学习目标:
1、了解Struts获得原始的request、response的信息
学习过程:
在前面的例子中我们知道,struts2中要获得页面的传值,只需要在Action类中定义一个全局变量,然后给予get/set方法,那么页面的值就会自动绑定,不需要使用原始的request方法。这是struts2最好用的功能之一了。但是在有些情况之下我们还是需要用到原始的request、response和session的。所以这里我们讲讲如何获得这三个对象,一般来说有两种方法。
一、第一种方法
如果我们只是在一个方法中获得这些对象,那么我是可是使用ServletActionContext类。我们可以新建一个GoodsAction类,同时新建一个方法addgoods,实现代码如下:
/**
* 如何获得原始的request和response session 两种方法
*/
public class GoodsAction extends ActionSupport{
public String addgoods() {
//第一种方式
HttpServletRequest request=ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
HttpSession session = request.getSession();
String gname = request.getParameter("gname");
System.out.println(gname);
return SUCCESS;
}
}
struts.xml的配置文件如下:
<action name="addgoods" class="com.action.GoodsAction" method="addgoods">
<result name="success">/success.jsp</result>
</action>
在index.jsp中新建一个超链接测试。注意看后台输出。
<a href="addgoods.action?gname=cookie">添加商品</a>
后台应该会输出:cookie。证明后台是可以获得页面传过来的值的,也就是我们的request是可以正常使用的。
二、第二种方法
第一种方法比较适合在一个方法中使用,如果这个类的全部方法都会使用,那么可以把request、response和session声明为全局变量,然后实现相关的接口,织入这些对象。实现代码如下:
/**
* 如何获得原始的request和response session 两种方法
*/
public class GoodsAction extends ActionSupport implements ServletRequestAware,
ServletResponseAware, SessionAware {
protected HttpServletRequest request;
protected HttpServletResponse response;
protected Map<String, Object> session;//这个地方要注意
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
public void setSession(Map<String, Object> session) {
this.session = session;
}
public String addgoods() {
String gname = request.getParameter("gname");
System.out.println(gname);
return SUCCESS;
}
}
你可以重启启动项目后,再次测试,后台还是可以打印gname的数据。
在这里有一点需要特别注意的,就是struts2对HttpSession封装成为一个Map对象,所以在我们定义的是一个Map<String, Object> 类型来保持session的对象。
三、封装BaseAction
如果有好几个Action都需要用到这三个对象,每个Action都实现这三个对象,确实又有点麻烦,我们可以封装一个BaseAction实现这个三个接口,如果那个Action需要用到这三个对象,直接继承BaseAction就可以了。BaseAction类代码如下:
public class BaseAction extends ActionSupport implements ServletRequestAware,
ServletResponseAware, SessionAware {
protected HttpServletRequest request;
protected HttpServletResponse response;
protected Map<String, Object> session;
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
public void setSession(Map<String, Object> session) {
this.session = session;
}
}
GoodsAction可以修改成为这样了:
/**
* 如何获得原始的request和response session 两种方法
*/
public class GoodsAction extends BaseAction{
public String addgoods() {
String gname = request.getParameter("gname");
System.out.println(gname);
return SUCCESS;
}
}