熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

完全技術手冊——Struts使用手冊二

2013-11-23 20:21:34  來源: Java開源技術 

   其他表示層技術
  
  盡管外觀可以用JSP或Struts的標簽來實現但你仍然應該考慮融合其他技術來提高組件的重用減少維護工作量減少錯誤
  
   特定應用標簽
  
  忽略
  
  使用包含組合頁面
  
  將一個頁面放在一個JSP文件中是一個普遍的設計方法但是許多應用需要將應用中的不同部分顯示在一個頁面中例如一個門戶應用需要如下功能
  
   訪問門戶的搜索引擎
  
   訪問門戶的討論區
  
   用戶感興趣的話題
  
   郵件等待指示器
  
  將這些不同的功能交給不同的開發者開發要完成這個門戶應用是比較容易的然後你就可以使用包含( include)來
  
  將它們組合到一個頁面中有三種不同的包含方式選擇哪種取決於你希望整個輸出在什麼時候整合
   <%@ include file=xxxxx %>
   <jsp:include page=xxxxx flush=true />
   bean:include
  
   使用Tiles組合頁面
  
  Tiles是一個功能很強的模板庫它可以將很多tile組合成最終的視圖以下是設置向導
  
  .創建layout/layoutjsp它包含標准外觀
  
  <html>
  <body>
  <tiles:insert attribute=body/>
  </body>
  </html>
  
  .創建你的主頁/indexjsp
  
  <h>This is my homepage</h>
  
  .創建文件/WEBINF/tilesdefsxml
  
  <tilesdefinitions>
  <definition
  name=layout
  path=/layout/layoutjsp>
  <put name=body value=/>
  </definition>
  <definition name=homepage extends=layout>
  <put
  name=body
  value=/indexjsp/>
  </definition>
  <tilesdefinitions>
  
  .在文件strutsconfigxml中設置TilesPlugin
  
  <plugin
  className=orgapachestrutstilesTilesPlugin>
  <setproperty
  property=definitionsconfig
  value=/WEBINF/tilesdefsxml/>
  </plugin>
  
  .在strutsconfigxml文件中設置一個Action指向你的主頁
  
  <action path=/index type=orgapachestrutsactionsForwardAction parameter=homepage/>
  
   圖片渲染組件
  
  一些應用需要動態產生圖片有兩種方法符合如下需求
  
   產生一個執行Servlet請求的超鏈接 Servlet將使用圖形庫來產生圖片
  
   將JAVA Applet嵌入在HTML頁面中來產生圖片
  
   文本輸出
  
  一些應用需要動態的產生文本(如XML)因為整個頁面將通過PrinterWriter輸出我們可以通過設置PrinterWriter的屬性來做到
  
  responsesetContentType(text/plain); // or text/xml
  PrintWriter writer = responsegetWriter();
  // use writer to render text
  return(null);
  
   Struts EL 標簽庫
  
  Struts基本的標簽都是依賴rtexprvalue(runtime scriptlet expression)來動態計算屬性
  
  的值例如要根據資源關鍵值打印來自屬性文件中的信息
  
  <bean:message key=<%= stringvar %>/> 這樣寫是假定stringvar是JSP中的
  
  腳本變量如果使用Struts的EL標簽庫就會是如下形式
  
  <beanel:message key=${stringvar}/>
  
   創建控制(Controller)組件
  
   概述
  
  我們已經知道如何去構建Model和View組件現在我們將集中到Controller組件Struts包含了一個映射請求URI到Action類的Servlet因此你編寫WEB應用時在Controller組件這方面要做的工作如下
  
  .編寫AtionForm作為Model和View的中介
  
  .編寫Action(繼承orgapachestrutsactionAction)來處理請求
  
  .為每一個邏輯請求在strutsconfigxml中編寫一個ActionMapping
  
   ActionServlet
  
  對於熟悉MVC架構的人來講ActionServlet就代表著   C ? ControllerController的任務是
  
  .處理用戶請求
  
  .根據用戶請求來決定用戶將要完成什麼任務
  
  .將Model的數據傳到視圖(View)
  
  .選擇合適的視圖響應請求
  
  Controller會將大部分工作放到Request Processor和Action 類中
  
   請求處理器(Request Processor)
  
  RequestProcessor對每個請求做核心處理的地方它要做的處理如下
  
  processPath - 確定請求的路徑以備後面的處理檢索ActionMapping
  
  processLocale ? 為請求選擇一個locale
  
  processContent - 設置默認的內容(Content)類型
  
  processNoCache ? 設置響應頭PragmaCacheControlExpires
  
  processPreprocess - RequestProcessor讓子類重載實現默認返回真(True)如果子類重載此方法並返回真則該請求將繼續處理流程如果返回假則意味著你處理了該請求處理流程直接返回
  
  processMapping - 確定請求所對應路徑的ActionMapping
  
  processRoles - 保證請求的用戶具備特定的角色
  
  processActionForm - 實例化ActioForm並且把它放在適當的作用域中
  
  processPopulate - 用請求中的數據組裝ActionForm
  
  processValidate - 校驗ActionForm中的數據
  
  processForward - 如果映射是一個轉向( Forward)指令就轉向到特定的路徑
  
  processInclude - 如果映射是一個包含(Include)指令就將映射指定的路徑的輸出結果包含進來
  
  processActionCreate - 實例化映射指定的Action
  
  processActionPerform ? 執行Action的perform或excute方法
  
  processForwardConfig - 最後RequetProcessor使用Action類返回的ActionForward來選擇下一個資源大多數的AtionForward將會導航到顯示頁面輸出響應
  
   ActionForm類
  
  一個ActionForm代表著一個與用戶交互的HTML表單ActionForm中的屬性來存儲表單中的狀態並且有gettersetter方法來訪問他們ActionForm可以存儲在session或request的作用域中(默認的是session)如果ActionForm放在session中記得要實現reset方法以備每次使用ActionForm時都會初始化Struts根據請求中的參數設置ActionForm的屬性並且把經過校驗後的ActionForm傳到Action的execute方法
  
  當你在編寫ActionForm時必須堅持如下原則
  
  .ActionForm本身沒有任何特定的方法被實現僅僅用來表示它是整個框架中一個特定的角色ActinForm中只有gettersetter方法並沒有任何商業邏輯
  
  .AtionForm提供標准的校驗機制如果你重載了ActionForm的validate方法並且在資源屬性文件中提供了錯誤消息那麼Struts就會自動校驗表單中的數據當然你也可以忽略ActionForm中的校驗在Action類中來實現校驗
  
  .為輸入表單中的每一個輸入定義屬性輸入域的名稱和ActionForm中屬性的名稱必須符合JAVA規范例如一個輸入域的名稱username將會導致ActionForm中的setUsername被調用
  
  .也可以為Form中的按鈕或其他控件定義屬性當提交表單時這將有利於你知道哪個控件被選中了
  
  .把ActionForm當作HTTP和Action之間的防火牆ActionForm的方法可以校驗所有必須的屬性已經存在了並且包含合理的值如果校驗失敗請求將不會被Action類處理
  
  .你可能會放一個Bean的實例在ActinForm中這樣你就會用到嵌套屬性引用例如你可能有一個customer在ActionForm中然後在頁面中用customername來引用屬性
  
   DynaActionForm
  
  維護一個具體的ActionForm是要耗費時間的特別是ActionForm越來越多並且都是校驗一些簡單的屬性時你可能會感覺到一股挫折感
  
  這個瓶頸通過DynaActionForm會有所減輕通過在Struts的配置文件中列出屬性類型和默認值來替代以前的定義一個新類並且添加getter/setter方法例如在strutsconfigxml中添加一個UserForm
  
  <formbean
  name=UserForm
  type=orgapachestrutsactionDynaActionForm>
  <formproperty
  name=givenName
  type=javalangString
  initial=John/>
  <formproperty
  name=familyName
  type=javalangString
  initial=Smith/>
  </formbean>
  
  DynaActionForm支持的數據類型
  
  javalangBigDecimal
  javalangBigInteger
  boolean and javalangBoolean
  byte and javalangByte
  char and javalangCharacter
  javalangClass
  double and javalangDouble
  float and javalangFloat
  int and javalangInteger
  long and javalangLong
  short and javalangShort

From:http://tw.wingwit.com/Article/program/Java/ky/201311/28379.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.