1. 程式人生 > >Struts2入門介紹(二)

Struts2入門介紹(二)

輸入 clu ons dom 訪問路徑 訪問 filter pri locale

一、Struts執行過程的分析。

  當我們在瀏覽器中輸入了網址http://127.0.0.1:8080/Struts2_01/hello.action的時候,Struts2做了如下過程:

  1、Struts2首先使用過濾器,攔截我們的URL請求,以下的過程全部在過濾器中進行。

  2、獲得請求的路徑,然後截取Action的名字,本示例中會截取字符串"hello"。

  3、在src目錄下找到struts.xml文件,使用dom4j解析該文件,得到裏面的數據。

  4、用字符串"hello"去struts.xml文件中匹配action標簽中的name值。

  5、匹配到了action中的name值,然後去查找該action標簽中的class屬性,得到該action的全路徑。

  6、使用反射方法調用該action中的hello方法,反射代碼如下。

            Class calzz = Class.forName("com.jack.action.HelloAction1");
            Method m = calzz.getMethod("hello",String.class);
            m.invoke(calzz.newInstance());

  7、得到action的返回值。然後去action的result標簽中匹配name屬性的值。

  8、匹配成功後,跳轉到result標簽中的配置的路徑中去。

二、Struts2常量的配置

  1、如何查看struts2的常量有哪些

    (1)在struts2-core-2.3.24.jar包下面有一個default.propreties文件,該文件中保存了所有的常量

      技術分享

  2、Struts2的常量配置有三種方式

  1、在struts.xml的<struts></struts>標簽中配置

  <!-- 
            constant標簽用來配置常量
            name屬性的值:default.properties文件中的常量名稱。
            value屬性的值:要配置的常量的值
         
--> <constant name="struts.i18n.encoding" value="UTF-8"></constant>

  2、在src下面創建struts.properties文件,在裏面進行配置

# struts.locale=en_US
struts.i18n.encoding=UTF-8

### valid values are: name, type, auto, and constructor (name is the default)
struts.objectFactory.spring.autoWire = name

struts.objectFactory.spring.useClassCache = true

struts.objectFactory.spring.autoWire.alwaysRespect = false

struts.objectFactory.spring.enableAopSupport = false

struts.multipart.parser=jakarta
struts.multipart.saveDir=
struts.multipart.maxSize=2097152

  3、在web.xml中進行配置 

 <filter>
      <filter-name>struts2</filter-name>
      <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        <init-param>
            <param-name>struts.i18n.encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
  </filter>

三、分模塊開發

  當一個項目有多人進行開發時,可以每個人都寫一個配置文件,然後通過引入的方式,將其引入struts.xml文件中。

  (1)在Action包下面建一個hello.xml文件寫入配置    

<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入dtd約束 -->
   <!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
    
    <struts>
        <!-- 
            constant標簽用來配置常量
            name屬性的值:default.properties文件中的常量名稱。
            value屬性的值:要配置的常量的值
         -->
        <constant name="struts.i18n.encoding" value="UTF-8"></constant>
        <!-- 
            配置package標簽:該標簽類似於Java中的包,Struts標簽中可以有多個package標簽
                             這些package標簽的name屬性的值必須不同
            name屬性的值:這個名稱可以隨意起名,它表示一個包名,用來區分不同的package
            extends屬性的值:這個屬性的值是固定的,其值為“struts-default”,只有在此配置了
                             這個屬性,該類采有action的功能,類似於Java中的繼承
            namespace屬性的值:該屬性是名稱空間,該屬性的值一般為“/”,用於和action標簽中得
                            name屬性組成訪問路徑
         -->
        <package name="demo" extends="struts-default" namespace="/">
           <!-- 
                   配置action標簽:該標簽用來配置action,一個package標簽中可以有多個action
                                 標簽,這些action標簽的name屬性的值必須不同
                   name屬性的值:name屬性的值可以隨意起,該值用來和package標簽中的namespace
                                  屬性的值一起構成該action的訪問路徑
                   class屬性的值:該值是要配置的action所在類的全路徑。
                   method屬性的值:該屬性用來配置該action對應於類中的哪一個方法,其值為要訪問的類中的
                                 那個方法的方法名(execute方法默認訪問,不用配置)。
            -->
            <action name="hello" class="com.jack.action.HelloAction1" method="hello">
                <!-- 
                    配置result標簽:如果配置的該action方法中有返回值,並且返回值不是none,則必須
                                  要配置該標簽,否則會出現404錯誤
                    
                    name屬性的值:該屬性的值就是action方法所返回的那個值。
                    該標簽中的值為:action返回該屬性後,要重定向到那個路徑
                 -->
                <result name="ok">/hello.jsp</result>
            </action>
        </package>
    </struts>

  (2)在struts.xml中引入該文件 

