struts2学习(11)——action访问ServletAPI

在上一次笔记中我记录了,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,这样更专业。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章