Struts2_006_Servlet API解耦的访问方式web资源

来源:互联网 发布:魅思cms视频系统 编辑:程序博客网 时间:2024/06/05 01:16

简介

  • 为了避免与 Servlet API 耦合在一起, 方便 Action 做单元测试, 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()
  • 获取 HttpServletRequest 对应的 Map 对象:
    • public Object get(Object key): ActionContext 类中没有提供类似 getRequest() 这样的方法来获取 HttpServletRequest 对应的 Map 对象. 要得到 HttpServletRequest 对应的 Map 对象, 可以通过为 get() 方法传递 “request” 参数实现

测试代码

TestActionContext.java

package top.itcourse.action.context;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Locale;import java.util.Map;import com.opensymphony.xwork2.ActionContext;/** * Action类 * @author mac *//* * 通过 ActionContext 访问 Web 资源 *  1.ServletContext的属性设置: *      1.1.获取ActionContext对象:ActionContext.getContext() *      1.2.获取ServletContext对象的Attribute的Map:调用ActionContext对象的getApplication方法 *      1.3.通过Map设置属性:put(key,value) *      1.4.通过Map获取相应的属性:get(key) *  *  2.Session类似。 *  *  3.request: *      3.1.获取的时候是调用ActionContext对象的get("request")方法,并强转成Map *      3.2.其它类似 *   *  4.请求参数 *      4.1.其它类似 *      4.2.调用ActionContext对象的getParameters方法 *      4.3.通过get方法获取参数数组(返回的是数组) *      4.4.不能写入请求参数 *  * 说明: *  都没有直接得到相关的对象,都是通过封装后的方法,去操作的部分方法(属性等) */public class TestActionContext {    public TestActionContext() {    }    /*    * public class ActionContext extends Object implements Serializable:    * ActionContext是执行的Action的上下文。每个上下文基本上是一个对象的容器,一个操作需要执行,如会话,参数,区域设置等。    * ActionContext是线程本地的,这意味着存储在ActionContext中的值在每个线程中是唯一的。    * 这样做的好处是,您不需要担心用户特定的操作上下文,您只需获取它:    *   ActionContext context = ActionContext.getContext();    * 最后,由于线程本地使用,您不需要担心使您的操作线程安全。    */    // action方法:ok    public String save() {        /*        * public static  ActionContext  getContext():        *   返回特定于当前线程的ActionContext。        * 返回:        *   当前线程的ActionContext永远不为null。        */        // 0.获取ActionContext对象        ActionContext actionContext = ActionContext.getContext();        /*        * public  Map < String,Object > getApplication():        *   在servlet环境或通用应用程序级别Map中返回ServletContext的Map。        * 返回:        *   一个ServletContext或通用应用程序级的Map        * 源码:        *   public Map<String, Object> getSession() {        *       return (Map<String, Object>)get(SESSION);        *   }        */        // 1.获取application的Map,并向其中添加、获取属性        Map<String, Object> applicationMap = actionContext.getApplication();        // 获取内容,在jsp中通过application对象设置的             if (applicationMap.get("keyJSP") != null) {            System.out.println("application: " + applicationMap.get("keyJSP")); //get方法,获取属性值        }        //ServletContext中的get、set属性的方法,可以直接通过Map的get、put方法使用(没有办法)        applicationMap.put("keyAction", "Action类中设置的我:" + new SimpleDateFormat("yyyy年MM月dd日", Locale.CHINA).format(new Date()));        // 在index页面去获取出来        // 2.获取session的Map,并向其中添加、获取属性        Map<String, Object> sessionMap = actionContext.getSession();        if (applicationMap.get("keyJSP") != null) {            System.out.println("session:" + sessionMap.get("keyJSP"));  //get方法,获取属性值        }        sessionMap.put("keyAction", "Action类中设置的我:" + new SimpleDateFormat("yyyy年MM月dd日", Locale.CHINA).format(new Date()));        // 在index页面去获取出来        // 3.获取request的Map,并向其中添加、获取属性(注意,request这里要强制转换)        Map<String, Object> requestMap = (Map<String, Object>) actionContext.get("request");        requestMap.put("keyAction", "Action类中设置的我:" + new SimpleDateFormat("yyyy年MM月dd日", Locale.CHINA).format(new Date()));        // 在index页面去获取出来        // 4.获取请求参数对应的Map,并获取指定的参数值        Map<String, Object> parametersMap = actionContext.getParameters();        /*        * public  HttpParameters  getParameters()        * 在servlet环境中返回HttpServletRequest参数的映射,否则返回一般的Map参数。        * 返回:        *   在Servlet环境中使用HttpServletRequest参数或多部分映射的映射,或者其他参数的通用Map。        */        // 这里get返回的都是一个String类型的数组              System.out.println("name: " + ((String[])parametersMap.get("name"))[1]);        //只能读,不能写,但是写入不报错        return "ok";    }}

index.jsp

<%@page import="java.util.Locale"%><%@page import="java.text.SimpleDateFormat"%><%@page import="java.util.Date"%><%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    <!DOCTYPE html><html>    <head>        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">        <title>2017</title>        <!-- 导入jQuery文件 -->        <script src="js/jquery-1.10.1.js" type="text/javascript" charset="utf-8"></script>        <!-- script书写位置 -->             <script type="text/javascript">        </script>    </head>    <body>        <a href="access.action?name=Mushroom&name=test">测试一下</a>        <br /><br />        <!-- application -->        <c:if test="${applicationScope.keyAction != null }">            <c:out value="application: "></c:out>        </c:if>        <!-- 如果value不是null,那么就显示value的值,否则就显示标签体的内容(这里就是空) -->        <!-- 结果:value (在Action类中通过application的Map设置的) -->        <c:out value="${applicationScope.keyAction }"></c:out>         <!-- 这里设置,在Action类中获取 -->        <%             if( application.getAttribute("keyJSP") == null ) {                application.setAttribute("keyJSP", "jsp中设置的我:" + new SimpleDateFormat("yyyy年MM月dd日",Locale.CHINA).format(new Date()));            }        %>        <br /><br /><br />        <!-- session -->        <c:if test="${sessionScope.keyAction != null }">            <c:out value="session: "></c:out>        </c:if>        <c:out value="${sessionScope.keyAction }"></c:out>         <!-- 这里设置,在Action类中获取 -->        <%             if( session.getAttribute("keyJSP") == null ) {                session.setAttribute("keyJSP", "jsp中设置的我:" + new SimpleDateFormat("yyyy年MM月dd日",Locale.CHINA).format(new Date()));            }        %>          <br /><br /><br />        <!-- request -->        <c:if test="${requestScope.keyAction != null }">            <c:out value="request: "></c:out>        </c:if>        <c:out value="${requestScope.keyAction }"></c:out>         <!-- 这里设置,在Action类中获取 -->        <%             if( request.getAttribute("keyJSP") == null ) {                request.setAttribute("keyJSP", "jsp中设置的我:" + new SimpleDateFormat("yyyy年MM月dd日",Locale.CHINA).format(new Date()));            }        %>          </body></html>

struts.xml

<?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>      <!-- 这是struts.xml文件的模板 -->    <package name="default" extends="struts-default">          <action name="access" class="top.itcourse.action.context.TestActionContext" method="save">              <result name="ok">index.jsp</result>          </action>      </package>  </struts>  

效果

微信公众号:JavaWeb架构师

微信公众号:JavaWeb架构师


其它



- 源码下载

关注下方公众号,回复:Servlet API解耦的访问方式web资源.code
  • 欢迎加入交流群:451826376

  • 更多信息:www.itcourse.top

完整教程PDF版本下载