action中取得原始的request等

发表时间:2017-05-16 15:42:51 浏览量( 37 ) 留言数( 0 )

学习目标:

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;
	}
}