Struts2获取Servlet的api的两种方式,解决ParameterAware过时的问题
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过时的问题的更多相关文章
- Servlet访问路径的两种方式、Servlet生命周期特点、计算服务启动后的访问次数、Get请求、Post请求
Servlet访问路径的两种方式: 1:注解 即在Servlet里写一个@WebServlet @WebServlet("/myServlet") 2:配置web.xml < ...
- Servlet实现重定向的两种方式
使用Servlet实现请求重定向:两种方式 1. response.setStatus(302); response.setHeader("location", "/Re ...
- spring boot集成 servlet自动注册的两种方式
有两种方式:(两种方式同时存在时,@Bean优先@ServletComponentScan实例化,生成两个对象) 1)通过@ServletComponentScan类注解 扫描 带有@WebServl ...
- 前台获取json未定义问题之两种常用解决办法
来自博客园的一位朋友解答: 为什么要 eval这里要添加 “("("+data+")");//”呢? 原因在于:eval本身的问题. 由于json是以”{}”的 ...
- 1:3访问 servlet API 的两种方式(request,session等内置对象)
1:解耦方式 2:耦合方式: ========================================== ========================================== ...
- struts2与velocity的整合有两种方式
1.以struts2为主.struts2内置了对velocity的支持,只要在<result name="success"?type="velocity" ...
- js获取url參数值的两种方式具体解释
有个url例如以下: http://passport.csdn.net/account/login? from=http%3a%2f%2fwrite.blog.csdn.net%2fpostedit ...
- CefSharp获取页面Html代码的两种方式
CefSharp在NuGet的简介是“The CefSharp Chromium-based browser component”,机翻的意思就是“基于Cefsharp Chromium的浏览器组件” ...
- DevExpress中获取RichTextEdit中RichEditControl的两种方式
方式一: var rte = sender as RichTextEdit; control = rte.Controls[] as RichEditControl; 方式二: PropertyInf ...
随机推荐
- Centos如何通过yum安装php7
执行如下命令安装epel yum -y install epel-release 更换rpm源,请根据自己的centos版本选择相应的rpm源进行安装 Centos 5.X: rpm -Uvh ...
- sql执行计划变更和删除缓存中执行计划的方法
将指定SQL的执行计划从共享池删除的方法 http://www.2cto.com/database/201204/126388.html Oracle SQL执行计划变更的问题 http://www. ...
- spring core
https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/core.html#beans
- GO语言(八) defer注意点
package main import ( "net" "os" "fmt" "io/ioutil" ) func Cl ...
- GO语言(一)G语言自虐
package main import . "fmt" //notice 1 type testInt func(uint32) bool func isOdd(integer u ...
- phonegap 的指南针 api Compass
一. Compass 介绍方法参数 1.Compass 也就是,常说的指南针,又叫罗盘 2.方法 compass.getCurrentHeading compass.watchHeading co ...
- h5做的app和原生app的区别
之所以说h5做的app和原生app的区别,是因为一位博友的问题: 随着 h5 的普及,是不是不再需要开发 app ? 我的回答是要分业务需求,分场合而定. 比如现在的微信小程序这么流行,甚至也取代了不 ...
- 两种方式(xml+代码)构建SqlSessionFactory+完整实现
首先创建类.接口.数据库: entity包下Admin类: package com.wbg.springJavaConfig.entity; public class Admin { private ...
- 关于readonly的一些说明
readonly在代码中只能在字段初始化器和构造函数中赋值,并不是说readonly只能赋值一次,超出这个范围以后readonly就不能通过代码修改了,但是还是可以用反射来修改,readonly仅仅是 ...
- iOS中break、continue、return三者的区别
iOS中break.continue.return三者的区别 1. break 直接跳出当前层次的循环. 如果嵌套循环如for中嵌套while,break只能跳出内层的while循环, ...