Struts2是以WebWork2為核心,采用攔截機制對使用者的請求進行處理
Struts 2 相比Struts 1的優點:
1、在軟體設計上Struts 2 沒有像Struts 1那樣跟Servlet API 和 struts API 有着緊密的耦合。
Struts 2的應用可以不依賴于Servlet API和Struts API 。
2、Struts 2 提供了攔截器,利用攔截器可以進行AOP程式設計。
3、Struts 2 提供了類型轉換器。
4、Struts 2 提供支援多種表現層技術,如:JSP 、 freeMarker等。
5、Struts 2 的輸入校驗可以指定方法進行校驗。
6、Struts 2 提供了全局範圍、包範圍和Action範圍的國際化資源檔案管理實作。
架構結構:
Struts2架構基礎學習總結

工作流程:
1、Web浏覽器請求一個資源。
2、過濾器Dispatcher查找方法,确定适當的Action。
3、攔截器自動對請求應用通用功能,如驗證和檔案上傳操作。
4、Action的execute方法通常用來存儲和重新獲得資訊。
5、結果被傳回到浏覽器
Struts2所需要的jar包(圖示并不是這個):
Struts2架構基礎學習總結
配置Struts2核心控制器
配置核心控制器StrutsPrepareAndExecuteFilter就是用其實作類過濾所有的請求。Struts-2.5.8版本中的核心控制器實作類更改為org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
Struts2資料驗證以及驗證架構的應用
1 資料驗證
Action 繼承了 ActionSupport 類 ,而該類實作了 Action 、Validateable 、 ValidationAware 、TextProvider、LocaleProvider
Serializable 接口。
在Validateable 接口定義了一個 validate() 方法 , 在使用者自定義 Action 類中重寫該方法就可以實作 驗證功能。
public class LoginAction extends ActionSupport
{
private String username ;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
if ( ! username.equals("HelloWorld"))
{
Map request = (Map) ActionContext.getContext().get("request") ;
request.put("name", getUsername()) ;
return SUCCESS;
}
else return ERROR ;
}
public void validate()
{
//如果名字為空,則把錯誤資訊天驕的Action類的fileError
if (this.getUsername() == null || this.getUsername().trim().equals(""))
{
addFieldError("username" , "名字不能為空") ;
}
}
}
在類中定義了校驗方法後,該方法會執行系統的 execute() 方法之前執行。如果執行該方法後,Action類的fieldError中已經包含了資料校驗錯誤資訊,
将把請求轉發到input邏輯視圖處,是以在 Action配置中也要配置一下。
<action name = "LoginAction" class = "com.cnblogs.jbelial.login.LoginAction" >
<!-- 定義3個邏輯視圖和實體資源之間的映射 -->
<result name = "input">/login.jsp</result>
<result name = "error">/error.jsp</result>
<result name = "success">/main.jsp</result>
</action>
注意:
result中的name屬性有下:
1、success : 表示請求處理成功,該值也是預設值。
2、error :表示請求處理失敗。
3、none :表示請求處理完成後不跳轉到任何頁面。
4、input :表示輸入時如果驗證失敗應該跳轉到什麼地方。
5、login :表示登入失敗後跳轉的目标。
Struts 2 提供了大量的資料校驗器,包括表單域校驗器和非表單域校驗器。
(1)必填字元串校驗器
該校驗器的名字是 requiredstring 其校驗規則定義檔案如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<validators>
<field name = "username">
<!-- 需要驗證的字段的字段名 -->
<field-validators type = "requiredstring">
<!-- 去空格 -->
<param name = "trim">true</param>
<!-- 錯誤提示資訊 -->
<message>請輸入使用者名</message>
</field-validators>
</field>
</validators>
檔案命名:ActionName-validation.xml:其中ActionName 就是需要校驗的使用者自定義的Action 類的名字。而且該檔案應該與Action 類檔案放置在
同一路徑下。
(2)必填校驗器
該校驗器的名字就是 required 。該校驗器與requiredstring 的差别就是 可以有空字元串。配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<validators>
<!-- 需要驗證的字段的字段名 -->
<field name = "username">
<field-validators type = "required">
<!-- 錯誤提示資訊 -->
<message>請輸入使用者名</message>
</field-validators>
</field>
</validators>
(3)整數校驗器
該校驗器的名字為 int ,該校驗器要求字段的整數值必須在一定範圍内。配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<validators>
<!-- 需要驗證的字段的字段名 -->
<field name = "number">
<field-validators type = "int">
<!-- 數值的最小值 -->
<param name = "min">50</param>
<!-- 數值的最大值 -->
<param name = "max">100</param>
<!-- 錯誤提示資訊 -->
<message>大小必須在50至100之間</message>
</field-validators>
</field>
</validators>
(4) 日期校驗器
該校驗器的名字是 date , 該校驗器要求字段的日期值必須在指定範圍類,是以也有 min 和 max 參數。配置格式:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<validators>
<!-- 需要驗證的字段的字段名 -->
<field name = "date">
<field-validators type = "date">
<!-- 時間的最小值 -->
<param name = "min">1900-01-01</param>
<!-- 時間的最大值 -->
<param name = "max">9999-01-01</param>
<!-- 錯誤提示資訊 -->
<message>時間必須在1900-01-01至9999-01-01之間</message>
</field-validators>
</field>
</validators>
(5) 郵件位址校驗器
該校驗器的名稱是 email ,該校驗器要求字段的字元如果非空,就必須是合法的郵件位址。格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<validators>
<!-- 需要驗證的字段的字段名 -->
<field name = "email">
<field-validators type = "email">
<!-- 錯誤提示資訊 -->
<message>郵箱位址無效</message>
</field-validators>
</field>
</validators>
(6) 網址校驗器
該校驗器的名稱是 url , 該校驗器要求字段的字元如果非空,就必須是合法的URL位址 。 格式 和 (5)郵箱校驗器 類似。
(7) 字元穿長度校驗器
該校驗器的名稱是 stringlength ,該校驗器要求字段的字元長度必須在指定的範圍之間 ,是以它有 minLength 和 maxLength 兩個參數。
它的個數如 (3)整數校驗器 類似。
(8) 正規表達式校驗器
該校驗器的名稱是 regex ,它檢查被校驗字段是否比對一個正規表達式。
Struts2 攔截器:
Struts 2 架構的絕大部分功能是通過攔截器來完成的,當FilterDispatcher攔截到使用者請求後,大量攔截器将會對使用者請求進行處理,然後調用使用者
自定義的Action 類中的方法來處理請求。
攔截器的配置:
有時候一個Action要配置不隻一個攔截器,往往多個攔截器一起使用來進行過濾。這時候就要配置幾個攔截器組成的攔截器棧。定義攔截器棧用
<interceptor-stack.../>,格式如下:
<interceptor-stack name = "攔截器棧名">
<interceptor-ref name = "攔截器一"></interceptor-ref>
<interceptor-ref name = "攔截器二"></interceptor-ref>
<interceptor-ref name = "攔截器三"></interceptor-ref>
</interceptor-stack>
注意:在配置攔截器棧時,用到的攔截器必須是已經存在的攔截器。攔截器棧也可以引用攔截器棧。
攔截器實作類:
Struts 2 提供了一些接口或類供程式員自定義攔截器。如:com.opensymphony.xwork2.interceptor.Interceptor 接口。
該接口中有三個方法:
void init () :用于初始化資源。
String intercept (ActionInvocation invocation) :用于實作攔截的動作。
destroy () :用于銷毀在init()方法中打開的資源。