首页投稿(暂停使用,暂停投稿)今日看点程序员

3. 解析 struts.xml 文件

2016-11-28  本文已影响183人  MPPC

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

<struts>
    <!-- 设置常量 -->
    <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
    <constant name="struts.devMode" value="true"/>
    <!-- 修改默认的扩展名 -->
    <constant name="struts.action.extension" value="action,,do"/>
    <!--
        1、package: 包. struts2 使用 package 来组织模块.
        2、name 属性: 必须. 用于其它的包应用当前包.
        3、extends: 当前包继承哪个包, 继承的, 即可以继承其中的所有的配置. 通常情况下继承 struts-default
                 struts-default 这个包在 struts-default.xml 文件中定义.
        4、namespace 可选, 如果它没有给出, 则以 / 为默认值.
                     若 namespace 有一个非默认值, 则要想调用这个包里的Action,
                     就必须把这个属性所定义的命名空间添加到有关的 URI 字符串里
    -->
    <package name="default" namespace="/" extends="struts-default">
        <!--
            1、配置一个action 一个Struts请求就是一个action
            2、name:一个请求的名字(或者一个ServletPath,但是去除"/"和扩展名)
            3、class: 指定处理请求的Action, 如果没有填写,默认值为 struts-default.xml 中配置的 com.opensymphony.xwork2.ActionSupport
            4、method: 1)、处理请求的Action 的 method, 如果不设置,默认调用的是 execute 方法
                       2)、没有该方法就会抛出 NoSuchMethodException 异常
                       3)、如果有继承 ActionSupport ,并且没有配置 method,就会调用 ActionSupport 的 execute,返回一个常量  SUCCESS = "success";  根据常量去result不同的结果
        -->
        <action name="helloworld" class="org.pan.struts2.UserAction">
            <!--
                name: 和action中的class方法返回的字符串相匹配(默认为success,可不写)
                type: 表示结果类型,默认为dispatcher(转发到结果路径,可不写), 其他相关类型,在package 继承的struts-default.xml 中
                result中填写要转发到的路径
             -->
            <result name="success" type="dispatcher">/WEB-INF/views/success.jsp</result>
        </action>
    </package>
    <!-- 如果包含多个 struts.xml, 可以包含到一个总的配置文件中 -->
    <include file="struts-user.xml"/>
</struts>

2. result-type 结果类型

<result-types>
    <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
    <result-type name="dispatcher" class="org.apache.struts2.result.ServletDispatcherResult" default="true"/>
    <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
    <result-type name="httpheader" class="org.apache.struts2.result.HttpHeaderResult"/>
    <result-type name="redirect" class="org.apache.struts2.result.ServletRedirectResult"/>
    <result-type name="redirectAction" class="org.apache.struts2.result.ServletActionRedirectResult"/>
    <result-type name="stream" class="org.apache.struts2.result.StreamResult"/>
    <result-type name="velocity" class="org.apache.struts2.result.VelocityResult"/>
    <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
    <result-type name="plainText" class="org.apache.struts2.result.PlainTextResult" />
    <result-type name="postback" class="org.apache.struts2.result.PostbackResult" />
</result-types>
<!-- 这两个等价 -->
<result name="success" type="dispatcher">/WEB-INF/views/success.jsp</result>
<result name="success" type="dispatcher">
    <param name="location">/WEB-INF/views/success.jsp</param>
</result>
<!-- redirect 只能重定向到外部资源,不能到内部资源 -->
<result name="success" type="redirect">/redirect.jsp</result>

<!-- 重定向到一个Action /NameSpace/actionName-->
<result name="success" type="redirect">/pan/add</result>
<package name="testType" namespace="/pan" extends="struts-default">
    <action name="add" class="org.pan.struts2.action.HelloAction" method="add">
        <result name="success">/WEB-INF/views/success.jsp</result>
    </action>
</package>
<!-- redirectAction:重定向到一个Action,需要指定两个参数,actionName、namespace -->
<result name="success" type="redirectAction">
    <param name="actionName">add</param>
    <param name="namespace">/pan</param>
</result>
<!-- chain 转发到一个Action 形成一个 Action 链 -->
<result name="success" type="chain">
    <param name="actionName">update</param>
    <param name="namespace">/pan</param>
    <param name="method">update</param>
</result>
<filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
  <dispatcher>FORWARD</dispatcher>
  <dispatcher>REQUEST</dispatcher>
</filter-mapping>
<!--
    1、使用 dispatcher 进行请求转发到一个 Action,需要在 struts2的 filter-mapping 中配置请求的方式
        添加 <dispatcher>FORWARD</dispatcher>, 但是默认的 <dispatcher>REQUEST</dispatcher>我们也需要添加上去
    2、否则不会去拦截我们的清秀资源
 -->
<result name="success" type="dispatcher">/pan/update</result>

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

<global-results>
    <result name="success" type="dispatcher">/WEB-INF/views/success.jsp</result>
</global-results>
<!-- result name相同,优先返回 action 中的 result -->
<action name="helloworld" class="org.pan.struts2.action.HelloAction" method="execute">
    <result name="success" type="dispatcher">/WEB-INF/views/input.jsp</result>
</action>

4. 通配符映射

<a href="study-add.do">Study Add</a><br/>
<a href="study-delete.do">Study Delete</a><br/>
<a href="study-update.do">Study Update</a><br/>
<a href="study-query.do">Study Query</a><br/>

<action name="study-*" class="org.pan.struts2.action.TestTongPeiFu" method="{1}">
    <result name="{1}">/success.jsp</result>
</action>
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)

<constant name="struts.enable.DynamicMethodInvocation" value="true"/>

6. Struts2 异常处理

<!-- 局部映射 -->
<action name="testException" class="org.pan.struts2.action.UserAction" method="testException">
        <!-- 局部的异常映射 -->
         <exception-mapping exception="java.lang.ArithmeticException" result="exception"></exception-mapping>
         <result name="success" type="dispatcher">/WEB-INF/views/success.jsp</result>
         <result name="exception" type="dispatcher">/WEB-INF/views/exception.jsp</result>
</action>


<!-- 全局映射 -->
<global-results>
  <result name="error">/WEB-INF/views/exception.jsp</result>
</global-results>
<global-exception-mappings>
   <!-- 全局的异常映射,如果返回一个局部的result, 会查找该package下所有对应的 -->
   <!--<exception-mapping exception="java.lang.ArithmeticException" result="exception"></exception-mapping>-->
   <!--所以最好引用配置的全局的 result -->
   <exception-mapping exception="java.lang.ArithmeticException" result="error"></exception-mapping>
</global-exception-mappings>
上一篇下一篇

猜你喜欢

热点阅读