1. 程式人生 > >Struts2框架入門

Struts2框架入門

Struts2架構

Struts2概述    

  以上文字來自百度百科

 Struts2是一個基於VMC設計模式的web層架構

常見的web層框架

Struts2、Struts1、webwork、springMVC

web層框架都是基於前端控制器模型的

Struts2入門

下載Struts2開發環境

解壓Struts2開發包

  1. apps :Struts2提供的應用,war檔案:web專案打成war包。直接放入到tomcat可以執行。
  2. docs :Struts2的開發文件和API
  3. lib :Strtus2框架的開發的jar包
  4. 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相關配置

  1. package標籤稱為包,這個包與Java中的包的概念不一致。包為了更好管理action的配置。
  2. package標籤的屬性
    1. name :包的名稱,只有在一個專案中不重名即可。
    2. extends :繼承哪個包,通常值為struts-default。
    3. namespace :名稱空間,與<action>標籤中的name屬性共同決定訪問路徑。
      1. 名稱空間有三種寫法:
        1. 帶名稱的名稱空間 :namespace=”/aaa” 
        2. 跟名稱空間 :namespance=”/”
        3. 預設名稱空間 :namespace=””
      2. package標籤稱為包,這個包與Java中的包的概念不一致。包為了更好管理action的配置。
      3. package標籤的屬性
        1. name :包的名稱,只有在一個專案中不重名即可。
        2. extends :繼承哪個包,通常值為struts-default。
        3. namespace :名稱空間,與<action>標籤中的name屬性共同決定訪問路徑。
          1. 名稱空間有三種寫法:
            1. 帶名稱的名稱空間 :namespace=”/aaa” 
            2. 跟名稱空間 :namespance=”/”
            3. 預設名稱空間 :namespace=””
        4. abstract :抽象的,用於其他包的繼承。要想讓別的包繼承,就要將abstract設定成true

action相關配置

  1. action標籤配置Action類。
  2. action標籤的屬性
    1. name :與namespace共同決定訪問路徑
    2. class :Action類的全路徑
    3. method :執行Action中的哪個方法的方法名,預設值execute
    4. converter :用於設定型別轉換器,比如將String轉換成基本資料型別(int、double等)、時間日期型別的轉換等

<package>中的    namespace    與   <action>   中的    name   共同構成訪問路徑

常量的配置

在Struts2的框架中,提供了非常多的常量:(在default.properties)

  1. struts.i18n.encoding=UTF-8 ----Struts2中所有的post請求的中文亂碼不用處理。
  2. struts.action.extension=action,, ----Struts2請求的預設的副檔名。預設副檔名是.action或者什麼都不寫。

在Struts2中修改一些常量的值:

  1. 修改常量的值,可以有三個位置進行修正
    1. struts.xml中進行修改
    2. struts.properties中進行修改(這個配置檔案是我們自己在src下建立的,使用者可以自行修改的,只能修改常量
    3. 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/>