Struts2第二篇【開發步驟、執行流程、struts.xml講解、defalut-struts講解】

前言

咱們如今學習的是Struts2,其實Struts1和Struts2在技術上是沒有很大的關聯的Struts2其實基於Web Work框架的,只不過它的推廣沒有Struts1好,所以就拿着Struts這個名氣推出了Struts2框架。java

所以,學習Struts2的時候,不瞭解Struts1是沒有任何關係的。web

在開山篇的時候,已經說明了爲何要引入Struts框架,其實就是爲了提升開發效率…apache

Struts2框架預先實現了一些功能:安全

  • 請求數據自動封裝
  • 文件上傳的功能
  • 對國際化功能的簡化
  • 數據效驗功能…….等等

Struts2開發步驟

咱們就直接來說解Struts2的開發步驟是什麼吧….在瞭解它的細節以前,先要把配置環境搭好!服務器

引入jar文件

完整的struts中的jar包有80多個,咱們平常開發是不須要那麼多個的。通常咱們導入的jar包有8個:markdown

  • commons-fileupload-1.2.2.jar 【文件上傳相關包】
  • commons-io-2.0.1.jar【文件上傳相關包】
  • struts2-core-2.3.4.1.jar 【struts2核心功能包】
  • xwork-core-2.3.4.1.jar 【Xwork核心包】
  • ognl-3.0.5.jar 【Ognl表達式功能支持表】
  • commons-lang3-3.1.jar 【struts對java.lang包的擴展】
  • freemarker-2.3.19.jar 【struts的標籤模板庫jar文件】
  • javassist-3.11.0.GA.jar 【struts對字節碼的處理相關jar】

這裏寫圖片描述


配置web.xml

在web.xml中配置的過濾器,其實就是在爲struts進行初始化工做app

值得注意的是:若是該web.xml配置了多個fileter,那麼struts的filter須要在最後面!框架

<!-- 引入struts核心過濾器 -->
    <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>

開發Action

開山篇咱們已經說了,Servlet的業務代碼,咱們都使用Action來代替…Action類通常繼承着ActionSupportjsp

Action類也叫動做類,處理請求的類。ide

public class HelloAction extends ActionSupport {

    @Override
    public String execute() throws Exception {

        System.out.println("helloworld");

        return "success";
    }
}

至於execute()方法是什麼,咱們先不要去管它,爲啥要返回一個String,咱們也不要去管它….只要記住開發步驟,而且,咱們的Action類是要繼承ActionSupport類的

配置struts.xml

至於配置struts.xml,咱們能夠在文件中找到相對應的模版代碼的…最終修改爲下面這個樣子就好了:

<?xml version="1.0" encoding="UTF-8" ?>
        <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="hello" extends="struts-default">
    <action name="hello" class="action.HelloAction" method="execute">
        <result name="success">/index.jsp</result>

    </action>
</package>
</struts>

看完上面的配置文件,是很是像咱們開山篇寫的struts框架的配置文件的….

效果:

在地址欄中直接輸入hello,就跳轉到index.jsp頁面了。而且,execute()中的語句被執行了…

這裏寫圖片描述


Struts2執行流程

咱們來簡單地瞭解一下Struts的執行流程,而後再慢慢對上面的開發步驟的部分進行講解….

服務器啓動

下邊我說的都是struts流程的重點:

  • 加載web.xml文件
  • 找到咱們配置的filter中的StrutsPrepareAndExecuteFilter
  • StrutsPrepareAndExecuteFilter在裏邊執行init()方法
  • 一直到Dispatcher dispatcher = init.initDispatcher(config);,初始化dispatcher
  • 在初始化dispatcher的時候加載struts-default.xml和咱們配置的struts.xml

下面用GIF圖來看看它的執行過程:

這裏寫圖片描述

細心的朋友可能會發現,咱們在struts.xml的package節點下,extends了struts-default….那struts-default到底是什麼東西呢?

