在struts1中,获得到系统的request、session或者application对象非常方便,都是按照形参传递的,但是在struts2中,request、session和application都被隐藏了。
struts提供两种方式访问session、request和application对象,即IOC方式和非IOC方式,其中比较常用的是利用SPRING里面所说的IOC即控制反转。
一、非Ioc方式:
这种方式主要是利用了com.opensymphony.xwork2.ActionContext类以及org.apache.struts2.ServletActionContext类,具体的方法如下所示。
(1)与serlvet API耦合的方式(通过ServletActionContext类直接获取)
HttpServletRequest request = ServletActionContext.getRequest(); //获取request对象
HttpSession session = request.getSession();//获取session对象
ServletContext application = ServletActionContext.getServletContext(); //获取application对象方式一
或 ServletContext application = session.getServletContext(); //获取application对象方式二
HttpServletResponse response = ServletActionContext.getResponse(); //获取response对象
(2)与serlvet API无耦合的方式(通过ActionContext类直接获取)
ActionContext context = ActionContext.getContext(); //requestScope
Map request = (Map) context.get("request"); //获取request
Map session = context.getSession(); //获取session
Map application = context.getApplication(); //获取application
<!-- 赋值示例 -->
ActionContext ctx = ActionContext.getContext();
ctx.getApplication().put("app","application应用范围");
ctx.getSession().put("sess","session应用范围");
ctx.put("req","request应用范围");
二、IOC方式:
(1)获得request对象:
第一步:让action实现ServletRequestAware接口
第二步:在action中声明一个HttpServletRequest类型的实例变量
第三步:在action中实现ServletRequestAware接口的setServletRequest方法,实现方式很简单,如下所示。
//1.实现ServletRequestAware接口
public class UserAction implements ServletRequestAware {
//2.定义HttpServletRequest类型的成员变量并实现getter/setter方法
private HttpServletRequest request;
public HttpServletRequest getRequest() {
return request;
}
public void setRequest(HttpServletRequest request) {
this.request = request;
}
//3.实现ServletRequestAware接口的setServletRequest方法,并将它的request参数赋值给成员变量request
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
}
(2)获得Session对象(注意,此时的session是SessionMap类型):
第一步:让action实现SessionAware接口
第二步:在action中声明一个Map类型的实例变量
第三步:在action中实现SessionAware接口的setSession方法,实现方式很简单,如下所示。
//1.实现SessionAware接口
public class UserAction implements SessionAware {
//2.定义Map类型的成员变量并实现getter/setter方法
private Map session;
public Map getSession() {
return session;
}
//3.实现SessionAware接口的setSession方法,并将它的session参数赋值给成员变量session
@Override
public void setSession(Map session) {
this.session = session;
}
}
(3)获取application对象:
第一步:让action实现ServletContextAware接口
第二步:在action中声明一个ServletContext类型的实例变量
第三步:在action中实现ServletContextAware接口的setServletContext方法,实现方式很简单,如下所示。
//1.实现ServletContextAware接口
public class UserAction implements ServletContextAware {
//2.定义ServletContext类型的成员变量并实现getter/setter方法
private ServletContext application;
public ServletContext getApplication() {
return application;
}
public void setApplication(ServletContext application) {
this.application = application;
}
//3.实现ServletContextAware接口的setServletContext方法,并将它的application参数赋值给成员变量application
@Override
public void setServletContext(ServletContext application) {
this.application = application;
}
}
(4)获取response对象:
第一步:让action实现ServletResponseAware接口
第二步:在action中声明一个HttpServletResponse类型的实例变量
第三步:在action中实现HttpServletResponse接口的setResponse方法,实现方式很简单,如下所示。
//1.实现ServletResponseAware接口
public class UserAction implements ServletResponseAware {
//2.定义HttpServletResponse类型的成员变量并实现getter/setter方法
private HttpServletResponse response;
public HttpServletResponse getResponse() {
return response;
}
public void setResponse(HttpServletResponse response) {
this.response = response;
}
//3.实现ServletResponseAware接口的setServletResponse方法,并将它的response参数赋值给成员变量response
@Override
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
}
附注:Jps页面获取Scope对象值的几种方式:
(1)${ } 格式
${applicationScope.app}
${sessionScope.sess}
${requestScope.req}
(2)<s:property>标签
<s:property value="#request.req">
<s:property value="#session.sess">
<s:property value="#application.app">
(3)getAttribute()方式
<%=request.getAttribute("req") %><br>
<%=session.getAttribute("ses") %><br>
<%=application.getAttribute("app") %><br>