我有一个使用标签模板的页面。 我的web.xml非常基础。
我只是想在页面中运行一些代码 不,我对标签或其他替代品不感兴趣。我想使用bad-practice scriptlet哈哈。
到目前为止,我收到了“HTTP ERROR 500”错误:
Scripting elements ( %!, jsp:declaration, %=, jsp:expression, %, jsp:scriptlet ) are disallowed here.
虽然我的文件看起来像:
/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>
/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>
的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>
我试图修改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>
那么,我如何在标记的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>
请参阅?和之间的Scriptlets在''标签内。这正是我想要实现的目标。
答案 0 :(得分:21)
在这种情况下,容器不关心web.xml中scripting-invalid
的值,因为它查看了jsp:body
的标签元数据,其主体内容值为{ {1}}。所以当你看到:
scriptless
容器抱怨jsp:body的内容必须是无脚本的。如果要在正文中呈现scriptlet内容,可以使用scriptlet将其设置为jsp:body标记之外的页面属性,然后在主体内使用EL渲染它,如下所示:
Scripting elements ( %!, jsp:declaration, %=, jsp:expression, %, jsp:scriptlet ) are disallowed here.
答案 1 :(得分:6)
有点迟到,但这应该有效:
<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>
答案 2 :(得分:4)
如上所述,简单地说,你不能这样做。它没有“修复”,它无法完成。标记文件基本上是JSP术语中的“简单标记”。简单标签就是这样,Simpler标签不提供普通JSP标签的所有选项,包括处理Scriptlet。
所以,他们并没有限制你能做什么,而是你不能使用标签文件来做。您发现的是,当大多数社区都避免使用Scriptlet时,您似乎很少喜欢使用Scriptlet。
我发现如果我需要使用scriptlet代码,我将该代码包含在它自己的标记文件中,然后从JSP调用该标记。为了我的目的,这已经运作得很好,而且我只使用标签文件(而不是传统的Java)制作了一些非常复杂的标签。
这可能对您不起作用,因为我觉得您使用scriptlet作为规则,而不是作为例外。
答案 3 :(得分:2)
根据@bjarnij的回答,我发现这对我来说是最好的解决方案:
<强> myJSP.jsp 强>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<c:set var="bodyContent">
<%
//Your content with scriplets and everything
%>
</c:set>
<t:wrapper>
<jsp:body>
${bodyContent}
</jsp:body>
</t:wrapper>
与bjarnij几乎相同,但我必须将c:set
放在包装器之外。对我来说就像一个魅力:)
答案 4 :(得分:1)
我正在寻找这个问题的真正解决方案,但我正在使用的解决方法是创建一个旧样式的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
<taglib>
<tlib-version>1.2</tlib-version>
<jsp-version>2.1</jsp-version>
<short-name>q</short-name>
<uri>http://dev.example.com/jsp/taglib/</uri>
<tag>
<name>push</name>
<tag-class>x.web.PushTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>key</name>
<required>true</required>
<type>java.lang.String</type>
</attribute>
</tag>
<tag>
<name>pop</name>
<tag-class>x.web.PopTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>key</name>
<required>true</required>
<type>java.lang.String</type>
</attribute>
</tag>
</taglib>
在jsp:
中使用它<%@ taglib prefix="x" uri="http://example.com/jsp/taglib/" %>
<x:push key="scriptful"><%= "We Love SCRIPTLETS!" %></x:push>
<t:wrapper><x:pop key="scriptful"/></t:wrapper>
答案 5 :(得分:0)
@Poni
如果你想使用简单的if条件,我们可以使用以下代替scriptlet
<c:if test="${!empty flashMsg}">
<p>your content</p>
</c:if>
答案 6 :(得分:0)
下面是我用来添加scriplet的代码,例如JSPX页面中的代码。
代码在编辑Spring-Roo创建的模板页面时也可以使用。
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<div xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
xmlns:jsp="http://java.sun.com/JSP/Page"
xmlns:spring="http://www.springframework.org/tags"
xmlns:util="urn:jsptagdir:/WEB-INF/tags/util" id="footer" version="2.0">
<jsp:directive.page contentType="text/html;charset=UTF-8" />
<jsp:output omit-xml-declaration="yes" />
<jsp:declaration> String t; </jsp:declaration>
<jsp:scriptlet>
<![CDATA[
t="Declared and Initialized From Scriplet";
]]>
</jsp:scriptlet>
<jsp:scriptlet>
<![CDATA[
for(int i=0;i<3;i++){
]]>
</jsp:scriptlet>
<jsp:expression>t+i</jsp:expression> <![CDATA[ iteration <br/>]]>
<jsp:scriptlet>
<![CDATA[
}
]]>
</jsp:scriptlet>
</div>
注意:<jsp:declaration>,</jsp:declaration>
和<jsp:expression>
与<![CDATA[... ]]>
的正确组合可以达到目的。
以下是参考链接: