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框架前端的控制器就是過濾器
5. 前端控制器模式
* 傳統的方式中,一個請求對應着一個servlet
* 在web層框架中,所有的請求會先經過一個前端控制器,在前端控制器中實現框架的
部分功能,具體的業務邏輯交給具體的Action
* 在struts中採用過濾器來實現前端控制器
快速搭建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包的壓縮格式是一樣的
所以可以自己修改後綴名,解壓。
* 導入解壓後的jar包就可以了
書寫Action類
/**
* Action類中的方法簽名有要求的,必須這麼做
* public 共有的
* 必須有返回值,必須String類型
* 方法名稱可以是任意的,但是不能有參數列表
* 頁面的跳轉:
* 1. return "字符串"
* 2. 需要在strtus.xml配置文件中,配置跳轉的頁面
*/
public String execute(){
System.out.println("hello struts2");
return "success";
}
書寫配置文件(src/struts.xml)
- 配置文件名稱是struts.xml(名稱必須是struts.xml)
- 在src下引入struts.xml配置文件(配置文件的路徑必須是在src的目錄下)
<?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="hello" namespace="/hello" extends="struts-default" >
<action name="HelloAction" class="cn.itheima.a_hello.HelloAction" method="hello" >
<result name="success" type="dispatcher" >/hello.jsp</result>
</action>
</package>
</struts>
配置核心過濾器到web.xml中
<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>
測試
輸入請求路徑測試
struts2架構(訪問流程)
配置文件詳解
struts.xml配置
<?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>
<!--
1.package: 將Action配置封裝,就是在package中可以配置很多Action
* name : 給包起個名字,起到標識作用(不與其他包名重複即可)隨便取
* namespace : 給action的訪問路徑中定義一個命名空間,跟<action>標籤中的
name屬性共同決定訪問路徑,默認爲空
* extends : 繼承一個指定包,只要繼承了就具有該包的所有功能 struts-default 是必須要繼承的
* abstract : 包是否爲抽象的; 標識性屬性(給開發者看的)標識該包不能獨立運行.專門被繼承
2.action: 配置action類
* name : <package>標籤的namespace屬性一起來決定訪問路徑的
* class : 配置Action類的全路徑(默認值是ActionSupport類)
* method : 指定調用Action中的哪個方法來處理請求,如果不指定,默認值是execute
3.result : 配置結果
* name : 結果頁面邏輯視圖名稱
* type : 指定調用哪一個result類來處理結果,默認使用轉發
* 標籤體 : 填寫頁面的相對路徑
-->
<package name="hello" namespace="/hello" extends="struts-default" >
<action name="HelloAction" class="com.xiaoming.controller.HelloAction" method="execute" >
<result name="success" type="dispatcher" >/index.jsp</result>
</action>
</package>
</struts>
struts2常量配置
struts2默認常量配置位置
修改struts2常量配置方式
- 在src/struts.xml中(重要)
<constant name="key" value="value"></constant>
- 在src下創建struts.properties(瞭解)
//以鍵值對的形式
struts.i18n.encoding=UTF-8
- 在web.xml文件中(瞭解)
在StrutsPrepareAndExecuteFilter配置文件中配置初始化參數
<!-- 配置常量 在覈心過濾器標籤下 -->
<init-param>
<param-name>struts.i18n.encoding</param-name>
<param-value>UTF-8</param-value>
</innit-param>
常量配置文件加載順序
常量配置
<!-- i18n:國際化. 解決post提交亂碼 get亂碼自己解決 -->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<!-- 指定反問action時的後綴名
http://localhost:8080/struts2_day01/hello/HelloAction.action
-->
<constant name="struts.action.extension" value="action"></constant>
<!-- 指定struts2是否以開發模式運行
1.熱加載主配置.(不需要重啓即可生效)
2.提供更多錯誤信息輸出,方便開發時的調試
項目上線的時候設置爲 false
-->
<constant name="struts.devMode" value="true"></constant>
* struts.serve.static.browserCache=true
-- 設置瀏覽器是否緩存靜態內容,默認值爲true(生產環境下使用),開發階段最好關閉
* struts.configuration.xml.reload=false
-- 當struts的配置文件修改後,系統是否自動重新加載該文件,默認值爲false(生產環境下使用)
分模塊開發配置
<!-- 引入其他struts配置文件 -->
<include file="cn/itheima/b_dynamic/struts.xml"></include>
<include file="cn/itheima/c_default/struts.xml"></include>
struts2配置進階
動態方法調用
- ==通配符方式(重要)==
<?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="dynamic" namespace="/dynamic" extends="struts-default" >
<!--
通配符方式:
使用{1} 取出第一個星號通配的內容
訪問的url :
http://localhost:8080/項目名/namespace/actionName_方法名.後綴
-->
<action name="Demo1Action_*" class="cn.itheima.b_dynamic.Demo1Action" method="{1}" >
<result name="success" >/hello.jsp</result>
</action>
</package>
</struts>
- 配置動態方法調用方法常量
<!-- 配置動態方法調用是否開啓常量
默認是關閉的,需要開啓(true)
訪問的url : http://localhost:8080/項目名/namespace/actionName 方法名!後綴
不利於seo優化
-->
<constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>
struts2中的默認配置
<?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="/default" extends="struts-default" >
<!-- 找不到包下的action,會使用Demo2Action作爲默認action處理請求 -->
<default-action-ref name="Demo2Action"></default-action-ref>
<!-- 常見默認值 -->
<!-- method屬性:execute -->
<!-- result的name屬性:success -->
<!-- result的type屬性:dispatcher 轉發 -->
<!-- class屬性:com.opensymphony.xwork2.ActionSupport -->
<action name="Demo2Action" >
<result >/hello.jsp</result>
</action>
</package>
</struts>
Action類的三種寫法
1. 配置文件學習完成,下面的重點是Action類的三種寫法
/* 寫一個POJO類
* 什麼是POJO類,POJO(Plain Ordinary Java Object)簡單的Java對象.
簡單記:沒有繼承某個類,沒有實現接口,就是POJO的類。
* 實現Action接口
* Action接口中定義了5個常量,5個常量的值對應的是5個邏輯視圖跳轉頁面
(跳轉的頁面還是需要自己來配置),還定義了一個方法,execute方法。
* 大家需要掌握5個邏輯視圖的常量(實際上就是一個字符串)
* SUCCESS -- 成功.
* INPUT -- 用於數據表單校驗.如果校驗失敗,跳轉INPUT視圖.
* LOGIN -- 登錄.
* ERROR -- 錯誤.
* NONE -- 頁面不轉向.
* 給我們提供上述的常量只是爲了統一規範
* 繼承ActionSupport類(開發中這種方式使用最多)
* 幫我們實現了 Validateable, ValidationAware, TextProvider, LocaleProvider 等接口
* 如果我們需要用到這些接口的實現時,不需要自己來實現了