Struts 學(xué)習(xí)隨筆 ?
Struts 是基于 MVC 設(shè)計(jì)模式的框架技術(shù),現(xiàn)在的流行使用是 struts1.1 and struts1.2, 使用開發(fā)框架可以更好地提高開發(fā)效率。
Struts 的工作流程
1. ???????? 檢索和用戶請(qǐng)求匹配的 ActionMapping 實(shí)例,如果不存在,就返回用戶請(qǐng)求中路徑無效的信息。
2. ???????? 如果 ActionForm 實(shí)例不存在,就創(chuàng)建一個(gè) ActionForm 對(duì)象,把客戶提交的表單數(shù)據(jù)保存到 ActionForm 對(duì)象中。
3. ???????? 根據(jù)配置信息決定是否需要表單驗(yàn)證。如果需要驗(yàn)證,就調(diào)用 ActionForm 的 validate() 方法。
4. ???????? 如果 ActionForm 的 validate() 方法返回 null 或返回一個(gè)不包含 ActionMessage 的 ActionErrors 對(duì)象,就表示表單驗(yàn)證成功。如果返回一個(gè)或多個(gè) ActionMessage 的 ActionErrors 對(duì)象,就表示表單驗(yàn)證失敗,此時(shí) ActionServlet 將直接把請(qǐng)求轉(zhuǎn)發(fā)給包含用戶提交表單的 jsp 組件。在這種情況下,不會(huì)創(chuàng)建 Action 對(duì)象和調(diào)用 Action 的 execute() 方法。
5. ???????? ActionServlet 根據(jù) ActionMapping 實(shí)例包含的映射信息決定將請(qǐng)求轉(zhuǎn)發(fā)給哪個(gè) Action 。如果相應(yīng)的 Action 實(shí)例不存在,就先創(chuàng)建這個(gè)實(shí)例,然后調(diào)用 Action 的 execute() 方法。
6. ???????? Action 的 execute() 方法返回一個(gè) ActionForward 對(duì)象 ,ActionServlet 再把客戶請(qǐng)求轉(zhuǎn)發(fā)給 ActionForward 對(duì)象指向的 jsp 組件 .
7. ???????? ActionForward 對(duì)象指向的 jsp 組件生成動(dòng)態(tài)網(wǎng)頁,返回給客戶。
?????? 如何用好 struts 框架技術(shù)呢?我們應(yīng)該掌握如下的知識(shí)點(diǎn):
? ???????? MVC 的兩種規(guī)范
? ???????? 配置文件 (struts-config.xml,web.xml)
? ???????? ActionForm 類及其子類。
? ???????? ActionForward 類
? ???????? ActionServlet 類
? ???????? Action 類
? ???????? ActionMessages 類
? ???????? 國際化的問題
? ???????? struts 驗(yàn)證技術(shù)
? ???????? struts 標(biāo)簽
? ???????? struts 擴(kuò)展(略)
? ???????? struts 與 hibernate 結(jié)合使用
?
逐個(gè)擊破
?
MVC
的兩種規(guī)范
?
兩種 MVC 規(guī)范是 JSP Model1? and JSP Model2.
假設(shè)訪問我們分這么幾部分:瀏覽器, WEB 服務(wù)器,應(yīng)用服務(wù)器和數(shù)據(jù)庫,兩者不同的是 JSP Model1 WEB 服務(wù)器里面只有 JSP 頁面和 JavaBean , JSP 既充當(dāng) V ,又充當(dāng) C 的角色。而 JSP Model2 的 WEB 服務(wù)器里有 JSP 、 JavaBean 和 Servlet 。
配置文件
(struts-config.xml,web.xml)
?
web.xml 文件。
配置 ActionServlet(<servlet>,<servlet-mapping>)
初始化 ActionServlet 的初始化參數(shù) (<init-param> 也就是加載 struts-config.xml)
配置歡迎文件 (<welcome-file-list>)
配置錯(cuò)誤處理
<error-page>
?????? <error-code>404</error-code>
?????? <location>/common/404.jsp</location>
</error-page>
配置 struts 標(biāo)簽庫 (<tablib>)
?
struts-config.xml
配置數(shù)據(jù)庫連接 (<data-sources>)
配置實(shí)體 (<form-beans>)
配置全局的異常處理 (<globel-exceptions>)
配置全局的轉(zhuǎn)發(fā)關(guān)系 (<globel-forwards>)
配置映射 (<action-mapping>)
配置本地化文件 (<message-resources>) 實(shí)際是為了完成國際化。
配置插件 (<plug-in>)( 略 )
?
ActionForm
類及其子類。
?
DTO 數(shù)據(jù)傳輸對(duì)象,生命周期有兩種 request and session,ActionForm 有 validate() 和 reset() 方法,主要說 reset() 方法,針對(duì)于 request 級(jí)的 ActionForm 類是沒有很大含義地,因?yàn)樗粫?huì)被調(diào)用一次,里面封裝的數(shù)據(jù)也只是一次使用。主要是對(duì)于 session 級(jí)的作用是很大的,因?yàn)樗婕暗蕉啻斡玫健?/span>
DynaActionForm 是 ActionForm 子類 , 有 initialize() 方法 , 實(shí)現(xiàn) DynaActionForm 的方法 :
<form-bean? name=”loginForm”? type=”org.apache.struts.action.DynaActionForm”>
?????? <form-property? initial=”alex”? name=”userName”? type=”java.lang.String”/>
</form-bean>
兩種 ActionForm 做比較 .
初始化: DynaActionForm 是通過實(shí)現(xiàn)化,然后覆蓋其父類的方法 reset() 在這個(gè)方法中
調(diào)用 initilize() 進(jìn)行初始化。
驗(yàn)證: DynaActionForm 采用動(dòng)態(tài)的驗(yàn)證方法,在( struts 驗(yàn)證技術(shù)中會(huì)說到)
使用: DynaActionForm 的所有屬性保存在一個(gè) Map 類中 , 通過 get() , set() 方法調(diào)用,
?????? ? 如: String email=(String)form.get(“email”);
????????????? ? form.set(“email”,”cssseek@163.com”);
?
ActionForward
類
?
( 略 )
ActionServlet
類
?
屬于 struts 控制器組件,包括: ActionServlet,RequestProcessor and Action.
組件完成的任務(wù):
接收用戶請(qǐng)求、根據(jù)用戶請(qǐng)求,調(diào)用合適的模型組件來執(zhí)行相應(yīng)的業(yè)務(wù)邏輯、獲取業(yè)務(wù)邏輯執(zhí)行結(jié)果、根據(jù)當(dāng)前狀態(tài)以及業(yè)務(wù)邏輯執(zhí)行結(jié)果,選擇合適的視圖組件返回給用戶。
Struts 采用 ActionServlet 和 RequestProcessor 組件進(jìn)行集中控制,并采用 Action 組件來處理單項(xiàng)業(yè)務(wù)。
ActionServlet 類在應(yīng)用生命周期中只創(chuàng)建實(shí)例一次。
?
Action
類
?
Action 類是用戶請(qǐng)求和業(yè)務(wù)邏輯之間的橋梁。在 RequestProcessor 類預(yù)處理請(qǐng)求時(shí),在創(chuàng)建了 Action 的實(shí)例后,就調(diào)用自身的 processActionPerform() 方法,該方法再調(diào)用 Action 類的 execute() 方法。
ActionMessages
類
?
ActionError 類是 ActionMessage 的子類, struts1.2 放棄 ActionError.
國際化的問題
?
application_zh.properties 保存一些信息。
如 :error.loginFail=” 登錄失敗,請(qǐng)輸入正確的用戶名和密碼 ”
ActionMessages errors=new ActionMessages();
Errors.add(“l(fā)oginfail”,new ActionMessage(“error.loginFail”));
關(guān)于亂碼的問題:
1.
?
如果一些網(wǎng)站服務(wù)器例如
Tomcat 如果遇到中文亂碼問題,可以修改conf目錄下的server.xml ?
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100" debug="0"connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"/>
URIENcoding 設(shè)成GBK或GB2312
2.?
表單中或傳遞字符串:本來輸入的漢字是正常的,但是提交后再顯示出來是亂碼,因?yàn)樘峤坏囊话闶?ISO8859編碼,所以顯示的時(shí)候要轉(zhuǎn)成GB2312編碼: String S=new String(rs.getString("news").getBytes("gb2312"),"ISO8859_1"); ?
//rs為待轉(zhuǎn)換的字符串
然后使用S字符串的值就可以了
3.?
?有的服務(wù)器端的語言環(huán)境如果設(shè)成簡體中文的也可以解決此類問題
?
4.?
?插入數(shù)據(jù)庫中的字符是亂碼 ?
看看數(shù)據(jù)庫中支持的是何種編碼方式,用類似2中的方式作一下轉(zhuǎn)換即可。
5.?
總之,用jsp開發(fā),碰到亂碼,你得分析是讀的時(shí)候發(fā)生亂碼,還是寫的時(shí)候發(fā)生亂碼,用2中的轉(zhuǎn)換,基本就能解決問題,有些時(shí)候?qū)懙臅r(shí)候做一次轉(zhuǎn)換,例如: ?
String S=new String(rs.getString("news").getBytes("gb2312"),"ISO8859_1");
//讀的時(shí)候在轉(zhuǎn)換回來
String S=new String(rs.getString("news").getBytes("ISO8859_1"),"GB2312");
或者把ISO8859-1和GB2312 的位置換一下,自己多試試,就能找到解決問題的辦法。
struts
驗(yàn)證技術(shù)
?
前面已講在 ActionForm 中 validate() 驗(yàn)證。這里主要說在配置中驗(yàn)證技術(shù)。所需文件 validation.xml? validator-rules.xml 優(yōu)點(diǎn):當(dāng)相同的驗(yàn)證邏輯時(shí),可提高代碼的可重用性
struts
標(biāo)簽
?
struts-bean.tld? struts-form.tld? struts-html.tld? struts-logic.tld? struts-nested.tld? struts-template.tld? struts-tiles.tld 七個(gè)標(biāo)簽文件。
struts HTML 標(biāo)簽
基本的標(biāo)記
struts Bean 標(biāo)簽
用于定義輸入輸出 javaBean
struts Login 標(biāo)簽
邏輯運(yùn)算、循環(huán)遍歷
struts Nested 標(biāo)簽
定義 javaBean 嵌套關(guān)系。
?
?
?
?
?
?
????????????? ????????????? ????????????? ????????????? ????????????? ????????????? ????????????? ?????? 曹水生
????????????? ????????????? ????????????? ????????????? ????????????? ????????????? ?????? ?????? 2005 . 11 . 11 隨筆