`

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和session的获取

    本文将深入探讨Struts2中如何获取request和session,以及这两种对象的作用和应用场景。 ### Struts2框架简介 Struts2是基于Java Servlet API的一个开源MVC(Model-View-Controller)框架,它提供了强大的功能来...

    STRUTS2获得session和request

    在探讨STRUTS2框架中如何获取session和request这一核心知识点时,我们首先需要理解STRUTS2框架的运行机制以及session与request在Web开发中的基础概念。 ### STRUTS2框架简介 STRUTS2是Apache软件基金会下的一个...

    Struts2的Action中获得request response session几种方法

    在Struts2框架中,Action类是处理用户请求的核心组件,它负责业务逻辑的执行以及与视图层的交互。为了使Action能够访问到HTTP请求(HttpServletRequest)、响应(HttpServletResponse)、会话(HttpSession)等关键...

    Struts2访问request,session,application的四种方式

    例如,你可以使用`ActionContext.getContext().get("key")`来获取请求或会话中的值,而`ActionContext.getContext().getValueStack()`则可以获取ValueStack,它是Struts2中处理模型驱动的一个关键部分。 2. **...

    struts2使用request、response

    ### Struts2中request与response的使用方法 #### 一、引言 Struts2作为Struts1的后续版本,在架构设计与实现机制上进行了大量的改进。相较于Struts1,Struts2对request、response、session等核心对象的处理方式有所...

    struts2访问request,session,application作用域

    在 Struts2 中,处理用户请求时经常需要使用到 Servlet 的内置对象,比如 Request、Session 和 Application,这些对象可以帮助开发者存储和获取数据。然而,在实际应用中,为了避免代码与 Servlet API 过度耦合,...

    struts2获取response的方法

    总结来说,Struts2提供了多种方式来获取和操作Response对象,包括但不限于通过`ActionSupport`、拦截器、`ActionContext`以及OGNL表达式。这些方法使开发者能灵活地控制HTTP响应,满足各种业务需求。在实际开发中,...

    STRUTS2获得作用域、参数响应对象及三种符号说明

    通过实现特定的接口或使用`ActionContext`和`ServletActionContext`类,开发者可以轻松地获取`request`、`session`和`response`对象。这些工具极大地简化了Web应用程序的开发过程,提高了代码的可维护性和可扩展性。

    jsp获取action传来的session和session清空以及判断.docx

    使用request.getSession()方法可以获取当前请求的session对象,然后可以通过getAttribute()方法获取session中的值,例如:&lt;%=request.getSession().getAttribute("sessionid"); %&gt;。这种方法也可以获取session的值,...

    Struts2 Request Process Procedure

    在请求被处理之前,ActionContext对象会被初始化,它保存了请求和响应的相关信息,如session、request、parameters等,是Action和插件之间通信的重要载体。 4. **加载配置**: 过滤器会加载配置信息,包括Action...

    struts2标签使用方法

    下面我们将详细探讨Struts2标签的使用方法以及EL(Expression Language)表达式。 1. **Struts2标签库**: - **s:textfield**: 用于创建输入字段,可以设置属性如name、value、size、maxlength等。 - **s:...

    struts2 学习重点笔记

    - **自动填充**:Struts2 自动从 request 中获取数据并填充到 Action 对象中。 - **原理**:通过拦截器实现,拦截器会查找与 Action 类中的 setter 方法相匹配的请求参数,并调用这些方法填充数据。 **3.3 数据传递...

    struts1.2增删改查分页Filter Session

    这些参数可以存储在ActionForm中,或者通过Request或Session范围的对象传递。同时,业务逻辑层需要根据这些参数计算出正确的数据范围,并返回给视图层进行展示。 3. Filter(过滤器): Filter在Servlet API中扮演...

    struts2中#号的用法

    本文将详细介绍`#`符号的使用方法及其应用场景,帮助读者更好地理解和掌握Struts2框架的相关知识。 #### 一、Struts2简介 Struts2是基于Struts1的基础上发展起来的一款开源Web应用框架,它使用MVC(Model-View-...

    struts2 ognl的用法

    ### Struts2中OGNL的使用详解 #### 一、OGNL简介 OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取或设置一个对象图中的属性。它在Struts2框架中扮演着极其重要的角色,是Struts2实现...

    Struts2_OGNL

    OGNL(Object-Graph Navigation Language)是Struts2框架中的一个重要组件,用于在Web应用中访问和操作Java对象的属性,调用其方法,以及执行类型转换等操作。 OGNL是对象图导航语言的缩写,它是一种功能强大的...

    struts中自定义的tag的Java类中如何获得session

    通过`pageContext`,我们可以方便地获取到如`request`、`session`、`application`等内置对象,这对于实现自定义标签非常有帮助。 #### 2.2 获取`HttpSession`的具体方法 在自定义标签的Java类中,可以通过以下方式...

    struts2的API耦合与动态方法调用

    2. **ServletActionContext类**:这是ActionContext的一个扩展,提供了更方便的访问Servlet相关对象的方法,如`ServletActionContext.getRequest()`和`ServletActionContext.getResponse()`分别用于获取...

Global site tag (gtag.js) - Google Analytics