【问题标题】:Struts2: How to pass a values from one action to another action. Or from one JSP to another JSP. Without using sessionStruts2:如何将值从一个动作传递到另一个动作。或者从一个 JSP 到另一个 JSP。不使用会话
【发布时间】:2012-05-16 18:40:30
【问题描述】:

您好,我正在使用 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>

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 中, 如何将 userNameLogin.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;
   }
}

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

我试过了

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

但它不起作用....

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

【问题讨论】:

  • 我不明白您在使用会话时遇到的具体问题——这正是它的用途,即存储特定于会话的数据。您是否证明您拥有“太多”的会话数据?您是否忽略了在不再需要时删除会话数据?

标签: struts2


【解决方案1】:

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 中,您可以直接使用&lt;s:property value="userName"/&gt;(或其他)

【讨论】:

  • 您好阿努,感谢您的帮助。但是我刚刚编辑了我上面的问题。它不允许我添加到此评论框中。对不起!不知道怎么回复。新手
  • 进行这些更改后,我收到了 Null 异常
  • 分解您的问题。首先尝试简单地使用String userName,就像您最初在LoginAction class 中给出的那样。在HomeAction 类中声明相同的变量及其getter/setter。然后尝试在您的Home.jsp 中查看该值。我不明白你编辑的帖子。您是否尝试将登录页面中的userName 提交到userData?不需要声明userData 构造函数来设置userName 属性吗?
  • 嗨,我已经尝试过了,给了我两个不同的结果。 'homePage ${userName} ' 这里 userName 已经被 UserData 对象替换了。 并且得到了异常 HomeAction.setUserData(String) ... NoSuchMethodException 这是否意味着我们不能传递除字符串以外的参数?? ?
  • 我从未尝试过对象,但我认为它应该可以工作。当您通过userName 时它是否有效?您在redirectAction 中传递userName,因此struts 将在HomeAction 中查找setUserName(String userName)。类似地,如果您在结果中传递userData,它将查找setUserData(userData data) 方法。你确定你有正确的getter/setter吗?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2021-01-14
    • 1970-01-01
    • 2014-03-02
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    相关资源
    最近更新 更多