鐵手劍譜

          上善若水
          數據加載中……
          Struts秘籍之起式:第1.5式:將JSP 應用轉到Struts

          第1.5式. 將JSP 應用轉到Struts

          問題

          你需要將一個已有的基于JSP的web 應用轉換為Struts 的應用。

          動作分解

          在加入新的功能到應用中時,可應用Struts采取重構的方式來進行。隨著你對Struts 知識的增加,你可以將現有代碼重新架構成使用Struts。如果沒有計劃對應用進行新的開發,就一次性重構現有的JSP代碼。

          變化

          遷移一個現有JSP應用的困難程度取決于應用的復雜度和架構的穩固性。如果應用使用Model 1 架構,所有的邏輯多包涵在JSP中,這的確是一個不小的挑戰。你會發現你需要從頭重新設計應用,以便在你開始重構之前分離業務邏輯和表現。

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

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

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

          Example 1-3. 鏈接到一個輸入頁面

           

          <%@ 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中的頁面將表單提交給一個JSP 頁面來顯示結果。目標頁面 (示于Example 1-6) 使用了一個JavaBean 來持有在請求中從表單接收的值。在看目標JSP代碼之前,Example 1-5展示了存儲數據的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標簽來通過請求值來組裝bean。值的輸出使用請求時表達式,而和的計算則使用一個scriptlet。最后,該計算出的總和被顯示出來。

          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>

           

          這個應用演示了一些很不受人歡迎的使用JSP的方式。雖然使用JavaBean 是值得贊揚的,計算卻是在JSP中使用scriptlet來執行的。其結果是業務邏輯和表現混合在一起,scriptlets (內嵌的的Java 代碼) 可能導致JSP應用的維護問題。

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

           

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

           

          現在,修改JSP來使用bean:write標簽:

           

          <%@ 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>

           

          這對這個小應用的前一版本來說是一個明顯的改善。

          1

          在你進行進一步的修改之前,最好將應用重新構建并重新部署,看其是否仍然能工作。

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

          Example 1-7. 添加一個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 創建一個ActionMapping:

           

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

           

          為了使用這個Action,需要修改get_input.jsp頁面中的表單的目標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>

           

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

          相關

          第6.1式描述了如何為你的所有動作的公共行為創建一個基礎action。

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

          第5.6式討論了集成現有的JavaBean 和Struts action forms的方式。

           

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

          評論

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

          本系列源改編自O'Reily的Strus Cookbook
          [引用提示]阿泠引用了該文章, 地址: http://blog.donews.com/inclear/archive/2005/11/12/624363.aspx
            回復  更多評論    
          主站蜘蛛池模板: 兴化市| 电白县| 松江区| 油尖旺区| 镇沅| 石门县| 财经| 上杭县| 彰化市| 兖州市| 临夏县| 宜州市| 施甸县| 盘山县| 松江区| 微博| 志丹县| 甘洛县| 彝良县| 监利县| 海丰县| 许昌县| 临泉县| 铁岭县| 治多县| 揭东县| 临海市| 环江| 定陶县| 顺平县| 延长县| 榆树市| 古蔺县| 盐山县| 晋宁县| 龙泉市| 菏泽市| 莱阳市| 英德市| 博爱县| 都江堰市|