您好我正在使用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" />
但它没有用......
你知道我在这里犯了什么错误吗?
答案 0 :(得分: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"/>
(或其他)
答案 1 :(得分:0)
conversation plugin
是一个很好的会话包装器,可以用来管理对象在动作之间的生命周期。 (https://code.google.com/p/struts2-conversation/)
当你有一些步骤基础jsp页面(超过两个步骤)时,这个解决方案将会有很大帮助。该插件是注释库,也有必要的jsp标签