內(nèi)容簡介:了解Struts2 的基本流程
說明: 此文只是我參看資料以及自己試驗以后的觀點
此文的代碼皆來自上篇文章中的項目,不過添加了些注釋,畢竟流程還是看個程序怎么運(yùn)行更直觀
(我個人就覺得看程序怎么走,再看那些枯燥的說明讓人更容易理解) 首先我們來看struts2 在web.xml配置文件里配置的信息,這是我們使用struts2要做的第一步工作
文件中我們配置了一個過濾器,處理的類是org.apache.struts2.dispatcher.FilterDispatcher,從url-pattern可以看出,此應(yīng)用程序的所有請求都會經(jīng)過該過濾器
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="2.4"
- xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
- http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
- <display-name>Struts 2.0 Hello World</display-name>
- <filter>
- <filter-name>struts2</filter-name>
- <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>struts2</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- </web-app>
接下來我們需要一個請求頁面和兩個分別表示成功和失敗的頁面
index.jsp,welcome.jsp,error.jsp
index.jsp代碼如下,welcome.jsp和error.jsp由于只需要顯示成功或失敗的文字
這里就不在列出代碼了
- <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
-
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>第一個Struts程序</title>
- </head>
-
- <body>
- <!-- form 表單提交給Login.action去處理 -->
- <form action="Login.action" method="post">
- <table align="center">
- <caption><h3>用戶登錄</h3></caption>
- <tr>
- <td>用戶名:<input type="text" name="username"/></td>
- </tr>
- <tr>
- <td>密 碼:<input type="text" name="password"/></td>
- </tr>
- <tr align="center">
- <td colspan="2"><input type="submit" value="登錄"/>
- <input type="reset" value="重填"/></td>
- </tr>
- </table>
- </form>
- </body>
- </html>
然后我們需要處理action的類HelloAction
這個類只是個簡單java類,沒有繼承任何類和實現(xiàn)任何接口
- package yufei.hello;
-
- public class HelloAction
- {
- private String username;
- private String password;
- public String getPassword()
- {
- return password;
- }
- public void setPassword(String password)
- {
- this.password = password;
- }
- public String getUsername()
- {
- return username;
- }
- public void setUsername(String username)
- {
- this.username = username;
- }
- public String execute()
- {
- String strReturn = "error";
- if (username.equals("yufei"))
- strReturn = "success";
- return strReturn;
- }
- }
最后我們配置struts.xml
- <?xml version="1.0" encoding="GBK"?>
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
- "http://struts.apache.org/dtds/struts-2.0.dtd">
- <struts>
- <!--
- package 先不管,以后會講,目前知道下面那些就夠了
- name 屬性任意填,只要不出現(xiàn)重復(fù)的就行,該屬性必需有
- extends 屬性 目前 記住一定要是"struts-default"這個
- 該屬性必需有
-
- -->
- <package name="yufei.hello" extends="struts-default">
- <!--
- action 標(biāo)簽里 name屬性代表我們要處理的.action的前面部分
- 例如,這里的Login代表Login.action,可以打開項目里的index.jsp
- 看表單的action屬性,注意name的值是不帶.action,只是前面部分
- action 標(biāo)簽里 class屬性代表我們需要哪個類來處理
- result 標(biāo)簽的 name屬性代表action類的執(zhí)行方法的返回值,
- (即外層action標(biāo)簽里class屬性那個類的),struts2中
- action類的默認(rèn)執(zhí)行方法是public String execute()
- action類的執(zhí)行方法一定要是public String 和 無參數(shù)
- 標(biāo)簽對中的屬性代表,當(dāng)execute方法返回的字符串和name里的
- 相同時就跳轉(zhuǎn)到相應(yīng)那頁去,斜杠(/)是必需的
- -->
- <action name="Login" class="yufei.hello.HelloAction">
- <result name="error">/error.jsp</result>
- <result name="success">/welcome.jsp</result>
- </action>
- </package>
- </struts>
流程說明:
當(dāng)我們運(yùn)行程序在index.jsp頁面中提交表單后,(實際上就是讓頁面跳轉(zhuǎn)帶著表單參數(shù)到相應(yīng)的URL路徑)表單里的action是Login.action,當(dāng)我們提交表單實際就是將URL跳轉(zhuǎn)到
http://127.0.0.1:8888/Struts2Study/Login.action這個路徑上去
(http://127.0.0.1:8888/Struts2Study 這個為你的項目根路徑)
由于我們在web.xml里面配置了過濾器,該過濾器在本應(yīng)用程序的任何路徑下都會執(zhí)行,所以觸發(fā)了FilterDispatcher來處理,然后該過濾器將以action結(jié)尾的請求轉(zhuǎn)入Struts2框架處理。(struts2 配置文件中的默認(rèn)后綴標(biāo)記是action,當(dāng)然你要喜歡也可以改為其它的,以后講配置文件會提到)這里實際是截獲了Login.action的請求,然后將.action的前面部分和struts.xml文件里的action的name對比,當(dāng)找到相同的后,調(diào)用class屬性里的類來處理,這里實際就是調(diào)用的yufei.hello.HelloAction(說明,當(dāng)struts.xml里沒有明確配置處理方法時,默認(rèn)會去找execute方法來處理,而且處理的方法必需是公共(public) 返回字符串類型(String) 沒有參數(shù),關(guān)于方法配置在以后會提),最后根據(jù)action類的執(zhí)行方法的返回值(String)來和struts.xml里面的該action配置下的result標(biāo)簽的name屬性進(jìn)行比對,然后進(jìn)行相應(yīng)的跳轉(zhuǎn)
-
-
-
-
-
最后我將網(wǎng)上的關(guān)于Struts2 基本流程 比較理論化的說明放下面
--FilterDispatcher 是 Struts 2 框架的核心控制器,該控制器作為一個 Filter 運(yùn)行在 Web應(yīng)用中,它負(fù)責(zé)攔截所有的用戶請求(攔截所有還是部分是由url-pattern來決定的),當(dāng)用戶請求到達(dá)時,該 Filter 會過濾用戶請求。如果用戶請求以 action 結(jié)尾,該請求將被轉(zhuǎn)入 Struts 2 框架處理。
--Struts 2 框架獲得了*.action 請求后,將根據(jù)*.action請求的前面部分決定調(diào)用哪個業(yè)務(wù)邏輯組件,例如,對于 login.action 請求,Struts 2調(diào)用名為 login 的 Action來處理該請求。
--Struts 2 應(yīng)用中的 Action都被定義在 struts.xml 文件中,在該文件中定義 Action 時,定義了該 Action 的name 屬性和 class 屬性,其中 name 屬性決定了該 Action 處理哪個用戶請求,而 class屬性決定了該 Action 的實現(xiàn)類。
--Struts 2 用于處理用戶請求的 Action實例,并不是用戶實現(xiàn)的業(yè)務(wù)控制器,而是 Action代理——因為用戶實現(xiàn)的業(yè)務(wù)控制器并沒有和 Servlet API耦合,顯然無法處理用戶請求。而 Struts 2 框架提供了系列攔截器,該系列攔截器負(fù)責(zé)將 HttpServletRequest 請求中的請求參數(shù)解析出來,傳入到 Action 中,并回調(diào) Action 的 execute方法來處理用戶請求。
--顯然,上面的處理過程是典型的 AOP(面向切面編程)處理方式。圖 3.19 顯示了這
種處理模型。
--從圖3.19中可以看出,用戶實現(xiàn)的Action類僅僅是Struts 2的Action代理的代理目標(biāo)。用戶實現(xiàn)的業(yè)務(wù)控制器(Action)則包含了對用戶請求的處理。用戶的請求數(shù)據(jù)包含在HttpServletRequest 對象里,而用戶的 Action 類無需訪問 HttpServletRequest 對象。攔截器負(fù)責(zé)將 HttpServletRequest里的請求數(shù)據(jù)解析出來,并傳給業(yè)務(wù)邏輯組件 Action 實例