Struts2中ActionContext介绍

来源:http://blog.csdn.net/alex197963/article/details/2219912

在Web应用程序开发中,除了将请求参数自动设置到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");
ActionContext(com.opensymphony.xwork.ActionContext)是Action执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个Map而已),它存放的是Action在执行时需要用到的对象。


一般情况,我们的ActionContext都是通过:

ActionContext context = (ActionContext) actionContext.get();

来获取的(详细见ActionContext.class)。我们再来看看这里的actionContext对象的创建:

static ThreadLocal actionContext = new ActionContextThreadLocal();

ActionContextThreadLocal是实现ThreadLocal的一个内部类。ThreadLocal可以命名为“线程局部变量”,它为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。这样,我们ActionContext里的属性只会在对应的当前请求线程中可见,从而保证它是线程安全的。
下面我们看看怎么通过ActionContext取得我们的HttpSession:

Map session = ActionContext.getContext().getSession();


ServletActionContext
ServletActionContext(com.opensymphony.webwork. ServletActionContext),这个类直接继承了我们上面介绍的ActionContext,它提供了直接与JavaServlet相关对象访问的功能,它可以取得的对象有:
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里取得JavaServlet的相关对象:
1, 取得HttpServletRequest对象:

HttpServletRequest request = ServletActionContext. getRequest();
2, 取得HttpSession对象:
HttpSession session = ServletActionContext. getRequest().getSession();
ServletActionContext和ActionContext有着一些重复的功能,在我们的Action中,该如何去抉择呢?

我们遵循的原则是:如果ActionContext能够实现我们的功能,那最好就不要使用ServletActionContext,让我们的Action尽量不要直接去访问JavaServlet的相关对象。

在使用ActionContext时有一点要注意:不要在Action的构造函数里使用ActionContext.getContext(),因为这个时候ActionContext里的一些值也许没有设置,这时通过ActionContext取得的值也许是null。


如果我要取得Servlet API中的一些对象,如request,response或session等,应该怎么做?这里的execute不像Struts 1.x的那样在参数中引入。开发Web应用程序当然免不了跟这些对象打交道。在Strutx 2.0你可以有两种方式获得这些对象:非IoC(控制反转Inversion of Control)方式和IoC方式。

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

HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
HttpSession session = request.getSession();
 如果你只是想访问session的属性(Attribute),你也可以通过ActionContext.getContext().getSession() 获取或添加session范围(Scoped)的对象。

NonIoCServlet.java

package tutorial;
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)想取得某个对象的意愿,通过实现相应的接口做到这点。具体实现,请参 IocServlet.java。
IoCServlet.java

package tutorial;
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; 
}publicvoid setSession(Map att) {
this.att = att;
}publicvoid setServletRequest(HttpServletRequest request) {
this.request = request;
}publicvoid 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;
}
}


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>
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/Struts2_Action/NonIoCServlet.action?msg=Hello%20World! 或http://localhost:8080/Struts2_Action/IoCServlet.action?msg=Hello%20World!
 在Servlet.jsp中,我用了两次property标志,第一次将escape设为false为了在JSP中输出<br>转行,第二次的value中的OGNL为"#session.msg",它的作用与session.getAttribute("msg")等同.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498068.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

delphi excel取批注所在的行列_excel技巧教程丨34个常用Excel小技巧,助你玩转职场!...

技巧1&#xff1a;单元格内强制换行在单元格中某个字符后按alt回车键&#xff0c;即可强制把光标换到下一行中。技巧2&#xff1a;锁定标题行选取第2行&#xff0c;视图 - 冻结窗格 - 冻结首行(或选取第2行 - 冻结窗格)冻结后再向下翻看时标题行始终显示在最上面。技巧3&#x…

Spring Security用户认证和权限控制(默认实现)

1 背景 实际应用系统中&#xff0c;为了安全起见&#xff0c;一般都必备用户认证&#xff08;登录&#xff09;和权限控制的功能&#xff0c;以识别用户是否合法&#xff0c;以及根据权限来控制用户是否能够执行某项操作。 Spring Security是一个安全相关的框架&#xff0c;能…

2017年数据可视化的七大趋势!

来源&#xff1a; 全球人工智能 概要&#xff1a;随着科技的不断进步与新设备的不断涌现&#xff0c;数据可视化领域目前正处在飞速地发展之中。 随着科技的不断进步与新设备的不断涌现&#xff0c;数据可视化领域目前正处在飞速地发展之中。ProPublica的调查记者兼开发者Lena…

python中for语句涉及的序列可以是关系表达式吗_为什么我可以在Python for循环中为迭代器和序列使用相同的名称?...

x告诉我们什么&#xff1a;Python 3.4.1 (default, May 19 2014, 13:10:29)[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwinType "help", "copyright", "credits" or "license" for more information.>>>…

struts2中用interceptor实现权限控制

在jsp servlet中我们通常使用Servlet Filter控制用户是否登入&#xff0c; 是否有权限转到某个页面。在struts2中我们应该会想到他的拦截器(Interceptor)&#xff0c; Interceptor在struts2中起着非常重要的作用。很多struts2中的功能都是使用Interceptor实现的。 需求&#xf…

Java实现xml与map互转

此文档中包含单层和多层嵌套情况下&#xff0c;xml和map集合进行互转&#xff0c;具体代码如下&#xff1a; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry;import org.dom4j.Document; import org.dom4j.DocumentExce…

