在struts2 中request,response,session 都被隐藏起来了,所以不能在像JSP中那样的方式来设置和获取session的值了
可以通过IoC(控制反转)的方式来获取request,response,session,这里以session为列
以登录用户和密码存储在session中为列
首先index.jsp 页面
<div align="center">
<form action="" method="post" name="loginForm">
username:<input type="text" name="username"/> <br>
password:<input type="password" name="password"/> <br>
<input type="button" name="btn" value="提交" οnclick="javascript:document.loginForm.action='login/Login';document.loginForm.submit();">
</form>
</div>
<?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" 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>struts_session</display-name>
<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>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
接下来根据struts.xml中寻找action
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<package name="example" namespace="/login" extends="struts-default">
<action name="Login" class="com.session.LoginAction">
<result >/success.jsp</result>
</action>
</package>
<!-- Add packages here -->
</struts>
然后是创建对应的action对象,然后会根据询问时候实了SessionAware, ServletRequestAware,
ServletResponseAware接口,反射之后得知实现了这些借口,则调用相对应的set方法。之后访问LoginAction的execute()的方法
之所以叫做控制反转,是因为action对象的session变量不是自己设置的,而是依赖于外部注入的
Java代码如下
package com.session;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport implements SessionAware,ServletRequestAware,ServletResponseAware{
private static final long serialVersionUID = 111;
private String username;
private String password;
private HttpServletResponse Response;
private HttpServletRequest Request;
private Map<String,Object> Session;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String psw) {
this.password = password;
}
@Override
public void setServletResponse(HttpServletResponse Response) {
this.Response = Response;
}
@Override
public void setServletRequest(HttpServletRequest Request) {
this.Request = Request;
}
@Override
public void setSession(Map<String, Object> Session) {
this.Session = Session;
}
public String execute() {
this.Session.put("username", username);
this.Session.put("password", password);
return SUCCESS;
}
}
成功之后跳转到success.jsp页面,在此页面通过session获取username的值
<body>
<div align="center">
<%=session.getAttribute("username")%> <br>
<s:property value="#session.username"/> <br>
<s:debug></s:debug>
</div>
</body>