struts2 获取 session 与 request 对象 以及用法

一。

在struts2中,request和session都被隐藏了
struts提供两种方式访问session和request,其中比较常用的是利用SPRING里面所说的IOC即控制反转

IOC方式:
action类实现ServletRequestAware接口,并新建一个HttpServletRequest request

public class UserLoginAction extends ActionSupport implements
		ServletRequestAware {
	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}
}
 


 然后可以生成的request得到对象,如request.getRemoteAddr()
action类实现SessionAware接口,并创建一个MAP对象session

public class UserLoginAction extends ActionSupport implements
		ServletRequestAware, SessionAware {
	
	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}

	public void setSession(Map session) {
		this.session = session;
	}
}
 


非IOC方式
这种方式主要是利用了com.opensymphony.xwork2.ActionContext类以及org.apache.struts2.ServletActionContext类,具体的方法如下所示。
获得request对象:

//A.
HttpServletRequest request = ServletActionContext.getRequest ();
//B.
ActionContext ct= ActionContext.getContext()
   HttpServletRequest request=
(HttpServletRequest)ct.get(ServletActionContext. HTTP_REQUEST );
 


获得session对象:
在Struts2中底层的session都被封装成了Map类型,我们称之为SessionMap,而平常我们所说的session则是指HttpSession对象,具体的获得方法如下所示。

//A.
Map session=ActionContext.getSession();
//B.
Map session=(Map)ActionContext.getContext().get(ActionContext.SESSION);
 


得到这个SessionMap之后我们就可以对session进行读写了,如果我们想得到原始的HttpSession可以首先得到 HttpServletRequest对象,然后通过request.getSession()来取得原始的HttpSession对象。一般情况下 SessionMap已经可以完成所有的工作,我们不必再去碰底层的session了。

 

 

二。

非IoC方式

  要获得上述对象,关键Struts 2 .0中com.opensymphony.xwork2 .ActionContext类。我们可以通过它的静态方法getContext()获取当前 Action的上下文对象。 另外,org.apache.struts 2 .ServletActionContext作为辅助类(Helper Class),可以帮助您快捷地获得这几个对象。

HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
HttpSession session = request.getSession();
 

 

  如果你只是想访问session 的属性(Attribute),你也可以通过ActionContext.getContext().getSession()获取或添加session 范围(Scoped)的对象。


 

例6 classes/tutorial/NonIoCServlet.java

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class NonIoCServlet extends ActionSupport {
	private String message;

	public String getMessage() {
		return message;
	}

	@Override
	public String execute() {
		ActionContext.getContext().getSession().put("msg",
				"Hello World from Session!");

		HttpServletRequest request = ServletActionContext.getRequest();
		HttpServletResponse response = ServletActionContext.getResponse();
		HttpSession session = request.getSession();

		StringBuffer sb = new StringBuffer("Message from request: ");
		sb.append(request.getParameter("msg"));
		sb.append("<br>Response Buffer Size: ");
		sb.append(response.getBufferSize());
		sb.append("<br>Session ID: ");
		sb.append(session.getId());

		message = sb.toString();
		return SUCCESS;
	}
}
 
IoC方式
要使用IoC方式 ,我们首先要告诉IoC容器(Container)想取得某个对象的意愿,通过实现相应的接口做到这点。具体实现,请参考例6 IocServlet.java。

例6 classes/tutorial/IoCServlet.java

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class IoCServlet extends ActionSupport implements SessionAware,
		ServletRequestAware, ServletResponseAware {
	private String message;
	private Map att;
	private HttpServletRequest request;
	private HttpServletResponse response;

	public String getMessage() {
		return message;
	}

	public void setSession(Map att) {
		this.att = att;
	}

	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}

	public void setServletResponse(HttpServletResponse response) {
		this.response = response;
	}

	@Override
	public String execute() {
		att.put("msg", "Hello World from Session!");

		HttpSession session = request.getSession();

		StringBuffer sb = new StringBuffer("Message from request: ");
		sb.append(request.getParameter("msg"));
		sb.append("<br>Response Buffer Size: ");
		sb.append(response.getBufferSize());
		sb.append("<br>Session ID: ");
		sb.append(session.getId());

		message = sb.toString();
		return SUCCESS;
	}
}
 

例6 Servlet.jsp

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
    <title>Hello World!</title>
</head>
<body>
    <h2>
        <s:property value="message" escape="false"/>
        <br>Message from session: <s:property value="#session.msg"/>
    </h2>
</body>
</html>
 

 

例6 classes/struts .xml中NonIocServlet和IoCServlet Action的配置

<action name="NonIoCServlet" class="tutorial.NonIoCServlet">
<result>/Servlet.jsp</result>
</action>
<action name="IoCServlet" class="tutorial.IoCServlet">
<result>/Servlet.jsp</result>
</action>
 


  运行Tomcat,在浏览器地址栏中键入http://localhost:8080/Struts 2 _Action/NonIoCServlet.action?msg=Hello%2 0World! 或http://localhost:8080/Struts 2 _Action/IoCServlet.action?msg=Hello%2 0World!,出现如图7所示页面。


  在Servlet.jsp中,我用了两次property标志,第一次将escape设为false为了在JSP中输出<br>转 行,第二次的value中的OGNL为“#session .msg”,它的作用与session .getAttribute("msg")等同。


三。

 

通过com.opensymphony.xwork2.ActionContext取
如先获取request
HttpServletRequest request = (HttpServletRequest)ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE);
那么取session就和struts1一样了
HttpSession session = request.getSession();

操作都一样的

另外在action 内往session中保存数据,可以直接用下面的方法:
ActionContext.getContext().getSession().put(key, value)
key  object型
value object型

 

四。ActionContext

 

Struts2中的Action并没有和任何Servlet API耦合,这样框架更具灵活性,更易测试。
但是,对于web应用的控制器而言,不访问Servlet API几乎是不可能的,例如跟踪HTTP Session状态等。Struts2框架提供了一种更轻松的方式来访问Servlet API。Struts2中提供了一个ActionContext类(当前Action的上下文对象),通过这个类可以访问Servlet API。下面是该类中提供的几个常用方法:

 public static ActionContext getContext() //:获得当前Action的ActionContext实例。
 public Object get(Object key) //:此方法类似于调用HttpServletRequest的getAttribute(String name)方法。
 public void put(Object key, Object value)// :此方法类似于调用HttpServletRequest 的setAttribute(String name, Object o)。
 public Map getParameters() //:获取所有的请求参数。类似于调用HttpServletRequest对象的getParameterMap() 方法。
 public Map getSession() //:返回一个Map对象,该Map对象模拟了HttpSession实例。
 public void setSession(Map session)// : 直接传入一个Map实例,将该Map实例里的key-value对转换成session的属性名-属性值对。
 public Map getApplication()// :返回一个Map对象,该对象模拟了该应用的ServletContext实例。
 public void setApplication(Map application) // :直接传入一个Map实例,将该Map实例里的key-value对转换成application的属性名-属性值对。

 Struts2 中通过ActionContext来访问Servlet API,让Action彻底从Servlet API 中分离出来,最大的好处就是可以脱离Web容器测试Action。
       另外,Struts2中还提供了一个ServletActionContext类,Action只要继承自该类,就可以直接访问Servlet API。具体方法参看struts2的API文档。(可看上面二。 )

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值