• (二)Struts.xml文件详解


    一、Struts.xml文件

    •    Struts.xml文件构成

    如图,《Struts》标签内共有5个子标签。

      

      1.1  struts-default.xml

    •  查看Struts的内容可知,Struts的默认包“default”是继承于"Struts-dafault"包的,struts-default包是在struts-default.xml中定义,struts-default.xml也是Struts2默认配置文件,所以Struts2每次都会自动加载 struts-default.xml文件。
    •   struts-default.xml 里定义了一大堆的常量和bean,要使用这些只需要继承这个包就行了。

    • struts-default.xml路径:struts2-core-2.3.32.jar/struts-default.xml

      1.2 子标签之bean (暂时无须理会)

      

      1.3 子标签之constant

      A、 Struts所有常量定义在:

      B、 常用常量:

    struts.i18n.encoding=UTF-8                //设置请求的编码
        struts.enable.DynamicMethodInvocation = true        //是否支持动态方法的调用
        struts.configuration.xml.reload = true            //是否支持XML的自动加载
        struts.devMode = false                    //开发模式
        struts.ui.theme=xhtml                    //UI模板的设置
        struts.ognl.allowStaticMethodAccess=false        //是否允许在ONGL表达式中调用静态方法
        struts.action.extension=action,,            //STruts请求的扩展名。

      C、常量定义位置

    • 常量可以定义在4个位置:

        A、第一个就是defalut.properties里,但是我们一般都不会在这个文件里定义常量。

        B、第二个就是struts.xml中,

    <struts>
    	
        <constant name="struts.enable.DynamicMethodInvocation" value="false" />
        <constant name="struts.devMode" value="true" />
    
        <package name="default" namespace="/" extends="struts-default">
      	 <action name="xx" class="com.ActionFirst">
      	 <result name="index">/index.jsp</result>
      	 </action>
           </package>
    
    </struts>
    

        C、第三个就是

    • 这个文件需手工建立,也是放在src目录下,一般用于WebWork工程

        D、第四个就是在web.xml

       <filter>
            <filter-name>struts2</filter-name>
            <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
       <init-param>
           <param-name>struts.devMode</param-name>
           <param-value>true</param-value>
       </init-param>
       
        </filter>
    • struts读取常量的顺序:后面的会覆盖前面的配置。就是说web.xml中配置的struts.devMode的值会覆盖掉前面ABC配置的值。

      1.4  子标签之include

    •   包含其他配置文件,一般用于团队合作。

      struts中多模块的设置,模块化文件。
            <include file="xxxx.xml"/>
            公用的Action放在struts.xml中,模板的配置放到模板的配置文件中。

     1.5  子标签之package   

      1.5.1 属性

     

      属性A、   name="default"                包名,随便取,不能重复。

      属性B、   namespace="/"                命名空间。

        命名空间:
        struts请求的访问路径:
        http://IP地址:端口号/工程名/命名空间/Action的名称。    
        
        struts会根据命名空间逐层进行匹配。
        <a href="<%=path%>/aa/bb/cc/dd/nameSpaceAction">命名空间示例</a>

      •         示例:

          A. 编写index.html

     1 <%@ page language="java" contentType="text/html; charset=UTF-8"
     2     pageEncoding="UTF-8"%>
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     4 <html>
     5 <%
     6 String path = request.getContextPath();
     7 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
     8 %>
     9 <head>
    10 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    11 <title>Insert title here</title>
    12 </head>
    13 <body>
    14     <a href="<%=path%>/aa/bb/exam"> 命名空间示例</a>
    15 </body>
    16 </html>
    •  a标签跳转到“工程名/aa/bb/exam”URL,

        B、编写action类

     1 package com;
     2 
     3 public class ActionFirst {
     4     /**
     5      * 必须要有String的execute方法
     6      * @return
     7      */
     8     public String execute(){        
     9     
    10         return "index";    
    11     }
    12 }

        C、配置struts.xml文件

     1 <struts>
     2     <constant name="struts.enable.DynamicMethodInvocation" value="false" />
     3     <constant name="struts.devMode" value="true" />
     4     
     5     <package name="default" namespace="/" extends="struts-default">
     6        <action name="xx" class="com.ActionFirst">
     7        <result name="index">/index.jsp</result>
     8        </action>
     9        </package>
    10        
    11        <package name="aa" namespace="/aa" extends="struts-default">
    12            <action name="exam" class="com.ActionFirst">
    13                <result name="index">/index_2.jsp</result>
    14            </action>
    15        </package>
    16        
    17 
    18 </struts>

        D、编写跳转后的index_2.jsp页面

     1 <%@ page language="java" contentType="text/html; charset=UTF-8"
     2     pageEncoding="UTF-8"%>
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     4 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     7 <title>Insert title here</title>
     8 </head>
     9 <body>
    10     我是跳转后的jsp页面
    11     
    12 </body>
    13 </html>

    结果:

    点击a标签跳转到:

    查看地址栏“http://localhost:8080/struts_project_1/aa/bb/exam” 说明跳转成功,但是在struts.xml文件如下配置,并没有“/aa/bb”这个命名空间,正常来说,地址栏的URL 为“http://localhost:8080/struts_project_1/aa/exam” 才能跳转成功,但是还是跳转成功了,|struts的匹配规则为: struts会根据命名空间逐层进行匹配。
    以本例来说,当URL为“/aa/bb”找不到action=exam时,就会到上一层命名空间“/aa”里找action=exam ,就这样一层一层往上找。

     <package name="aa" namespace="/aa" extends="struts-default">
               <action name="exam" class="com.ActionFirst">
                   <result name="index">/index_2.jsp</result>
               </action>
           </package>

        属性C、    extends="struts-default"        包之间的继承。就可以父包配置的选项

                                默认所有的package都继承struts-default.xml

        属性D、    abstract="true|false"            是否抽象包。抽象包中不能定义action。

        1.5.2  package的子标签

             1.5.2.1  package子标签之action标签

       <action  name=""  class=""  method="">     

      示范:  <action name="methodAction" class="com.action.MethodAction" method="test"></action> 

            解析:访问methodAction路径,默认执行execute方法。通过method属性的配置,可以执行其他的方法。示例中就是执行test方法。

      值得注意到是 method里的方法只能是public访问修饰符,而不能是其它修饰符,可以在这个public方法里调用其他非public的方法。

          

             1.5.2.2  action标签的子标签《param》
    • action中的param

        设置或者获取Action中定义的成员变量的值。要求成员变量要有SET与GET方法。本文中只示范设置成员变量,而获取在后续章节再详细讲解。

    示例(设置Action中定义的成员变量的值):

    index.jsp:

    <body>
        <a href="<%=path%>/aa/exam"> action中param标签使用示例</a>
    </body>

    ActionFirst.java:

    package com;
    
    public class ActionFirst {
        /**
         * 使用action中的param标签前提是action的成员变量必须有get和set方法。
         * 
         */
        private String userName;
        
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    
        public String execute(){        
        System.out.println(this.userName);   //在控制台输出Action成员变量的值
            return "index_2";    
        }
    }

    struts.xml:

     <package name="aa" namespace="/aa" extends="struts-default">
               <action name="exam" class="com.ActionFirst">
                   <param name="userName">用户名</param>
                   <result name="index_2">/index_2.jsp</result>
               </action>
           </package>

    结果:

    点击标签之后:

            1.5.2.2  action标签的子标签《result》

    •  action中的result
         属性A、 name:result的名称
         属性B、type:result的类型,
              chain:                    请求转发到Action
              dispatcher:                请求转发到JSP面,默认
              redirect:                重定向到JSP页面
              redirectAction:            重定向到Action
              stream:                流方式,用于下载

             freemarker              freemarker模版引擎 (了解即可)  

    示例:  以上题为例:

     <package name="aa" namespace="/aa" extends="struts-default">
               <action name="exam" class="com.ActionFirst">
                   <param name="userName">用户名</param>
                   <result name="index_2">/index_2.jsp</result>
               </action>
           </package>
    •  struts.xml中<result name="index_2">/index_2.jsp</result> ,当访问URL"工程名/aa/exam"时,ActionFirst 这个 Action 的execute方法的返回值为index_2时,将跳转到index_2.jsp这个jsp。

        type类型如果没有写,默认是dispatcher ,即<result name="index_2" type="dispatcher">/index_2.jsp</result>

    • type="chain" 使用示例:
           <package name="aa" namespace="/aa" extends="struts-default">
               <action name="exam" class="com.ActionFirst">
                   <result name="index_2" type="chain">
                       <param name="namespace">/bb</param>
                       <param name="ActionName">ChainAction</param>
                   </result>
               </action>
           </package>
        
        <package name="bb" namespace="/bb" extends="struts-default">
                 <action name="ChainAction" class="com.ChainAction">    
                 </action>
             </package>

     解析: 当我们访问url"工程名/aa/exam" 的时候,会调用com.ActionFirst 这个类的execute方法,然后返回一个String值"index_2" ,由于这个result是chain类型的(请求转发到Action), 所以会找到<param name="namespace">/bb</param>  命名空间为"/bb"中的 <param name="ActionName">ChainAction</param> Action名叫“ChainAction”的类并执行,调用那个的execute方法,并返回String值。  注意:  name="namespace"name="ActionName"  值不能写错,但是不区分大小写,ActionName与actionname是一样的。

    • type="redirect" 使用示例
     <package name="aa" namespace="/aa" extends="struts-default">
               <action name="exam" class="com.ActionFirst">
                   <result name="redict_index_2" type="redirect">/index_2.jsp</result>
               </action>
           </package>
    • type="redirectAction" 重定向到Action 用法与type="chain" 相同
    • type="freemarker" 使用示例:
           <package name="aa" namespace="/aa" extends="struts-default">
               <action name="exam" class="com.ActionFirst">
                  <param name="userName">admin</param>
                   <result name="freemarker_index_2" type="freemarker">/cc.ftl</result>
               </action>
           </package>

    解析: 当地址栏为"工程名/aa/exam"时, 调用com.ActionFirst ,然后调用execute方法,给这个类的成员变量赋值(<param name="userName">admin</param>), 最后execute方法返回String值=freemarker_index_2, 跳转到/cc.ftl 里。

     cc.ftl:

    <html>
    
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
                ${userName}
    </body>
    </html>

     ${} 这是ftl文件的表达式,用于获取值。

    结果:

    如图可见,在Struts.xml设置的userName=admin成功在cc.ftl文件里获取。

         1.5.3  package子标签之《default-action-ref》标签

    •  配置默认的action。

        当链接到一个命名空间时,没有指定action的路径,那么就会执行默认的action。

        http://localhost:8080/Struts2_Project_1/test1/

        <package name="test" namespace="/test1" extends="struts-default">
                <default-action-ref name="index" />
                <action name="index">
                    <result>/main.jsp</result>
                </action>

        </package>

     示例:

    struts.xml

    <struts>
        <package name="default" namespace="/" extends="struts-default">
           <default-action-ref name="xx"></default-action-ref>
           <action name="xx" class="com.ActionFirst">
               <result name="index_2">/index_2.jsp</result>
           </action>
           
          </package>       
    </struts>  

     index_2.jsp

    <body>
        我是重定向后的页面
    </body>

    注意:  1.  请把(项目名/index.jsp)中的index.jsp这个文件去掉,否则web服务器会自动跳转到index.jsp页面。

          2.  <default-action-ref name="xx"></default-action-ref> 这个标签请放在《package》标签中的第一行,否则报错。

     结果:

    解析: 当url为“项目名/”/为命名空间,此时在地址栏里没有输入任何action的名,所以无法执行Action,默认执行<default-action-ref name="xx"></default-action-ref> 中的名叫“xx”的action。 于是出现上图。

        1.5.4  package子标签之《global-results》标签

    • 是Package下面所有的action都可以调用global中定义的result.
    • global-results与results的区别:

        global-result:是Package下面所有的action都可以调用global中定义的result.

        result:是action中私用的。

        其它的package想要调用另一个package中定义的global-result时,直接将包做

        继承关系即可。通过extend来继承。

        <package name="aa" namespace="/aa" extends="default">

    • 《global-results》标签适用于错误页面、版权页面等通用的页面。

    示例:

    Struts.xml

    <package name="aa" namespace="/aa" extends="struts-default">
              <global-results >
                <result name="error">/page_error.jsp</result>
            </global-results>
            
               <action name="exam" class="com.ActionFirst">
                   <result name="index_2">/index_2.jsp</result>
               </action>
           </package>

    ActionFirst.java

    package com;
    
    public class ActionFirst {
        /**
         * 使用action中的param标签前提是action的成员变量必须有get和set方法。
         * 
         */
        private String userName;
        
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    
        public String execute(){
            String a=null;
            
            if(a!=null && !a.equals(""))
            
                return "index_2";    
            else
                return "error";
            
        }
    }

     解析:当地址栏为“项目名/aa/exam”时,执行ActionFirst的execute方法,返回String=“error” ,然后名叫exam的这个action中并没有名叫error的result,但是仍旧可以使用,因为这个errror定义在<global-results > 里,本包中的所有action都可以使用,而不必在《result》中定义。

  • 相关阅读:
    集训第六周 O题
    集训第六周 M题
    集训第六周 矩阵快速幂 K题
    集训第六周 数学概念与方法 计数 排列 L题
    集训第六周 数学概念与方法 J题 数论,质因数分解
    集训第六周 数学概念与方法 数论 线性方程 I题
    集训第六周 数学概念与方法 概率 N题
    HUAS Summer Contest#4 D题 DP
    集训第六周 数学概念与方法 数论 筛素数 H题
    C语言之六大排序算法
  • 原文地址:https://www.cnblogs.com/shyroke/p/6538168.html
Copyright © 2020-2023  润新知