servlet API通过ActionContext进行获取

Struts2对HttpServletRequest,HttpSession和ServletContext进行了封装,构造了3个Map对象替代以上以上3个对象。在Action中可以直接使用HttpServletRequest,HttpServletSession,ServletContext对应的Map对象来保存和读取对象。

ActionContext是Action执行的上下文,在ActionContext保存了Action,执行所需要的所有对象,包括parameters,request,session,application
  • 获取HttpSession对应的Map对象:public Map getSession
  • 获取ServletContext对应的MAP对象:public Map getApplication
  • 请求参数对应的Map对象:public Map getParameters()

代码实现

public class ActionContextTest {

    /**
* 执行execute方法
* @return String
*/
public String execute() {
// 获取actionContext对象
ActionContext actionContext = ActionContext.getContext();
// 获取applicationMap
Map<String, Object> applicationMap = actionContext.getApplication();
// 可以通过jsp页面获取${applicationScope.get}
applicationMap.put("applicationKey","applicationValue");
// 也可以从jsp页面获取设置的值
System.out.println(applicationMap.get("date")); // 在session中添加值
Map<String, Object> sessionMap = actionContext.getSession();
sessionMap.put("sessionKey","sessionValue");
// 获取页面设置的值
System.out.println(sessionMap.get("date")); // 由于底层没有提供actionContext.getRequest()方法,所以需要自己手动获取
Map<String, Object> requestMap = (Map<String, Object>) actionContext.get("request");
requestMap.put("requestKey","requestValue"); // 获取提交url的get参数详情,原来的是一个Map集合对象,而现在是一个Map集合的实现类,该Map实现类无法添加参数只能做读取(url提交的属性)
HttpParameters parameters = actionContext.getParameters();
System.out.println(parameters.get("name"));
return SUCCESS;
}

其中Struts2.xml中配置如下:

<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="actionContextTest" class="com.codegeekgao.actioncontext.ActionContextTest" method="execute">
<result>/TestActionContext.jsp</result>
</action>
</package>
</struts>

成功后跳转的JSP页面

<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %><%--
Created by IntelliJ IDEA.
User: DonnieGao
Date: 2018/9/4
Time: 23:47
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--获取applicationScope的值--%>
application: ${applicationScope.get("applicationKey")} <%--获取日期的的值--%>
<%
if (application.getAttribute("date")==null) {
application.setAttribute("date",new Date());
}
%>
<%--获取session的值--%>
<br/>
session:${sessionScope.get("sessionKey")}
<%
if (session.getAttribute("date")==null) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String format = sdf.format(new Date());
session.setAttribute("date",format);
}
%>
<br/>
request:${requestScope.get("requestKey")} <br/>
parameters:${parameters.name} </body>
</html>

实现接口方式获取Servlet的api

public class TestActionAware implements ApplicationAware, SessionAware, RequestAware, HttpParametersAware {

    private Map<String, Object> application;
private Map<String, Object> session;
private Map<String, Object> request; /**
* execute执行的方法
*
* @return
*/
public String execute() {
// 获取application的内容属性
application.put("applicationKey", "applicationValue");
// 获取页面设置的application值
System.out.println(application.get("date"));
// 设置session值
session.put("sessionKey", "sessionValue");
// 设置request的值
request.put("requestKey", "requestValue"); return SUCCESS;
} @Override
public void setApplication(Map<String, Object> map) {
this.application = map;
} @Override
public void setSession(Map<String, Object> map) {
this.session = map;
} @Override
public void setRequest(Map<String, Object> map) {
this.request = map;
} /**
* 注意ParameterAware已经过时需要HttpAWare进行设置值,并且不能直接调用put方法,否则会报
* HttpParameters are immutable, you cannot put value directly! 的错误
* @param httpParameters
*/
@Override
public void setParameters(HttpParameters httpParameters) {
Map<String, Parameter> newParams = new HashMap<String, Parameter>();
for (String key : httpParameters.keySet()) {
Parameter p = httpParameters.get(key);
if (p instanceof Parameter.Request) {
newParams.put(key, new Parameter.Request(key, new
String[]{ p.getValue()}));
}
}
httpParameters.appendAll(newParams);
}
}

其中Struts2.xml中配置如下:

<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="actionAware" class="com.codegeekgao.actionaware.TestActionAware" method="execute">
<result>/TestActionAware.jsp</result>
</action>
</package>
</struts>

成功后跳转的jsp页面

<%@ page import="java.util.Date" %><%--
Created by IntelliJ IDEA.
User: DonnieGao
Date: 2018/9/4
Time: 23:47
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--获取applicationScope的值--%>
application: ${applicationScope.get("applicationKey")} <%--获取日期的的值--%>
<%
if (application.getAttribute("date")==null) {
application.setAttribute("date",new Date());
}
%>
</br>
<%--获取sessionScope的值--%>
session: ${sessionScope.get("sessionKey")}
</br>
<%--获取sessionScope的值--%>
request: ${requestScope.get("requestKey")}
</body>
</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. 图解:TCP协议中的三次握手和四次挥手

    建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...

  2. kill -9 和kill-15的区别

    kill -9大家应该是非常熟悉的,杀死进程一般用kill -9的吧. 今天接触到kill -15,kill -15也是杀死进程的.那个kill -15和kill -9有什么区别呢? 其实kill - ...

  3. PhoneGap 的存储 API_localStorage 和 sessionStorage

    一.介绍 1.为了替代Cookile这门古老的客户端存储技术,Html5的WEB Storage Api 提供了俩中在 客户端存储数据库的方法:localStorage 和 sessionStorag ...

  4. POJ-2992 Divisors---组合数求因子数目

    题目链接: https://cn.vjudge.net/problem/POJ-2992 题目大意: 给出组合数Cnk,求出其因子个数,其中n,k不大于431,组合数的值在long long范围内 解 ...

  5. Leetcode 225 两个队列实现栈

    Implement the following operations of a stack using queues. push(x) -- Push element x onto stack. po ...

  6. Coursera机器学习基石 第2讲:感知器

    第一讲中我们学习了一个机器学习系统的完整框架,包含以下3部分:训练集.假设集.学习算法 一个机器学习系统的工作原理是:学习算法根据训练集,从假设集合H中选择一个最好的假设g,使得g与目标函数f尽可能低 ...

  7. mysql使用Navicat 导出和导入数据库

    系统环境: Win7 x64软件准备:Navicat Premium_11.2.7简体中文版下载网址:http://www.cr173.com/soft/419023.html 现在我就向大家介绍 m ...

  8. Segmentation fault(Core Dump)

    Segmentation fault 这个提示还是比较常见的,这个提示就是段错误,这是翻译还是十分恰当的. Core Dump 有的时候给我们呈现的翻译很有趣是”吐核“,但是实际上比较贴切的翻译是核心 ...

  9. Mobile IP

    Mobile IP Proliferation(增生) of mobile devices: PDAs, laptops, smart phones, - As user moves, point-o ...

  10. Entity Freamwork CodeFirst 连接PostgreSql数据库

    EF的Code First是一个比较强大也比较有用的功能,他可以让你先写代码,最后根据代码去生成数据库,非常符合OO设计的要求,抛开数据库层面不管(当然不是完全的不管),只管对象的设计. 首先,说一下 ...