4

嗨,我正在使用 Struts2 构建一个项目。然而,在开发过程中,我面临着许多问题。最大的问题是 Struts2 中的会话管理。与此相关的信息非常有限。

我一直在寻找解决问题的方法,但只获得了无法满足我需求的有限信息。

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

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

我也在使用瓷砖。

我尝试使用标签,但无法为其设置值。

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

登录操作.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;
   }

}

用户数据.java

public class UserData {
   private String userName;

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

   public String getUserName() {
      return userName;
   }
}

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

我试过这个

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

但它不工作....

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

4

2 回答 2

6

redirectAction与_param

  <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"/>(或其他)

于 2012-05-08T09:32:23.840 回答
0

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

当您有一些基于步骤的 jsp 页面(超过两个步骤)时,此解决方案将有很大帮助。里面的插件是注解基础,也有必要的jsp标签

于 2016-06-20T11:53:00.910 回答