引言:在前面的Action操作中,关键就是Action中的exectue方法,但是此方法并没有request、session、application等对象作为参数,自然就不能利用这些对象来操作。下面我们建立struts2scope项目,并用四种方式来获取这些对象:
方式一、与Servlet解耦合的非IOC方式
获取的scope对象与容器无关,通过ActionContext获取。
LoginAction代码如下:
package
public
private
ActionContext
Map
Map
Map
public
context=ActionContext.getContext();
request=(Map)
session=context.getSession();
application=context.getApplication();
request.put("req",
session.put("ses",
application.put("app",
return
}
...省略username的get/set方法
}
struts.xml配置如下:
<struts>
<package
<action
<result>/loginSuc.jsp</result>
</action>
</package>
</struts>
login.jsp内容如下:
<form
用户名:<input
<input
</form>
loginSuc.jsp的主要内容如下:
${requestScope.req}
${sessionScope.ses}
${applicationScope.app}
<h4>以下使用scope.getAttribute的形式来接受</h4>
request: <%=request.getAttribute("req")
session: <%=session.getAttribute("ses")
application:<%=application.getAttribute("app")
分析:通过ActionContext的getContext静态方法得到ActionContext对象,然后ActionContext对象调用get方法来获取一个存储在request范围中的对象。我们使用el或通过request.getAttribute这样的方式均可以获取对象值,这说明了这些Map
方式二、与Servlet解耦合的IOC方式
我们建立Login2Action,主要代码如下:
package
public
private
Map
Map
Map
public
request.put("req",
session.put("ses",
application.put("app",
return
}
public
this.request=request;
}
public
this.session=session;
}
public
this.application=application;
}
...省略username的get/set方法
}
注册此Action的name为login2,随后修改登录提交为.../login2.action。便可以发布测试。说明:此方法其实和方式一很相似,只是在方式一中我们需要手动的为Map
方式三、与Servlet耦合的非IOC方式
建立Login3Action,代码如下:
package
public
private
HttpServletRequest
HttpSession
ServletContext
public
request
session
application
request.setAttribute("req",
session.setAttribute("ses",
application.setAttribute("app",
return
}
...省略username的get/set方法。
}
此方法获取的纯粹的Scope对象,它与容器相关,这些Scope对象操作更强。同样只需要注册此Action并修改登录页面便可进行测试。
方式四、与Servlet耦合的IOC方式
建立Login4Action,代码如下:
package
public
private
ActionContext
HttpServletRequest
HttpSession
ServletContext
public
context=ActionContext.getContext();
session=request.getSession();
request.setAttribute("req",
session.setAttribute("ses",
application.setAttribute("app",
return
}
public
System.out.println("测试:"+request);
this.request=request;
}
public
System.out.println("测试:"+application);
this.application=application;
}
...省略username的get/set方法
}
同样只需要注册此Action并修改登录页面便可发布测试