Struts2(四):在Action中如何访问Web资源
1、什么WEB资源?
HttpServletRequest,HttpServletRespone,HttpApplication,ServletContext,HttpSession等原生ServletAPI。
2、在Struts2中为什么要访问WEB资源?
B/S应用中的Controller必然会有场景需要访问WEB资源:向域对象中读写属性,读取Cookie,获取realPath等。
3、在Struts2中如何访问WEB资源?
a)和ServletAPI解耦的方式:只能有限的ServletAPI对象,只能访问有限的方法(读取请求参数,读写域对象的属性,使session失效),有些内容访问不到;
具体使用ActionContext;
实现XxxAware接口
b)和ServletAPI耦合的方式:可以访问更多的ServletAPI对象,且可以调用其原生的方法。
使用ServletServletContext;
实现ServletXxxAware接口。
- 怎么通过“和ServletAPI解耦的方式”实现访问有限的方法-使用ActionContext实现
 
- 使用ActionContext实现
 
首先,我们新建一个Struts002的工程,引入struts2的jar包,创建struts.xml,修改web.xml。
新建包com.dx.actions,在包下创建一个action类:TestActionContextFetchServletObjectAction.java
内容如下:
 package com.dx.actions;
 import java.util.Map;
 import com.opensymphony.xwork2.ActionContext;
 public class TestActionContextFetchServletObjectAction {
     public String execute() {
         // 0.通过ActionContext调用其getContext方法,获取到一个ActionContext实例对象。
         // ActionContext是Action的上下文对象,可以从中获取当前Action需要的一起信息。
         ActionContext context = ActionContext.getContext();
         // 1.获取ApplicationContext对应的Map,并向其中添加一个属性。
         // 调用ActionContext对象的getApplication方法,获取application对象的Map对象。
         Map<String, Object> applicationMap = context.getApplication();
         // 设置属性
         applicationMap.put("applicationKey", "applicationValue");
         // 获取属性
         Object appPageKey = applicationMap.get("applicationClientKey");
         System.out.println(appPageKey);
         // 2.session
         Map<String, Object> sessionMap = context.getSession();
         sessionMap.put("sessionKey", "sessionValue");
         Object sessionClientKey = sessionMap.get("sessionClientKey");
         System.out.println(sessionClientKey);
         // 3.request
         // ActionContext中並沒有提供getRequets方法來獲取request對應的Map.
         // 需要手工调用ActionContext的get方法,并传入一个request字符串来获取request对象的Map对象。
         Map<String, Object> requestMap = (Map<String, Object>) context.get("request");
         //设置属性
         requestMap.put("requestKey", "requestValue");
         // 获取属性
         Object requestClientKey = requestMap.get("requestClientKey");
         System.out.println(requestClientKey);
         // 4.parameters
         // 获取请求参数对应的Map,并获取指定的参数值。
         // 键:请求参数的名字,值:请求参数的值对应的字符串数组。
         // 注意: 1.getParameters返回的值为Map<String,Object>,而不是Map<String,String[]>
         //     2.parameters这个Map是只读的,不能写入数据,如果写入,但不出错误,但也不起作用。
         Map<String, Object> parametersMap = context.getParameters();
         // 读取属性
         Object parametersClientKey = parametersMap.get("parametersClientKey");
         System.out.println(parametersClientKey);
         // 设置值,并不起作用的。
         parametersMap.put("parameterKey", "parametersValue");
         return "success";
     }
 }
上边的action类,是一个缺省继承ActionSupport类.
在struts.xml中注册action,修改后的struts.xml内容:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts>
<constant name="struts.action.extension" value="action" />
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="false" /> <package name="default" namespace="/" extends="struts-default">
<action name="testServletObject" class="com.dx.actions.TestActionContextFetchServletObjectAction">
<result>/WEB-INF/test-context.jsp</result>
</action>
</package>
</struts>
在WebContent文件夹下新建一个index.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="testServletObject.action?parameterClientKey=hello">Test
Fetch Servlet Object From ActionContext object.</a>
<% application.setAttribute("applicationClientKey", "applicationClientValue"); %>
	        <% session.setAttribute("sessionClientKey", "sessionClientValue"); %>
	        <% request.setAttribute("requestClientKey", "requestClientValue"); %>
</body>
</html>
在该页面中包含了一个连接,该连接内容指定了需要跳转的页面。同时,还给页面中Servlet域对象application,session,request属性赋值了值。
/WEB-INF/test-context.jsp页面内容:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h4>Test fetch Servlet object from ActionContext object</h4>
applicationKey:${applicationScope.applicationKey}
<br>
sessionKey:${sessionScope.sessionKey}
<br>
requestKey:${requestScope.requestKey}
<br>
parameterKey:${parameters.parameterKey}
<br>
</body>
</html>
用来显示action的转发内容,同时显示通过ActionContext对象中获取到的application,session,request,parameters对象的赋值结果展示。
页面运行结果:

