1. 程式人生 > >初次使用Struts2/入門

初次使用Struts2/入門

步驟:

1.下載jar包

在這裡插入圖片描述
官網:https://struts.apache.org/

其他所需要的jar包

  • commons-fileupload.jar:檔案上傳元件
  • commons-io是一款處理io流的工具,封裝了很多處理io流和檔案的方法,可以大大簡化我們處理io流和操作檔案的程式碼
  • commons-lang3跟java.lang這個包的作用類似,Commons
    Lang這一組API也是提供一些基礎的、通用的操作和處理,如自動生成toString()的結果、自動實現hashCode()和equals()方法、陣列操作、列舉、日期和時間的處理等等。
  • freemarker-2.3.26.jar:struts2的UI標籤的模板使用FreeMaker編寫
  • Javassist是一款位元組碼編輯工具,可以直接編輯和生成Java生成的位元組碼,以達到對.class檔案進行動態修改的效果。
  • Log4j 是Apache為Java提供的日誌管理工具。他與System.out.println()的作用相似,用來跟蹤、除錯、維護程式。
  • ognl.jar:物件圖導航語言(struts2通過ognl讀寫物件的屬性)
  • struts2的核心類庫
    如圖
    在這裡插入圖片描述

2.引用至本地專案

  • 準備好了上面所有的jar包之後,我們把這些jar包匯入到自己的專案中去

    如圖
    在這裡插入圖片描述

3.新建source folder 放入struts.xml 配置web.xml

  • 如圖:

