咱們如今學習的是Struts2,其實Struts1和Struts2在技術上是沒有很大的關聯的。Struts2其實基於Web Work框架的,只不過它的推廣沒有Struts1好,所以就拿着Struts這個名氣推出了Struts2框架。java
所以,學習Struts2的時候,不瞭解Struts1是沒有任何關係的。web
在開山篇的時候,已經說明了爲何要引入Struts框架,其實就是爲了提升開發效率…apache
Struts2框架預先實現了一些功能:安全
咱們就直接來說解Struts2的開發步驟是什麼吧….在瞭解它的細節以前,先要把配置環境搭好!服務器
完整的struts中的jar包有80多個,咱們平常開發是不須要那麼多個的。通常咱們導入的jar包有8個:markdown
在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>
開山篇咱們已經說了,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,咱們能夠在文件中找到相對應的模版代碼的…最終修改爲下面這個樣子就好了:
<?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()中的語句被執行了…
咱們來簡單地瞭解一下Struts的執行流程,而後再慢慢對上面的開發步驟的部分進行講解….
下邊我說的都是struts流程的重點:
Dispatcher dispatcher = init.initDispatcher(config);
,初始化dispatcher下面用GIF圖來看看它的執行過程:
細心的朋友可能會發現,咱們在struts.xml的package節點下,extends了struts-default….那struts-default到底是什麼東西呢?
咱們找到它的源碼:
咱們發現了一大堆的Bean,interceptor,result-type,interceptor-stack…下邊我來說解一下它們是幹嗎用的…
還要補充的就是:默認的攔截器棧有18個攔截器….
攔截器和過濾器都是攔截資源的
攔截器只攔截Action請求,是struts的概念…
過濾器攔截web的全部資源,是Servlet的概念…
服務器啓動的時候,其實就是加載了web.xml文件,而後調用init()方法去加載struts.xml和struts-default.xml之類的文件…..
注意:此時的攔截器是尚未被調用的。
在服務器啓動的階段,僅僅是加載了各類的xml文件…那麼當咱們訪問Action的時候,它的執行流程是怎麼的呢?
值得注意的是:每訪問Action一次,它就會建立一個對象…它並非和Servlet同樣只有一個對象…所以它是線程安全的.
這是咱們的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其實就是包,那包用來幹什麼?包就是用來管理Action
一般來講,咱們都是一個業務模版對應一個package
name是包的名字,值得注意的是,包的名稱是不能重複的。
extends表明的是當前包繼承着哪一個包。在struts中,包必定要繼承着struts-default
在package中還有abstract這個屬性,使用該屬性時:代表當前包被其餘的包繼承…而且,在package下不能有action,不然會出錯!
在package中還有namespace這個屬性—名稱空間….它是做爲路徑的一部分的,默認是」/」
action:配置請求路徑與Action類的映射關係
name是請求路徑的名字
class是處理action類的全名
method是調用的方法名稱
result表明的是Action中業務方法返回的值
name是action處理返回的值
type是跳轉的類型
文本值是跳轉的路徑
前邊已經說了,一個package應該對應一個業務模塊..目的就是把職能細分出來…
struts爲了讓咱們更好地管理xml文件,它還能夠這樣作:在不一樣的模塊中用不一樣的xml文件進行描述…
最後在struts.xml文件中將其引入便可..
<!--struts在運行的時候總會加載這個文件--> <!--總配置文件總引入其餘的文件--> <struts> <include file="privilegeaction/privilege.xml"/> <include file="useraction/hello.xml"/> </struts>