在上一次笔记中我记录了,action来获取前台页面发送过来的params。
有两种方法 ,第一种是在action中定义所有我们需要使用到的属性,给它们增加get/set方法,当请求到达的时候,struts2的拦截器就会自动将这个属性的value赋到param上。
第二种方法是使用复合式的方式。例如我们的前台经常会传来用户的信息,那么我们就可以先定义一个类——user,将所有的user属性添加ok后,在action中定义user,添加get/set方法,前台使用user.name的方式来传递。
今天我要记录的是:action中我们来访问servletAPI,所有用过jsp,servlet的人肯定对application,session,request,response,cookie,pageContex,servletContext等非常熟悉,那么在action中我们怎么才能访问这些ServletAPI呢?
struts2为我们提供一个ActionContext类,因为struts2为了避免与servlet的耦合,所以它认为直接调用servletAPI是一种不安全的方法,提供ActionContext类,我们通过这个类就可以访问servletAPI了。
public class ServletapiAction {
public String execute(){
ActionContext act = ActionContext.getContext();
Map<String, Object> application = act.getApplication();
Map<String, Object> session = act.getSession();
act.put("request", "request");
application.put("application", "application");
session.put("session", "session");
return "success";
}
}
从这里我们可以看到ActionContext的getContext是为了获取系统的ActionContext实例
之后我们使用getApplication,getSession , 方法来获取application和session,当然细心的看我们发现方法的返回值并不是HttpServletContext等,而是一个Map,所以理所当然getAttribute和setAttribute方法变成了get和put方法。
当我们直接用act的get和put方法时,就相当于调用request的方法。
success页面我们就可以:
<body>
application:${applicationScope.application }<br/>
session:${sessionScope.session }<br/>
request:${requestScope.request }
</body>
获取值。
从这里其实我们可以看出一些端倪,这里的返回值是一个Map类型,他并不是request等,所以request的一些方法,他是无法使用的,那么是否有办法真正的使用到ServletAPI呢,当然。
struts为我们准备了ServletActionContext类,通过这个类我们就可以得到真正的HttpServletRequest。
public String otherFunction(){
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
HttpServletResponse response = ServletActionContext.getResponse();
ServletContext application = ServletActionContext.getServletContext();
return "success";
}
之后就和我们的servlet中的用法相同了。
当然还有其他的办法,当时上面这种事使用最多的,所以其他就暂时记录了。
当然我们这里要注意,为什么struts既要支持ActionContext类又要支持ServletActionContext类,一个ServletActionContext不就搞定了吗?
其实不然,上面也说了避免耦合。当我们只是为了在servlet的这几个范围中放入我们要放入的值时,建议使用ActionContext,这样更专业。