在這裡插入圖片描述
在這裡插入圖片描述

  • web.xml程式碼:

     <display-name>Struts Blank</display-name>
    
     <filter>
         <filter-name>struts2</filter-name>
         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
     </filter>
    
     <filter-mapping>
         <filter-name>struts2</filter-name>
         <url-pattern>/*</url-pattern>
     </filter-mapping>
    
     <welcome-file-list>
         <welcome-file>index.html</welcome-file>
     </welcome-file-list>
    

struts程式碼:

<struts>

<!-- consant 常量,struts.devMode表示開發者模式,當為true時如果改變了其中的一些程式碼,可以不用重新啟動tomcat-->
<constant name="struts.devMode" value="true" />

<!--package可以有多個解決重名的情況, namespace 可以不寫,預設是如何路徑都可以,也可以寫成/xx/yy ,必須是/開頭-->
    <package name="default" namespace="/" extends="struts-default">

       <default-action-ref name="index" />

       <global-results>
           <result name="error">/error.jsp</result>
       </global-results>

       <global-exception-mappings>
           <exception-mapping exception="java.lang.Exception" result="error"/>
       </global-exception-mappings>

<!-- action裡面那個name屬性值得是URL輸入的路徑名 ,如“http://localhost:8080/Struts2Demo/hello”,則會根據result反饋Hello.jsp-->
       <action name="hello" class="com.styspace.struts2.action.action2">
           <result>  /Hello.jsp</result>
       </action>

<!-- action裡面class屬性值,會有對應的這個類,執行該類裡面的execute()方法-->

       <action name="action" class="com.styspace.struts2.action.action2">
           <result name="success">/Action.jsp</result>
       </action>

<!-- action裡面method屬性值,會有對應class這個類中的add方法,然後執行該方法-->

<action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add">
            <result>/user_add_success.jsp</result>
        </action>

<!-- 一般action裡面不用method屬性值,而是用DMI(動態方法呼叫)可以通過http://localhost:8080/Struts2Demo/user!addURL呼叫,其中user指的是action中的name值-->
        
        <action name="user" class="com.bjsxt.struts2.user.action.UserAction">
            <result>/user_add_success.jsp</result>
        </action>

<!-- 更簡單的方法,萬用字元,name=“student*”會匹配URL中所有Studentxx,而method=“{1}”指的是name中第一個“*”匹配的值 同理,result中{1}也是一樣的-->


        <action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">

            <result>/Student{1}_success.jsp</result>
        </action>
<!-- 甚至可以有多個萬用字元,class屬性中也可以用{1}來匹配,最簡化-->
        <action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
            <result>/{1}_{2}_success.jsp</result>
            <!-- {0}_success.jsp -->
        </action>


    </package>
    <!-- Add packages here -->

</struts>

4.新建一個子控制器

  • 列如:一個名為HelloAction的子控制器

    
    private String result;
    
    public String getResult() {
    	return result;
    }
    
    public void setResult(String result) {
    	this.result = result;
    }
    
    public String execute() {
    	System.out.println("滑稽");
    	return "rs";
    }	 }
    
    
    
    
  • struts配置:

在這裡插入圖片描述

  • jsp跳轉:

在這裡插入圖片描述

工作原理:

  1. 在瀏覽器中輸入http://localhost:8080/Struts2Demo/hello,就會向伺服器端(tomcat)傳送一個請求

  2. tomcat會解析URL,從中找到一個webApplication(可理解為即專案名)為Struts2Demo,然後就會在這個專案裡面找到web.xml檔案

  3. 在web.xml中找到filter標籤,然後在filter中定義的filter-class處理URL中的hello(這其中其實還包含一個步驟,就是web.xml中/*會過濾掉所有地址,這樣地址才會被filter-class中定義的類接收到)

  4. StrutsPrepareAndExecuteFilter接收到地址之後,首先查詢namespace(在struts.xml中的package標籤中的namespace中得到它的值),然後將URL中namespace值(這裡是/)後面的路徑讀取到(這裡是hello)

  5. 繼續在struts的action標籤中查詢是否有hello這個值的,如果有且發現action中有class屬性,則會new一個class中宣告的類,執行裡面的一個execute()方法,該方法返回一個String字串,返回該字串之後才能得到result中的值,如果action中沒有class屬性,則預設有一個ActionSupport類,該類中也有一個execute方法,返回一個String值

  6. 上一步中講到execute()方法,但是不一定非要執行execute()方法,當action標籤中有method屬性時,就會執行該屬性定義的方法名稱,然後同樣會返回一個String字串

  7. 根據返回的String字串(success),在result中找到name屬性值為返回的String字串的標籤(這裡就是Action.jsp),如果沒有找到,則會返回error頁面;如果action中沒有class則直接找到該action下面的result中的值(這裡是/Hello.jsp),然後將請求forword到Action.jsp/Hello.jsp

  8. 最後jsp反饋到客戶端。

jsp展示結果:

在這裡插入圖片描述

初步使用建立一個Hello Word頁面完成了

如果你在struts.xml標籤校驗失敗沒有提示怎麼辦?

Look!看下面在這裡插入圖片描述

  1. 首先在Libraries下面找到 struts2.5.dtd

在這裡插入圖片描述

  1. 然後在本地新建一個struts2.5.dtd(程式碼使用高階記事本copy進去就可以了)

在這裡插入圖片描述

3.進入window→preference→輸入xml
在這裡插入圖片描述

4.點選add會出現這個介面
在這裡插入圖片描述

  • 先選中本地我們新建的dtd檔案,然後輸入uri,然後我們回到struts.xml裡就會出現提示了

結果:

在這裡插入圖片描述

XML Catalog 原理

XML Catalog 提供了一種重新定位資源的機制,可以將 xml 引用的 artifacts,包括 URI 地址以及 namespace 名重新定位到另一個地址。通常這種機制被用來將遠端的引用資源重定位到本地或者 web。XML catalog 就是一個描述外部實體引用和本地快取的相同實體的對映的檔案。

在實際的開發生產中,xml 檔案經常會引用外部的檔案,這些檔案通常通過 URI 表示,其中以 URL 應用最廣。但是如果是絕對的 URL, 那麼只有當你的網路能夠訪問它時才能起作用,如果網路出現問題,那麼將不能訪問。當是相對 URL 時,例如"…/…/xml/dtd/docbookx.xml",只有當你的檔案系統和定義者一致的時候才能起作用。

一種解決辦法就是通過實體解析器(Entity Resolver)或者是 URI 解析器 (URI Resolver ),解析器可以通過檢查資源的 URI 來定位資源。 使用者通過配置 xml catalog, 手動的指定 xml 檔案引用的 xsd 檔案的本地地址,URI 解析器通過 xml catalog 裡面的對映,找到對應的 xsd, 最後 xml catalog 處理器通過解析器找到的 xsd 對 xml 進行校驗。

通俗點說,XML catalog 通過名稱空間將 xml 檔案及其對應的 xsd 檔案聯絡起來,並通過解析器定位 xsd 檔案的位置,最後通過處理器進行校驗。

與 javax.xml.validation 通過 xsd 對 xml 進行校驗的方法不同,xml catalog 可以通過 Namespace 來校驗所有引用這個 xsd 的 xml 檔案,從而達到批量校驗的效果。例如,a.xml,b.xml,c.xml 都是由 d.xsd 校驗,那麼只要將 d.xsd 的名稱空間配置好,通過該名稱空間就可以校驗以上三個檔案了。

5.引數賦值方法

  • 賦值方法分為三種:

    1.在Action內為某一屬性提供set/get方法

    在這裡插入圖片描述
    在這裡插入圖片描述
    在這裡插入圖片描述

    2.implements ModelDriven介面客戶端頁面的值會通過反射賦值

    在這裡插入圖片描述
    在這裡插入圖片描述

    3.物件導航賦值

    這裡是用物件例項的name.屬性
    在這裡插入圖片描述

  • 物件導航需要對物件進行封裝

在這裡插入圖片描述