- Apache Struts 2是一種流行的 Java模型 - 視圖 - 控制器(MVC)框架,成功地結合了 WebWork和Struts1.x 兩種 web 框架。
struts2與struts1區別 (經常聽搞java的同事嗶嗶這個面試題)
- Struts 2是Struts的下一代產品,是在 struts 1和WebWork的技術基礎上進行了合并的全新的Struts 2框架。其全新的Struts 2的體系結構與Struts 1的體系結構差別巨大。Struts 2以WebWork為核心,采用攔截器的機制來處理用戶的請求,這樣的設計也使得業務邏輯控制器能夠與ServletAPI完全脫離開,所以Struts 2可以理解為WebWork的更新產品。雖然從Struts 1到Struts 2有著太大的變化,但是相對于WebWork,Struts 2的變化很小。從某種程度上來看,Struts 2是WebWork的升級,而不是Struts 1的升級,甚至在Apache的Struts 2的官方文檔都提到:WebWork到Struts 2是一次平滑的過渡。實際上,Struts 2.0其實是WebWork 2.3而已。在很多方面,Struts 2僅僅是改變了WebWork下的名稱,Struts 2也刪除了WebWork中少量特性。
-
Struts實現MVC的原理
Struts實現MVC的原理 - 控制:通過圖可以看到有一個XML文件Struts-config.xml,與之相關聯的是Controller,它可以稱作為Struts神經中樞。承擔MVC中Controller角色的是一個Servlet,叫ActionServlet。ActionServlet是一個通用的控制組件。這個控制組件提供了處理所有發送到Struts的HTTP請求的入口點。它截取和分發這些請求到相應的動作類(這些動作類都是Action類的子類)。另外控制組件也負責用相應的請求參數填充 Action From(通常稱之為FromBean),并傳給動作類(通常稱之為ActionBean)。
- 流程:在Struts中,用戶的請求一般以.do作為請求服務名,所有的.do請求均被指向ActionSevlet,ActionSevlet根據Struts-config.xml中的配置信息,將用戶請求封裝成一個指定名稱的FormBean,并將此FormBean傳至指定名稱的ActionBean,由ActionBean完成相應的業務操作,如文件操作,數據庫操作等。每一個*.do均有對應的FormBean名稱和ActionBean名稱,這些在Struts-config.xml中配置。動作類實現核心商業邏輯,它可以訪問java bean 或調用EJB。最后動作類把控制權傳給后續的JSP 文件,后者生成視圖。所有這些控制邏輯利用Struts-config.xml文件來配置。表現邏輯和程序邏輯。
- 視圖:主要由JSP生成頁面完成視圖。
- 模型:模型以一個或多個java bean的形式存在。這些bean分為三類:Action Form、Action、JavaBean or EJB。Action Form通常稱之為FormBean,封裝了來自于Client的用戶請求信息,如表單信息。Action通常稱之為ActionBean,獲取從ActionSevlet傳來的FormBean,取出FormBean中的相關信息,并做出相關的處理,一般是調用Java Bean或EJB等。
-
核心:Struts的核心是ActionSevlet,ActionSevlet的核心是Struts-config.xml。
20130904161742156.jpg - 客戶端(Client)向Action發用一個請求(Request)
- Container通過web.xml映射請求,并獲得控制器(Controller)的名字
- 容器(Container)調用控制器(StrutsPrepareAndExecuteFilter或FilterDispatcher)。在Struts2.1以前調用FilterDispatcher,Struts2.1以后調用StrutsPrepareAndExecuteFilter
- 控制器(Controller)通過ActionMapper獲得Action的信息
- 控制器(Controller)調用ActionProxy
- ActionProxy讀取struts.xml文件獲取action和interceptor stack的信息。
- ActionProxy把request請求傳遞給ActionInvocation
- ActionInvocation依次調用action和interceptor
- 根據action的配置信息,產生result
- Result信息返回給ActionInvocation
- 產生一個HttpServletResponse響應
- 產生的響應行為發送給客服端。
Struts 2 各種文件詳解:
- Struts 2 體系結構 :
1、Web瀏覽器請求一個資源。
2、過濾器Dispatcher查找方法,確定適當的Action。
3、攔截器自動對請求應用通用功能,如驗證和文件上傳操作。
4、Action的execute方法通常用來存儲和重新獲得信息。
5、結果被返回到瀏覽器。 - 開發Struts 2 最少用到的jar文件:
- Struts-core-2.x.x.jar : Struts 2 框架的核心類庫
- xwork-2.x.x.jar : XWork類庫,Struts 2 在其上構建,由于struts2很多事基于webwork的,因此也需要這個的核心包
- ognl-2.6.x.jar : Object Graph Navigation Language ,Struts 2 框架通過其讀寫對象的屬性,提供了OGNL表達式。
- freemarker-2.3.x.jar : Struts 2 的UI標簽的模版使用 Freemarker編寫,提供了另一種展現方式。
- commons-logging-1.1.x.jar : ASF出品的日志包,apache commons的jar包。
- commons-fileupload-1.2.1.jar : 文件上傳組件,apache commons的jar包。
- struts.xml文件
- Struts.xml是 Struts 2 的核心配置文件,主要用于配置開發人員編寫的action。
- struts.xml需要存放在WEB-INF/classes下,模板如下:
<?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">
<struts>
</struts>
- web.xml文件
- 在Struts 2中,Struts框架是通過Filter啟動的,他在web.xml中的配置如下:
<!-- 配置Struts2 核心 Filter -->
<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>
- 在StrutsPrepareAndExecuteFilter的init()方法中將會讀取類路徑下默認的配置文件struts.xml完成初始化操作。
- 注意:struts 2 讀取到 struts.xml的內容后,以javabean形式存放在內存中,以后Struts 2對用戶的每一次請求處理將使用內存中的數據。
- Filter 過濾器是用戶請求和處理程序之間的一層處理程序。它可以對用戶請求和處理程序響應的類容進行處理,通常用于權限、編碼轉換等場合。
- ActionSupport 類
- ActionSupport 類為 Action 提供了一些默認實現,主要包括預定義常量、從資源文件中取文本資源、接收驗證錯誤信息和驗證的默認實現。
- 數據校驗
- 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 ;
}
//重寫的validate方法
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 驗證框架的應用
- Struts 2 提供了大量的數據校驗器,包括表單域校驗器和非表單域校驗器。
- 必填字符串校驗器:
該校驗器的名字是 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 類文件放置在同一路徑下。
- 必填校驗器
該校驗器的名字就是 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>
- 整數校驗器
該校驗器的名字為 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>
- Struts 2 攔截器:
- Struts 2 框架的絕大部分功能是通過攔截器來完成的,當F ilterDispatcher攔截到用戶請求后,大量攔截器將會對用戶請求進行處理,然后調用用戶自定義的Action 類中的方法來處理請求。
- 攔截器的配置:
在struts.xml文件中來定義的,使用<interceptor.../>元素,格式如下:
<interceptor name = "攔截器名" class = "攔截器實現的類">
<param name = "參數名">參數值</param>
</interceptor>
其中<param.../>可以省略,但在有的時候就需要為其傳入攔截器參數。
- 有時候一個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()方法中打開的資源。