Struts2中的JSP2表达式表单输入

时间:2011-06-09 17:01:08

标签: jsp struts2 el

我开始玩JSP和Struts2。我已经阅读了大量的教程和规范,现在我正在尝试使用Struts2,JSP2 EL和创建自定义标记库的非常简单的应用程序。

我要做的是创建一个简单的可重用登录控件。我创建了一个JSP,它将检查会话以查看用户是否已登录,如果没有显示登录页面。

我遇到的问题是我似乎无法将login.tag中的retPage属性作为隐藏输入字段中的值。因此,我收到以下错误“/ WEB-INF / tags / login.tag(14,1)根据标记文件中的TLD或属性指令,属性值不接受任何表达式”。如果我将sourcePage的值设置为空字符串,则其他所有工作正常。

我已经做了一些谷歌搜索这个错误,它似乎表明我没有使用我认为我的JSP版本(我想我正在使用JSP 2,但这个错误似乎发生在JSP 1.2尝试解释JSP2 EL语句)。但是,如果我没有使用JSP 2,我会认为所有JSP EL语句都会失败,但事实并非如此。

如何将login.tag中的retPage属性设置为隐藏输入字段的值?

我确实觉得我对这些东西非常敏锐。所以,如果所有这些都不合适,请告诉我。

非常感谢任何帮助。谢谢。

的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>

1 个答案:

答案 0 :(得分:1)

  

根据标记文件中的TLD或属性指令,属性值不接受任何表达式。

默认情况下,您无法将JSP EL表达式传递给Struts2标记。这样做是为了安全起见。如果您愿意,可以复制struts-tags.tld并将<rtexprvalue>设置为true以表示所有标记。但是,您应该了解允许标记接受JSP EL和OGNL表达式所涉及的安全漏洞。

在调用标记处理程序之前评估JSP EL,之后评估OGNL(在标记内)。因此,如果${retPage}评估为OGNL表达式,那么标记可能会结束您做不到的事情。

对于隐藏表单字段的情况,只需使用等效的HTML。