<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入dtd約束 -->
   <!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
    
    <struts>
      <include file="com/jack/action/hello.xml"></include>
    </struts>

四、Action的訪問配置

  我們知道要訪問一個Action,必須要對該Action進行配置。配置的方式有三種

  1、使用method屬性配置  

    可以使用<action>標簽中的method屬性來配置。在<action>標簽的method屬性中配置對應的要訪問的的方法名稱即可完成。

<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入dtd約束 -->
   <!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
    
    <struts>
      <!-- 
            constant標簽用來配置常量
            name屬性的值:default.properties文件中的常量名稱。
            value屬性的值:要配置的常量的值
         -->
        <constant name="struts.i18n.encoding" value="UTF-8"></constant>
        <!-- 
            配置package標簽:該標簽類似於Java中的包,Struts標簽中可以有多個package標簽
                             這些package標簽的name屬性的值必須不同
            name屬性的值:這個名稱可以隨意起名,它表示一個包名,用來區分不同的package
            extends屬性的值:這個屬性的值是固定的,其值為“struts-default”,只有在此配置了
                             這個屬性,該類采有action的功能,類似於Java中的繼承
            namespace屬性的值:該屬性是名稱空間,該屬性的值一般為“/”,用於和action標簽中得
                            name屬性組成訪問路徑
         -->
        <package name="demo" extends="struts-default" namespace="/">
           <!-- 
                   配置action標簽:該標簽用來配置action,一個package標簽中可以有多個action
                                 標簽,這些action標簽的name屬性的值必須不同
                   name屬性的值:name屬性的值可以隨意起,該值用來和package標簽中的namespace
                                  屬性的值一起構成該action的訪問路徑
                   class屬性的值:該值是要配置的action所在類的全路徑。
                   method屬性的值:該屬性用來配置該action對應於類中的哪一個方法,其值為要訪問的類中的
                                 那個方法的方法名(execute方法默認訪問,不用配置)。
            -->
            <action name="hello" class="com.jack.action.HelloAction1" method="hello">
                <!-- 
                    配置result標簽:如果配置的該action方法中有返回值,並且返回值不是none,則必須
                                  要配置該標簽,否則會出現404錯誤
                    
                    name屬性的值:該屬性的值就是action方法所返回的那個值。
                    該標簽中的值為:action返回該屬性後,要重定向到那個路徑
                 -->
                <result name="ok">/hello.jsp</result>
            </action>
            <!-- 配置test方法的訪問 -->
             <action name="test" class="com.jack.action.HelloAction1" method="test"> </action>
            
             <!-- 配置test1方法的訪問 -->
             <action name="test1" class="com.jack.action.HelloAction1" method="test1"></action>
        </package>
    </struts>

  缺點:如果一個Action類中有很多的方法,要寫很多的<action>標簽來配置,這樣顯得混亂。

  2、使用通配符來配置(重點)

    在配置文件中還可以使用通配符的方式來配置,好處是如果有很多的方法,只需要配置一個<action>標簽,就可以完成整個類的配置。

  

