3. 解析 struts.xml 文件

1. struts.xml 文件基本配置:

  • 主要放在资源路径下,配置 sturts2相关的 Action , 拦截器等配置

    
    
    
    
    
    
    
        
        
            
            /WEB-INF/views/success.jsp
        
    
    
    

2. result-type 结果类型

  • Struts2 中我们已经不再需要手动跳转到的指定资源,而是 Struts2 在框架内部替我们完成。
  • 我们可以在 action 标签配置多个 result,并为 result 指定一个 name 属性
  • 我们只需要在 action 方法中返回一个 result 的那么,则 Struts2 会自动调到对应 result 指定资源。
  • Struts2 默认以转发的形式跳转到目标资源,我们也可以通过 type属性 来指定跳转的方式。
  • 在 struts-default.xml 中定义了所有的 result-types:

    
    
    
    
    
    
    
    
    
    
    

  • 常用的有四种结果类型

    • dispatcher (请求转发)
    • chain (请求到一个 Action)
    • redirect (重定向, 也可以重定向到一个 Action)
    • redirectAction (重定向到一个 Action)
  • dispatcher 通过转发的形式跳转到目标资源,默认值

    • dispatcher需要指定一个location属性,指向一个目标资源的地址,
    • location 是默认属性,可以直接在result标签中配置,也可以通过param标签单独配置

/WEB-INF/views/success.jsp

    /WEB-INF/views/success.jsp

  • redirect 通过重定向的形式跳转到目标资源
    • redirect 结果类型将把响应重定向到另一个资源, 而不是转发给该资源.
    • redirect 结果类型接受下面这些参数:
      • location: 用来给出重定向的目的地.它是默认属性
      • parse: 用来表明是否把 location 参数的值视为一个 OGNL 表达式来解释. 默认值为 true
    • redirect 结果类型只能把响应重定向到一个外部资源
    • 使用 redirect 同样也可以重定向到一个Action

/redirect.jsp


/pan/add
  • redirectAction 通过重定向的形式跳转到一个Action
    • redirectAction 结果类型把响应重定向到另一个 Action
    • redirectAction 结果类型接受下面这些参数:
      • actionName: 指定 “目的地” action 的名字. 它是默认属性
      • namespace: 用来指定 “目的地” action 的命名空间. 如果没有配置该参数, Struts 会把当前 Action 所在的命名空间作为 “目的地” 的命名空间

    
        /WEB-INF/views/success.jsp
    



    add
    /pan

  • chain 将请求直接转发到一个Action(通过转发的形式跳转的一个Action)
    • chain 结果类型的基本用途是构成一个 action 链: 前一个 action 把控制权转发给后一个 action, 而前一个 action 的状态在后一个 action 中依然保持
    • chain 结果类型接受下面这些参数:
      • actionName: 指定目标 action 的名字. 它是默认属性
      • namespace: 用来指定 “目的地” action 的命名空间. 如果没有配置该参数, Struts 会把当前 action 所在的命名空间作为 “目的地” 的命名空间
      • method: 指定目标 action 方法. 默认值为 execute


    update
    /pan
    update

  • 不要使用 type=dispatcher 的方式转发到一个 Action,但是我们可以通过配置 struts2 的 filter-mapping 的拦截方式来实现
    • filter-mapping,默认情况下,只能直接访问( REQUEST )目标资源才会执行过滤器,而 forward 执行目标资源,不会执行过滤器!
    • 所以我们首先需要先配置 struts2 的filter-mapping

  struts2
  /*
  FORWARD
  REQUEST


/pan/update

3. 在 package 标签中来映射全局的result

  • global-results 标签配置到package标签,它可以 对当前package中的所有action起作用。
  • 但是,如果 action 中有和global-results相同名字的result,则会优先使用当前action中配置的result。

    /WEB-INF/views/success.jsp



    /WEB-INF/views/input.jsp

4. 通配符映射

  • 一个 Web 应用可能有成百上千个 action 声明. 可以利用 struts 提供的通配符映射机制把多个彼此相似的映射关系简化为一个映射关系
  • 通配符映射规则
    • 若找到多个匹配, 没有通配符的那个将胜出
    • 若指定的动作不存在, Struts 将会尝试把这个 URI 与任何一个包含着通配符 * 的动作名及进行匹配
    • 被通配符匹配到的 URI 字符串的子串可以用 {1}, {2} 来引用. {1} 匹配第一个子串, {2} 匹配第二个子串…
      {0} 匹配整个 URI
    • 若 Struts 找到的带有通配符的匹配不止一个, 则按先后顺序进行匹配 ,在 package 中的顺序,最上边的action。
    • *可以匹配零个或多个字符, 但不包括 / 字符. 如果想把 / 字符包括在内, 需要使用 **. 如果需要对某个字符进行转义, 需要使用 \.
Study Add
Study Delete
Study Update
Study Query
/success.jsp
public String add() {
        System.out.println("add........");
        return "add";
    }
    public String delete() {
        System.out.println("delete........");
        return "delete";
    }
    public String update() {
        System.out.println("update........");
        return "update";
    }
    public String query() {
        System.out.println("query........");
        return "query";
}

5. 动态方法调用(DMI)

  • 动态方法调用: 通过 url 动态调用 Action 中的方法
  • 调用方式:actionName!methodName
  • URI:
    • /struts-app2/Product.action: Struts 调用 Product 类的 execute
    • /struts-app2/Product!save.action: Struts 调用 Product 类的 save() 方法
  • 默认情况下, Struts 的动态方法调用处于禁用状态 在struts.xml 中修改

6. Struts2 异常处理

  • 一个成熟的MVC框架中还需要有一个完善的异常处理机制,也就是说框架内部应该可以替我们完成出现异常以后的处理。
    Struts2 提供了一种声明式的异常处理方式。可以将异常交给Struts2处理,Struts2捕获到指定异常后会返回浏览器一个指定页面。
  • 异常映射有两种方式,一种是局部异常映射、一种是全局异常映射。
  • 局部的异常映射:
    • exception-mapping 元素: 配置当前 action 的声明式异常处理
    • exception-mapping 元素中有 2 个属性
    • exception: 指定需要捕获的的异常类型。异常的全类名
    • result: 指定一个响应结果, 该结果将在捕获到指定异常时被执行, 既可以来自当前 action 的声明, 也可以来自 global-results 声明
  • 全局异常映射
    • 可以通过 global-exception-mappings 元素为应用程序提供一个全局性的异常捕获映射.
    • 但在 global-exception-mappings 元素下声明的任何 exception-mapping 元素最好只引用在 global-results 元素下声明的某个 result 元素
  • 声明式异常处理机制由 ExceptionMappingInterceptor 拦截器负责处理,
    • 当某个 exception-mapping 元素声明的异常被捕获到时, ExceptionMappingInterceptor 拦截器就会向 ValueStack 中添加两个对象:
    • exception: 表示被捕获异常的 Exception 对象
    • exceptionStack: 包含着被捕获异常的栈
    • 可以在视图上通过 标签, 或者 显示异常消息


        
         
         /WEB-INF/views/success.jsp
         /WEB-INF/views/exception.jsp





  /WEB-INF/views/exception.jsp


   
   
   
   

你可能感兴趣的:(3. 解析 struts.xml 文件)