`

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文档。(可看上面二。 )

 

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    struts2使用request、response

    struts1中使用request、response都是方法自带的,而struts2中的request、response、session都被隐藏的了,该带代码文档会清晰的让你明白struts2中request、response在自定义方法中如何随意使用

    struts1和struts2的区别

    从开发者角度看,就是说需要显示给用户的数据可以直接从Action中获取,而不像Struts1.x那样,必须把相应的Bean存到Page、Request或者Session中才能获取。Struts1.x 必须继承org.apache.struts.action.Action或者其...

    struts2传值

    传值问题 在其中取值的方法有两种: #+映射名, 直接写映射名。 1.不加#的方式获取(所有对象放置在栈顶): a.XXaction中有该字段的成员变量. b.XXaction中该对象返回个给...页面struts2标签保存的数据也需要使用#来获取

    从J2SE到J2EE知识点介绍

    1. struts2的拦截器定义以及使用 153 2. struts标签 160 3. Struts 2 标签库说明及使用 160 4. set 描述 169 5. text 描述 170 6. property 描述 170 7. Struts的异常处理 171 8. Struts的上传与下载 178 五、 ...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    全书分4篇,共24章,其中,第1篇为技能学习篇,主要包括Java Web开发环境、JSP语法、JSP内置对象、Java Bean技术、Servlet技术、EL与JSTL标签库、数据库应用开发、初识Struts2基础、揭密Struts2高级技术、Hib锄劬e...

    getAttribute和getParameter区别.

    即request.getAttribute()方法返回request范围内存在的对象,而request.getParameter()方法是获取http提交过来的数据。 JSP中getParameter与getAttribute有何区别? ——说实话,这个问题当初我也困惑很久,我也知道...

    struts 标签 logic:iterate使用 logic:iterate

    我就是靠这个文档实现logic:iterate的循环的 struts 标签 logic:iterate使用 logic:iterate &lt;br&gt;第一页 是struts官方的说明, 第二页 是个例子 第三页 是我实现的arrayList放入标签的方法。 这是页面...

    Struts_config.xml详解

    parameter="" //指定Actgion的配置参数,在Action类的execute()方法中,可以调用ActionMapping对象的getParameter()方法来读取该配置参数。(相当于初始化赋值) &gt;&gt;&gt; prefix=""// 指定填充当前 Action 关联 FormBean...

    超级有影响力霸气的Java面试题大全文档

    redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。 23、EJB与JAVA BEAN的区别?  Java Bean 是可...

    J2EE应用开发详解

    76 5.5.2 JavaBean动作 78 5.6 隐式对象 78 5.6.1 request对象 78 5.6.2 response对象 78 5.6.3 application对象 78 5.6.4 out对象 79 5.6.5 page对象 79 5.6.6 session对象 79 5.6.7 exception对象 80 5.6.8 ...

    J2EE面试题

    2) 利用JavaMail API发送邮件的过程中,()能获取正确的session对象。 a) Session mailsession=Session.getInstance(); b) Session mailsession=Session.getInstance(objProperties); c) Session mailsession...

    千方百计笔试题大全

    182、Request对象的主要方法 43 183、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串? 43 184、Servlet执行时一般实现哪几个方法? 44 185、getServletContext...

    java面试宝典

    182、Request对象的主要方法 43 183、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串? 43 184、Servlet执行时一般实现哪几个方法? 44 185、getServletContext...

    java面试题

    82. 异常的使用方法 98 83. JAVA代码查错 101 83.1. 判断 101 83.2. 判断 102 83.3. 判断 102 83.4. 判断 102 83.5. 判断 102 83.6. 判断 103 83.7. 判断 103 83.8. 判断 103 83.9. 判断 104 83.10. 判断 104 83.11....

    外文翻译 stus MVC

    For instance, the Struts framework will take fname from request stream and call UserActionForm.setFname(). • The Struts framework updates the state of the UserActionForm before passing it to the ...

    XWork绕过安全限制执行任意命令漏洞补丁

    Struts2中WebWork框架使用XWork基于HTTP参数名执行操作和调用,将每个HTTP参数名处理为OGNL(对象图形导航语言)语句,而OGNL将: user.address.city=Bishkek&user['favoriteDrink']=kumys 转换为: action....

    拦截器和控制器的区别

    1、struts2对servlet封装(request,response) ,资源调配和资源的映射 2、框架设计的思想 istruts 配置,过滤器,反射 istruts.properties 3、starts2的使用思路 1、jar 2、配置文件 3、常用类 ...

    java 面试题 总结

    redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。 20、EJB与JAVA BEAN的区别? Java Bean 是可复用...

Global site tag (gtag.js) - Google Analytics