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

通过上一章节的开端,我们对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时完成注入

ServletContextAware
void setServletContext(javax.servlet.ServletContext context)

ServletRequestAware
void setServletRequest(javax.servlet.http.HttpServletRequest request)

ServletResponseAware
void setServletResponse(javax.servlet.http.HttpServletResponse response)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

方式二 使用ServletActionContext

static PageContext getPageContext()
static HttpServletRequest getRequest()
static HttpServletResponse getResponse()
static ServletContext getServletContext()
  • 1
  • 2
  • 3
  • 4
  • 5

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


猜你喜欢

转载自blog.csdn.net/lizhensen/article/details/79769042