Выражение JSP2 в форме ввода Struts2 - PullRequest
0 голосов
/ 09 июня 2011

Я начал играть с JSP и Struts2. Я прочитал кучу учебных пособий и спецификаций, и сейчас я пробую свои силы в очень простом приложении, использующем Struts2, JSP2 EL, и создаю пользовательскую библиотеку тегов.

Что я пытаюсь сделать, это создать простой многоразовый элемент управления для входа. Я создал JSP, который проверит сеанс, чтобы увидеть, вошел ли пользователь в систему, и, если нет, отобразить страницу входа.

У меня проблема в том, что я не могу поместить атрибут retPage в login.tag в качестве значения в скрытом поле ввода. Таким образом, я получаю следующую ошибку «/ WEB-INF / tags / login.tag (14,1) Согласно TLD или директиве атрибута в файле тега, значение атрибута не принимает никаких выражений» . Если я установлю значение sourcePage в пустую строку, все остальное будет работать нормально.

Я выполнил поиск в Google для этой ошибки, и это, кажется, указывает на то, что я не использую версию 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>

1 Ответ

1 голос
/ 09 июня 2011

Согласно TLD или директиве атрибута в файле тега, значение атрибута не принимает никаких выражений.

По умолчанию нельзя передать выражение JSP EL в тег Struts2. Это сделано в целях безопасности. Если вы хотите, вы можете сделать копию struts-tags.tld и установить для <rtexprvalue> значение true для всех тегов. Однако вы должны знать об уязвимости безопасности, связанной с разрешением тегам принимать выражения JSP EL и OGNL.

JSP EL оценивается до вызова обработчика тега, OGNL оценивается впоследствии (внутри тега). Таким образом, если ${retPage} вычислено для выражения OGNL, то тег может закончить тем, что вы не ожидали.

В случае скрытого поля формы просто используйте HTML-эквивалент.

...