Struts2-访问Web资源

32 篇文章 0 订阅
6 篇文章 0 订阅

Action类

  • action: 应用程序可以完成的每一个操作. 例如: 显示一个登陆表单; 把产品信息保存起来
  • Action类: 普通的 Java 类, 可以有属性和方法, 同时必须遵守下面这些规则:
    • 属性的名字必须遵守与 JavaBeans 属性名相同的命名规则. 属性的类型可以是任意类型. 从字符串到非字符串(基本数据库类型)之间的数据转换可以自动发生
    • 必须有一个不带参的构造器
    • 至少有一个供 Struts2 在执行这个 action 时调用的方法
    • 同一个 Action 类可以包含多个 action 方法.
    • Struts2 会为每一个 HTTP 请求创建一个新的 Action 实例

访问Web资源

Action 中, 可以通过以下方式访问 webHttpSession, HttpServletRequest, HttpServletResponse 等资源。

与 Servlet API 解耦的访问方式

通过ActionContext

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” 参数实现

//com.opensymphony.xwork2.ActionContext
public String execute() {

    //0.获取ActionContext对象
    ActionContext ac = ActionContext.getContext(); 

    //1.获取Application对应的Map,并向其添加一个属性
    //通过调用ApplicationContext对象的getApplication方法来获取
    Map<String, Object> applicationMap = ac.getApplication();
    //设置属性
    applicationMap.put("applicationKey", "applicationValue");
    //获取属性
    Object date = applicationMap.get("date");
    System.out.println(date);

    //2.Session
    Map<String, Object> sessionMap = ac.getSession();
    sessionMap.put("sessionKey", "sessionValue");
    /*
     * session 对应的Map其实是SessionMap类型的
     * 强转后,可以调用invalidate方法,使Session失效
     */
    if( sessionMap instanceof SessionMap ) {
        SessionMap sm = (SessionMap) sessionMap;
        sm.invalidate();
        System.out.println("Session 失效了.");
    }

    //3.Request
    //ActionContext中并没有提供getRequest方法来获取Request对应的Map
    @SuppressWarnings("unchecked")
    Map<String, Object> requestMap = (Map<String, Object>) ac.get("request");
    requestMap.put("requestKey", "requestValue");

    //4.获取请求参数对应的Map,并获取指定参数
    //键是请求参数的名字,值是请求参数对应的字符串数组
    // 1. getParameters的返回类型是Map<String, Parameter>
    // 2. getParameters这个Map只能读,不能写入数据;如果写入,不会出错,也不起作用
    Map<String, Parameter> parameters = ac.getParameters();
    System.out.println(parameters.get("name")); 
    return "success";
}
通过 Action 实现XxxAware接口

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

@SuppressWarnings("deprecation")
public class TestAwareAction 
    implements ApplicationAware, RequestAware, SessionAware, ParameterAware {

    private Map<String, Object> application;
    private Map<String, Object> session;
    private Map<String, Object> request;
    private Map<String, String[]> parameters;



    public String execute() {
        //1.获取Application
        application.put("applicationKey2", "applicationValue2");
        request.put("requestKey2", "requestValue2");
        session.put("sessionKey2", "sessionValue2");

        return "success";
    }

    @Override
    public void setApplication(Map<String, Object> application) {
        this.application = application;
    }

    @Override
    public void setRequest(Map<String, Object> request) {
        this.request = request;
    }

    @Override
    public void setParameters(Map<String, String[]> parameters) {
        this.parameters = parameters;
        System.out.println(parameters.get("name"));
    }

    @Override
    public void setSession(Map<String, Object> session) {
        this.session = session;
    }
}

若一个Action类中有多个action方法,且多个方法都需要使用域对象的Map或者Parameter。
使用实现Aware接口这种方法

与 Servlet API 耦合的访问方式

直接访问 Servlet API 将使 ActionServlet 环境耦合在一起, 测试时需要有 Servlet 容器, 不便于对 Action 的单元测试.

  • 直接获取 HttpServletRequest 对象:
    ServletActionContext.getRequest()
  • 直接获取 HttpSession 对象
    ServletActionContext.getRequest().getSession()
  • 直接获取 ServletContext 对象
    ServletActionContext.getServletContext()
  • 通过实现 ServletRequestAware,ServletResponseAware, ServletContextAware 等接口的方式

通过实现ServletXxxAware接口的方式可以由Struts2注入需要的Servlet相关的对象
ServletRequestAware:注入HttpRequest对象
ServletResponseAware:注入HttpResponse对象
ServletContextAware: 注入ServletContext对象

public class TestServletActionContext {

    public String execute() {
        HttpServletRequest request = ServletActionContext.getRequest();
        HttpSession session = request.getSession();
        ServletContext servletContext = ServletActionContext.getServletContext();

        System.out.println("execute....");
        return "success";
    }
}

ActionSupport

com.opensymphony.xwork2.ActionSupport 类是默认的 Action 类.

<action>结点中不写class属性,其默认值就是com.opensymphony.xwork2.ActionSupport,其中。result默认的name属性是execute

在编写 Action 类时, 通常会对这个类进行扩展。
这里写图片描述

在手工完成字段验证,显示错误信息,国际化等情况下,推荐使用继承ActionSupport类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值