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