CGAL的三维点集

CGAL提供了几种处理点集的算法&#xff0c;从形状检测到通过标准点集处理工具进行的表面重建。 虽然这些算法不强制使用特定的数据结构&#xff0c;但该软件包提供了一个3D点集结构&#xff0c;使用户更容易处理附加属性&#xff0c;如法向量、颜色、标签&#xff0c;并在其上调…

2018年AI智商将达到多少?未来智能实验室启动第三次世界AI智商评测

来源&#xff1a; 人工智能学家 概要&#xff1a;21世纪以来&#xff0c;人工智能领域陆续爆发很多重要事件。其中最吸引人们眼球的&#xff0c;当属2016年战胜了人类围棋冠军并开始能够从0自我学习的AlphaGo。 一.人工智能能否超越人类智慧的争议 21世纪以来&#xff0c;人工智…

二进制函数_Go二进制文件逆向分析从基础到进阶——MetaInfo、函数符号和源码文件路径列表...

书接前文&#xff0c;本文主要介绍 Go 二进制文件中 Meta Information 的解析&#xff0c;与函数符号和源码文件路径列表的提取。最后详细介绍一下 Moduledata 这个结构。传送门&#xff1a;Go二进制文件逆向分析从基础到进阶——综述05Meta information>>>>5.1 Go…

学习网址

深入讲解权限&#xff1a; http://www.noahweb.net/mail/2/Project.htm#biaoStruts2 源码分析 http://blog.csdn.net/wl_ldy/article/details/5948779 Struts2部分源码讲解&#xff1a;http://code.google.com/p/struts2-src-study/source/browse/trunk/struts2-src-study--u…

七大科技巨头统治世界?

来源&#xff1a;亿欧智库 概要&#xff1a;我想无论是业内人士还是普通用户&#xff0c;都会思考为什么是他们成为最大的公司&#xff1f; 2017年秋天&#xff0c;随着腾讯和阿里巴巴两家中国公司市值的不断上涨&#xff0c;全球市值头部公司刚好是七大科技巨头&#xff08;下…

vue 懒人_Vue.js 中的实用工具方法【推荐】

收集日常开发中常用到的一些工具方法, 包含 vue 的公用过滤器、公用指令等 (PS: 懒人养成记)公用自定义过滤器import Vue from vueimport moment from moment/*** filter dateFormat 时间格式化* param {String, Date} value 可被 new Date 解析的字符串* param {String} forma…

用户权限管理——DB设计篇

来源&#xff1a;http://www.noahweb.net/mail/2/Project.htm#biao B/S系统中的权限比C/S中的更显的重要&#xff0c;C/S系统因为具有特殊的客户端&#xff0c;所以访问用户的权限检测可以通过客户端实现或通过客户端服务器检测实现&#xff0c;而B/S中&#xff0c;浏览器是每一…

oracle数据库常用的语法与复合函数

oracle查用到一些复合函数以及一些常用的方法用来快速查询数据&#xff0c;以下是我收集的一下常用方法&#xff0c;推荐给大家&#xff1a; 1、 当分组之后&#xff0c;针对某一属性值进行合并并以逗号进行分割&#xff1a; &#xff08;1&#xff09;所有版本都可使用&…

spring 事务之@transactional的使用与回滚

一、事务简单介绍 事务指逻辑上的一组操作&#xff0c;组成这组操作的各个单元&#xff0c;要不全部成功&#xff0c;要不全部不成功。 1.1 事务基本要素 原子性(Atomicity): 事务开始后所有操作&#xff0c;要么全部做完&#xff0c;要么全部不做&#xff0c;不可能停滞在…

python可视化图形界面_Python PyQt5 Designer 可视化图形界面模块

PYQT5 Designer简介强大的可视化GUI设计工具, 帮助我们快速开发PyQt.它生成UI界面为.ui文件, 通过命令将.ui转为.py文件.准备工作安装PyQt5: pip install pyqt5安装Qt工具: pip install pyqt5-tools(坑提示&#xff1a;一开始安装的pyqt5版本高了&#xff0c;结果安装QT工具的时…

雷克世界:Gyrfalcon加入芯片角斗场,又一款改变AI界的产品问世

来源&#xff1a;雷克世界 概要&#xff1a;随着人工智能产业规模扩大&#xff0c;众多巨头和初创公司纷纷加入人工智能芯片领域。 随着人工智能产业规模扩大&#xff0c;众多巨头和初创公司纷纷加入人工智能芯片领域&#xff0c;今天来了解一家旨在开发低成本、低功耗、高性能…

Freemarker静态化页面的使用

Freemarker 是一种基于模板的&#xff0c;用来生成输出文本的通用工具&#xff0c;所以我们必须要定制符合自己业务的模板&#xff0c;然后生成自己的文本&#xff08;html页面&#xff0c;string字符串&#xff0c;xml文本等等&#xff09;。Freemarker是通过freemarker.templ…

SessionHelper

问题描述&#xff1a; strut2 的织入 Session 为原始 Map 类型&#xff0c;没有泛型化&#xff0c;在添加属性时就会有一个恼人的警告。 功能&#xff1a; 1、安全的消除警告 2、插入时检查类型&#xff0c;如果不符就提前报错&#xff08;免得取值时才报转换异常的错误&…