JSP 标签 +小脚本。如何启用脚本?
我有一个使用标签模板的页面。 我的 web.xml 非常基本。
我只是想在页面中运行一些代码。
不,我对标签或其他替代品不感兴趣。我想使用不好的做法 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:
理想的代码看起来像这样,在使用我的模板的页面内(“包装器”如上所述):
<%@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>
看到了吗? & 之间的小脚本在 '' 标签内。这正是我想要实现的目标。
I have a page which uses a tag template.
My web.xml is very basic.
I simply want to run some code in the page.
And no, I'm not interested in tags or other alternative. I want to use the bad-practice scriptlet haha.
So far I'm getting this "HTTP ERROR 500" error:
Scripting elements ( %!, jsp:declaration, %=, jsp:expression, %, jsp:scriptlet ) are disallowed here.
While my files look like:
/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>
I have tried to modify web.xml to explicitly enable it, like this (not working):
<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>
So, how do I use pure scriptlets within my tag'ed JSP?
EDIT #1:
An ideal code would look like this, inside a page that uses my template ('wrapper' as the above):
<%@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>
See? Scriptlets between & inside the '' tags. That's exactly what I'm trying to achieve.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
在这种情况下,容器不关心 web.xml 中
scripting-invalid
的值,因为它查看jsp:body
的标记元数据,其中包含正文内容值为scriptless
。因此,当您看到:容器正在抱怨 jsp:body 的内容必须是无脚本的。如果要在正文中呈现 scriptlet 内容,可以使用 scriptlet 将其设置为 jsp:body 标记外部的页面属性,然后在正文中使用 EL 进行呈现,如下所示:
In this case, the container doesn't care about the value of
scripting-invalid
in web.xml because its looking at the tag meta-data forjsp:body
which has a body-content value ofscriptless
. So when you see:The container is complaining about the contents of jsp:body which must be scriptless. If you want to render scriptlet content in the body, you can set it as a page attribute outside of the jsp:body tag using a scriptlet and then render it using EL inside the body like so:
有点晚了,但这应该有效:
Kind of late answer, but this should work:
简而言之,正如前面提到的,你不能这样做。没有办法“修复”它,这是不可能完成的。标记文件基本上是 JSP 术语中的“简单标记”。简单标记就是更简单的标记,不提供普通 JSP 标记的所有选项,并且包括处理 Scriptlet。
因此,它们不会限制您可以执行的操作,而是您不能使用标记文件来执行此操作。您发现您是少数几个喜欢在 JSP 中使用 scriptlet 的人之一,而大多数社区都回避使用它们。
我发现,如果我需要诉诸 scriptlet 代码,我会将该代码封装到它自己的标记文件中,然后从 JSP 调用该标记。就我的目的而言,这非常有效,并且我仅使用标签文件(而不是传统的 Java)制作了一些非常复杂的标签。
这可能对您不起作用,因为我感觉您通常使用 scriptlet,而不是例外。
Simply put, as mentioned, you can't do that. There is no "fix" to it, it can't be done. Tag Files are basically "Simple Tags" in JSP parlance. Simple Tags are just that, Simpler tags that don't offer all of the options of a normal JSP Tag, and that included handling Scriptlets.
So, they're not constraining what you can do, rather you can't use tag files to do it. What you've found is that you're one of the few that seems to enjoy using scriptlets in JSP when most of the community has avoided them.
What I've found is that if I need to resort to scriptlet code, I encase that code in to it's own tag file, and then invoke the tag from the JSP. For my purposes this has worked quite well, and I've made some quite sophisticated tags using only tag files (rather than conventional Java).
This probably won't work for you, as I get the feeling you're using scriptlets as a rule, rather than as an exception.
根据 @bjarnij 的回答,我发现这对我来说是最好的解决方案:
myJSP.jsp
几乎与 bjarnij 的相同,但我必须放置
c:set
在包装纸外面。对我来说就像一个魅力:)Based on the answer of @bjarnij, I found this to be the best solution for me:
myJSP.jsp
Almost the same as bjarnij's, but I had to put
c:set
outside of the wrapper. Works like a charm for me :)我正在寻找解决此问题的真正解决方案,但我使用的解决方法是创建一个旧式 tld 标记以将 scriptlet 片段保存在页面上下文中,然后将其打印在标记内。
pushpop.tld
在jsp中使用它:
I'm looking to find a real solution for this problem, but the workaround I'm using is to create an old style tld tag to save scriptlet fragment in page context and then print it inside a tag.
pushpop.tld
Use it in jsp:
@Poni
如果你想使用简单的if条件我们可以使用以下而不是scriptlet
@Poni
If you want to use the simple if condition we can use the following instead of scriptlet
下面是我用来在 JSPX 页面中添加 scriplet 之类的代码。
代码在编辑 Spring-Roo 创建的模板页面时也可以工作。
注意:
、
和
与就可以了。
以下是参考链接:
Below is the code which I used to add scriplet like coding in JSPX pages.
Code also works while editing template pages created by Spring-Roo.
Note: Proper combination of
<jsp:declaration>,</jsp:declaration>
and<jsp:expression>
along with<![CDATA[... ]]>
does the trick.Following are reference links: