版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/kese7952/article/details/81080707
本篇任務
1. Struts2架構的概述
2. Struts2的快速入門
3. Struts2的運作流程
4. Struts2的常見配置(配置檔案加載的順序、struts.xml的常見配置(重點)、常量的配置等)
5. Struts2的Action的通路(Action的三種編寫方式、類的配置、方法的調用等)
案例一:使用Struts2架構完成登入功能
需求分析
1. 使用Struts2完成登入的功能
技術分析之Struts2架構的概述
1. 什麼是Struts2的架構
* Struts2是Struts1的下一代産品,是在 struts1和WebWork的技術基礎上進行了合并的全新的Struts 2架構。
* 其全新的Struts 2的體系結構與Struts 1的體系結構差别巨大。
* Struts 2以WebWork為核心,采用攔截器的機制來處理使用者的請求,這樣的設計也使得業務邏輯控制器能夠與ServletAPI完全脫離開,是以Struts 2可以了解為WebWork的更新産品。
* 雖然從Struts 1到Struts 2有着太大的變化,但是相對于WebWork,Struts 2的變化很小。
2. Struts2是一個基于MVC設計模式的Web層架構
* MVC和JavaEE的三層結構
* MVC設計模式:是由一些網站的開發人員提出來的
* JavaEE三層結構:SUN公司為EE開發劃分的結構
3. 常見的Web層的架構
* Struts1
* Struts2
* Webwork
* SpringMVC
4. Web層架構的特點
* 都是一個特點,前端控制器模式
* 記住:前端控制器(核心的控制器)
* Struts2架構前端的控制器就是過濾器
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIw1mYuUjM1czN2ATN4ETIh8VYYhlYDhFWYFGWxknaOVnQX12VFx2bq5kMCR1LcVjM1czN2ATN4EzLcJTavwVYyRHeldWbp9CXt92Yu4GZjlGbh5yZtl2Lc9CX6MHc0RHaiojIsJye.bmp)
技術分析之Struts2快速入門的環境準備
1. 建立WEB項目,編寫JSP的頁面,編寫超連結,點選超連結發送請求,請求伺服器,讓伺服器的方法去執行!!
<h3>Struts2的入門程式</h3>
<a href="${ pageContext.request.contextPath }/hello.action">Struts2入門程式</a>
2. 下載下傳Struts2的開發包
* https://struts.apache.org/ -- 官網位址
3. 解壓struts-2.3.24-all.zip包
* 解壓後會看到有包和一些檔案,大家需要掌握包相關的資訊
* apps -- Struts2架構提供了一些應用
* libs -- Struts2架構開發的jar包
* docs -- Struts2架構開發文檔
* src -- Struts2架構源碼
4. 引入需要開發的jar包
* Struts2架構的開發jar包非常多,但是不是所有都是必須要引入的,有一些必須要導入的jar包,這些jar包可以從Struts2架構提供的應用中找到。
* 大家可以打開apps目錄,然後找到struts2-blank.war應用。war包和zip包的壓縮格式是一樣的,是以可以自己修改字尾名,解壓。
* 找到解壓後的應用,打開WEB-INF/lib目錄下是以的jar包。複制到工程中,就可以了。
5. 需要配置Struts2的前端控制器,注意:這一步是必須要做的操作,這是Struts2核心的控制器。
* Struts2的前端控制器就是一個過濾器,那麼過濾器相關知識咱們都學習過,需要在web.xml中進行配置。
* 前端控制器的類的路徑和名稱:org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
* 具體配置如下
<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類
1. Action類是動作類,是Struts2處理請求,封裝資料,響應頁面的核心控制器。需要自己編寫。
package cn.javabs.action;
public String sayHello(){
System.out.println("Hello Struts2!!");
return null;
}
技術分析之編寫Struts的配置檔案
1. 配置檔案名稱是struts.xml(名稱必須是struts.xml)
2. 在src下引入struts.xml配置檔案(配置檔案的路徑必須是在src的目錄下)
3. 配置如下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="hello" class="cn.javabs.action.HelloAction" method="sayHello">
</action>
</package>
</struts>
入門總結之Struts2的執行流程
1. 執行的流程
* 編寫的頁面,點選超連結,請求送出到伺服器端。
* 請求會先經過Struts2的核心過濾器(StrutsPrepareAndExecuteFilter)
* 過濾器的功能是完成了一部分代碼功能
* 就是一系列的攔截器執行了,進行一些處理工作。
* 咱們可以在struts-default.xml配置檔案中看到有很多的攔截器。可以通過斷點的方式來示範。
* 攔截器執行完後,會根據struts.xml的配置檔案找到請求路徑,找到具體的類,通過反射的方式讓方法執行。
2. 總結
* JSP頁面-->StrutsPrepereAndExecuteFilter過濾器-->執行一系列攔截器(完成了部分代碼)-->執行到目标Action-->傳回字元串-->結果頁面(result)-->頁面跳轉
入門總結之struts.xml的配置檔案提示的問題
1. 先找到struts.xml的配置檔案,複制http://struts.apache.org/dtds/struts-2.3.dtd,注意,不要有雙引号。
* http://struts.apache.org/dtds/struts-2.3.dtd
2. 選擇window -- 首選項 -- 搜尋xml -- 選擇xml Catalog
3. 選擇添加按鈕(add按鈕)
* key type 要選擇URI
* key的位置把剛才複制的路徑拷貝進去。http://struts.apache.org/dtds/struts-2.3.dtd
* Location要在本地能找到struts2-2.3.dtd的真實檔案。點選File System,去資料中找到它
4. 如果想檢視源代碼
* 選擇資料/struts2/struts-2.3.24-all.zip
入門總結之Struts2架構配置檔案加載的順序
0. 需要掌握
* 加載了哪些個配置檔案(重點的)
* 配置檔案的名稱是什麼
* 配置檔案的位置
* 配置檔案的作用
1. Struts2架構的核心是StrutsPrepareAndExecuteFilter過濾器,該過濾器有兩個功能
* Prepare -- 預處理,加載核心的配置檔案
* Execute -- 執行,讓部分攔截器執行
2. StrutsPrepareAndExecuteFilter過濾器會加載哪些配置檔案呢?
* 通過源代碼可以看到具體加載的配置檔案和加載配置檔案的順序
* init_DefaultProperties(); -- 加載org/apache/struts2/default.properties
* init_TraditionalXmlConfigurations(); -- 加載struts-default.xml,struts-plugin.xml,struts.xml
* init_LegacyStrutsProperties(); -- 加載自定義的struts.properties.
* init_CustomConfigurationProviders(); -- 加載使用者自定義配置提供者
* init_FilterInitParameters() ; -- 加載web.xml
3. 重點了解的配置檔案
* default.properties -- 在org/apache/struts2/目錄下,代表的是配置的是Struts2的常量的值
* struts-default.xml -- 在Struts2的核心包下,代表的是Struts2核心功能的配置(Bean、攔截器、結果類型等)
* struts.xml -- 重點中的重點配置,代表WEB應用的預設配置,在工作中,基本就配置它就可以了!!(可以配置常量)
* web.xml -- 配置前端控制器(可以配置常量)
* 注意:
* 前3個配置檔案是struts2架構的預設配置檔案,基本不用修改。
* 後3個配置檔案可以允許自己修改struts2的常量。但是有一個特點:後加載的配置檔案修改的常量的值,會覆寫掉前面修改的常量的值。
4. 總結(重點掌握的配置檔案)
* 先加載default.properties檔案,在org/apache/struts2/default.properties檔案,都是常量。
* 又加載struts-default.xml配置檔案,在核心的jar包最下方,struts2架構的核心功能都是在該配置檔案中配置的。
* 再加載struts.xml的配置檔案,在src的目錄下,代表使用者自己配置的配置檔案
* 最後加載web.xml的配置檔案
* 後加載的配置檔案會覆寫掉之前加載的配置檔案(在這些配置檔案中可以配置常量)
5. 注意一個問題
* 哪些配置檔案中可以配置常量?
* default.properties -- 預設值,咱們是不能修改的!!
* struts.xml -- 可以配置,開發中基本上都在該配置檔案中配置常量
* struts.properties -- 可以配置,基本不會在該配置檔案中配置
* web.xml -- 可以配置,基本不會在該配置檔案中配置
* 後加載的配置檔案會覆寫掉之前加載的配置!!
入門總結之struts.xml配置檔案的配置
1. <package>标簽,如果要配置<Action>的标簽,那麼必須要先配置<package>标簽,代表的包的概念
* 包含的屬性
* name -- 包的名稱,要求是唯一的,管理action配置
* extends -- 繼承,可以繼承其他的包,隻要繼承了,那麼該包就包含了其他包的功能,一般都是繼承struts-default
* namespace -- 名稱空間,一般與<action>标簽中的name屬性共同決定通路路徑(通俗話:怎麼來通路action),常見的配置如下
* namespace="/" -- 根名稱空間
* namespace="/aaa" -- 帶有名稱的名稱空間
* abstract -- 抽象的。這個屬性基本很少使用,值如果是true,那麼編寫的包是被繼承的
2. <action>标簽
* 代表配置action類,包含的屬性
* name -- 和<package>标簽的namespace屬性一起來決定通路路徑的
* class -- 配置Action類的全路徑(預設值是ActionSupport類)
* method -- Action類中執行的方法,如果不指定,預設值是execute
3. <result>标簽
* action類中方法執行,傳回的結果跳轉的頁面
* name -- 結果頁面邏輯視圖名稱
* type -- 結果類型(預設值是轉發,也可以設定其他的值)
入門總結之Struts2配置常量
1. 可以在Struts2架構中的哪些配置檔案中配置常量?
* struts.xml(必須要掌握,開發中基本上就在該配置檔案中編寫常量)
* <constant name="key" value="value"></constant>
* web.xml
* 在StrutsPrepareAndExecuteFilter配置檔案中配置初始化參數
* 注意:後加載的配置的檔案的常量會覆寫之前加載的常量!!
2. 需要大家了解的常量
* struts.i18n.encoding=UTF-8 -- 指定預設編碼集,作用于HttpServletRequest的setCharacterEncoding方法
* struts.action.extension=action,, -- 該屬性指定需要Struts 2處理的請求字尾,該屬性的預設值是action,即所有比對*.action的請求都由Struts2處理。如果使用者需要指定多個請求字尾,則多個字尾之間以英文逗号(,)隔開
* struts.serve.static.browserCache=true -- 設定浏覽器是否緩存靜态内容,預設值為true(生産環境下使用),開發階段最好關閉
* struts.configuration.xml.reload=false -- 當struts的配置檔案修改後,系統是否自動重新加載該檔案,預設值為false(生産環境下使用)
* struts.devMode = false -- 開發模式下使用,這樣可以列印出更詳細的錯誤資訊
入門總結之指定多個struts的配置檔案(了解)
1. 在大部分應用裡,随着應用規模的增加,系統中Action的數量也會大量增加,導緻struts.xml配置檔案變得非常臃腫。
為了避免struts.xml檔案過于龐大、臃腫,提高struts.xml檔案的可讀性,我們可以将一個struts.xml配置檔案分解成多個配置檔案,然後在struts.xml檔案中包含其他配置檔案。
2. 可以在<package>标簽中,使用<include>标簽來引入其他的struts_xx.xml的配置檔案。例如:
<struts>
<include file="struts-part1.xml"/>
<include file="struts-part2.xml"/>
</struts>
3. 注意注意注意(重要的事情說三遍):<include file="cn/javabs/demo2/struts-part1.xml"/>
技術分析之Action類的三種寫法
1. 配置檔案學習完成,下面的重點是Action類的三種寫法
* Action類就是一個POJO類
* 什麼是POJO類,POJO(Plain Ordinary Java Object)簡單的Java對象.簡單記:沒有繼承某個類,沒有實作接口,就是POJO的類。
* Action類可以實作Action接口
* Action接口中定義了5個常量,5個常量的值對應的是5個邏輯視圖跳轉頁面(跳轉的頁面還是需要自己來配置),還定義了一個方法,execute方法。
* 大家需要掌握5個邏輯視圖的常量
* SUCCESS -- 成功.
* INPUT -- 用于資料表單校驗.如果校驗失敗,跳轉INPUT視圖.
* LOGIN -- 登入.
* ERROR -- 錯誤.
* NONE -- 頁面不轉向.
* Action類可以去繼承ActionSupport類(開發中這種方式使用最多)
* 設定錯誤資訊
技術分析之Action的通路
1. 通過<action>标簽中的method屬性,通路到Action中的具體的方法。
* 傳統的配置方式,配置更清晰更好了解!但是擴充需要修改配置檔案等!
* 具體的執行個體如下:
* 頁面代碼
* <a href="${pageContext.request.contextPath}/addBook.action">添加圖書</a>
* <a href="${pageContext.request.contextPath}/deleteBook.action">删除圖書</a>
* 配置檔案的代碼
<package name="demo2" extends="struts-default" namespace="/">
<action name="addBook" class="cn.javabs.demo2.BookAction" method="add"></action>
<action name="deleteBook" class="cn.javabs.demo2.BookAction" method="delete"></action>
</package>
* Action的代碼
public String add(){
System.out.println("添加圖書");
return NONE;
}
public String delete(){
System.out.println("删除圖書");
return NONE;
}
2. 通配符的通路方式:(通路的路徑和方法的名稱必須要有某種聯系.) 通配符就是 * 代表任意的字元
* 使用通配符的方式可以簡化配置檔案的代碼編寫,而且擴充和維護比較容易。
* 具體執行個體如下:
* 頁面代碼
<a href="${pageContext.request.contextPath}/order_add.action">添加訂單</a>
<a href="${pageContext.request.contextPath}/order_delete.action">删除訂單</a>
* 配置檔案代碼
* <action name="order_*" class="cn.javabs.demo2.OrderAction" method="{1}"></action>
* Action的代碼
public String add(){
System.out.println("添加訂單");
return NONE;
}
public String delete(){
System.out.println("删除訂單");
return NONE;
}
* 具體了解:在JSP頁面發送請求,http://localhost/struts2_01/order_add.action,配置檔案中的order_*可以比對該請求,*就相當于變成了add,method屬性的值使用{1}來代替,{1}就表示的是第一個*号的位置!!是以method的值就等于了add,那麼就找到Action類中的add方法,那麼add方法就執行了!
3. 動态方法通路的方式(有的開發中也會使用這種方式)
* 如果想完成動态方法通路的方式,需要開啟一個常量,struts.enable.DynamicMethodInvocation = false,把值設定成true。
* 注意:不同的Struts2架構的版本,該常量的值不一定是true或者false,需要自己來看一下。如果是false,需要自己開啟。
* 在struts.xml中開啟該常量。
* <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
* 具體代碼如下
* 頁面的代碼
* <a href="${pageContext.request.contextPath}/product!add.action">添加商品</a>
* <a href="${pageContext.request.contextPath}/product!delete.action">删除商品</a>
* 配置檔案代碼
* <action name="product" class="cn.javabs.demo2.ProductAction"></action>
* Action的類的代碼
public class ProductAction extends ActionSupport{
public String add(){
System.out.println("添加訂單");
return NONE;
}
public String delete(){
System.out.println("删除訂單");
return NONE;
}
}
作者: 楊校
出處:
https://blog.csdn.net/kese7952分享是快樂的,也見證了個人成長曆程,文章大多都是工作經驗總結以及平時學習積累,基于自身認知不足之處在所難免,也請大家指正,共同進步。
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出, 如有問題, 可郵件([email protected])咨詢。