struts2 获取session中的action如何获取jsp设置的session

2011年3月 Java大版内专家分月排行榜第三
2012年1月 Java大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。本帖子已过去太久远了,不再提供回复功能。Struts 中获取session、request及response对象的方法 - 佐岸_念之风景 - ITeye博客
博客分类:
我们平常所说的session一般是HttpSession,但在struts2中被封装成了Map类型。
这个map对象里面可以存放键值对,而且我们可以在前台页面中通过相应的表达式将值取出来,如何在Action中获取session呢?下面是一些常用的方法:
1、获取session
Map session = ActionContext.getContext().getSession();
session.put("userName",userName);
ActionContext.getContext().getSession().remove(key);
2、获取HttpSession
ServletActionContext.getRequest().getSession();
3、获取HttpRequest
ServletActionContext.getRequest();
4、获取HttpResponse
ServletActionContext.getResponse()
也可以采用下面的代码段:
ActionContext ctx = ActionContext.getContext();
HttpServletRequest request = (HttpServletRequest)ctx.get(ServletActionContext.HTTP_REQUEST);
HttpServletResponse response = (HttpServletResponse)ctx.get(ServletActionContext.HTTP_RESPONSE);
采用实现接口的方式进行获取:
public class BaseAction extends ActionSupport implements SessionAware, ServletRequestAware, ServletResponseAware {
ActionContext context = ActionContext.getContext();
HttpServletR
HttpServletR
//获取request,response,session方式一,非IoC方式,不用实现SessionAware, ServletRequestAware, ServletResponseAware
//ActionContext context = ActionContext.getContext();
//HttpServletRequest request = (HttpServletRequest) context.get(ServletActionContext.HTTP_REQUEST);
//HttpServletResponse response = (HttpServletResponse) context.get(ServletActionContext.HTTP_RESPONSE);
//Map session = context.getSession();
//SessionMap session = (SessionMap) context.get(ActionContext.SESSION);
//获取request,response,session方式一,IoC方式,必须实现SessionAware, ServletRequestAware, ServletResponseAware
public void setSession(Map map) {
this.session = (SessionMap)
public void setServletRequest(HttpServletRequest request) {
this.request =
public void setServletResponse(HttpServletResponse response) {
this.response =
结合实际的应用:
平时我们在action中要把值设进session然后在jsp页面去的话,一般是这样(struts2不行):
public String findAllUsers() throws Exception {
List&User& userList = userService.findAllUsers();
HttpSession se = request.getSession();
se.setAttribute("userList", userList);
return SUCCESS;
在struts2中,设进session的话则应该变成这样了,因为session是一个map类型:
public String findAllUsers() throws Exception {
List&User& userList = userService.findAllUsers();
session.put("userList", userList);
//request.setAttribute("userList", userList);
return SUCCESS;
如果直接到jsp页面的话,一般推荐用request而不用session,多人单机同时操作的话保险一点,虽然一个浏览器同一时间只有一个session。
在前台jsp页面取值可以采用如下所示的方式:
&table class="table_report"&
&th&用户ID&/th&
&th&用户名称&/th&
&th&用户性别&/th&
&th&用户年龄&/th&
&th&用户地址&/th&
&th&用户电话&/th&
&th&用户邮箱&/th&
&!-- struts2最正规的取值方式 --&
&s:iterator id="user" value="%{#session.userList}"&--%&
&s:iterator id="user" value="#session.userList"&
&s:iterator id="user" value="#request.userList"&--%&
&td&${user.id}&/td&
&td&${user.name}&/td&
&td&${user.sex}&/td&
&td&${user.age}&/td&
&td&${user.address}&/td&
&td&${user.phone}&/td&
&td&${user.email}&/td&
&/s:iterator&
&%-- 用完要清空 --%&
&%request.removeAttribute("userList");%&
&%--&%session.removeAttribute("userList");%&--%&
[/size][/size][/size]
浏览: 32263 次
来自: 武汉
idealwangqing 写道idealwangqing 写 ...
idealwangqing 写道/*全选*/for(var i ...
/*全选*/for(var i=0; i&boxs.le ...
zhenglongfei 写道反选和全选只需要设置checke ...
反选和全选只需要设置checked值为true false 就 ...13218人阅读
1. ActionContext
在Struts2开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话(Session)的一些信息,甚至需要直接对JavaServlet Http的请求(HttpServletRequest),响应(HttpServletResponse)操作. 我们需要在Action中取得request请求参数"username"的值:
ActionContext context = ActionContext.getContext();Map params = context.getParameters();String username = (String) params.get("username");on执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个Map而已),它存放的是Action在执行时需要用到的对象. 一般情况, 我们的ActionContext都是通过: ActionContext context = (ActionContext) actionContext.get();来获取的.我们再来看看这里的actionContext对象的创建:
static ThreadLocal actionContext = new ActionContextThreadLocal();
ActionContextThreadLocal是实现ThreadLocal的一个内部类.ThreadLocal可以命名为"线程局部变量",它为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突.这样,我们ActionContext里的属性只会在对应的当前请求线程中可见,从而保证它是线程安全的.
通过ActionContext取得HttpSession: Map session = ActionContext.getContext().getSession();
2. ServletActionContext
ServletActionContext(com.opensymphony.webwork. ServletActionContext),这个类直接继承了我们上面介绍的ActionContext,它提供了直接与Servlet相关对象访问的功能,它可以取得的对象有:
(1)javax.servlet.http.HttpServletRequest : HTTPservlet请求对象
(2)javax.servlet.http.HttpServletResponse : HTTPservlet相应对象
(3)javax.servlet.ServletContext : Servlet上下文信息
(4)javax.servlet.ServletConfig : Servlet配置对象
(5)javax.servlet.jsp.PageContext : Http页面上下文
如何从ServletActionContext里取得Servlet的相关对象:
&1&取得HttpServletRequest对象: HttpServletRequest request = ServletActionContext. getRequest();
&2&取得HttpSession对象: HttpSession session = ServletActionContext. getRequest().getSession();
3. ServletActionContext和ActionContext联系
ServletActionContext和ActionContext有着一些重复的功能,在我们的Action中,该如何去抉择呢?我们遵循的原则是:如果ActionContext能够实现我们的功能,那最好就不要使用ServletActionContext,让我们的Action尽量不要直接去访问Servlet的相关对象.
注意:在使用ActionContext时有一点要注意: 不要在Action的构造函数里使用ActionContext.getContext(),因为这个时候ActionContext里的一些值也许没有设置,这时通过ActionContext取得的值也许是null;同样,HttpServletRequest req = ServletActionContext.getRequest()也不要放在构造函数中,也不要直接将req作为类变量给其赋值。至于原因,我想是因为前面讲到的static ThreadLocal actionContext = new ActionContextThreadLocal(),从这里我们可以看出ActionContext是线程安全的,而ServletActionContext继承自ActionContext,所以ServletActionContext也线程安全,线程安全要求每个线程都独立进行,所以req的创建也要求独立进行,所以ServletActionContext.getRequest()这句话不要放在构造函数中,也不要直接放在类中,而应该放在每个具体的方法体中(eg:login()、queryAll()、insert()等),这样才能保证每次产生对象时独立的建立了一个req。
4. struts2中获得request、response和session
(1)非IoC方式
方法一:使用org.apache.struts2.ActionContext类,通过它的静态方法getContext()获取当前Action的上下文对象。
ActionContext ctx = ActionContext.getContext();
ctx.put("liuwei", "andy"); //request.setAttribute("liuwei", "andy"); Map session = ctx.getSession(); //session
HttpServletRequest request = ctx.get(org.apache.struts2.StrutsStatics.HTTP_REQUEST); HttpServletResponse response = ctx.get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE);细心的朋友可以发现这里的session是个Map对象, 在Struts2中底层的session都被封装成了Map类型. 我们可以直接操作这个Map对象进行对session的写入和读取操作, 而不用去直接操作HttpSession对象.
方法二:使用org.apache.struts2.ServletActionContext类
public class UserAction extends ActionSupport { &&&& &&& //其他代码片段 &&&& &&& private HttpServletR // private HttpServletRequest req = ServletActionContext.getRequest(); 这条语句放在这个位置是错误的,同样把这条语句放在构造方法中也是错误的。
&&& public String login() { &&&&&&& req = ServletActionContext.getRequest(); //req的获得必须在具体的方法中实现 &&&&&&& user = new User(); &&&&&&& user.setUid(uid); &&&&&&& user.setPassword(password); &&&&&&& if (userDAO.isLogin(user)) { &&&&&&&&&&& req.getSession().setAttribute("user", user); &&&&&&&&&&& return SUCCESS; &&&&&&& } &&&&&&& return LOGIN; &&& } &&& public String queryAll() { &&&&&&& req = ServletActionContext.getRequest(); //req的获得必须在具体的方法中实现 &&&&&&& uList = userDAO.queryAll(); &&&&&&& req.getSession().setAttribute("uList", uList); &&&&&&& return SUCCESS; &&& } &&&& &&& //其他代码片段 }(2)IoC方式(即使用Struts2 Aware拦截器)
要使用IoC方式,我们首先要告诉IoC容器(Container)想取得某个对象的意愿,通过实现相应的接口做到这点。
public class UserAction extends ActionSupport implements SessionAware, ServletRequestAware, ServletResponseAware {
&&& private HttpServletR &&& private HttpServletR
&&& public void setServletRequest(HttpServletRequest request) { &&&&&&& this.request = &&& }
&&& public void setServletResponse(HttpServletResponse response) { &&&&&&& this.response = &&& }
&&& public String execute() { &&&&&&& HttpSession session = request.getSession(); &&&&&&& return SUCCESS; &&& } }
本文来自CSDN博客,转载请标明出处:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:101551次
排名:千里之外
原创:17篇
评论:18条
(1)(3)(4)(1)(2)(3)(8)(2)(2)为避免与Servlet API耦合在一起,方便Action类做单元测试.
Struts2对HttpServletRequest、HttpSession、ServletContext进行了封装,构造了三个Map对象来替代这三种对象。
注意,这三个对象与Servlet API中的三个对象是相同的。
即,在Action中放入Session中信息,在JSP页面中是可以读出来的。
方式一:通过使用ActionContext类获取
在Struts2框架中,通过Action的执行上下文类ActionContext,可以获取request/session/application对象。
ActionContext对象本身就是request范围的存储空间。
所以,对于向request范围中添加属性,直接向ActionContext对象中添加即可。
ActionContext ctx = ActionContext.getContext();Map&String,Object& application = ctx.getApplication();
Map&String,Object& session = ctx.getSession();
application.put(&app&, &应用范围&);
//往ServletContext里放入app
session.put(&ses&, &session范围&);
//往session里放入ses
ctx.put(&req&, &request范围&);
//往request里放入req
代码文档目录如下:
&index.jsp源码如下:
&%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%&
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
&!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&
&base href="&%=basePath%&"&
&title&My JSP 'index.jsp' starting page&/title&
&meta http-equiv="pragma" content="no-cache"&
&meta http-equiv="cache-control" content="no-cache"&
&meta http-equiv="expires" content="0"&
&meta http-equiv="keywords" content="keyword1,keyword2,keyword3"&
&meta http-equiv="description" content="This is my page"&
&link rel="stylesheet" type="text/css" href="styles.css"&
This is my JSP page. &br&
&show.jsp源码如下:
&%@ page pageEncoding="utf-8" isELIgnored="false"%&
&title&show page&/title&
application中的app=${applicationScope.app}&br/&
session中的ses=${sessionScope.ses}&br/&
request中的req=${requestScope.req}
& ScopeTestAction.java源码如下:
import java.util.M
import com.opensymphony.xwork2.ActionC
public class ScopeTestAction {
public String execute(){
ActionContext ctx=ActionContext.getContext();
Map&String,Object& application=ctx.getApplication();
Map&String,Object& session=ctx.getSession();
application.put("app","app scope");
session.put("ses","ses scope");
//request中放入属性req
ctx.put("req", "req scope");
return "success";
&web.xml配置如下:
&?xml version="1.0" encoding="UTF-8"?&
&web-app version="2.5"
xmlns="/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="/xml/ns/javaee
/xml/ns/javaee/web-app_2_5.xsd"&
&filter-name&struts2&/filter-name&
&filter-class&org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter&/filter-class&
&filter-mapping&
&filter-name&struts2&/filter-name&
&url-pattern&/*&/url-pattern&
&/filter-mapping&
&welcome-file-list&
&welcome-file&index.jsp&/welcome-file&
&/welcome-file-list&
&/web-app&
struts.xml配置如下:
&?xml version="1.0" encoding="UTF-8" ?&
&!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"&
&package name="one" extends="struts-default"&
&action name="scope" class="actions.ScopeTestAction"&
&result&/show.jsp&/result&
&/package&
&部署发布,启动tomcat,输入地址:
http://127.0.0.1:8080/request_session_application/scope.action
运行截图如下:
&方式二:通过实现特定接口来获取
通过让Action实现特定接口,也可获取request/session/application对象。
&RequestAware接口:该接口中只有一个方法
&&& public void setRequest(Map&String,Object& request)
&SessionAware接口:该接口中只有一个方法
&&& public void setSession (Map&String,Object& session)
&ApplicationAware接口:该接口中只有一个方法
&&& public void setApplication (Map&String,Object& application)
只要在Action中以如下的形式定义好相应的对象:
&&&&&&&&&&& Map&String,Object&
并以如下的方式实现特定接口中的方法:
&&&&&&&&&&& this.request =
那么,在Action方法中(如execute方法)就可使用相应的对象了。
对这些对象的访问:
在各范围中放入属性后,在页面中即可通过EL表达式将其值读出来了。
&&& ${requestScope.req}&& &br/&
&&& ${sessionScope.ses}&& &br/&
&&& ${applicationScope.app}
实例:在Action中获取request/session/application&scopetest
Step1:编写ScopeTestAction与ScopeTestAction2类,来实现使用两种方式的添加相应习属性的功能
Step2:编写web.xml与struts.xml
Step3:编写show.jsp
在上面的基础上新建ScopeTestAction2.java
完成源码如下:
import java.util.M
import org.apache.struts2.interceptor.ApplicationA
import org.apache.struts2.interceptor.RequestA
import org.apache.struts2.interceptor.SessionA
public class ScopeTestAction2 implements RequestAware, SessionAware,ApplicationAware {
private Map&String,Object&
private Map&String,Object&
private Map&String,Object&
public void setRequest(Map&String, Object& request) {
this.request =
public void setSession(Map&String, Object& session) {
this.session =
public void setApplication(Map&String, Object& application) {
this.application =
public String execute(){
application.put("app","app scope");
session.put("ses","ses scope");
//request中放入属性req
request.put("req", "req scope");
return "success";
&修改后struts.xml文件如下:
&?xml version="1.0" encoding="UTF-8" ?&
&!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"&
&package name="one" extends="struts-default"&
&action name="scope" class="actions.ScopeTestAction"&
&result&/show.jsp&/result&
&action name="scope2" class="actions.ScopeTestAction2"&
&result&/show.jsp&/result&
&/package&
重新部署发布,启动tomcat,输入地址:
http://127.0.0.1:8080/request_session_application/scope2.action
阅读(...) 评论()

我要回帖

更多关于 struts2中获取session 的文章

 

随机推荐