Struts2_007_Servlet API解耦的访问方式web资源之Aware

  • Action 类通过可以实现某些特定的接口, 让 Struts2 框架在运行时向 Action 实例注入 parameters, request, session 和 application 对应的 Map 对象:

微信公众号;JavaWeb架构师

步骤

  1. 实现接口:XxxAware(ApplicationAware,SessionAware,RequestAware,ParameterAware)
  2. 实现接口中的方法,这个方法将传进来相应的web资源属性对象(会被自动调用,依赖注入)
  3. 添加属性成员,接收传进来的web资源属性对象
  4. 使用属性成员

解耦方式访问web资源两种方法的选择

1.ActionContext:每次都需要获取(跨方法时)
2.XxxAware: 一次获取,多次使用(跨方法使用时,选用这个更好)

测试代码

TestAware.java

package top.itcourse.aware;

import java.util.Map;

import javax.servlet.ServletContext;

import org.apache.struts2.dispatcher.SessionMap;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.ParameterAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;

/*
 * 解耦方式访问web资源之Aware:
 *  1. 实现接口:XxxAware(ApplicationAware,SessionAware,RequestAware,ParameterAware)
 *  2.实现接口中的方法,这个方法将传进来相应的web资源属性对象(会被自动调用,依赖注入)
 *  3.添加属性成员,接收传进来的web资源属性对象
 *  4.使用属性成员
 */

/*
 * 解耦方式访问web资源两种方法的选择:
 *  1.ActionContext:每次都需要获取(跨方法时)
 *  2.XxxAware: 一次获取,多次使用(跨方法使用时,选用这个更好)
 */

//1. 实现接口:XxxAware
public class TestAware implements ApplicationAware,SessionAware,RequestAware,ParameterAware{
    // 3.添加属性成员,接收传进来的web资源属性对象
    private Map<String, Object> applicationMap;
    private SessionMap<String, Object> sessionMap;

    // action方法,这个方法名(execute)是action节点的默认method值
    public String execute() {
        System.out.println("进入……");
        // 4.使用属性成员     

        //①. 向application对象加入、读取一个属性
            // 存入           
        applicationMap.put("keyAware", "application属性-Aware");
            // 读取
        if( applicationMap.get("keyJSP") != null ) {
            System.out.println("application-keyJSP:" + applicationMap.get("keyJSP"));
        }

        //② 其它类似

        //③ SessionMap的invalidate方法,使session失效
        sessionMap.invalidate();
        System.out.println("session失效了");


        // 这个返回值(success)是result节点的默认name接受值
        return "success";
    }

    // 2.实现接口中的方法,这个方法将传进来相应的web资源属性对象
    // application
    @Override
    public void setApplication(Map<String, Object> application) {
        this.applicationMap = application;
    }

    // parameters
    @Override
    public void setParameters(Map<String, String[]> parameters) {
        // TODO Auto-generated method stub

    }

    // request
    @Override
    public void setRequest(Map<String, Object> request) {
        // TODO Auto-generated method stub

    }

    @Override
    public void setSession(Map<String, Object> sessionMap) {
        // 要强转一下,变成SessionMap
        this.sessionMap = (SessionMap<String, Object>) sessionMap;
    }
}

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>    

<!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">点击一下</a>
        <br />

        <!-- 读取application的属性(在Action中通过Aware方式设置的) -->
        <c:if test="${applicationScope.keyAware != null }">
            application-keyAware: 
        </c:if>
        <c:out value="${applicationScope.keyAware }"></c:out>

        <!-- 设置application的属性 -->
        <c:if test="${applicationScope.keyJSP == null }">
            <!-- value:属性值;var:属性名;scope:域范围 -->
            <c:set value="application属性-JSP" var="keyJSP" scope="application"></c:set>
        </c:if>

        <br /><br />
        <!-- 测试session失效的invalidate方法 -->
        <% 
            /* 每次打印的对象的地址不同,就证明session失效了(session本会维持一次浏览器的开启到关闭不变) */
            System.out.println(session);
        %>
    </body>
</html>

结果

微信公众号:JavaWeb架构师

微信公众号:JavaWeb架构师


其它



- 源码下载

关注下方公众号,回复:解耦的访问方式web资源之Aware.code

完整教程PDF版本下载

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值