#Struts2知識複習之一
- 概述:struts2是一個基於MVC設計模型的輕量級web應用框架,它本質上相當於servlet。
它是 Struts1(早期基於MVC模式的輕量級Web框架) 和 WebWork(openSymphony組織的J2EE Web框架)技術的合併。
它的核心是WebWork,採用攔截器的機制來處理用戶請求,使業務邏輯控制器與ServletAPI脫離。 - struts2優勢:
- 提供Exception異常處理機制
- 提供良好的Ajax支持
- Result方式的頁面導航,通過Result標籤實現重定向和頁面跳轉。
- 開源,擴展性強
- web層框架(struts1,struts2,webwork,springMVC)都基於前端控制器的模式
- 什麼前端控制器模式?
概述:傳統開發中,每一個請求都會對應一個Servlet,這樣就會導致很多的Servlet。
而Struts2框架將所有請求都經過一個前端控制器,通過攔截器來過濾,實現部分功能後,
將剩下具體的操作提交到具體的Action進行處理。struts2入門基本
- Struts2開發包目錄
- apps:存放Struts2實例程序
- docs:Struts2的API參考文檔
- lib:Struts2的核心類庫,以及第三方插件類庫。
- src:Struts2的框架源碼
- web工程引入的struts2開發包
概述:實際開發中, 因爲我們不需使用lib目錄下所有jar包,所以我們引入的是
apps\struts2-blank\WEB-INF\lib 目錄下的jar包。
struts2開發jar包分析:
struts2-core-2.3.24.jar Struts2核心類庫
xwork-core-2.3.24.jar webWork核心類庫,Struts2構建的基礎
ognl-3.0.6.jar 對象圖導航語言(Object Graph Navigation Language) Struts2通過其讀寫對象的屬性。
freemarker-2.3.22.jar Struts2標籤模板使用的類庫
log4j-api-2.2.jar Struts2日誌管理組件依賴包的api
log4j-core-2.2.jar Struts2日誌管理組件依賴包
commons-fileupload-1.3.1.jar Struts2文件上傳組件依賴包
commons-io-2.2.jar Struts2的輸出輸入,傳文件依賴的jar包
commons-lang3-3.2.jar 包含一些數據類型工具,是對java.lang包的增強
javassist-3.11.0.GA.jar javascript字節碼解析器
asm-3.3.jar 操作字節碼類庫
asm-commons-3.3.jar 提供基於事件的表現形式。 asm-tree-3.3.jar 提供基於對象的表現形式。Struts2配置詳解
& 基本配置環境搭建
struts.xml文件的約束:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
頭標籤:<struts></struts>
& Struts2執行流程:
從客戶端發送的請求,會先經過前端控制器(核心過濾器 StrutsPrepareAndExecuteFilter )過濾器中執行一組攔截器,完成部分功能。
執行完攔截器後,就會執行Action,返回一個結果視圖,根據Result配置進行頁面的跳轉。 - struts.xml文件配置
(1)常量配置(使用<content></content>)
注:所有常量配置都可在struts2-core-2.3.24.jar包下的/org/apache/struts2/default.properties文件中找到
常量的配置屬性:
方式一(基於struts.xml文件)
<1> i18n:國際化編碼,解決Post提交亂碼。
示例:
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<2> struts.action.extension=action,, 指定訪問action時的後綴名, action,, 爲默認值
action,, 代表後綴名爲action或空 (兩個 , 符號代表空)。
示例:
<constant name="struts.action.extension" value="action,,"></constant>
<3>struts.devMode = false(默認) 指定struts2是否以開發模式運行,開發模式具有以下優點:
1.熱加載主配置文件(不需要重啓即可生效)
2.提供更多錯誤信息輸出,方便開發時的調試
示例:
<constant name="struts.devMode" value="true"></constant>
<4>配置動態方法調用是否開啓
示例:struts.enable.DynamicMethodInvocation = false(默認) 默認是關閉,使用需手動開啓
分析:
配置後瀏覽器訪問服務器數據的格式爲:Action類後 + !+對應的方法名
如:http://localhost/struts2_01/dynamic/Demo1Action!query
這種動態方法常量配置會導致 地址欄的名稱怪異,不利於SEO搜索引擎的檢索
方式二(基於web.xml文件)
配置struts2的編碼爲utf-8到整個web應用中
<context-param>
<param-name>struts.i18n.encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
方式三(基於 在src下重寫一個常量配置文件 default.properties覆蓋框架已有的常量配置文件)
(2)基本配置
<package name="" namespace="" extends="struts-default">
<action name="" class="" method="">
<result name="success">/xxx.jsp</result>
</action>
</package>
細述:
<1>父標籤package,將多個Action封裝到一個包裏。其屬性如下:- name:包名,起到標識作用,隨便起但不能重複。
- namespace:給Action的訪問路徑定義一個命名空間。
- extend:繼承Struts2框架下的一個指定包struts-default的所有配置
該屬性標識 該包是否爲抽象,若爲true則說明該包不能獨立運行,只是專門被繼承的
<2>一級子標籤<action>,配置action類。其屬性如下:- name:決定了action的資源訪問名
- class:action的完整類名
- method:調用actionl類中哪個方法來處理請求。
<3>一級子標籤<default-action-ref>
<default-action-ref name="xx.dd.Demo2Action"></default-action-ref>
當訪問找不到包下的ation,會使用Demo2Action作爲默認的action處理請求
<3>二級子標籤<result>,結果配置 - name屬性:標識處理結果的名稱,與Action類方法的返回值對應
- type屬性:指定調用哪一個result類來處理結果,默認使用 轉發 進行結果處理。
& 結果處理方式:
1 type="dispatcher" 請求轉發
2 type="redirect" 重定向
3 重定向到另一個Action(常用)Demo1Action / ${name} 4 請求轉發到另一個Action(不常用瞭解即可)Demo1Action / &標籤體內容:填寫跳轉頁面的相對路徑 <4>二級子標籤 (3)引入src路徑下其他的struts.xml文件,格式如下: (4)配置攔截器,格式如下: add,delete
- 配置核心過濾器
概述:所有的WEB框架都有基於 前端控制器(核心過濾器)模式的特點。
示例:struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter struts2 /* - Struts2配置文件加載順序
概述:每次從客戶端發送請求到服務器都要經過Struts2的核心過濾器StrutsPrepareAndExecuteFilter,該過濾器有預處理和執行的功能。- 預處理主要用來加載配置文件,對應過濾器的init()方法。
- 執行用來執行一組攔截器完成部分功能,對應攔截器的doFilter()方法。
詳解doFilter()方法中對Struts2配置文件的加載順序:
(1)先加載struts.xml文件,對應配置action以及常量等。
(2)後加載struts.properties文件,對應配置常量等。
(3)最後加載web.xml文件,對應配置核心過濾器以及常量。Action類的編寫
1 概述:Action作爲框架的核心類,也作爲業務邏輯控制器,實現對用戶請求處理,每一次請求都對應一個獨立的Action類工作單元.
Action類是一個POJO類(plain ordinary java object 簡單的java類)具有一部分getter/setter方法,不繼承任何父類,不實現任何接口
有一個共有無參構造(默認) 和一個execute方法(public權限修飾,字符串返回類型,方法爲空參)。
滿足上述要求的POJO類可算作Action類實現。除此之外,Struts2框架還提供了Action類的其他實現方式。
2 Action類的實現
(1)方式一:實現Action(com.opensymphony.xwork2.Action)接口
代碼示例:
public class HelloAction implements Action {br/>@Override
public String execute() throws Exception {
System.out.println("hello world!");
return "success";
}
}
但是由於該接口定義了一個execute方法以及五個基本常量: - SUCESS 成功跳轉 NONE 不跳轉 ERROR 跳轉到錯誤處理頁面
- INPUT 數據校驗時要跳轉的路徑 LOGIN 跳轉到登錄頁面
爲開發者提供幫助小,實際開發一般不用,而是使用繼承ActionSupport類。
(2)方式二:繼承ActionSupport類
代碼示例:
public class HelloAction extends ActionSupport {
}
ActionSupport類本身實現了Action接口,除此還實現其他接口,爲用戶提供更多的功能。
實際上,ActionSupport是Struts2的默認Action處理類,繼承該類可簡化Action開發。
3 Action類的訪問
(1)使用通配符 配置Action動態方法(解決一個Action類處理一個模塊中多個請求)
示例:
<action name="Demo1Action*" class="xxxx.Demo1Action" method="{1}">
<result name="success">/hello.jsp</result>
</action>
分析:
Demo1Action 的 爲 Action類的 方法名,與method="{1}"(取出第一個通配符的內容)中的 1 對應,
若Demo1Action** 則method="{2}"
擴展:值得一提,<constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>
常量配置是實現另一種Action方法的方式
- Struts2開發包目錄
- 什麼前端控制器模式?