鐵手劍譜

          上善若水

          公告

          天下皆知美之為美,斯惡已;皆知善之為善,斯不善已。 故有無相生,難易相成,長短相形,高下相傾,音聲相和,前后相隨,恒也。
          <2005年4月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          統(tǒng)計(jì)

          • 隨筆 - 127
          • 文章 - 1
          • 評論 - 952
          • 引用 - 26

          常用鏈接

          留言簿(49)

          隨筆分類(201)

          隨筆檔案(127)

          文章分類(1)

          文章檔案(1)

          DotNET

          Java站點(diǎn)

          我的其他空間

          朋友

          著名牛人

          搜索

          •  

          積分與排名

          • 積分 - 400830
          • 排名 - 140

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

          Struts秘籍之起式:第1.5式:將JSP 應(yīng)用轉(zhuǎn)到Struts

          第1.5式. 將JSP 應(yīng)用轉(zhuǎn)到Struts

          問題

          你需要將一個(gè)已有的基于JSP的web 應(yīng)用轉(zhuǎn)換為Struts 的應(yīng)用。

          動(dòng)作分解

          在加入新的功能到應(yīng)用中時(shí),可應(yīng)用Struts采取重構(gòu)的方式來進(jìn)行。隨著你對Struts 知識(shí)的增加,你可以將現(xiàn)有代碼重新架構(gòu)成使用Struts。如果沒有計(jì)劃對應(yīng)用進(jìn)行新的開發(fā),就一次性重構(gòu)現(xiàn)有的JSP代碼。

          變化

          遷移一個(gè)現(xiàn)有JSP應(yīng)用的困難程度取決于應(yīng)用的復(fù)雜度和架構(gòu)的穩(wěn)固性。如果應(yīng)用使用Model 1 架構(gòu),所有的邏輯多包涵在JSP中,這的確是一個(gè)不小的挑戰(zhàn)。你會(huì)發(fā)現(xiàn)你需要從頭重新設(shè)計(jì)應(yīng)用,以便在你開始重構(gòu)之前分離業(yè)務(wù)邏輯和表現(xiàn)。

          如果你新接觸Struts,那么可以在一個(gè)新應(yīng)用的開發(fā)中學(xué)習(xí)Struts而不是等到玩得很熟了才進(jìn)行開發(fā)。Struts 不是在開發(fā)流程后端可以隨便輕易就可以“開瓶即喝”的可樂。但是,有些項(xiàng)目卻在開發(fā)過程中途變更項(xiàng)目的架構(gòu)支撐。如果你處于這種情況,請掌握好你的項(xiàng)目計(jì)劃,以便Struts 能夠首先應(yīng)用到新的開發(fā)中和適合的特征中,而不是在危急的道路之上。一旦你增長了你的Struts 功力,將使得轉(zhuǎn)換現(xiàn)有代碼更加容易。

          為了使這更具體些,考慮一個(gè)有3個(gè)頁面組成的簡單例子。第一個(gè)頁面是一個(gè)主要的歡迎頁面,顯示到第2個(gè)頁面的鏈接。第二個(gè)頁面顯示兩個(gè)表單輸入字段。當(dāng)用戶提交表單時(shí),所添加的值的結(jié)果顯示在第3個(gè)頁面上。

          首先,Example 1-3 顯示了提供輸入頁面鏈接的index.jsp頁面。

          Example 1-3. 鏈接到一個(gè)輸入頁面

           

          <%@ page contentType="text/html;charset=UTF-8" language="java" %>
          <html>
             
          <head>
                
          <title>Simple Calculator</title>
             
          </head>
             
          <body>
                
          <href="get_input.jsp">calculator</a>
             
          </body>
          </html>

           

          Example 1-4 展示了提交輸入值的get_input.jsp頁面。

          Example 1-4. Submitting data

           

          <%@ page contentType="text/html;charset=UTF-8" language="java" %>
          <html>
             
          <head>
                
          <title>Add Two Numbers</title>
             
          </head>
             
          <body>
                
          <form action="display_result.jsp">
                   Value 1: 
          <input name="value1" type="text"/><br/>
                   Value 2: 
          <input name="value2" type="text"/>
                   
          <p>
                      
          <input type="submit"/>
                   
          </p>
                
          </form>
             
          </body>
          </html>

           

          Example 1-4中的頁面將表單提交給一個(gè)JSP 頁面來顯示結(jié)果。目標(biāo)頁面 (示于Example 1-6) 使用了一個(gè)JavaBean 來持有在請求中從表單接收的值。在看目標(biāo)JSP代碼之前,Example 1-5展示了存儲(chǔ)數(shù)據(jù)的JavaBean 的代碼。

          Example 1-5. Simple JavaBean

           

          package com.oreilly.strutsckbk;

          public class ValueHolder {
              
          private int value1;
              
          private int value2;

              
          public int getValue1( ) {
                  
          return value1;
              }


              
          public void setValue1(int value1) {
                  
          this.value1 = value1;
              }


              
          public int getValue2( ) {
                  
          return value2;
              }

             
              
          public void setValue2(int value2) {
                  
          this.value2 = value2;
              }

          }

           

          display_result.jsp頁面,示于Example 1-6, 使用JSP setProperty標(biāo)簽來通過請求值來組裝bean。值的輸出使用請求時(shí)表達(dá)式,而和的計(jì)算則使用一個(gè)scriptlet。最后,該計(jì)算出的總和被顯示出來。

          Example 1-6. Displaying results

           

          <%@ page contentType="text/html;charset=UTF-8" language="java" %>
          <html>
             
          <head>
                
          <title>Add Two Numbers</title>
             
          </head>
             
          <body>
                
          <jsp:useBean 
                      
          id="valueHolder"
                      class
          ="com.oreilly.strutsckbk.ValueHolder">
                   
          <jsp:setProperty name="valueHolder" property="*"/>
                
          </jsp:useBean>
                The sum of 
          <%= valueHolder.getValue1( ) %> plus
                
          <%= valueHolder.getValue2( ) %> is:<p>
                
          <% int sum = valueHolder.getValue1( ) + valueHolder.getValue2( ); %>
                
          <%= sum %>.<p>
                
          <href="get_input.jsp">perform another calculation</a>      
             
          </body>
          </html>

           

          這個(gè)應(yīng)用演示了一些很不受人歡迎的使用JSP的方式。雖然使用JavaBean 是值得贊揚(yáng)的,計(jì)算卻是在JSP中使用scriptlet來執(zhí)行的。其結(jié)果是業(yè)務(wù)邏輯和表現(xiàn)混合在一起,scriptlets (內(nèi)嵌的的Java 代碼) 可能導(dǎo)致JSP應(yīng)用的維護(hù)問題。

          明確的說明轉(zhuǎn)換這個(gè)應(yīng)用到Struts 的策略是簡單的。雖然這個(gè)例子微不足道,但所采用的策略卻可適用于更加復(fù)雜的應(yīng)用。應(yīng)該盡可能的從JSP中去除內(nèi)嵌的以scriptlet (<% %>)開始的Java 代碼;如果可能還要去請求時(shí)表達(dá)式(<%= %>)。為了完成這個(gè)任務(wù),Example 1-6中,將通過添加一個(gè)計(jì)算和返回總和的方法將和的計(jì)算移到了JavaBean (from Example 1-5) 中:

           

          public int getSum(  ) {
             
          return value1 + value2;
          }

           

          現(xiàn)在,修改JSP來使用bean:write標(biāo)簽:

           

          <%@ page contentType="text/html;charset=UTF-8" language="java" %>
          <html>
             
          <head>
                
          <title>Add Two Numbers</title>
             
          </head>
             
          <body>
                
          <jsp:useBean 
                      
          id="valueHolder"
                      class
          ="com.oreilly.strutsckbk.ValueHolder">
                   
          <jsp:setProperty name="valueHolder" property="*"/>
                
          </jsp:useBean>
                The sum of 
          <bean:write name="valueHolder" property="value1"/> plus
                
          <bean:write name="valueHolder" property="value2"/> is:<p>
                
          <bean:write name="valueHolder" property="sum"/>.<p>
                
          <href="get_input.jsp">perform another calculation</a>      
             
          </body>
          </html>

           

          這對這個(gè)小應(yīng)用的前一版本來說是一個(gè)明顯的改善。

          1

          在你進(jìn)行進(jìn)一步的修改之前,最好將應(yīng)用重新構(gòu)建并重新部署,看其是否仍然能工作。

          下一步,將Struts 控制器整合進(jìn)來,有更多一些的工作要做。首先,創(chuàng)建一個(gè)Struts Action,就象Example 1-7中所示的一樣,它負(fù)責(zé)接收來自于get_input.jsp頁面中的表單的值。提交的值將獲取為Action整理到一個(gè)JavaBean中的請求參數(shù)。bean 實(shí)例被設(shè)置為一個(gè)servlet 請求屬性。Action然后將請求轉(zhuǎn)發(fā)到display_result.jsp頁面。

          Example 1-7. 添加一個(gè)Struts action

           

          package com.oreilly.strutsckbk;

          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;

          import org.apache.struts.action.Action;
          import org.apache.struts.action.ActionForm;
          import org.apache.struts.action.ActionForward;
          import org.apache.struts.action.ActionMapping;

          public final class ProcessInputAction extends Action {
              
          public ActionForward execute(ActionMapping mapping,
                           ActionForm form,
                           HttpServletRequest request,
                           HttpServletResponse response)
                      throws Exception 
          {
                  ValueHolder bean 
          = new ValueHolder( );
                  bean.setValue1( Integer.parseInt(
                      request.getParameter(
          "value1")) );
                  bean.setValue2( Integer.parseInt(
                      request.getParameter(
          "value2")) );
                  request.setAttribute( 
          "valueHolder", bean );
                  
          return (mapping.findForward("success"));
              }

          }

           

          在你的struts-config.xml中為Action 創(chuàng)建一個(gè)ActionMapping:

           

          <!-- Process input data -->
          <action    path="/processInput"
                     type
          ="com.oreilly.strutsckbk.ProcessInputAction">
            
          <forward name="success" path="/display_results.jsp"/>
          </action>

           

          為了使用這個(gè)Action,需要修改get_input.jsp頁面中的表單的目標(biāo)action屬性:

           

          <form action="ProcessInput.do">
            Value 1: 
          <input name="value1" type="text"/><br/>
            Value 2: 
          <input name="value2" type="text"/>
            
          <p>
              
          <input type="submit"/>
            
          </p>
          </form>

           

          一旦你開發(fā)好了一個(gè)這樣的新特征,從一個(gè)已有的JSP頁面中連接到新的action 只需要簡單的使用特定的ActionServlet mapping (e.g., *.do)。你也可以使用JSP的URL從Struts頁面鏈接到現(xiàn)有的JSP頁面。

          相關(guān)

          第6.1式描述了如何為你的所有動(dòng)作的公共行為創(chuàng)建一個(gè)基礎(chǔ)action。

          第9.1式詳細(xì)描述了如何聲明Struts的例外處理。

          第5.6式討論了集成現(xiàn)有的JavaBean 和Struts action forms的方式。

           

          posted on 2005-04-29 10:14 鐵手 閱讀(2140) 評論(1)  編輯  收藏 所屬分類: JavaStruts系列

          評論

          # Struts 秘籍(CookBook)[TrackBack] 2005-11-12 18:29 阿泠

          本系列源改編自O(shè)'Reily的Strus Cookbook
          [引用提示]阿泠引用了該文章, 地址: http://blog.donews.com/inclear/archive/2005/11/12/624363.aspx
            回復(fù)  更多評論    
          主站蜘蛛池模板: 康定县| 法库县| 慈利县| 南郑县| 通海县| 景泰县| 新兴县| 岳阳县| 鄂托克前旗| 太湖县| 永年县| 五原县| 定结县| 巴林右旗| 汝城县| 城固县| 图片| 尼木县| 新民市| 阿巴嘎旗| 昆明市| 山阴县| 肃宁县| 嵊泗县| 海阳市| 洪泽县| 佳木斯市| 乐安县| 肇源县| 长子县| 马边| 嵩明县| 铜山县| 额济纳旗| 安西县| 云霄县| 平陆县| 六安市| 壤塘县| 乌拉特后旗| 凤庆县|