●在抱怨自己赚钱少之前,先努力,学着让自己值钱。—-我们共勉
为了在业务逻辑层更加独立,Struts2的action放弃了request,response等servletAPI。但是很多时候,不可避免的在action中使用servletAPI。
Struts获取ServletAPI有三种方法:
①通过ActionContext类的静态方法获取
②通过ServletActionContext的静态方法获取
③实现相关的Aware接口
1.通过ActionContext类获取
package com.lee.action;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.StrutsStatics;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
public class LoginAction implements Action{
@Override
public String execute() throws Exception {
//获取session对象,注意是Map类型
Map session=ActionContext.getContext().getSession();
//给session赋值
session.put("key1", "我是key1");
//获取application对象,注意是Map类型
Map application=ActionContext.getContext().getApplication();
//给application赋值
application.put("key2", "我是key2");
//获取request对象,注意写法:get()中必须是“request”
Map request =(Map)ActionContext.getContext().get("request");
//给request赋值
request.put("key3", "我是key3");
return "success";
}
}
上面获取到的三大域都是Map类型的,比如对于request来说,我们通常喜欢获取HttpServletRequest,HttpServletResponse类型的,因为这个类型的request功能要强大得多,用ActionContext也是可以获取的,而且也是我们更常用的一种方式,如下:
//获取HttpServletRequest
HttpServletRequest request = (HttpServletRequest)ActionContext.getContext().get(StrutsStatics.HTTP_REQUEST);
//通过request获取sesssion
HttpSession session = request.getSession();
2.通过ServletActionContext获取
通过ServletActionContext获取的各种对象就是真正的HttpServletContext对象。
public String mydemo2(){
//获取HttpServletRequest
HttpServletRequest request=ServletActionContext.getRequest();
request.setAttribute("aa", "我是aa");
//获取HttpSession
request.getSession().setAttribute("bb", "我是bb");
//获取application
ServletActionContext.getServletContext().setAttribute("cc", "我是cc");
return "success";
}
注意每个域的写法,每个都不一样。
application和request需要一步get(),一步set()。
session需要两步get()和一步set()。
3.实现相关的Aware接口
request 对应RequestAware接口
session 对应SessionAware接口
application对应ApplicationAware接口
struts2在实例化一个action对象时,如果发现他实现了相关的Aware接口,就会把相应的资源通过Aware接口方法注入进去,所以叫做注入方式(IOC方式)。
以request为例,实现了RequestAware接口,就会有一setRequest()方法获取request对象,Aware接口实际上是一种拦截器,他会在执行Action前执行,把相关的servlet对象设置进来。
action代码:
package com.lee.action;
import java.util.Map;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
public class TestAware implements RequestAware,SessionAware,ApplicationAware {
private Map<String, Object> myrequest;
private Map<String, Object> mysession;
private Map<String, Object> myapplication;
@Override
public void setApplication(Map<String, Object> application) {
application.put("aaa", "我是aaa");
this.myapplication=application;
}
@Override
public void setSession(Map<String, Object> session) {
session.put("bbb", "我是bbb");
this.mysession=session;
}
@Override
public void setRequest(Map<String, Object> request) {
request.put("ccc", "我是ccc");
this.myrequest=request;
}
public String execute(){
System.out.println(myrequest);
return "success";
}
}