JSP标签+ scriptlet。 如何启用scriptlet?
我有一个使用标签模板的页面。 我的web.xml非常基础。
我只是想在页面中运行一些代码。
不,我对标签或其他替代品不感兴趣。 我想使用bad-practice scriptlet哈哈。
到目前为止,我收到此“HTTP ERROR 500”错误:
Scripting elements ( %!, jsp:declaration, %=, jsp:expression, %, jsp:scriptlet ) are disallowed here.
虽然我的文件看起来像:
/WEB-INF/web.xml
index.html index.jsp
/WEB-INF/tags/wrapper.tag
${title}
的index.jsp
My nice title
我试图修改web.xml以显式启用它,就像这样(不工作):
*.jsp false *.tag false
那么,我如何在标记的JSP中使用纯scriptlet呢?
编辑#1 :
理想的代码看起来像这样 ,在使用我的模板的页面内(如上所述”wrapper’):
My nice title Have a nice Saturday ()!
Have a nice rest-of-the-week ()!
看到? ”标签之间和内部的Scriptlet。 这正是我想要实现的目标。
在这种情况下,容器不关心web.xml中scripting-invalid
的值,因为它查看了jsp:body
的标签元数据,其主体内容值为无scriptless
。 所以当你看到:
Scripting elements ( %!, jsp:declaration, %=, jsp:expression, %, jsp:scriptlet ) are disallowed here.
容器抱怨jsp:body的内容必须是无脚本的。 如果要在正文中呈现scriptlet内容,可以使用scriptlet将其设置为jsp:body标记之外的页面属性,然后在主体内使用EL渲染它,如下所示:
<% request.setAttribute("stuff", object); %> ${stuff}
一种迟到的答案,但这应该工作:
My nice title <% final int day_of_week = Calendar.getInstance().get(Calendar.DAY_OF_WEEK); if (day_of_week == Calendar.SATURDAY) { %> Have a nice Saturday (<%=Integer.toString(day_of_week)%>)!
<% } else { %> Have a nice rest-of-the-week (<%=Integer.toString(day_of_week)%>)!
<% } %> ${bodyContent}
简单地说,如上所述,你不能这样做。 它没有“修复”,它无法完成。 标记文件基本上是JSP术语中的“简单标记”。 简单标签就是这样,Simpler标签不提供普通JSP标签的所有选项,包括处理Scriptlet。
因此,它们不会限制您可以执行的操作,而是您无法使用标记文件来执行此操作。 您发现的是,当大多数社区已经避免使用Scriptlet时,您是少数似乎喜欢使用Scriptlet的人之一。
我发现如果我需要使用scriptlet代码,我将该代码包含在它自己的标记文件中,然后从JSP调用该标记。 为了我的目的,这已经很好地工作了,并且我使用标签文件(而不是传统的Java)制作了一些相当复杂的标签。
这可能对你不起作用,因为我觉得你正在使用scriptlet作为规则,而不是作为例外。
基于@bjarnij的答案,我发现这对我来说是最好的解决方案:
myJSP.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%> <%@taglib prefix="t" tagdir="/WEB-INF/tags" %> <% //Your content with scriplets and everything %> ${bodyContent}
几乎和bjarnij一样,但我不得不把c:set
在包装器之外。 像我的魅力对我来说:)
我正在寻找这个问题的真正解决方案,但我正在使用的解决方法是创建一个旧样式tld标记以在页面上下文中保存scriptlet片段,然后将其打印在标记内。
public class PushTag extends BodyTagSupport { private String key; public int doStartTag() throws JspException { return EVAL_BODY_BUFFERED; } @Override public int doAfterBody() throws JspException { pageContext.setAttribute(PREFIX + key, getBodyContent().getString()); return SKIP_BODY; } public String getKey() { return key; } public void setKey(String key) { this.key = key; } private static final String PREFIX = PushTag.class.getPackage().getName() + "."; private static final long serialVersionUID = 1L; } public class PopTag extends BodyTagSupport { private String key; @Override public int doStartTag() throws JspException { try { String bc = (String) pageContext.getAttribute(PREFIX + key); if (bc != null) { pageContext.getOut().write(bc); } } catch (Exception e) { throw new JspException("Error:" + e.getMessage()); } return super.doStartTag(); } public String getKey() { return key; } public void setKey(String key) { this.key = key; } private static final String PREFIX = PopTag.class.getPackage().getName() + "."; private static final long serialVersionUID = 1L; }
pushpop.tld
1.2 2.1 q http://dev.example.com/jsp/taglib/ push x.web.PushTag JSP key true java.lang.String pop x.web.PopTag JSP key true java.lang.String
在jsp中使用它:
<%@ taglib prefix="x" uri="http://example.com/jsp/taglib/" %> <%= "We Love SCRIPTLETS!" %>
@Poni
如果你想使用简单的if条件,我们可以使用以下代替scriptlet
your content
下面是我在JSPX页面中添加scriplet编码的代码。
在编辑Spring-Roo创建的模板页面时,代码也有效。
注意:
和
以及可以解决问题。
以下是参考链接:
- 如何使用JSPX生成有效的HTML? (不是XHTML)
- https://docs.oracle.com/javaee/1.4/tutorial/doc/JSPX3.html