<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入dtd約束 -->
   <!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
    
    <struts>
      <!-- 
            constant標簽用來配置常量
            name屬性的值:default.properties文件中的常量名稱。
            value屬性的值:要配置的常量的值
         -->
        <constant name="struts.i18n.encoding" value="UTF-8"></constant>
        <!-- 
            配置package標簽:該標簽類似於Java中的包,Struts標簽中可以有多個package標簽
                             這些package標簽的name屬性的值必須不同
            name屬性的值:這個名稱可以隨意起名,它表示一個包名,用來區分不同的package
            extends屬性的值:這個屬性的值是固定的,其值為“struts-default”,只有在此配置了
                             這個屬性,該類采有action的功能,類似於Java中的繼承
            namespace屬性的值:該屬性是名稱空間,該屬性的值一般為“/”,用於和action標簽中得
                            name屬性組成訪問路徑
         -->
        <package name="demo" extends="struts-default" namespace="/">
         
            <!-- 
                使用通配符來配置訪問方式時,要使用到*來進行匹配
                name屬性的值:在name屬性中要寫有*,該*表示匹配要訪問的方法名稱(hello、test),
                                其中可以直接寫*號,也可以寫多個*號。該值用來和package標簽中的namespace
                                  屬性的值一起構成該action的訪問路徑
                class屬性的值:該值是要配置的action所在類的全路徑。
                method屬性的值:該值要使用{1},{}中的數字表示要截取的name屬性之中的*的順序,為1表示截取
                                     第一個*,為2表示截取第二個,該*表示Action中的方法的名稱
                示例:hello方法的路徑為:HelloAction_hello
                    test方法的路徑為:HelloAction_test
             -->
            <action name="HelloAction_*" class="com.jack.action.HelloAction1" method="{1}">
                <!-- 
                    配置result標簽:如果配置的該action方法中有返回值,並且返回值不是none,則必須
                                  要配置該標簽,否則會出現404錯誤
                    name屬性的值:該屬性的值就是action方法所返回的那個值。
                    該標簽中的值為:action返回該屬性後,要重定向到那個路徑
                 -->
                <result name="ok">/hello.jsp</result>
            </action>
          
        </package>
    </struts>

  3、動態方式訪問(一般用不到)

    動態訪問方式在Struts2中默認不開啟,要使用必須要現在struts的配置文件中配置一個常量來開啟支持 

<struts>
      <!-- 
            constant標簽用來配置常量
            name屬性的值:default.properties文件中的常量名稱。
            value屬性的值:要配置的常量的值
         -->
         <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
</struts>

    訪問方式中不用進行特殊配置

<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入dtd約束 -->
   <!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
    
    <struts>
      <!-- 
            constant標簽用來配置常量
            name屬性的值:default.properties文件中的常量名稱。
            value屬性的值:要配置的常量的值
         -->
         <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
        <constant name="struts.i18n.encoding" value="UTF-8"></constant>
        <!-- 
            配置package標簽:該標簽類似於Java中的包,Struts標簽中可以有多個package標簽
                             這些package標簽的name屬性的值必須不同
            name屬性的值:這個名稱可以隨意起名,它表示一個包名,用來區分不同的package
            extends屬性的值:這個屬性的值是固定的,其值為“struts-default”,只有在此配置了
                             這個屬性,該類采有action的功能,類似於Java中的繼承
            namespace屬性的值:該屬性是名稱空間,該屬性的值一般為“/”,用於和action標簽中得
                            name屬性組成訪問路徑
         -->
        <package name="demo" extends="struts-default" namespace="/">
         
            <!-- 
                使用通配符來配置訪問方式時,要使用到*來進行匹配
                name屬性的值:在name屬性中要寫有*,該*表示匹配要訪問的方法名稱(hello、test),
                                其中可以直接寫*號,也可以寫多個*號。該值用來和package標簽中的namespace
                                  屬性的值一起構成該action的訪問路徑
                class屬性的值:該值是要配置的action所在類的全路徑。
                method屬性的值:該值要使用{1},{}中的數字表示要截取的name屬性之中的*的順序,為1表示截取
                                     第一個*,為2表示截取第二個,該*表示Action中的方法的名稱
                示例:hello方法的路徑為:HelloAction_hello
                    test方法的路徑為:HelloAction_test
             -->
           <action name="HelloAction1" class="com.jack.action.HelloAction1">
               <result name="ok">/hello.jsp</result>
           </action>
        </package>
    </struts>

    該URL的寫法和其他不同

    如訪問hello方法:URL為:http://ip:端口/項目名稱/HelloAction1!hello.action

     

    

Struts2入門介紹(二)