什么是与Servlet API解耦?

为了避免与servlet API耦合在一起,方便Action做单元测试,

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

两种解耦方式:

1、    使用Struts2提供的工具类中提供的静态方法,得到对用的封装后对象。

  

package cn.itcast.context;

import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class ContextAction extends ActionSupport { /**
*
*/
private static final long serialVersionUID = 1L; public String test() throws Exception{
System.out.println("ContextAction ****** test()"); HttpServletRequest request=ServletActionContext.getRequest();
request.setAttribute("username","username_request"); HttpServletResponse response=ServletActionContext.getResponse(); Map sessionMap=ServletActionContext.getContext().getSession();
sessionMap.put("username", "username_session"); ServletContext sc=ServletActionContext.getServletContext();
sc.setAttribute("username", "username_application"); return "attr";
}
}

2、    Action实现ServletRequestAware,ServletResponseAware,ServletContextAware,SessionAware四个接口,分别重写对应的set方法,达到操作该4个封装后对象。

package cn.itcast.context;

import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;
import org.apache.struts2.util.ServletContextAware; import com.opensymphony.xwork2.ActionSupport; public class Context02Action extends ActionSupport
implements ServletRequestAware,ServletResponseAware,ServletContextAware,SessionAware{ HttpServletRequest request;
HttpServletResponse response;
ServletContext context;
Map<String, Object> sessionMap; private static final long serialVersionUID = 1L; public String test() throws Exception{
System.out.println("ContextAction ****** test()"); HttpServletRequest request=ServletActionContext.getRequest();
request.setAttribute("username","username_request"); HttpServletResponse response=ServletActionContext.getResponse(); Map sessionMap=ServletActionContext.getContext().getSession();
sessionMap.put("username", "username_session"); ServletContext sc=ServletActionContext.getServletContext();
sc.setAttribute("username", "username_application"); return "attr";
} public void setSession(Map<String, Object> session) {
this.sessionMap=session;
} public void setServletContext(ServletContext context) {
this.context=context; } public void setServletResponse(HttpServletResponse response) {
this.response=response;
} public void setServletRequest(HttpServletRequest request) {
this.request=request; }
}

两种方式没有好坏之分,全凭个人喜好!

其他代码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts> <package name="context" namespace="/context" extends="struts-default">
<action name="contextAction_test" class="cn.itcast.context.ContextAction" method="test">
<result name="success">/context/success.jsp</result>
<result name="attr">/context/attr.jsp</result>
</action>
<action name="contextAction02_test" class="cn.itcast.context.Context02Action" method="test">
<result name="success">/context/success.jsp</result>
<result name="attr">/context/attr.jsp</result>
</action>
</package> </struts>

struts_context.xml

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'test.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
--> </head> <body>
<a href="${pageContext.request.contextPath }/context/contextAction_test.do">textContext</a><br/>
<a href="${pageContext.request.contextPath }/context/contextAction02_test.do">testContext</a><br/>
</body>
</html>

context/test.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'success.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
--> </head> <body>
xxxxxxxxxxxxxx<br/>
</body>
</html>

context/success.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'attr.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
--> </head> <body>
${requestScope.username }<br/>
${sessionScope.username }<br/>
${applicationScope.username }
</body>
</html>

context/attr.jsp

  

最新文章

  1. POI操作Excel
  2. CentOs中yum安装LAMP+PHPMYADMIN
  3. Tomcat调试笔记
  4. js模版引擎handlebars.js实用教程——由于if功力不足引出的Helper
  5. 配置redis外网可访问,并只允许指定的ip可访问redis
  6. PHP扩展开发相关总结
  7. Android 4.4KitKat AudioRecord 流程分析
  8. swift 与 指针初级使用
  9. python中提示invalid syntax 总结
  10. 15 个响应式的 jQuery 图像滑块插件
  11. 成都Python工程师招聘
  12. VS013的单元测试去哪里了
  13. MySql不支持主外键
  14. 也谈---基于 HTTP 长连接的“服务(转载)
  15. Oracle 阅读器-刚看完表空间回复的详细解释
  16. CentOS7 下使用YUM安装 MySQL5.7
  17. Windows MDI(Multiple-Document Interface)
  18. android imageview按钮按下动画效果
  19. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2-&gt;新增记录SQL执行过程
  20. python之socket模块详解--小白博客

热门文章

  1. TCP/IP详解 卷一(第二章 链路层)
  2. 如何让DIV居中
  3. c# using三种用法
  4. 世纪怎么换算成具体的年份?eg:19世纪60年代=19??年?
  5. Oracle的主键约束、唯一约束与外键约束
  6. FileUpload控件预览图片
  7. ie6中 object doesn’t support this property or method
  8. Windows 10正式版历代记:Version 1709、Build 16299都是什么鬼?
  9. jquery单选框radio绑定click事件实现方法
  10. 循序渐进学Python 1 安装与入门