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" ...
随机推荐
- height设置100%不起作用
详细讲解了原因:http://www.webhek.com/post/css-100-percent-height.html
- golang拾遗:内置函数len的小知识
len是很常用的内置函数,可以测量字符串.slice.array.channel以及map的长度/元素个数. 不过你真的了解len吗?也许还有一些你不知道的小知识. 我们来看一道GO101的题目,这题 ...
- 「干货」面试官问我如何快速搜索10万个矩形?——我说RBush
「干货」面试官问我如何快速搜索10万个矩形?--我说RBUSH 前言 亲爱的coder们,我又来了,一个喜欢图形的程序员,前几篇文章一直都在教大家怎么画地图.画折线图.画烟花,难道图形就是这样嘛,当 ...
- Redis介绍及使用(八)
一.什么是Redis 1.Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库.(非关系型缓存数据库) 2.五种数据类型: 3.支持持久化. 参看链接:https:// ...
- 项目启动报错 The server time zone value '�й���ʱ��' is unrecognize...
背景介绍: 把项目在新的电脑上运行,MySQL版本不同出现错误 错误: 报错The server time zone value '�й���ʱ��' is unrecognized or repr ...
- python序列化proto时对repeated修饰数据进行赋值(常用类型和其他类型)
说一下对proto文件中数据使用时的书写方法,因为笔者也经常弄混淆 一.repeated修饰符,该列表是常用类型,比如int message C2GS_GoodsList { repeated int ...
- 什么是BI工具,好用的BI工具软件排名
目录 一.什么是BI工具? 二.BI工具有什么好处? 三.BI工具软件排名 由于海量数据对各种规模的企业构成挑战,因此每年确保所有业务流程都在控制之下变得越来越困难.最终,组织和公司在做出可持续和有利 ...
- MP4命令行处理
MP4Box可用于生成符合MPEG-DASH规范的内容,也就是ISO / IEC 23009-1在ISO公共可用标准中可用的内容. dash切片命令: mp4box -dash 5000 -frag ...
- Redis挂了,流量把数据库也打挂了,怎么办?
你好呀,我是歪歪. 是这样的,前几天有个读者给我发消息,说面试的时候遇到一个场景题: 他说他当时,一时间竟然找不到回答问题的角度,感觉自己没有回答到点子上. 我仔细想了一下,确实是感到这个问题有一丝丝 ...
- 论文笔记:(ICML2020)On Learning Sets of Symmetric Elements
目录 摘要 一.引言 二.先前的工作 三.基础 3.1 符号和基本定义 3.2 G-不变网络 3.3 描述等变层 3.4 Deep sets 四.DSS层 4.1 对称元素集合 4.2 等变层的表征 ...