通过以上例子,我们了解到了如何通过“和ServletAPI解耦的方式”来获取Servlet域对象的方法。
0.ActionContext是Action的上下文对象,可以从中获取当前Action需要的一起信息,通过ActionContext调用其getContext方法,获取到一个ActionContext实例对象。
1.获取ApplicationContext对应的Map,并向其中添加一个属性。
调用ActionContext对象的getApplication方法,获取application对象的Map对象。
Map<String, Object> applicationMap = context.getApplication();
2.session
Map<String, Object> sessionMap = context.getSession();3.request
ActionContext中並沒有提供getRequets方法來獲取request對應的Map.
需要手工调用ActionContext的get方法,并传入一个request字符串来获取request对象的Map对象。
Map<String, Object> requestMap = (Map<String, Object>) context.get("request");4.parameters
获取请求参数对应的Map,并获取指定的参数值。
键:请求参数的名字,值:请求参数的值对应的字符串数组。
注意: 1.getParameters返回的值为Map<String,Object>,而不是Map<String,String[]>
2.parameters这个Map是只读的,不能写入数据,如果写入,但不出错误,但也不起作用。
Map<String, Object> parametersMap = context.getParameters();
- 实现XxxAware接口
 
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts>
<!-- action路径的扩展名:*.action,*.do,无扩展名 -->
<constant name="struts.action.extension" value="action,do," />
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="false" /> <package name="default" namespace="/" extends="struts-default">
<action name="testServletObject"
class="com.dx.actions.TestActionContextFetchServletObjectAction">
<result>/WEB-INF/test-context.jsp</result>
</action>
<action name="gotoLoginPage" class="com.opensymphony.xwork2.ActionSupport" method="execute">
<result name="success">/login.jsp</result>
</action>
<action name="login" class="com.dx.actions.TestWithXXXAware"
method="login">
<result name="login-success">/WEB-INF/login-success.jsp</result>
</action>
<action name="logout" class="com.dx.actions.TestWithXXXAware"
method="logout">
<result name="logout-success">/login.jsp</result>
</action>
</package> </struts>
TestWithXXXAware.java:
package com.dx.actions; import java.util.Map; import org.apache.struts2.ServletActionContext;
import org.apache.struts2.dispatcher.SessionMap;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.ParameterAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware; /**
* XxxAware一般情況下,一個Action類中包含了多個Action方法,同時這個多個Action中都需要使用域對象或parameters.
* ActionContext的方式,一般情況下一個Action類中包含了一個Action方法,
* 或者需要使用SessionMap清楚session的時候會使用。
*/
public class TestWithXXXAware implements ApplicationAware, RequestAware, SessionAware, ParameterAware {
private String username; public void setUsername(String username) {
this.username = username;
} /**
* login action
* */
public String login() {
// 记录登录成功的用户信息。
// 从request中获取不到form提交的参数信息,为什么呢?
String usernameWithActionContext = (String) request.get("username");
String usernameWithServletActionContext=ServletActionContext.getRequest().getParameter("username"); session.put("loginusername", username); System.out.println("with setter:"+username);
System.out.println("with ActionContext.get(\"request\").get(\"username\"):"+usernameWithActionContext);
System.out.println("with ServletActionContext.getRequest().getParameter(\"username\"):"+usernameWithServletActionContext); // 实现成功登录计数
Integer count = (Integer) application.get("count"); if (count == null || count <) {
count = 0;
} count++; application.put("count", count); return "login-success";
} /**
* logout action
* */
public String logout() {
// 实现成功登录计数
Integer count = (Integer) application.get("count"); if (count == null || count < 0) {
count = 0;
} else {
count--;
}
application.put("count", count); // 使得session失效
((SessionMap) session).invalidate(); return "logout-success";
} private Map<String, String[]> parameters;
private Map<String, Object> session;
private Map<String, Object> request;
private Map<String, Object> application; @Override
public void setParameters(Map<String, String[]> parameters) {
this.parameters = parameters;
} @Override
public void setSession(Map<String, Object> session) {
this.session = session;
} @Override
public void setRequest(Map<String, Object> request) {
this.request = request;
} @Override
public void setApplication(Map<String, Object> application) {
this.application = application;
} }
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="login" method="post">
User Name:
<input type="text" name="username" />
<br />
<input name="submit" type="submit" value="submit"/>
</form>
</body>
</html>
login-success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
欢迎${sessionScope.loginusername}登录!
<br/>
当前登录人数:${applicationScope.count}
<br/>
<a href="logout.do">logout</a>
<br/>
</body>
</html>
后台打印信息:
with setter:ddddddddddd
with ActionContext.get("request").get("username"):null
with ServletActionContext.getRequest().getParameter("username"):ddddddddddd
页面登录信息:

- 和ServletAPI耦合的方式:可以访问更多的ServletAPI对象,且可以调用其原生的方法。
 
- 使用ServletServletContext实现
 
  String usernameWithServletActionContext=ServletActionContext.getRequest().getParameter("username");
HttpServletResponse httpServletResponse=ServletActionContext.getResponse();
HttpServletRequest httpServletRequest=ServletActionContext.getRequest();
HttpSession httpSession=ServletActionContext.getRequest().getSession();
ActionContext actionContext=ServletActionContext.getContext();
- 实现ServletXxxAware接口
 