咱們找到它的源碼:

這裏寫圖片描述

咱們發現了一大堆的Bean,interceptor,result-type,interceptor-stack…下邊我來說解一下它們是幹嗎用的…

  • bean指定了struts在運行的時候須要建立的對象類型
    • 在運行struts的時候,可能須要建立一些對象,那麼就經過Bean來指定
  • interceptor是struts定義的攔截器,一共有32個
    • 前邊已經說了,Struts爲咱們實現了一些功能,就是經過攔截器來實現的
  • result-type是跳轉結果的類型
    • Action業務方法中的返回值,咱們發現幾個實用的:redirect【重定向】、dispatcher【轉發】、redirectAction【重定向到Action資源】、stream【文件下載的時候用】…跳轉結果的類型也在這裏定義了
  • interceptor-stack是攔截器的棧
    • 攔截器有32個,咱們可能會使用不少的攔截器,不可能一個一個來調用,因而提供了攔截器棧…其實能夠簡單當作文件夾和文件之間的關係
  • default-interceptor-ref是默認執行的攔截器棧
  • default-class-ref class是默認的執行Action類

還要補充的就是:默認的攔截器棧有18個攔截器….


攔截器和過濾器

攔截器和過濾器都是攔截資源的

攔截器只攔截Action請求,是struts的概念…

過濾器攔截web的全部資源,是Servlet的概念…


小總結

服務器啓動的時候,其實就是加載了web.xml文件,而後調用init()方法去加載struts.xml和struts-default.xml之類的文件…..

注意:此時的攔截器是尚未被調用的


訪問階段

服務器啓動的階段,僅僅是加載了各類的xml文件…那麼當咱們訪問Action的時候,它的執行流程是怎麼的呢?

  • 首先,它會建立咱們在struts.xml中配置的Action對象
  • 接着,它會按照默認的順序執行18個攔截器【也就是調用默認攔截器棧】
  • 最後,它會執行Action的業務方法【也就是execute(),咱們在struts.xml文件中配置了什麼,就執行什麼業務方法】

值得注意的是:每訪問Action一次,它就會建立一個對象…它並非和Servlet同樣只有一個對象…所以它是線程安全的.


深刻講解struts.xml

這是咱們的struts.xml的內容,相信如今對它也不會太陌生了…

<struts>
<package name="hello" extends="struts-default">
    <action name="hello" class="action.HelloAction" method="execute">
        <result name="success">/index.jsp</result>
    </action>
</package>
</struts>

package

package其實就是包,那包用來幹什麼?包就是用來管理Action

一般來講,咱們都是一個業務模版對應一個package

name

name是包的名字,值得注意的是,包的名稱是不能重複的。


extends

extends表明的是當前包繼承着哪一個包。在struts中,包必定要繼承着struts-default


abstract

在package中還有abstract這個屬性,使用該屬性時:代表當前包被其餘的包繼承…而且,在package下不能有action,不然會出錯!


namespace

在package中還有namespace這個屬性—名稱空間….它是做爲路徑的一部分的,默認是」/」


actoin

action:配置請求路徑與Action類的映射關係


name

name是請求路徑的名字


class

class是處理action類的全名


method

method是調用的方法名稱


result

result表明的是Action中業務方法返回的值


name

name是action處理返回的值


type

type是跳轉的類型


文本值

文本值是跳轉的路徑


細節

前邊已經說了,一個package應該對應一個業務模塊..目的就是把職能細分出來

struts爲了讓咱們更好地管理xml文件,它還能夠這樣作:在不一樣的模塊中用不一樣的xml文件進行描述

這裏寫圖片描述

最後在struts.xml文件中將其引入便可..

<!--struts在運行的時候總會加載這個文件-->
<!--總配置文件總引入其餘的文件-->
<struts>
    <include file="privilegeaction/privilege.xml"/>
    <include file="useraction/hello.xml"/>
</struts>
相關文章
相關標籤/搜索