与Servlet API解耦的访问方式
为了避免与 Servlet API 耦合在一起, 方便 Action 做单元测试,Struts2 对 HttpServletRequest, HttpSession和 ServletContext进行了封装, 构造了 3 个 Map 对象来替代这 3 个对象, 在 Action 中可以直接使用 HttpServletRequest, HttpSession, ServletContext对应的 Map 对象来保存和读取数据.
访问request/session/application对象
方法一:通过ServletActionContext类直接获取
ActionContext是Action 执行的上下文对象, 在ActionContext中保存了Action 执行所需要的所有对象, 包括parameters, request, session,application 等.
获取HttpServletRequest对应的Map 对象:
public Object get(Object key): ActionContext类中没有提供类似getRequest() 这样的方法来获取HttpServletRequest对应的Map 对象. 要得到HttpServletRequest对应的Map 对象, 可以通过为 get() 方法传递 “request” 参数实现
获取HttpSession对应的Map 对象:
public Map getSession()
获取ServletContext对应的Map 对象:
public Map getApplication()
publicString test(){
HttpServletRequestrequest=ServletActionContext.getRequest();
HttpServletResponse response=ServletActionContext.getResponse();
HttpSession session=request.getSession();
ServletContextservletContext=ServletActionContext.getServletContext();
return"success";
}
如果你只是想访问session的属性(Attribute),
你也可以通过ActionContext.getContext().getSession()获取
@Override
public String execute() throws Exception {
HttpServletRequest request=ServletActionContext.getRequest();
HttpServletResponse response=ServletActionContext.getResponse();
Map sessionMap=ServletActionContext.getContext().getSession();
ServletContext sc=ServletActionContext.getServletContext();
request.setAttribute("username", "username_request");
sessionMap.put("username", "username_session");
sc.setAttribute("username", "username_application");
System.err.println("ssssssssssss");
return "attr";
}
方法二:实现指定接口,由struts框架运行时注入:
Action类通过可以实现某些特定的接口,
让Struts2
框架在运行时向 Action
实例注入parameters, request, session
和 application
对应的 Map 对象:
importorg.apache.struts2.interceptor.ServletRequestAware;
importorg.apache.struts2.interceptor.ServletResponseAware;
importorg.apache.struts2.interceptor.SessionAware;
importorg.apache.struts2.util.ServletContextAware;
publicclass ContextAction02 extendsActionSupport implementsServletRequestAware,
ServletResponseAware,ServletContextAware,SessionAware {
privateHttpServletRequestrequest;
privateServletContextservletContext;
privateHttpServletResponseresponse;
privateMap<String, Object> session;
publicString test(){
System.out.println(" request "+request);
System.out.println(" servletContext "+servletContext);
System.out.println(" response "+response);
System.out.println(" session "+session);
return "success"; }
publicvoidsetServletRequest(HttpServletRequest request) {
this.request=request;}
publicvoidsetServletResponse(HttpServletResponse response) {
this.response=response;}
publicvoidsetServletContext(ServletContext context) {
this.servletContext=context;}
publicvoidsetSession(Map<String, Object> session){
this.session=session;}
}
public class ContextAction02 extends ActionSupport
implements ServletRequestAware, ServletResponseAware, ServletContextAware, SessionAware{
HttpServletRequest request;
HttpServletResponse response;
Map sessionMap;
ServletContext sc;
public String test(){
System.out.println("ContextAction *********** test()");
request.setAttribute("username", "username_request");
sessionMap.put("username", "username_session");
sc.setAttribute("username", "username_application");
return "attr";
}
public void setSession(Map<String, Object> session) {
this.sessionMap = session;
}
public void setServletContext(ServletContext context) {
this.sc = context;
}
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
}
访问request/session/application对象中的属性
Action中
publicclassContextActionAttrextendsActionSupport {
publicString test(){
ServletActionContext.getServletContext().setAttribute("username", "username_servletContext");
ServletActionContext.getRequest().setAttribute("username", "username_requst");
ServletActionContext.getContext().getSession().put("username", "username_sesson");
return"attr";
}
}
JSP页面:
<body>
${applicationScope.username} <br>
${sessionScope.username}<br>
${requestScope.username}<br>
</body>