MVC 設(shè)計(jì)模式概覽
實(shí)現(xiàn) MVC(Model、View、Controller) 模式的應(yīng)用程序由 3 大部分構(gòu)成:模型:封裝應(yīng)用程序的數(shù)據(jù)和業(yè)務(wù)邏輯 POJO(Plain Old java Object)視圖:實(shí)現(xiàn)應(yīng)用程序的信息顯示功能jsp控制器:接收來(lái)自用戶的輸入,調(diào)用模型層,響應(yīng)對(duì)應(yīng)的視圖組件Servlet Filter使用 Filter 作為控制器的 MVC
使用 Filter 作為控制器的好處 使用一個(gè)過(guò)濾器來(lái)作為控制器, 可以方便地在應(yīng)用程序里對(duì)所有資源(包括靜態(tài)資源)進(jìn)行控制訪問(wèn).
<url-pattern>*.action</url-pattern>
Servlet VS Filter
Servlet 能做的Filter 是否都可以完成? 嗯。Filter 能做的Servlet 都可以完成嗎? 攔截資源卻不是Servlet 所擅長(zhǎng)的! Filter 中有一個(gè)FilterChain,這個(gè)API 在Servlet 中沒(méi)有!
Struts2 概述
Struts2 是一個(gè)用來(lái)開(kāi)發(fā) MVC 應(yīng)用程序的框架. 它提供了 Web 應(yīng)用程序開(kāi)發(fā)過(guò)程中的一些常見(jiàn)問(wèn)題的解決方案:對(duì)來(lái)自用戶的輸入數(shù)據(jù)進(jìn)行合法性驗(yàn)證統(tǒng)一的布局可擴(kuò)展性國(guó)際化和本地化支持 Ajax表單的重復(fù)提交文件的上傳下載…..
Struts2 VS Struts1
在體系結(jié)構(gòu)方面更優(yōu)秀:類更少, 更高效: 在Struts2 中無(wú)需使用“ActionForm”來(lái)封裝請(qǐng)求參數(shù).擴(kuò)展更容易: Struts2 通過(guò)攔截器完成了框架的大部分工作. 在 Struts2 中插入一個(gè)攔截器對(duì)象相當(dāng)簡(jiǎn)便易行.更容易測(cè)試:即使不使用瀏覽器也可以對(duì)基于 Struts2 的應(yīng)用進(jìn)行測(cè)試從 Struts1 升級(jí)到 Struts2
Struts2 從本質(zhì)上講已不是從 Struts1 擴(kuò)展而來(lái)的, 說(shuō)它是一個(gè)換了品牌標(biāo)簽的 WebWork更合適從 Struts1 升級(jí)到 Struts2:Struts1 里使用 ActionServlet 作為控制器; Struts2 使用了一個(gè)過(guò)濾器作為控制器Struts1 中每個(gè) HTML 表單都對(duì)應(yīng)一個(gè) ActionForm 實(shí)例. Struts2 中, HTML 表單將被直接映射到一個(gè) POJO.Struts1 的驗(yàn)證邏輯編寫在 ActionForm 中; Struts2 中的驗(yàn)證邏輯編寫在 Action 中.Struts1 中, Action 類必須繼承 org.apache.struts.action.Action 類; Struts2 中任何一個(gè) POJO 都可以是一個(gè) Action 類.Struts2 在頁(yè)面里使用 OGNL 來(lái)顯示各種對(duì)象模型, 可以不再使用 EL 和 JSTL下載 Struts2
打開(kāi)瀏覽器輸入http://struts.apache.org/點(diǎn)擊超鏈接“Struts 2.3.x”, 打開(kāi)下載頁(yè)面點(diǎn)擊“struts-2.3.x-all.zip”下載Struts2 的 Hello World搭建 Struts2 的環(huán)境:加入 jar 包: 復(fù)制 struts/apps/struts2-blank/WEB-INF/lib 下的所有 jar 包到當(dāng)前 web 應(yīng)用的 lib 目錄下.在 web.xml 文件中配置 struts2: 復(fù)制 struts/apps/struts2-blank1/WEB-INF/web.xml 文件中的過(guò)濾器的配置到當(dāng)前 web 應(yīng)用的 web.xml 文件中在當(dāng)前 web 應(yīng)用的 classpath 下添加 struts2 的配置文件 struts.xml: 復(fù)制 struts1/apps/struts2-blank/WEB-INF/classes 下的 struts.xml 文件到當(dāng)前 web 應(yīng)用的 src 目錄下. 添加 DTD 約束:
ActionAction 類 action: 應(yīng)用程序可以完成的每一個(gè)操作. 例如: 顯示一個(gè)登陸表單; 把產(chǎn)品信息保存起來(lái) Action類: 普通的 Java 類, 可以有屬性和方法, 同時(shí)必須遵守下面這些規(guī)則:屬性的名字必須遵守與 JavaBeans 屬性名相同的命名規(guī)則.屬性的類型可以是任意類型. 從字符串到非字符串(基本數(shù)據(jù)庫(kù)類型)之間的數(shù)據(jù)轉(zhuǎn)換可以自動(dòng)發(fā)生必須有一個(gè)不帶參的構(gòu)造器至少有一個(gè)供 struts 在執(zhí)行這個(gè) action 時(shí)調(diào)用的方法同一個(gè) Action 類可以包含多個(gè) action 方法.Struts2 會(huì)為每一個(gè) HTTP 請(qǐng)求創(chuàng)建一個(gè)新的 Action 實(shí)例訪問(wèn) web 資源在 Action 中, 可以通過(guò)以下方式訪問(wèn) web 的 Httpsession, HttpServletRequest, HttpServletResponse 等資源與 Servlet API 解耦的訪問(wèn)方式通過(guò)com.opensymphony.xwork2.ActionContext通過(guò) Action 實(shí)現(xiàn)如下接口 與 Servlet API 耦合的訪問(wèn)方式通過(guò)org.apache.struts2.ServletActionContext通過(guò)實(shí)現(xiàn)對(duì)應(yīng)的 XxxAware接口
與Servlet API解耦的訪問(wèn)方式 為了避免與 Servlet API 耦合在一起, 方便 Action 做單元測(cè)試, Struts2 對(duì) HttpServletRequest, HttpSession和 ServletContext進(jìn)行了封裝, 構(gòu)造了 3 個(gè) Map 對(duì)象來(lái)替代這 3 個(gè)對(duì)象, 在 Action 中可以直接使用 HttpServletRequest, HttpServletSession, ServletContext對(duì)應(yīng)的 Map 對(duì)象來(lái)保存和讀取數(shù)據(jù).通過(guò) ActionContext訪問(wèn) Web 資源ActionContext是 Action 執(zhí)行的上下文對(duì)象, 在 ActionContext中保存了 Action 執(zhí)行所需要的所有對(duì)象, 包括 parameters, request, session, application 等.獲取 HttpSession對(duì)應(yīng)的 Map 對(duì)象: – public Map getSession()獲取 ServletContext對(duì)應(yīng)的 Map 對(duì)象: – public Map getApplication()獲取請(qǐng)求參數(shù)對(duì)應(yīng)的 Map 對(duì)象: – public Map getParameters()獲取 HttpServletRequest對(duì)應(yīng)的 Map 對(duì)象: – public Object get(Object key): ActionContext類中沒(méi)有提供類似 getRequest() 這樣的方法來(lái)獲取 HttpServletRequest對(duì)應(yīng)的 Map 對(duì)象. 要得到 HttpServletRequest對(duì)應(yīng)的 Map 對(duì)象, 可以通過(guò)為 get() 方法傳遞 “request” 參數(shù)實(shí)現(xiàn)通過(guò)實(shí)現(xiàn) Aware 接口訪問(wèn) Web 資源Action 類通過(guò)可以實(shí)現(xiàn)某些特定的接口, 讓 Struts2 框架在運(yùn)行時(shí)向 Action 實(shí)例注入parameters, request, session 和 application 對(duì)應(yīng)的 Map 對(duì)象: 與 Servlet耦合的訪問(wèn)方式直接訪問(wèn) Servlet API 將使 Action 與 Servlet環(huán)境耦合在一起, 測(cè)試時(shí)需要有 Servlet容器, 不便于對(duì) Action 的單元測(cè)試.直接獲取 HttpServletRequest對(duì)象: – ServletActionContext.getRequest()直接獲取 HttpSession對(duì)象 – ServletActionContext.getRequest().getSession()直接獲取 ServletContext對(duì)象 – ServletActionContext.getServletContext()通過(guò)實(shí)現(xiàn) ServletRequestAware, ServletContextAware等接口的方式
ActionSupportcom.opensymphony.xwork2.ActionSupport 類是默認(rèn)的 Action 類.在編寫 Action 類時(shí), 通常會(huì)對(duì)這個(gè)類進(jìn)行擴(kuò)展result每個(gè) action 方法都將返回一個(gè) String 類型的值, Struts 將根據(jù)這個(gè)值來(lái)決定響應(yīng)什么結(jié)果.每個(gè) action 聲明都必須包含有數(shù)量足夠多的 result 元素, 每個(gè) result 元素分別對(duì)應(yīng)著 action 方法的一個(gè)返回值.result 元素可以有下面兩個(gè)屬性name: 結(jié)果的名字, 必須與 Action 方法的返回值相匹配, 默認(rèn)值為 successtype: 響應(yīng)結(jié)果的類型. 默認(rèn)值為 dispatcher結(jié)果類型: dispatcherdispatcher 結(jié)果類型是最常用的結(jié)果類型, 也是 struts 框架默認(rèn)的結(jié)果類型該結(jié)果類型有一個(gè) location 參數(shù), 它是一個(gè)默認(rèn)參數(shù)dispatcher 結(jié)果類型將把控制權(quán)轉(zhuǎn)發(fā)給應(yīng)用程序里的指定資源.dispatcher 結(jié)果類型不能把控制權(quán)轉(zhuǎn)發(fā)給一個(gè)外部資源. 若需要把控制權(quán)重定向到一個(gè)外部資源, 應(yīng)該使用 redirect 結(jié)果類型結(jié)果類型: redirectredirect 結(jié)果類型將把響應(yīng)重定向到另一個(gè)資源, 而不是轉(zhuǎn)發(fā)給該資源.redirect 結(jié)果類型接受下面這些參數(shù): location: 用來(lái)給出重定向的目的地.它是默認(rèn)屬性 parse: 用來(lái)表明是否把 location 參數(shù)的值視為一個(gè) OGNL表達(dá)式來(lái)解釋. 默認(rèn)值為 trueredirect 結(jié)果類型可以把響應(yīng)重定向到一個(gè)外部資源結(jié)果類型: redirectActionredirectAction結(jié)果類型把響應(yīng)重定向到另一個(gè) ActionredirectAction結(jié)果類型接受下面這些參數(shù): actionName: 指定 “目的地” action 的名字. 它是默認(rèn)屬性namespace: 用來(lái)指定 “目的地” action 的命名空間. 如果沒(méi)有配置該參數(shù), Struts 會(huì)把當(dāng)前 Action 所在的命名空間作為 “目的地” 的命名空間結(jié)果類型: chainchain 結(jié)果類型的基本用途是構(gòu)成一個(gè) action 鏈: 前一個(gè) action 把控制權(quán)轉(zhuǎn)發(fā)給后一個(gè) action, 而前一個(gè) action 的狀態(tài)在后一個(gè) action 中依然保持chain 結(jié)果類型接受下面這些參數(shù): – actionName: 指定目標(biāo) action 的名字. 它是默認(rèn)屬性 – namespace: 用來(lái)指定 “目的地” action 的命名空間. 如果沒(méi)有配置該參數(shù), Struts 會(huì)把當(dāng)前 action 所在的命名空間作為 “目的地” 的命名空間 – method: 指定目標(biāo) action 方法. 默認(rèn)值為 execute通配符映射一個(gè) Web 應(yīng)用可能有成百上千個(gè) action 聲明. 可以利用 struts 提供的通配符映射機(jī)制把多個(gè)彼此相似的映射關(guān)系簡(jiǎn)化為一個(gè)映射關(guān)系通配符映射規(guī)則 – 若找到多個(gè)匹配, 沒(méi)有通配符的那個(gè)將勝出 – 若指定的動(dòng)作不存在, Struts 將會(huì)嘗試把這個(gè) URI 與任何一個(gè)包含著通配符 * 的動(dòng)作名及進(jìn)行匹配 – 被通配符匹配到的 URI 字符串的子串可以用 {1}, {2} 來(lái)引用. {1} 匹配第一個(gè)子串, {2} 匹配第二個(gè)子串… – {0} 匹配整個(gè) URI – 若 Struts 找到的帶有通配符的匹配不止一個(gè), 則按先后順序進(jìn)行匹配 – * 可以匹配零個(gè)或多個(gè)字符, 但不包括 / 字符. 如果想把 / 字符包括在內(nèi), 需要使用 **. 如果需要對(duì)某個(gè)字符進(jìn)行轉(zhuǎn)義, 需要使用 /.動(dòng)態(tài)方法調(diào)用動(dòng)態(tài)方法調(diào)用: 通過(guò) url動(dòng)態(tài)調(diào)用 Action 中的方法action 聲明:URI: – /struts-app2/PRoduct.action: Struts 調(diào)用 Product 類的 execute – /struts-app2/Product!save.action: Struts 調(diào)用 Product 類的 save() 方法默認(rèn)情況下, Struts 的動(dòng)態(tài)方法調(diào)用處于禁用狀態(tài)
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注