1. 程式人生 > >【javaWeb】第60天——Struts框架的第四天

【javaWeb】第60天——Struts框架的第四天

Struts2第一天

Struts2的學習路線

1. Struts2的入門:主要是學習Struts2的開發流程(Struts2的開發流程、常見的配置、Action類的編寫)
2. Struts2的Servlet的API、引數封裝和攔截器
3. Struts2的值棧和OGNL表示式

今天的課程內容

1. Struts2框架的概述
2. Struts2的快速入門
3. Struts2的執行流程
4. Struts2的常見配置(配置檔案載入的順序、struts.xml的常見配置(重點)、常量的配置等)
5. Struts2的Action的訪問(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框架前端的控制器就是過濾器

技術分析之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.itcast.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="com.itheima.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/itcast/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.itcast.demo2.BookAction" method="add"></action>
		    	<action name="deleteBook" class="cn.itcast.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.itcast.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.itcast.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;
				}
			}