Struts2:如何将值从一个操作传递到另一个操作。或者从一个JSP到另一个JSP。不使用会话

时间:2012-05-08 09:23:02

标签: struts2

您好我正在使用Struts2构建项目。但是在开发过程中我遇到了很多问题。最大的问题是Struts2中的会话管理。与此相关的信息非常有限。

我已经找到解决问题的方法,但只获得了有限的信息,不能满足我的需求。

我不希望使用容器的会话(Apache Tomcat 7),因为当多个用户尝试使用该应用程序时,它将成为开销。

我创建了2个Action类和2个JSP。 在JSP1中输入的值(Login.jsp和LoginAction.java POJO)应该在另一个动作(HomeAction.java POJO)中使用,之后它们应该显示在后续的JSP(Home.jsp)中。

我也在使用瓷砖。

我尝试过使用tag但我无法为其设置值。

在Struts2中, 我怎样才能将JSP1 / Action上的对象传递给另一个Action / JSP2?

一个小的登录页面示例将不胜感激。 例如在文本字段中输入的用户名应使用2个不同的Action类显示到另一个JSP页面。

struts.xml中

    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <constant name="struts.devMode" value="true" />
    <constant name="struts.custom.i18n.resources" value="ApplicationResources" /> 

    <package name="default" extends="struts-default">
        <result-types>
            <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" />
        </result-types> 

        <action name="login" class="org.myaction.LoginAction" method="validateLoginCredentials">
            <result name="autheticatedUser" type="redirect" >homePage</result>
            <result name="fail" >/jsp/Login.jsp</result>
        </action>

        <action name="homePage" class="org.myaction.HomeAction" method="execute">
            <result name="responseOK" type="tiles" >/tile.NextPage</result>
            <result name="error" type="tiles" >/tile.HomePage</result>
        </action>
    </package>
</struts>

LoginAction.java

    public class LoginAction extends ActionSupport {

    //private static final String SUCCESS = "success"; 
    private static final String FAIL = "fail";

    private String userName;
    private String password;

    public String getUserName() { return userName; }

    public void setUserName(String userName) { this.userName = userName; }

    public String getPassword() { return password; }

    public void setPassword(String password) { this.password = password; }

    public String validateLoginCredentials() {

          if(this.userName.equals("admin") 
                      && this.password.equals("allow")) {

         return "autheticatedUser";
              }
        addActionError(getText("error.login"));
        return FAIL;
    }
}

的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_3_0.xsd"
    id="WebApp_ID" version="3.0">

    <display-name>Login</display-name>

    <context-param>
        <param-name>org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG</param-name>
        <param-value>/WEB-INF/tiles.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.apache.struts2.tiles.StrutsTilesListener</listener-class>
    </listener>

    <welcome-file-list>
        <welcome-file>/jsp/Login.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>

我的问题是, 在Struts2中, 我如何将用户名 Login.jsp / LoginAction.java 传递到 Home.jsp / HomeAction.java

注意:存储到会话不是首选选项,但如果没有其他方法可以在Struts2中维护用户状态,则可以使用。

一个小的登录页面示例将不胜感激。 例如在文本字段中输入的用户名应使用2个不同的Action类显示到另一个JSP页面。

被修改

嗨,谢谢!我非常感谢你的回复。我认为这会奏效。还有一件事我忘了提。 LoginAction.java类中存在另一个类(JavaBean)属性。

public class LoginAction extends ActionSupport {

   private UserData userData;

   public void setUserData(UserData userData) {
      this.userData = userData;
   }

   public String getUserData() {
      return userData;
   }

}

UserData.java

public class UserData {
   private String userName;

   public void setUserName(String userName) {
      this.userName = userName;
   }

   public String getUserName() {
      return userName;
   }
}

如何设置UserData对象的userName属性 LoginAction.java?

我试过这个

<s:hidden name="userData.userName" value="userName" />

但它没有用......

你知道我在这里犯了什么错误吗?

2 个答案:

答案 0 :(得分:6)

redirectActionparam

一起使用
  <action name="login" class="org.myaction.LoginAction" method="validateLoginCredentials">
      <result name="autheticatedUser" type="redirectAction">
        <param name="actionName">homePage</param>
        <param name="userName">${userName}</param>
      </result>
      <result name="fail" >/jsp/Login.jsp</result>
  </action> 

此外,不要忘记HomeAction课程中添加userName getter / setter。然后在Home.jsp中,您可以直接使用<s:property value="userName"/>(或其他)

答案 1 :(得分:0)

conversation plugin是一个很好的会话包装器,可以用来管理对象在动作之间的生命周期。 (https://code.google.com/p/struts2-conversation/

当你有一些步骤基础jsp页面(超过两个步骤)时,这个解决方案将会有很大帮助。该插件是注释库,也有必要的jsp标签