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创建的模板页面时,代码也有效。

   

注意: ,以及可以解决问题。

以下是参考链接: