servlet API通过ActionContext进行获取

  1. Struts2HttpServletRequest,HttpSessionServletContext进行了封装,构造了3Map对象替代以上以上3个对象。在Action中可以直接使用HttpServletRequestHttpServletSessionServletContext对应的Map对象来保存和读取对象。
  2. ActionContextAction执行的上下文,在ActionContext保存了Action,执行所需要的所有对象,包括parametersrequestsessionapplication
  • 获取HttpSession对应的Map对象:public Map getSession
  • 获取ServletContext对应的MAP对象:public Map getApplication
  • 请求参数对应的Map对象:public Map getParameters()

代码实现

  1. public class ActionContextTest {
  2. /**
  3. * 执行execute方法
  4. * @return String
  5. */
  6. public String execute() {
  7. // 获取actionContext对象
  8. ActionContext actionContext = ActionContext.getContext();
  9. // 获取applicationMap
  10. Map<String, Object> applicationMap = actionContext.getApplication();
  11. // 可以通过jsp页面获取${applicationScope.get}
  12. applicationMap.put("applicationKey","applicationValue");
  13. // 也可以从jsp页面获取设置的值
  14. System.out.println(applicationMap.get("date"));
  15. // 在session中添加值
  16. Map<String, Object> sessionMap = actionContext.getSession();
  17. sessionMap.put("sessionKey","sessionValue");
  18. // 获取页面设置的值
  19. System.out.println(sessionMap.get("date"));
  20. // 由于底层没有提供actionContext.getRequest()方法,所以需要自己手动获取
  21. Map<String, Object> requestMap = (Map<String, Object>) actionContext.get("request");
  22. requestMap.put("requestKey","requestValue");
  23. // 获取提交url的get参数详情,原来的是一个Map集合对象,而现在是一个Map集合的实现类,该Map实现类无法添加参数只能做读取(url提交的属性)
  24. HttpParameters parameters = actionContext.getParameters();
  25. System.out.println(parameters.get("name"));
  26. return SUCCESS;
  27. }

其中Struts2.xml中配置如下:

  1. <struts>
  2. <package name="default" namespace="/" extends="struts-default">
  3. <action name="actionContextTest" class="com.codegeekgao.actioncontext.ActionContextTest" method="execute">
  4. <result>/TestActionContext.jsp</result>
  5. </action>
  6. </package>
  7. </struts>

成功后跳转的JSP页面

  1. <%@ page import="java.util.Date" %>
  2. <%@ page import="java.text.SimpleDateFormat" %><%--
  3. Created by IntelliJ IDEA.
  4. User: DonnieGao
  5. Date: 2018/9/4
  6. Time: 23:47
  7. To change this template use File | Settings | File Templates.
  8. --%>
  9. <%@ page contentType="text/html;charset=UTF-8"%>
  10. <html>
  11. <head>
  12. <title>Title</title>
  13. </head>
  14. <body>
  15. <%--获取applicationScope的值--%>
  16. application: ${applicationScope.get("applicationKey")}
  17. <%--获取日期的的值--%>
  18. <%
  19. if (application.getAttribute("date")==null) {
  20. application.setAttribute("date",new Date());
  21. }
  22. %>
  23. <%--获取session的值--%>
  24. <br/>
  25. session:${sessionScope.get("sessionKey")}
  26. <%
  27. if (session.getAttribute("date")==null) {
  28. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  29. String format = sdf.format(new Date());
  30. session.setAttribute("date",format);
  31. }
  32. %>
  33. <br/>
  34. request:${requestScope.get("requestKey")}
  35. <br/>
  36. parameters:${parameters.name}
  37. </body>
  38. </html>

实现接口方式获取Servlet的api

  1. public class TestActionAware implements ApplicationAware, SessionAware, RequestAware, HttpParametersAware {
  2. private Map<String, Object> application;
  3. private Map<String, Object> session;
  4. private Map<String, Object> request;
  5. /**
  6. * execute执行的方法
  7. *
  8. * @return
  9. */
  10. public String execute() {
  11. // 获取application的内容属性
  12. application.put("applicationKey", "applicationValue");
  13. // 获取页面设置的application值
  14. System.out.println(application.get("date"));
  15. // 设置session值
  16. session.put("sessionKey", "sessionValue");
  17. // 设置request的值
  18. request.put("requestKey", "requestValue");
  19. return SUCCESS;
  20. }
  21. @Override
  22. public void setApplication(Map<String, Object> map) {
  23. this.application = map;
  24. }
  25. @Override
  26. public void setSession(Map<String, Object> map) {
  27. this.session = map;
  28. }
  29. @Override
  30. public void setRequest(Map<String, Object> map) {
  31. this.request = map;
  32. }
  33. /**
  34. * 注意ParameterAware已经过时需要HttpAWare进行设置值,并且不能直接调用put方法,否则会报
  35. * HttpParameters are immutable, you cannot put value directly! 的错误
  36. * @param httpParameters
  37. */
  38. @Override
  39. public void setParameters(HttpParameters httpParameters) {
  40. Map<String, Parameter> newParams = new HashMap<String, Parameter>();
  41. for (String key : httpParameters.keySet()) {
  42. Parameter p = httpParameters.get(key);
  43. if (p instanceof Parameter.Request) {
  44. newParams.put(key, new Parameter.Request(key, new
  45. String[]{ p.getValue()}));
  46. }
  47. }
  48. httpParameters.appendAll(newParams);
  49. }
  50. }

其中Struts2.xml中配置如下:

  1. <struts>
  2. <package name="default" namespace="/" extends="struts-default">
  3. <action name="actionAware" class="com.codegeekgao.actionaware.TestActionAware" method="execute">
  4. <result>/TestActionAware.jsp</result>
  5. </action>
  6. </package>
  7. </struts>

成功后跳转的jsp页面

  1. <%@ page import="java.util.Date" %><%--
  2. Created by IntelliJ IDEA.
  3. User: DonnieGao
  4. Date: 2018/9/4
  5. Time: 23:47
  6. To change this template use File | Settings | File Templates.
  7. --%>
  8. <%@ page contentType="text/html;charset=UTF-8"%>
  9. <html>
  10. <head>
  11. <title>Title</title>
  12. </head>
  13. <body>
  14. <%--获取applicationScope的值--%>
  15. application: ${applicationScope.get("applicationKey")}
  16. <%--获取日期的的值--%>
  17. <%
  18. if (application.getAttribute("date")==null) {
  19. application.setAttribute("date",new Date());
  20. }
  21. %>
  22. </br>
  23. <%--获取sessionScope的值--%>
  24. session: ${sessionScope.get("sessionKey")}
  25. </br>
  26. <%--获取sessionScope的值--%>
  27. request: ${requestScope.get("requestKey")}
  28. </body>
  29. </html>

Struts2获取Servlet的api的两种方式,解决ParameterAware过时的问题的更多相关文章

  1. Servlet访问路径的两种方式、Servlet生命周期特点、计算服务启动后的访问次数、Get请求、Post请求

    Servlet访问路径的两种方式: 1:注解 即在Servlet里写一个@WebServlet @WebServlet("/myServlet") 2:配置web.xml < ...

  2. Servlet实现重定向的两种方式

    使用Servlet实现请求重定向:两种方式 1. response.setStatus(302); response.setHeader("location", "/Re ...

  3. spring boot集成 servlet自动注册的两种方式

    有两种方式:(两种方式同时存在时,@Bean优先@ServletComponentScan实例化,生成两个对象) 1)通过@ServletComponentScan类注解 扫描 带有@WebServl ...

  4. 前台获取json未定义问题之两种常用解决办法

    来自博客园的一位朋友解答: 为什么要 eval这里要添加 “("("+data+")");//”呢? 原因在于:eval本身的问题. 由于json是以”{}”的 ...

  5. 1:3访问 servlet API 的两种方式(request,session等内置对象)

    1:解耦方式 2:耦合方式: ========================================== ========================================== ...

  6. struts2与velocity的整合有两种方式

    1.以struts2为主.struts2内置了对velocity的支持,只要在<result name="success"?type="velocity" ...

  7. js获取url參数值的两种方式具体解释

    有个url例如以下: http://passport.csdn.net/account/login? from=http%3a%2f%2fwrite.blog.csdn.net%2fpostedit ...

  8. CefSharp获取页面Html代码的两种方式

    CefSharp在NuGet的简介是“The CefSharp Chromium-based browser component”,机翻的意思就是“基于Cefsharp Chromium的浏览器组件” ...

  9. DevExpress中获取RichTextEdit中RichEditControl的两种方式

    方式一: var rte = sender as RichTextEdit; control = rte.Controls[] as RichEditControl; 方式二: PropertyInf ...

随机推荐

  1. 华为HCNP实验 防火墙安全区域及安全策略配置(USG6000)

    防火墙安全区域及安全策略配置   一.学习目的 掌握防火墙安全区域的配置方法 掌握安全策略的配置方法   二.拓扑图         三.场景 你是公司的网络管理员.公司总部的网络分成了三个区域,包括 ...

  2. 设计模式:装饰器(Decorator)模式

    设计模式:装饰器(Decorator)模式 一.前言    装饰器模式也是一种非常重要的模式,在Java以及程序设计中占据着重要的地位.比如Java的数据流处理,我们可能看到数据流经过不同的类的包装和 ...

  3. FireFox浏览器Flash&视频下载工具推荐

    介绍 两款扩展组件:Flash and Video Download & Flash Video Downloader 一起使用,各有优缺点. Flash and Video Download ...

  4. EventBus事件总线

    EventBus事件总线的使用-自己实现事件总线   在C#中,我们可以在一个类中定义自己的事件,而其他的类可以订阅该事件,当某些事情发生时,可以通知到该类.这对于桌面应用或者独立的windows服务 ...

  5. PowerDNS简单教程(4):优化篇

    目录: PowerDNS简单教程(1):安装篇 http://www.cnblogs.com/anpengapple/p/5205130.html PowerDNS简单教程(2):功能篇 http:/ ...

  6. mysql中与 in 相反的语句 find_in_set('数据',字段名)

    在 mysql 中,我们经常用 in 来查询众多数据中是否有数据表字段中的值: 如果我们在数据表的字段中添加了很多值,然后查询某个值是否是这个字段中众多值的一个时可以用 find_in_set('数据 ...

  7. spring AOP 代理(静态与动态+使用cglib实现)

    一.没有代理模式 缺点: 1.工作量特别大,如果项目中有多个类,多个方法,则要修改多次. 2.违背了设计原则:开闭原则(OCP),对扩展开放,对修改关闭,而为了增加功能把每个方法都修改了,也不便于维护 ...

  8. java根据数据库自动生成代码

    出现这个已经创建成功 出现这个情况,没有使用DBUtil,引入即可 已经创建完成 代码下载:https://github.com/weibanggang/tool 项目实例下载:https://pan ...

  9. 《Inetnet History,Technology and Security》学习笔记

    前言 本文为观看Cousera的Michigan<Internet History, Technology and Security>教程的个人学习笔记,包括了每个week的概要和个人感想 ...

  10. C# 泛型的协变和逆变 (转载)

    1. 可变性的类型:协变性和逆变性 可变性是以一种类型安全的方式,将一个对象当做另一个对象来使用.如果不能将一个类型替换为另一个类型,那么这个类型就称之为:不变量. 协变和逆变是两个相互对立的概念: ...