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. Hadoop学习---Eclipse中hadoop环境的搭建

    在eclipse中建立hadoop环境的支持 1.需要下载安装eclipse 2.需要hadoop-eclipse-plugin-2.6.0.jar插件,插件的终极解决方案是https://githu ...

  2. 第二周 day2 python学习笔记

    1. python中的三元运算: result=value1 if 条件 else value2 如果条件成立,result=value1 如果条件不成立,result=value2 2. pytho ...

  3. 表空间常用sql汇总

    表空间碎片相关:select tablespace_name,       round(sqrt(max(blocks) / sum(blocks)) *             (100 / sqr ...

  4. mysql执行sql文件

    mysql -uspider_55haitao -pspider_55haitao -Dspider_55haitao</home/gphonebbs/Dump20161109.sql 方法一  ...

  5. UVa 10375 - Choose and divide(唯一分解定理)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  6. Centos 安装libevent

    1.在http://libevent.org/下载libevent-2.1.8-stable.tar.gz 2.解压缩 tar -zxvf libevent-2.1.8-stable.tar.gz c ...

  7. JDBC(1)简单介绍/数据库的连接

    初识JDBC: JDBC是java连接数据库的一个工具,没有这个工具,java将无法和数据库进行连接. JDBC API: JDBC是个“低级”接口,也就是说,他直接用于调用SQL命令. JDBC驱动 ...

  8. js 实现分享功能

    分享功能初步测试,title为当前页面的title. 其他详见注释!!! <!doctype html> <html> <head> <meta http-e ...

  9. 时钟系统与UART

    关于时钟设置原理: 关于如何设置系统时钟的思路. 其中锁定时间需要一个寄存器,PLL需要一个寄存器(MPLLCL),分频还需要一个寄存器,总计三个寄存器.步骤如下: 1. 上电后,FCLK=Fin 2 ...

  10. ajax简单做html查询删除(鲜花)

    下载视频+项目链接:https://pan.baidu.com/s/1jUld3-Nqm3fUAzFSX8kjlQ