JSP标签+ scriptlet.如何启用scriptlet?

Pon*_*oni 13 java jsp jsp-tags scriptlet

我有一个使用标签模板的页面.我的web.xml非常基础.

我只想在页面中运行一些代码.
不,我对标签或其他替代品不感兴趣.我想使用坏练习scriptlet哈哈.

到目前为止,我收到此"HTTP ERROR 500"错误:

Scripting elements ( %!, jsp:declaration, %=, jsp:expression, %, jsp:scriptlet ) are disallowed here.
Run Code Online (Sandbox Code Playgroud)

虽然我的文件看起来像:

/WEB-INF/web.xml

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>
Run Code Online (Sandbox Code Playgroud)

/WEB-INF/tags/wrapper.tag

<%@tag description="Simple Wrapper Tag" pageEncoding="UTF-8"%>
<%@ attribute name="title" required="true" type="java.lang.String"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html>
<head>
<title>${title}</title>
</head>

<body>
    <jsp:doBody />
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

的index.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags"%>

<t:wrapper>
    <jsp:attribute name="title">My nice title</jsp:attribute>

    <jsp:body>
    <h1><%="some code generated text"%></h1>
    </jsp:body>
</t:wrapper>
Run Code Online (Sandbox Code Playgroud)

我试图修改web.xml以显式启用它,就像这样(不工作):

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <scripting-invalid>false</scripting-invalid>
    </jsp-property-group>
    <jsp-property-group>
        <url-pattern>*.tag</url-pattern>                
        <scripting-invalid>false</scripting-invalid>
    </jsp-property-group>
</jsp-config>
Run Code Online (Sandbox Code Playgroud)

那么,我如何在标记的JSP中使用纯scriptlet呢?

编辑#1:

理想的代码看起来像这样,在使用我的模板的页面内(如上所述''wrapper'):

<%@page import="java.util.Calendar"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags"%>

<t:wrapper>
    <jsp:attribute name="title">My nice title</jsp:attribute>

    <%
        final int day_of_week = Calendar.getInstance().get(
                Calendar.DAY_OF_WEEK);
        if (day_of_week == Calendar.SATURDAY)
        {
    %>
    <jsp:body>
    <h1>Have a nice Saturday (<%=Integer.toString(day_of_week)%>)!</h1>
    </jsp:body>
    <%
        }
        else
        {
    %>
    <jsp:body>
    <h1>Have a nice rest-of-the-week (<%=Integer.toString(day_of_week)%>)!</h1>
    </jsp:body>
    <%
        }
    %>
</t:wrapper>
Run Code Online (Sandbox Code Playgroud)

看到?''标签之间和内部的Scriptlet.这正是我想要实现的目标.

jon*_*one 21

在这种情况下,容器不关心scripting-invalidweb.xml中的值,因为它查看标签元数据,jsp:body其主体内容值为scriptless.所以当你看到:

Scripting elements ( %!, jsp:declaration, %=, jsp:expression, %, jsp:scriptlet ) are disallowed here.
Run Code Online (Sandbox Code Playgroud)

容器抱怨jsp:body的内容必须是无脚本的.如果要在正文中呈现scriptlet内容,可以使用scriptlet将其设置为jsp:body标记之外的页面属性,然后在主体内使用EL渲染它,如下所示:

<% request.setAttribute("stuff", object); %>

<jsp:body>
${stuff}
</jsp:body>
Run Code Online (Sandbox Code Playgroud)

  • 这是进化的结果.人们意识到scriptlet导致了不可维护的页面,因此当JSP 2.0出现并引入标记文件时,他们说"它必须停止",并且强制实施的方法之一是不让你将scriptlet内容添加到标记文件标记由jsp:body定义的主体.抱歉.:) (2认同)
  • 是的,当有人强迫你以某种方式编码时,真的很糟糕,没有"真正的"理由(比如语言设计问题等).事实上,我可以在JSP中编写一个scriptlet ....但是当它在"jsp:body"中时它是错的.. ffff ..这些家伙..所以你不知道一种让它工作的方法呃?希望有人会听到这个问题,并回答..谢谢! (2认同)

小智 7

一种迟到的答案,但这应该工作:

<t:wrapper>
    <jsp:attribute name="title">My nice title</jsp:attribute>
    <c:set var="bodyContent">
        <%
            final int day_of_week = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
            if (day_of_week == Calendar.SATURDAY)
            {
        %>
        <h1>Have a nice Saturday (<%=Integer.toString(day_of_week)%>)!</h1>
        <%
            }
            else
            {
        %>
        <jsp:body>
        <h1>Have a nice rest-of-the-week (<%=Integer.toString(day_of_week)%>)!</h1>
        </jsp:body>
        <%
            }
        %>
    </c:set>
    <jsp:body>
        ${bodyContent}
    </jsp:body>
</t:wrapper>
Run Code Online (Sandbox Code Playgroud)