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. GetDIBits 提示堆栈损坏的解决办法

    ...... BITMAPINFOHEADER bi; bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth = bmpScreen.bmWidth; bi ...

  2. 3.为JDeveloper添加不能的workspace

    1.点击选中JDeveloper,在属性中,选中快捷方式, 可以看到目标中的值为C:\Oracle\Middleware\jdeveloper\jdeveloper.exe, 只需要在修改为C:\Or ...

  3. T-sql中的三种分页查询

    USE [APS_Future_FT] GO /****** Object: StoredProcedure [dbo].[A_PagingAndSorting] Script Date: 2013/ ...

  4. Sublime Text 3 for Mac 3176 序号版

    —– BEGIN LICENSE —–sgbteamSingle User LicenseEA7E-11532598891CBB9 F1513E4F 1A3405C1 A865D53F115F202E ...

  5. [Medium翻译]RESTful API权威设计指南-设计更好的API

    本文为授权译文.希望查看原文的同学请戳链接:https://hackernoon.com/restful-api-design-step-by-step-guide-2f2c9f9fcdbf 对于我们 ...

  6. 个人免签收款接口 bufpay.com 支持限额设置

    有产品希望收款分布到不同的手机,每个当手机达到某一限额以后就停止改手机的收款. bufpay.com 近期上线了收款限额设置功能,配置界面如下图: 每个手机微信或支付宝可以单独设置每日限额,如果该手机 ...

  7. java获取客户端信息

    创建JSP页面 clientinfo <%@page import="java.util.StringTokenizer"%> <%@ page language ...

  8. HDU 2065 "红色病毒"问题(生成函数)

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  9. CSS实现图片等比例缩小不变形

    <img src="../images/bg1.jpg" alt="" /> img { /*等宽缩小不变形*/ /*width: 100%;*/ ...

  10. 深入理解bit_or和bit_and,bit_count

    bit_or:二进制数按位或,bit_and:二进制数按位与,bit_count:统计二进制数1个个数 下面以一个例子来说明用法:示例要实现的功能就是计算每月有几天有访问,先把示例摘录在这里.1234 ...