mzy,struts学习(三):action中获得servlet中三域一参的三种方法
package com.mzy.servlet;
import java.util.Arrays;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
/**
 * 获得原生Servlet对象的测试!
 * @author mzy
 *
 */
public class Demo01Action implements Action {
	/*
	 * 所谓POJO,就是一个普通的java类!
	 */
	@Override
	public String execute() throws Exception {
		/* ActionContext 解耦的,提供三大域和参数!
		 *
		 * 如何在Action中获得三大域和参数?
		 * struts的数据中心:ActionContext! getContext,取得上下文之后,获得被解析的三大域(Map)!
		 *
		 * 这样做作用是降低耦合!避免直接使用原生的servlet!就使用Map技术,不用了解Servlet-API!
		 * 做到解耦更合理!但是熟悉servlet-API也可以使用原生的!
		 */
		// 获得requestScope的map表示
		Map<String, Object> requestScope = (Map<String, Object>) ActionContext.getContext().get("request");
		// 获得session域的map表示
		Map<String, Object> sessionScope = ActionContext.getContext().getSession();
		// 获得application(ServletContext)的map表示
		Map<String, Object> applicationScope = ActionContext.getContext().getApplication();
		// 获得参数
		Map<String, Object> params = ActionContext.getContext().getParameters();
		requestScope.put("name", "requestScopeValue");
		sessionScope.put("name", "sessionScopeValue");
		applicationScope.put("name", "applicationScopeValue");
		/*
		 * ServletActionContext 耦合的!提供原生的servlet对象
		 */
		// 为了检验从ActionContext中getContext().getParameters()的结果,直接使用URL传值测试!
		// ?name=aaa&name=bbb&name=ccc
		// http://localhost:8080/Struts_Day01/servlet/Demo01Action?name=aaa&name=bbb&name=ccc
		String[] names = (String[]) params.get("name"); // 同servlet中的map,实际上是一个数组
		System.out.println(Arrays.toString(names));
		// ServletActionContext获得原生的Servlet对象:我最爱的方式!
		// struts为了方便一部分开发人员使用原生的servlet对象,把servlet中的原生对象封装到了ServletActionContext中
		// 但是struts官方推荐文档中,不推荐直接使用servlet的原生对象!
		/*
		HttpServletRequest request = ServletActionContext.getRequest();
		HttpServletResponse response = ServletActionContext.getResponse();
		ServletContext servletContext = ServletActionContext.getServletContext();
		HttpSession session = request.getSession(false);
		*/
		return SUCCESS;
	}
	public String add() throws Exception {
		// 测试动态方法调用的逻辑!
		return SUCCESS;
	}
}
package com.mzy.servlet;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.ParameterAware;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;
/**
 * 之前讲了在action中获得servlet三大域对象和参数的方式:
 * 	 	第一种是通过ActionContext.getConext:get("request")、getSession()、getApplication()和getParameters()
 * 		得到Map<String, Object>的解耦一类的低耦合对象!
 *
 * 		第二种是通过ServletActionContext:getRequest、getResponse、getServletContext、request.getSession和
 * 		request.getParameterMap原生servlet对象来操作,但是这样高耦合不推荐!
 *
 * 		第三种实现接口来实现:今天要介绍的!
 * @author mzy
 *
 */
public class Demo01Action extends ActionSupport implements ServletRequestAware,
		ServletResponseAware, SessionAware, ParameterAware, ApplicationAware {
	private static final long serialVersionUID = -8005627219142113283L;
	private HttpServletRequest request;
	private HttpServletResponse response;
	private Map<String, Object> session;
	private Map<String, Object> application;
	private Map<String, String[]> params;
	@Override
	public String execute() throws Exception {
		System.out.println(request);
		System.out.println(response);
		System.out.println(session);
		System.out.println(application);
		System.out.println(params);
		/*
		 * 输出发现这些对象都是包装过的;并且application、session和parameters
		 * 都以及解析成为了Map键值对了!
		 * 担心是否功能会发生变化?
		 * 回想起之前动态代理做包装一类的案例:
		 * 一个良好的包装,是在不改变使用习惯的前提下,完成了功能的增强!
		 * 例如连接池中,获得连接池对象之后,动态代理把原本的close方法替换成了,放回连接池的操作!
		 *
		 * 进一步查看源码发现:
		 * 		ServletRequestAware这一系列所谓的接口,其实也是通过ActionContext进行获取,
		 * 		然后包装起来传入的,我感觉没有必要再通过实现接口这样去获得这一类Servlet中的对象。
		 *
		 * 直接通过ActionContext就是最好的办法!
		 * 而且实现接口之后,有代码入侵性的危险;不安全。可以查到我的实现接口,能不用最好不用。
		 */
		return SUCCESS;
	}
	@Override
	public void setApplication(Map<String, Object> application) {
		this.application = application;
	}
	@Override
	public void setParameters(Map<String, String[]> params) {
		this.params = params;
	}
	@Override
	public void setSession(Map<String, Object> session) {
		this.session = session;
	}
	@Override
	public void setServletResponse(HttpServletResponse response) {
		this.response = response;
	}
	@Override
	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}
}
mzy,struts学习(三):action中获得servlet中三域一参的三种方法的更多相关文章
- SpringMVC 学习 十一  springMVC控制器向jsp或者别的控制器传递参数的四种方法
		以后的开发,大部分是发送ajax,因此这四种传递参数的方法,并不太常用.作为了解吧 第一种:使用原生 Servlet 在控制器的响应的方法中添加Servlet中的一些作用域:HttpRequestSe ... 
