Struts2框架入門
Struts2架構
Struts2概述
以上文字來自百度百科
Struts2是一個基於VMC設計模式的web層架構
常見的web層框架
Struts2、Struts1、webwork、springMVC
web層框架都是基於前端控制器模型的
Struts2入門
下載Struts2開發環境
解壓Struts2開發包
- apps :Struts2提供的應用,war檔案:web專案打成war包。直接放入到tomcat可以執行。
- docs :Struts2的開發文件和API
- lib :Strtus2框架的開發的jar包
- src :Struts2的原始碼
建立web專案,匯入jar包
struts-blank專案下找jar包
建立一個jsp頁面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>Struts2的入門</h1> <h3><a href="${ pageContext.request.contextPath }/hello.action">Struts2的入門</a></h3> </body> </html>
編寫action類
public class HelloAction { /** * 提供一個方法: * * 方法簽名固定的 * 共有的 返回值是String型別 方法名execute 在這個方法中不能傳遞引數。 */ public String execute(){ System.out.println("HelloAction執行了..."); return "success"; } }
對action進行配置 struts_demo1.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> <!-- Struts2為了管理Action的配置,通過包進行管理。 --> <!-- 配置Struts2的包 ================ --> <package name="demo1" extends="struts-default" namespace="/"> <!-- 配置Action================ --> <action name="hello" class="com.itheima.struts.demo1.HelloAction" > <!-- 配置頁面的跳轉=========== --> <result name="success">/demo1/success.jsp</result> </action> </package> </struts>
配置前端控制器(核心過濾器)
在web.xml中配置核心過濾器
<!-- 配置Struts2的核心過濾器 --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> <!-- 修改常量 --> <!-- <init-param> --> <!-- <param-name>struts.action.extension</param-name> --> <!-- <param-value>xyz</param-value> --> <!-- </init-param> --> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
編寫前端success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>跳轉成功頁面!!!</h1> </body> </html>
Struts2執行流程
當用戶訪問某一個Action的時候,先經過核心過濾器,在核心過濾器中執行一組攔截器(這組攔截器實現部分功能),執行目標Action,根據Action的返回值,進行頁面跳轉
Struts2的配置檔案的載入順序*(瞭解)
Struts中可以在很多地方設定初始化常量,實際用到哪一個,這就與載入順序有關了
init_DefaultProperties() ----載入default.properties
init_TraditionalXmlConfigurations(); ----載入struts-default.xml、struts-plugin.xml、struts.xml
init_LegacyStrutsProperties(); ----載入struts.properties
init_CustomConfigurationProviders(); ----載入配置提供類
init_FilterInitParameters() ; // [6] ----載入web.xml中過濾器初始化引數
init_AliasStandardObjects() ; // [7] ----載入Bean物件
載入順序
default.properties
struts-default.xml
struts-plugin.xml
struts.xml
struts.properties
web.xml
注意:後配置的常量的值會覆蓋先配置的常量的值。
Action配置
package相關配置
- package標籤稱為包,這個包與Java中的包的概念不一致。包為了更好管理action的配置。
- package標籤的屬性
- name :包的名稱,只有在一個專案中不重名即可。
- extends :繼承哪個包,通常值為struts-default。
- namespace :名稱空間,與<action>標籤中的name屬性共同決定訪問路徑。
- 名稱空間有三種寫法:
- 帶名稱的名稱空間 :namespace=”/aaa”
- 跟名稱空間 :namespance=”/”
- 預設名稱空間 :namespace=””
- package標籤稱為包,這個包與Java中的包的概念不一致。包為了更好管理action的配置。
- package標籤的屬性
- name :包的名稱,只有在一個專案中不重名即可。
- extends :繼承哪個包,通常值為struts-default。
- namespace :名稱空間,與<action>標籤中的name屬性共同決定訪問路徑。
- 名稱空間有三種寫法:
- 帶名稱的名稱空間 :namespace=”/aaa”
- 跟名稱空間 :namespance=”/”
- 預設名稱空間 :namespace=””
- 名稱空間有三種寫法:
- abstract :抽象的,用於其他包的繼承。要想讓別的包繼承,就要將abstract設定成true
- 名稱空間有三種寫法:
action相關配置
- action標籤配置Action類。
- action標籤的屬性
- name :與namespace共同決定訪問路徑
- class :Action類的全路徑
- method :執行Action中的哪個方法的方法名,預設值execute
- converter :用於設定型別轉換器,比如將String轉換成基本資料型別(int、double等)、時間日期型別的轉換等
<package>中的 namespace 與 <action> 中的 name 共同構成訪問路徑
常量的配置
在Struts2的框架中,提供了非常多的常量:(在default.properties)
- struts.i18n.encoding=UTF-8 ----Struts2中所有的post請求的中文亂碼不用處理。
- struts.action.extension=action,, ----Struts2請求的預設的副檔名。預設副檔名是.action或者什麼都不寫。
在Struts2中修改一些常量的值:
- 修改常量的值,可以有三個位置進行修正
- struts.xml中進行修改
- struts.properties中進行修改(這個配置檔案是我們自己在src下建立的,使用者可以自行修改的,只能修改常量)
- web.xml中進行修改
分模組開發的配置
include標籤,在struts.xml中配置
action的訪問
Action類的寫法
Action類是POJO(Plain Ordinary Java Object 簡單的java型別)類
/**
* Action的編寫方式:Action類是一個POJO的類
*
*/
public class ActionDemo1 {
public String execute(){
System.out.println("ActionDemo1執行了...");
return null;
}
}
Action類實現Action介面
/**
* Action的編寫方式二:實現一個Action的介面
* * 實現介面的這種方式:提供了五個常量(五個邏輯檢視的名稱)
* * SUCCESS :成功
* * ERROR :失敗
* * LOGIN :登入出錯頁面跳轉
* * INPUT :表單校驗的時候出錯
* * NONE :不跳轉
*
*/
public class ActionDemo2 implements Action{
@Override
public String execute() throws Exception {
System.out.println("ActionDemo2執行了...");
return NONE;
}
}
Action類繼承ActionSupport類(推薦使用這種,因為ActionSupport類實現了Action介面,同時增加了許多功能)
import com.opensymphony.xwork2.ActionSupport;
/**
* Action的編寫方式三:Action類繼承ActionSupport類
* * 推薦使用繼承ActionSupport方式
* * ActionSupport中提供了資料校驗、國際化等一系列操作的方法。
*
*/
public class ActionDemo3 extends ActionSupport{
@Override
public String execute() throws Exception {
System.out.println("ActionDemo3執行了...");
return NONE;
}
}
Action的訪問方法
但在實際開發中,我們一般是一個 模組 對應一個 類 ,一個 請求 對應類中的一個 方法
因此Struts2提供了三種訪問的方法
通過method屬性配置
前端程式碼
<h3>通過method方式</h3> <a href="${ pageContext.request.contextPath }/userFind.action">查詢使用者</a><br/> <a href="${ pageContext.request.contextPath }/userUpdate.action">修改使用者</a><br/> <a href="${ pageContext.request.contextPath }/userDelete.action">刪除使用者</a><br/> <a href="${ pageContext.request.contextPath }/userSave.action">儲存使用者</a><br/>
配置Struts2的包
<package name="demo3" extends="struts-default" namespace="/"> <action name="userFind" class="com.itheima.struts.demo3.UserAction" method="find"></action> <action name="userUpdate" class="com.itheima.struts.demo3.UserAction" method="update"></action> <action name="userDelete" class="com.itheima.struts.demo3.UserAction" method="delete"></action> <action name="userSave" class="com.itheima.struts.demo3.UserAction" method="save"></action> </package>
這樣子,不同的前端請求,就會訪問到UserAction類中的不同的方法中去
通過萬用字元的方式設定
前端頁面訪問
<h3>通過萬用字元的方式</h3> <a href="${ pageContext.request.contextPath }/product_find.action">查詢商品</a><br/> <a href="${ pageContext.request.contextPath }/product_update.action">修改商品</a><br/> <a href="${ pageContext.request.contextPath }/product_delete.action">刪除商品</a><br/> <a href="${ pageContext.request.contextPath }/product_save.action">儲存商品</a><br/>
Struts2的包配置
<package name="demo3" extends="struts-default" namespace="/"> <!-- 萬用字元的方式 --> <action name="product_*" class="com.itheima.struts.demo3.ProductAction" method="{1}"></action> </package>
動態方法訪問(Struts2中預設是關閉的)
配置Struts2的包
<package name="demo3" extends="struts-default" namespace="/"> <!-- 動態方法訪問的方式 --> <action name="customer" class="com.itheima.struts.demo3.CustomerAction"></action> </package>
由於動態訪問在Struts2中預設是關閉的,因此我們需要設定一下動態訪問的常量,在struts.xml或其子配置檔案中(如struts_demo3.xml)配置
<!-- 開啟動態方法訪問 --> <constant name="struts.enable.DynamicMethodInvocation" value="true"/>
編寫動態訪問路徑,路徑為 acting標籤中配置的name + ! + 要訪問的方法名 .action
<h3>通過動態方法訪問的方式</h3> <a href="${ pageContext.request.contextPath }/customer!find.action">查詢客戶</a><br/> <a href="${ pageContext.request.contextPath }/customer!update.action">修改客戶</a><br/> <a href="${ pageContext.request.contextPath }/customer!delete.action">刪除客戶</a><br/> <a href="${ pageContext.request.contextPath }/customer!save.action">儲存客戶</a><br/>