Struts2_通过 ActionContext 获取 WEB 资源

新建动态web项目:
src中新建包名为:com.atguigu.struts2.action:
在里面新建一个类:

package com.atguigu.struts2.action;

import java.util.Map;

import org.apache.struts2.dispatcher.SessionMap;

import com.opensymphony.xwork2.ActionContext;

public class TestActionContextAction {

    public String execute(){

        //0. 获取 ActionContext 对象
        //ActionContext 是 Action 的上下文对象. 可以从中获取到当往 Action 需要的一切信息
        ActionContext actionContext = ActionContext.getContext();

        //1. 获取 application 对应的 Map, 并向其中添加一个属性
        //通过调用 ActionContext 对象的 getApplication() 方法来获取 application 对象的 Map 对象
        Map<String, Object> applicationMap = actionContext.getApplication();
        //设置属性
        applicationMap.put("applicationKey", "applicationValue");

        //获取属性
        Object date = applicationMap.get("date");
        System.out.println("date: " + date);

        //2. session
        Map<String, Object> sessionMap = actionContext.getSession();
        sessionMap.put("sessionKey", "sessionValue");

    
          System.out.println(sessionMap.getClass()); 

      if(sessionMap instanceof SessionMap){
        SessionMap sm = (SessionMap) sessionMap;
        sm.invalidate();
        System.out.println("session 失效了. ");
      }

//3. request* 
        //ActionContext 中并没有提供 getRequest 方法来获取 request 对应的 Map
        //需要手工调用 get() 方法, 传入 request 字符串来获取. 
        Map<String, Object> requestMap = (Map<String, Object>) actionContext.get("request");
        requestMap.put("requestKey", "requestValue");

        //4. 获取请求参数对应的 Map, 并获取指定的参数值. 
        //键: 请求参数的名字, 值: 请求参数的值对应的字符串数组
        //注意: 1. getParameters 的返回值为在 Map<String, Object>, 而不是 Map<String, String[]>
        //     2. parameters 这个 Map 只能读, 不能写入数据, 如果写入, 但不出错, 但也不起作用!
        Map<String, Object> parameters = actionContext.getParameters();
        System.out.println(((String[])parameters.get("name"))[0]);

        parameters.put("age", 100);

        return "success";
    }

}

WebContent 中新建一个index.jsp页面:

<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

    <a href="TestActionContext.action?name=atguigu">Test ActionContext</a>
    <% 
        if(application.getAttribute("date") == null)
            application.setAttribute("date", new Date());

        request.setAttribute("req", "reqvalue");
    %>

</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>

    <package name="default" namespace="/" extends="struts-default">

        <action name="TestActionContext" 
            class="com.atguigu.struts2.action.TestActionContextAction">
            <result  name="success">/test-actionContext.jsp</result>    
        </action>

</struts>

WebContent 中新建一个 test-actionContext.jsp 页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

    <h4>Test ActionContext Page</h4>

    application : ${applicationScope.applicationKey }
    <br><br>

    session: ${sessionScope.sessionKey }
    <br><br>

    request: ${requestScope.requestKey }
    <br><br>

    age: ${parameters.age }

</body>
</html>

action VS Action

  1. action: 代表一个 Struts2 的请求.
  2. Action 类: 能够处理 Struts2 请求的类.
    1. 属性的名字必须遵守与 JavaBeans 属性名相同的命名规则. 属性的类型可以是任意类型. 从字符串到非字符串(基本数据库类型)之间的数据转换可以自动发生
    2. 必须有一个不带参的构造器: 通过反射创建实例
    3. 至少有一个供 struts 在执行这个 action 时调用的方法
    4. 同一个 Action 类可以包含多个 action 方法.
    5. Struts2 会为每一个 HTTP 请求创建一个新的 Action 实例, 即 Action 不是单例的, 是线程安全的.

Action 中访问 WEB 资源:

  1. 什么是 WEB 资源 ?
    1. HttpServletRequest, HttpSession, ServletContext 等原生的 Servlet API。
  2. 为什么访问 WEB 资源?
    1. B\S 的应用的 Controller 中必然需要访问 WEB 资源: 向域对象中读写属性, 读写 Cookie, 获取 realPath ….
  3. 如何访问 ?
    1. Servlet API 解耦的方式: 只能访问有限的 Servlet API 对象, 且只能访问其有限的方法(读取请求参数, 读写域对象的属性, 使 session 失效…).
      1. 使用 ActionContext
      2. 实现 XxxAware 接口
      3. 选用的建议: 若一个 Action 类中有多个 action 方法, 且多个方法都需要使用域对象的 Mapparameters, 则建议使用Aware 接口的方式
      4. session 对应的 Map 实际上是 SessionMap 类型的! 强转后若调用其 invalidate() 方法, 可以使其 session 失效!
    2. Servlet API 耦合的方式: 可以访问更多的 Servlet API 对象, 且可以调用其原生的方法.
      1. 使用 ServletActionContext
      2. 实现 ServletXxxAware 接口
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值