package com.dx.actions; import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.util.ServletContextAware; public class TestServletXxxAware implements ServletContextAware, ServletRequestAware,ServletResponseAware { @Override
public void setServletResponse(HttpServletResponse arg0) {
// TODO Auto-generated method stub } @Override
public void setServletRequest(HttpServletRequest arg0) {
// TODO Auto-generated method stub } @Override
public void setServletContext(ServletContext arg0) {
// TODO Auto-generated method stub } }
Struts2(四):在Action中如何访问Web资源的更多相关文章
- [原创]java WEB学习笔记55:Struts2学习之路---详解struts2 中 Action,如何访问web 资源,解耦方式(使用 ActionContext,实现 XxxAware 接口),耦合方式(通过ServletActionContext,通过实现 ServletRequestAware, ServletContextAware 等接口的方式)
		
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
 - Struts2在Action中访问WEB资源
		
什么是WEB资源? 这里所说的WEB资源是指:HttpServletRequest, HttpSession, ServletContext 等原生的 Servlet API. 为什么需要访问WEB资 ...
 - 在Action 中访问web资源
		
1.什么是web资源: HttpServletRequest,HttpSession,ServletContext等原生的Servlet API. 2.为什么要访问web资源? B/S应用的Contr ...
 - Struts2 之 Action 类访问 WEB 资源
		
接着上次博客的内容我继续分享我所学到的知识,和自己在学习过程中所遇到问题以及解决方案.当然,如果读者发现任何问题均可以在下方评论告知我,先谢! 在 Action 中访问 WEB 资源 web 资源 所 ...
 - 2.struts2访问web资源(在struts2中获取session,request等等)
		
什么是web资源:web资源就是指request,response,session,servlet的api 为什么需要访问web资源:因为图片上传,需要获取图片的目录,就需要通过action来访问we ...
 - Struts2学习第三课 访问Web资源
		
1.什么是WEB资源? HttpServletRequest,HttpSession,ServletContext等原生的Servlet API. 2.为什么访问WEB资源? B/S的应用的Contr ...
 - 在Firefox中通过AJAX跨域访问Web资源---
		
一.解决在firefox中无法跨域访问的问题 AJAX从本质上讲就是命名用XMLHttpRequest组件来向服务端发送HTTP请求,请接收相应信息.至于成功接收到响应信息后的操作,就和普通的Web客 ...
 - Struts2框架之Action类的访问
		
1. 通过<action>标签中的method属性,访问到Action中的具体的方法. * 传统的配置方式,配置更清晰更好理解!但是扩展需要修改配置文件等! * 具体的实例如下: * 页面 ...
 - struts2:在Action中使用Servlet的API,设置、读取各种内置对象的属性
		
有两种方式可以实现在Action中使用Servlet的API.一种是使用org.apache.struts2.ServletActionContext类,另一种是使用com.opensymphony. ...
 
随机推荐
- [Cocos2d-x For WP8]Layer 层
			
层(CCLayer) 从概念上说,层就是场景里的背景. CCLayer同样是CCNode的子类,通常用addChild方法添加子节点.CCLayer对象定义了可描绘的区域,定义了描绘的规则.C ...
 - CF 71C. Round Table Knights
			
题目链接 很多小的细节都没想到... #include <cstdio> #include <cstring> #include <iostream> #inclu ...
 - 【BZOJ2186】【SDoi2008】沙拉公主的困惑 数论
			
Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现 ...
 - 再说virtual
			
看了对Anders Hejlsberg的采访, 1)C#中函数默认是非virtual的设计因为:在java中,一个方法默认是虚拟化的,只有对一个方法必须声明final关键字,这样这个方法才是非虚的,无 ...
 - IE6、7绝对定位层被遮挡的原因(主要是父层决定的)
			
最近做项目,经常遇到IE7以下浏览器中.一些悬浮框被一些元素遮挡的问题,这些元素一般都是设置了position的.问题的根本在不是被设置绝对定位的元素上,而是在设置了相对定位的父元素上. 我查阅了 ...
 - java基础--java静态代码块和静态方法的区别、static用法
			
转载自: http://blog.sina.com.cn/s/blog_afddb8ff0101aqs9.html 静态代码块:有些代码必须在项目启动的时候就执行,这种代码是主动执行的(当类被载入时, ...
 - Json数据格式事例查看
			
最简单的一种: [{"ProvinceID":1,"ProvinceName":"北京市","DateCreated": ...
 - Super Jumping! Jumping! Jumping!——E
			
E. Super Jumping! Jumping! Jumping! Time Limit: 1000ms Memory Limit: 32768KB 64-bit integer IO forma ...
 - uva 1382 - Distant Galaxy
			
题目连接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=91208#problem/G 题意: 给出平面上的n个点,找出一个矩形,使得边 ...
 - Java_Eclipse安装Git插件
			
一.从官网选择系统版本下载Git并安装 地址:https://git-scm.com/downloads/ 二.打开Eclipse 1. 第一种安装方法: help-->Install New ...