我已经开始使用JSP和Struts2。我已经阅读了许多教程和规范,现在我正在尝试使用Struts2,JSP2 EL和创建自定义taglib的非常简单的应用程序。
我正在尝试做的是创建一个简单的可重用登录控件。我创建了一个JSP,它将检查会话以查看用户是否已登录,如果未显示登录页面。
我遇到的问题是我似乎无法将retPage属性作为一个隐藏输入字段中的值放在login.tag中。 照原样 ,我得到以下错误 “ /WEB- INF/tags/login.tag(14,1)根据标签文件中的TLD或属性指令,属性值不接受任何表达式” 。如果将的值设置为sourcePage空字符串,则其他所有功能都可以正常工作。
retPage
sourcePage
我已经对该错误进行了一些谷歌搜索,似乎表明我没有使用我想使用的JSP版本(我认为我正在使用JSP 2,但是此错误似乎是从JSP 1.2尝试解释JSP2时发生的EL语句)。但是,如果我不使用JSP 2,我会以为所有JSP EL语句都会失败,事实并非如此。
如何retPage在login.tag 中将我的属性设置为隐藏输入字段的值?
我确实觉得我对这些东西掌握得很紧。因此,如果所有这些都不合时宜,请告诉我。
任何帮助将不胜感激。谢谢。
index.jsp
<?xml version="1.0" encoding="UTF-8" ?> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Welcome</title> </head> <body> <%@ include file="auth.jsp" %> <div> Welcome to My Test Page</div> </body> </html>
auth.jsp:
<?xml version="1.0" encoding="UTF-8" ?> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <s:head /> </head> <body> <s:if test="! #session['authenticated']" > <% StringBuffer url = request.getRequestURL(); String ns = "myTest/"; int sidx = url.lastIndexOf( ns ); int tidx = url.indexOf( "?"); if( 0 > tidx ) { tidx = url.length(); } String retPage = url.substring( sidx + ns.length(), tidx ); %> <jsp:forward page="login.jsp" > <jsp:param name="page" value="<%=retPage%>" /> </jsp:forward> </s:if> </body> </html>
login.jsp:
<?xml version="1.0" encoding="UTF-8" ?> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <%@ taglib prefix="sj" uri="/struts-jquery-tags"%> <%@ taglib prefix="ml" tagdir="/WEB-INF/tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Please login</title> <s:head /> <sj:head /> </head> <body> <div id="login"> <ml:login retPage="${param.page}" /> </div> </body> </html>
login.tag:
<%@ tag body-content="empty" %> <%@ attribute name="retPage" required="true" %> <%@ taglib prefix="s" uri="/struts-tags" %> <s:head /> <s:form action="login" theme="xhtml"> <div> Please login. Ret0: ${retPage} </div> <s:textfield name="user.userName" label="Username" /> <s:hidden name="sourcePage" value="${retPage}" /> <s:submit /> </s:form>
web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>myTest</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
根据标签文件中的TLD或属性指令,属性值不接受任何表达式。
默认情况下,您不能将JSP EL表达式传递给Struts2标记。这样做是出于安全目的。如果愿意,可以复制struts- tags.tld并将<rtexprvalue>所有标签设置为true。但是,您应该意识到允许标签同时接受JSP EL和OGNL表达式所涉及的安全漏洞。
<rtexprvalue>
在调用标签处理程序之前先对JSP EL进行评估,然后在标签内部对OGNL进行评估。这样,如果将其${retPage}评估为OGNL表达式,则该标签可能会完成您意料之外的事情。
${retPage}
对于隐藏的表单字段,只需使用等效的HTML。