- VS编程,WPF中,获取鼠标相对于当前屏幕坐标的一种方法
		原文:VS编程,WPF中,获取鼠标相对于当前屏幕坐标的一种方法 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/det ... 
- Shell脚本中引用、调用另一个脚本文件的2种方法
		Shell脚本中引用.调用另一个脚本文件的2种方法 http://www.jb51.net/article/67903.htm 
- web.xml中在Servlet中获取context-param和init-param内的参数
		引自:http://blog.csdn.net/yakson/article/details/9203231 web.xml里面可以定义两种参数:1.application范围内的参数,存放在serv ... 
- jQuery中通过JSONP来跨域获取数据的三种方式
		第一种方法是在ajax函数中设置dataType为'jsonp' $.ajax({ dataType: 'jsonp', url: 'http://www.a.com/user?id=123', su ... 
- Android中UI线程与后台线程交互设计的5种方法
		我想关于这个话题已经有很多前辈讨论过了.今天算是一次学习总结吧. 在android的设计思想中,为了确保用户顺滑的操作体验.一 些耗时的任务不能够在UI线程中运行,像访问网络就属于这类任务.因此我们必 ... 
- 【翻译】Windows 10 中为不同设备加载不同页面的3种方法
		在以前,为PC和手机做App是两个工程,PC和手机各一个.在Windows 10中会发现只有一个了,对于简单的页面变化可以使用VisualState来解决,但是比如网易云音乐这种PC版和手机版差异巨大 ... 
- Java中获取项目根路径和类加载路径的7种方法
		引言 在web项目开发过程中,可能会经常遇到要获取项目根路径的情况,那接下来我就总结一下,java中获取项目根路径的7种方法,主要是通过thisClass和System,线程和request等方法. ... 
- vue 路由传参中刷新页面参数丢失 及传参的几种方式?
		在页面跳转中,我通过路由传参,结果发现页面参数丢失了.路径返回了根目录.... 1. 先说下路由传参的几种方式吧? 比如:<div v-for="item in items" ... 
随机推荐
- cisco 交换机 IOS命令
			1 显示交换机的MAC地址表 user mode : show mac-address-table 
- mysql实现主从复制、读写分离的配置方法(二)
			由于接触主从复制,读写分离的时间比较短,应用还不够熟练,目的是能通过MyCat实现基础的读写分离操作. 其核心功能是分库分表,配合数据库的主从模式还可实现读写分离. 1. 测试环境 一台win10主机 ... 
- Java数据库分表与多线程查询结果汇总
			今天接到一个需求:要对一个物理分表的逻辑表进行查询统计.而数据库用的是公司自己研发的产品,考虑的到公司产品的特点以及业务的需求,该逻辑表是按年月进行分表的,而非分区.我们来看一下,在按时间段进行查询统 ... 
- 重新手写一个Vue
			该版把上一次的数据修改就更新全部页面改为了局部更新,相比于上一版的在数据绑定上不是简单的一个监听set再全部更新,具体见下文. 总体流程 仍然是根据自己理解来实现的绑定,相较于上一版的数据更新就全部刷 ... 
- hash表/哈希表
			https://blog.csdn.net/duan19920101/article/details/51579136 简单理解就是一个通过映射直接查找的表(散列表),用哈希函数将数据按照其存储特点进 ... 
- Spring常见问题(五)
			1.静态资源访问配置 绝对路径:访问静态资源. <mvc:resources location="/js/" mapping="/js/**">&l ... 
- PostgreSQL-WITH AS短语
			WITH提供了一种方式来书写在一个大型查询中使用的辅助语句.这些语句通常被称为公共表表达式或CTE,它们可以被看成是定义只在一个查询中存在的临时表.在WITH子句中的每一个辅助语句可以是一个SELEC ... 
- salesforce Integration 概览(一) 杂篇
			本篇参考:https://resources.docs.salesforce.com/sfdc/pdf/integration_patterns_and_practices.pdf 我们在做sales ... 
- JVM参数模版
			首先需要自己根据机器的配置设置JVM中各区域的初步大小,如下: -Xms4096M-Xmx4096M-Xmn3072M-Xss1M-XX:MetaspaceSize=256M-XX:MaxMetasp ... 
- Apache Flink上传路径遍历(CVE-2020-17518)
			影响版本 Flink1.5.1-1.11.2 复现 POST /jars/upload HTTP/1.1 Host: localhost:8081 Accept-Encoding: gzip, def ... 
