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

简介

  • 为了避免与 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

完整教程PDF版本下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值