Struts2(二)核心思想及其工作原理

来源:互联网 发布:美工自学多久能自己做 编辑:程序博客网 时间:2024/06/05 17:09

通过上一章节的开端,我们对Struts2框架有了整体的认识,已经能够布置一个简单的Struts2小应用,并让他跑起来,现在我们需要的是深入了解其实现的机制,下面我们从以下几方面开始做一个学习。


1. Struts2框架配置文件

  • Struts2框架按照如下顺序加载struts2配置

    default.properties 该文件保存在 struts2-core-2.3.7.jar 中 org.apache.struts2包里面
    struts-default.xml 该文件保存在 struts2-core-2.3.7.jar
    struts-plugin.xml 该文件保存在struts-Xxx-2.3.7.jar
    struts.xml 该文件是web应用默认的struts配置文件
    struts.properties 该文件是Struts的默认配置文件
    web.xml 该文件是Web应用的配置文件

  • 如果多个文件配置了同一个struts2 常量,则后一个文件中配置的常量值会覆盖前面文件配置的常量值


2.Struts2框架Action相关配置

  • struts2所有action都是通过package管理
  • struts-default是struts-default.xml定义的一个package,内含大量拦截器和结果集
  • 每个package,可以定义一个namespace属性,默认值 “”
    这里写图片描述
  • Action的访问路径 = 包名称空间 namespace + Action name属性 例如上图采用默认配置namespace “/”
    所以客户端访问路径 ${pageContext.request.contextPath}/hello

这里写图片描述

  • 如果namespace配置为/demo1, 客户端访问路径
    ${pageContext.request.contextPath}/demo1/hello

3.Struts2框架Action配置默认值
这里写图片描述


4.访问Action

(1)
- struts2 的Action可以是POJO
- 为了让用户开发的Action更加规范struts2提供了一个Action接口

这里写图片描述

(2)
- Struts2为Action接口提供了一个实现类 ActionSupport,定义了 表单域校验、错误信息设置和获得国际化信息相关一些方法
这里写图片描述

(3)

  • 用户编写Action 可以是 POJO

  • 用户编写Action 可以实现Action接口

    可以使用结果集常量字符串

  • 用户编写Action 可以继承ActionSupport基类

    对请求参数进行校验
    设置错误信息
    读取国际化信息

  • execute方法编写注意细节

    public 修饰符
    String 返回值
    无参数

(4)

  • 没有指定method属性,默认执行execute方法
    这里写图片描述
  • 通过method属性,指定调用Action相应方法处理请求
    这里写图片描述
    因为指定了method=”regist”,所以HelloAction的regist方法会被调用

(5)

  • 在配置 action元素时,允许在指定name属性时,使用模式字符串(用(*)代表一个或多个任意字符)
  • 在class、method属性及(result)子元素中通过 {N} 形式代表前面地N个* 匹配子串

这里写图片描述

5.Action访问Servlet API

  • Struts2的Action没有与任何Servlet API耦合,便于测试
  • ActionContext
    getContext() 返回ActionContext实例对象
    get(key) 相当于 HttpServletRequest的getAttribute(String name)方法
    put(String,Object) 相当于HttpServletRequest的setAttribute方法
    getApplication() 返回一个Map对象,存取ServletContext属性
    getSession() 返回一个Map对象,存取HttpSession属性
    getParameters() 类似调用HttpServletRequest的getParameterMap()方法
    setApplication(Map) 将该Map实例里key-value保存为ServletContext的属性名、属性值
    setSession(Map) 将该Map实例里key-value保持为HttpSession的属性名、属性值

方式一 :实现接口,访问Action时完成注入

ServletContextAwarevoid setServletContext(javax.servlet.ServletContext context)ServletRequestAwarevoid setServletRequest(javax.servlet.http.HttpServletRequest request)ServletResponseAwarevoid setServletResponse(javax.servlet.http.HttpServletResponse response)

方式二 使用ServletActionContext

static PageContext getPageContext()static HttpServletRequest getRequest()static HttpServletResponse getResponse()static ServletContext getServletContext()

该方案可避免Action类实现XxxAware接口,但Action依然与Servlet API直接耦合
开发中优先使用ActionContext 这样可以避免耦合

原创粉丝点击