在Struts2中,从Action中取得request,session的对象进行应用是开发中的必需步骤,那么如何从Action中取得这些对象呢?Struts2为我们提供了四种方式。分别为servlet 不相关的 非IoC 取得Request等对象的方式servlet 不相关的 IoC 取得Request等对象的方式servlet 相关的 非IoC 取得Request等对象的方式servlet 相关的 IoC 取得Request等对象的方式以下分别叙述。首先请看struts.xml文件文件内容:

01<?xmlversion="1.0"encoding="UTF-8"?>
02<!DOCTYPE struts PUBLIC
03"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
04"http://struts.apache.org/dtds/struts-2.0.dtd">
05
06<struts>
07
08<packagename="default"extends="struts-default">
09<actionname="login"class="struts2.login.LoginAction">
10<resultname="success">result.jsp</result>
11</action>
12
13<actionname="login2"class="struts2.login.Login2Action">
14<resultname="success">result.jsp</result>
15</action>
16
17<actionname="login3"class="struts2.login.Login3Action">
18<resultname="success">result.jsp</result>
19</action>
20
21<actionname="login4"class="struts2.login.Login4Action">
22<resultname="success">result.jsp</result>
23</action>
24</package>
25
26</struts>


其中的LoginAction,Login2Action,Login3Action,Login4Action分别对应四种方式的Action。

文件名:result.jsp
文件内容:
1<%@ page contentType="text/html; charset=gb2312" %>
2<%@ taglib uri="/struts-tags" prefix="s"%>
3
4<html>
5request 属性是 ${requestScope.attribute}<br>
6session 属性是 ${sessionScope.attribute}<br>
7application 属性是 ${applicationScope.attribute}<br>
8</html>


文件名:getrequest.jsp
文件内容:
1<%@ page contentType="text/html; charset=gb2312" %>
2<%@ taglib uri="/struts-tags" prefix="s"%>
3<html>
4<ahref="login.action">servlet 不相关的 非IoC 取得Request等对象的方式</a><br>
5<ahref="login2.action">servlet 不相关的 IoC 取得Request等对象的方式</a><br>
6<ahref="login3.action">servlet 相关的 非IoC 取得Request等对象的方式</a><br>
7<ahref="login4.action">servlet 相关的 IoC 取得Request等对象的方式</a><br>
8</form>
9</html>


然后分别叙述4种方式,
1,servlet 不相关的 非IoC 取得Request等对象的方式
这种方法先取得ActionContext,然后获取Map类型的request等对象

Action文件:
01packagestruts2.login;
02
03importjava.util.Map;
04
05importcom.opensymphony.xwork2.ActionContext;
06importcom.opensymphony.xwork2.ActionSupport;
07
08publicclassLoginAction  extendsActionSupport{
09privateActionContext context;
10privateMap request;
11privateMap session;
12privateMap application;
13
14@Override
15publicString execute() throwsException {
16// TODO Auto-generated method stub
17this.context = ActionContext.getContext();
18this.request = (Map)this.context.get("request");
19this.session = this.context.getSession();
20this.application = this.context.getApplication();
21this.request.put("attribute", "request value servlet 不相关的 非IoC ");
22this.session.put("attribute", "session value servlet 不相关的 非IoC ");
23this.application.put("attribute", "application value servlet 不相关的非IoC ");
24returnSUCCESS;
25}
26}


2,servlet 不相关的 IoC 取得Request等对象的方式
这种方法,是实现特定的接口,由container来设定request等对象。请注意如下代码示例中红色文字的部分。

Action文件:
01packagestruts2.login;
02
03importjava.util.Map;
04
05importorg.apache.struts2.interceptor.ApplicationAware;
06importorg.apache.struts2.interceptor.RequestAware;
07importorg.apache.struts2.interceptor.SessionAware;
08
09importcom.opensymphony.xwork2.ActionSupport;
10
11publicclassLogin2Action  extendsActionSupport
12implementsRequestAware , SessionAware, ApplicationAware{
13privateMap request;
14privateMap session;
15privateMap application;
16
17@Override
18publicString execute() throwsException {
19// TODO Auto-generated method stub
20this.request.put("attribute", "request value servlet 不相关的 IoC ");
21this.session.put("attribute", "session value servlet 不相关的 IoC ");
22this.application.put("attribute", "application value servlet 不相关的 IoC ");
23returnSUCCESS;
24}
25
26@Override
27publicvoidsetRequest(Map<String, Object> arg0) {
28// TODO Auto-generated method stub
29this.request = arg0;
30}
31
32@Override
33publicvoidsetSession(Map<String, Object> arg0) {
34// TODO Auto-generated method stub
35this.session = arg0;
36}
37
38@Override
39publicvoidsetApplication(Map<String, Object> arg0) {
40// TODO Auto-generated method stub
41this.application = arg0;
42}
43}

3,servlet 相关的 非IoC 取得Request等对象的方式
这种方法可以获取servlet相关的request等对象,也就是说这种方式取出的request对象不单单是设定属性的作用,而是可以获取http相关的信息。
取出方法,请参看代码中的蓝字部分。

Action文件:
01packagestruts2.login;
02
03importjavax.servlet.ServletContext;
04importjavax.servlet.http.HttpServletRequest;
05importjavax.servlet.http.HttpSession;
06
07importorg.apache.struts2.ServletActionContext;
08
09importcom.opensymphony.xwork2.ActionSupport;
10
11publicclassLogin3Action  extendsActionSupport{
12privateHttpServletRequest request;
13privateHttpSession session;
14privateServletContext application;
15
16@Override
17publicString execute() throwsException {
18// TODO Auto-generated method stub
19this.request = ServletActionContext.getRequest();
20this.session = this.request.getSession();
21this.application = ServletActionContext.getServletContext();
22this.request.setAttribute("attribute", "request value servlet 相关的非IoC ");
23this.session.setAttribute("attribute", "session value servlet 相关的非IoC ");
24this.application.setAttribute("attribute", "application value servlet 相关的 非IoC ");
25returnSUCCESS;
26}
27
28}



4,servlet 相关的 IoC 取得Request等对象的方式

这种方法也可以获取servlet相关的request等对象,也就是说这种方式取出的request对象不单单是设定属性的作用,而是可以获取http相关的信息。
但是取出方法是通过接口进行实现,也就是由struts2的container来设定,请参看代码中的红字部分。

Action文件:
01packagestruts2.login;
02
03importjavax.servlet.ServletContext;
04importjavax.servlet.http.HttpServletRequest;
05importjavax.servlet.http.HttpSession;
06
07importorg.apache.struts2.interceptor.ServletRequestAware;
08importorg.apache.struts2.util.ServletContextAware;
09
10importcom.opensymphony.xwork2.ActionSupport;
11
12publicclassLogin4Action  extendsActionSupport
13implementsServletRequestAware , ServletContextAware{
14privateHttpServletRequest request;
15privateHttpSession session;
16privateServletContext application;
17
18@Override
19publicString execute() throwsException {
20// TODO Auto-generated method stub
21this.request.setAttribute("attribute", "request value servlet 相关的 IoC ");
22this.session = this.request.getSession();
23this.session.setAttribute("attribute", "session value servlet 相关的 IoC ");
24this.application.setAttribute("attribute", "application value servlet 相关的 IoC ");
25returnSUCCESS;
26}
27
28@Override
29publicvoidsetServletRequest(HttpServletRequest arg0) {
30// TODO Auto-generated method stub
31this.request = arg0;
32}
33
34@Override
35publicvoidsetServletContext(ServletContext arg0) {
36// TODO Auto-generated method stub
37this.application = arg0;
38}
39}