鐵手劍譜

          上善若水
          數(shù)據(jù)加載中……
          Struts秘籍之第2段,第 3.9式,產(chǎn)生動態(tài)選擇列表項目
          最近忙,好久沒來這里寫東西了。今天抽點時間繼續(xù)。
          上周去北京,坐火車去,在火車上閱讀《Core J2EE Patern》,想起再上一次去北京,也是坐火車,也是閱讀這本書,不過那次是第1版。
          還有巧的是,去時鋪位是16車16號,來時居然又買到16車16號,不過是上鋪。真是有點意思。

           

           

          Recipe 3.9. 產(chǎn)生動態(tài)選擇列表項目

          問題

          你想要基于同一個表單中的另一個字段的變化,動態(tài)改變一個select元素中顯示的項目,而不是非要在客戶端使用JavaScript 來處理選項集。

           

          這個問題并不會完全避免JavaScript;相反,它展示了如何從客戶端JavaScript事件監(jiān)聽器中調(diào)用Struts action 的技術。

           

          動作要領

          使用onchange或者onclick JavaScript 監(jiān)聽器來調(diào)用一個將表單提交至一個Struts Action的JavaScript 函數(shù)。在Action中,執(zhí)行必要的業(yè)務邏輯來構造一個新的select選項集,并且將控制轉發(fā)回原來的JSP 頁面。Example 3-11就展示了當用戶點擊一個單選按鈕時將表單提交至一個Action的JSP頁面。單選按鈕的值是作為一個請求參數(shù)傳遞給Action的。

          Example 3-11. 使用JavaScript提交表單

           

          <%@ page contentType="text/html;charset=UTF-8" language="java" %>
          <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
          <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
          <html>
          <head>
            
          <title>Apache Struts Web Framework - JavaScript Example</title>
            
          <script language="JavaScript">
               
          function getOptions(control) {
                  form 
          = control.form;
                  form.action 
          = "SetOptions.do?someProp=";
                  form.action 
          += control.value;
                  form.submit( );
               }

             
          </script>
          </head>
          <body>
            
          <html:form action="ProcessMyForm">
                
          <html:radio property="someProp1" value="val1" 
                             onclick
          ="getOptions(this);"/> Value 1<br/>
                
          <html:radio property="language" value="val2" 
                             onclick
          ="getOptions(this);"/> Value 2<br/>
                SomeProp2:
                
          <html:select property="someProp2">
                   
          <html:optionsCollection property="prop2Values"/>
                
          </html:select>
                
          </p>
                
          <html:submit/>
            
          </html:form>
          </body>
          </html>

           

          動作分解

          當一個Web頁面的動態(tài)交互需求是業(yè)務邏輯驅(qū)動的時候,那么最好使用一個Action,而不是JavaScript,來執(zhí)行這個功能。將業(yè)務邏輯編碼進JavaScript 函數(shù)將導致難以維護和不可重用的代碼。所以最好在服務器端執(zhí)行這個行為。

          這個技術也可以解決第3.8式中的同一個問題。但是,這個動作卻沒有依賴于JavaScript 函數(shù)中的數(shù)據(jù)。而是,被onclick時間句柄調(diào)用的函數(shù)將表單提交到一個與表單的action屬性中指定的不同的另一個URL 和Action。這個替換的URL 將控制定向到專門處理顯示在select控件中的新的選項集的一個Action。然后這個Action將控制轉發(fā)回原來的JSP 頁面,在其中使用新的值重新組裝下拉列表菜單。

          創(chuàng)建一個單獨的Action來處理HTML 控件中的值的改變好像有些過分。但是,這里展示的技術提供了一個利用了動態(tài)HTML背后的服務器端的全部威力的靈活方案。考慮一下你要基于同一個表單中的另一個字段的輸入值來計算某個字段的金融數(shù)據(jù)的情形。執(zhí)行計算的服務就應該由Action來完成。這里所示的解決方案對這種情形就很好。

          對于一個具體的例子,第3.8式所用的方法可以被這里所屬的方法代替。這個例子提供了一個輸入表單,從其中用戶可以輸入和選擇其鐘愛的編程語言和IDE。針對IDE的選項則依賴于編程語言的選擇。Example 3-12 顯示了現(xiàn)實這個表單的JSP 頁面(favorite_language2.jsp)。

          Example 3-12. 將表單提交到另一個URL

           

          <%@ page contentType="text/html;charset=UTF-8" language="java" %>
          <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
          <html>
          <head>
            
          <title>Apache Struts Web Framework - JavaScript Example</title>
            
          <script language="JavaScript">
               
          function getOptions(control) {
                  form 
          = control.form;
                  form.action 
          = "GetIdeOptions.do?language=";
                  form.action 
          += control.value;
                  form.submit( );
               }

             
          </script>
          </head>
          <body>
             
          <html:form action="ViewFavoriteLanguage">
                What's your favorite programming language?
          <br/>
                
          <html:radio property="language" value="Java" 
                             onclick
          ="getOptions(this);"/> Java<br/>
                
          <html:radio property="language" value="C-Sharp" 
                             onclick
          ="getOptions(this);"/> C-Sharp<br/>
                
          <p>What's your favorite development tool?<br/>
                IDE:
                
          <html:select property="ide">
                   
          <html:optionsCollection property="ides"/>
                
          </html:select>   
                
          </p>
                
          <html:submit/>
            
          </html:form>
          </body>
          </html>

           

          Apache Struts Web Framework-config.xml中的action元素指定了表單所用的URL 路徑。第一個mapping,/FavoriteLanguage2,指定了轉發(fā)到Example 3-12的JSP的action 。第二個mapping, /GetIdeOptions, 則指定了當用戶點擊單選按鈕時調(diào)用的action。最后一個mapping, /ViewFavoriteLanguage, 則指定的是按下Submit 按鈕時處理表單的action。

          <action    path="/FavoriteLanguage2"
                     name
          ="MyForm"
                    scope
          ="session"
                     type
          ="org.apache.struts.actions.ForwardAction"
                parameter
          ="/favorite_language2.jsp"/>

          <action    path="/GetIdeOptions"
                     name
          ="MyForm"
                    scope
          ="session"
                     type
          ="com.oreilly.strutsckbk.GetIdeOptionsAction">
               
          <forward name="success" path="/FavoriteLanguage2.do"/>
          </action>

          <action    path="/ViewFavoriteLanguage"
                     name
          ="MyForm"
                    scope
          ="session"
                     type
          ="org.apache.struts.actions.ForwardAction"
                parameter
          ="/view_favorite_language.jsp"/>


          最后是GetIdeOptionsAction本身,示于Example 3-13。

          Example 3-13. 處理替代URL 的Action

           

          package com.oreilly.strutsckbk;

          import java.util.ArrayList;

          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;
          import org.apache.struts.util.LabelValueBean;

          public final class GetIdeOptionsAction extends Action {

              
          public ActionForward execute(ActionMapping mapping,
                           ActionForm form,
                           HttpServletRequest request,
                           HttpServletResponse response)
              throws Exception 
          {
                  MyForm myForm 
          = (MyForm) form;
                  String language 
          = myForm.getLanguage( );
                  ArrayList ides 
          = new ArrayList( );
                  
          if (language.equals("Java")) {
                      ides.add(
          new LabelValueBean("Net Beans","Net Beans"));
                      ides.add(
          new LabelValueBean("Eclipse""Eclipse"));
                      ides.add(
          new LabelValueBean("jEdit""jEdit"));            
                  }

                  
          else if (language.equals("C-Sharp")) {
                      ides.add(
          new LabelValueBean("Sharp Develop""Sharp Develop"));
                      ides.add(
          new LabelValueBean("Visual Studio""Visual Studio"));
                  }

                myForm.setIdes( ides );

                  
          // Forward control to the specified success URI
                  return (mapping.findForward("success"));
              }

          }

           

          這個類負責從MyForm中獲取選擇的編程語言。然后Action設置包含對應的IDE名城的集合到表單中。為了簡化,這個Action直接創(chuàng)建了集合。在實際應用中,這些值可能來自于業(yè)務層,也許是來自于一個數(shù)據(jù)庫。最后,Action返回success forward,又將控制轉到初始Action。

           

          使用這個技術的一個后果是你可能需要將ActionForm定義在session范圍中。這樣可以讓主JSP 頁面在表單被從預備Action重新提交回原始頁面時可以反映修改了的數(shù)據(jù)。.

           

          對這個例子,內(nèi)置的ForwardAction將處理表單,直接將請求轉發(fā)至JSP頁面。如果你是使用一個定制的Action,請考慮擴展DispatchAction并且實現(xiàn)輔助action 為DispatchAction的一個方法。這種方式將相關代碼集中在一起,使應用更易維護。

          相關動作

          第3.8 式提供了另一個技術,它使用了動態(tài)產(chǎn)生JavaScript 數(shù)組的方式來解決這個問題。

          DispatchAction將在第6.8式講解。

           

          posted on 2005-06-29 10:05 鐵手 閱讀(3691) 評論(9)  編輯  收藏 所屬分類: JavaStruts系列

          評論

          # re: Struts秘籍之第2段,第 3.9式,產(chǎn)生動態(tài)選擇列表項目 2005-07-19 09:11 我是一只菠蘿

          鐵手大哥,能不能發(fā)一份動態(tài)選擇項目的完整代碼給我回去研究啊..
          郵箱:socas@sohu.com
          3Q了先
            回復  更多評論    

          # re: Struts秘籍之第2段,第 3.9式,產(chǎn)生動態(tài)選擇列表項目 2005-07-19 09:56 zjmoya

          鐵手大俠!
          我最近也在做一個東西,
          由于時間很緊,
          學的不扎的!
          正好也要產(chǎn)生動態(tài)選擇列表項目.

          我已經(jīng)把你的所以blog里的關于這方面的原代碼試了很久
          但是不幸的是沒有成功!

          鐵手大俠!
          能不能在你百忙之間抽出點時間把完整的源代碼給小弟!

          我將不禁感激!!

          謝謝!真的有點急
          !1!

          zjmoya@163.com

            回復  更多評論    

          # re: Struts秘籍之第2段,第 3.9式,產(chǎn)生動態(tài)選擇列表項目 2005-07-19 10:14 鐵手

          這些都是示例代碼,就這些。你可根據(jù)你的需要調(diào)整。另外,注意版本問題,包括Container, JSP,Servlet和Struts版本。最好使用最新的版本。
            回復  更多評論    

          # re: Struts秘籍之第2段,第 3.9式,產(chǎn)生動態(tài)選擇列表項目 2005-07-19 10:34 zjmoya

          view_favorite_language.jsp??


          這個文件是哪個???
            回復  更多評論    

          # re: Struts秘籍之第2段,第 3.9式,產(chǎn)生動態(tài)選擇列表項目 2005-07-19 10:45 zjmoya

          能不能告訴我啊 !
          ??

          還有Myform
          public ArrayList getIdes( )
          這個函數(shù)是不是應該寫上啊 !
            回復  更多評論    

          # re: Struts秘籍之第2段,第 3.9式,產(chǎn)生動態(tài)選擇列表項目 2005-07-19 11:34 鐵手

          refer to 3.8
            回復  更多評論    

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

          本系列源改編自O'Reily的Strus Cookbook
          [引用提示]阿泠引用了該文章, 地址: http://blog.donews.com/inclear/archive/2005/11/12/624363.aspx
            回復  更多評論    

          # re: Struts秘籍之第2段,第 3.9式,產(chǎn)生動態(tài)選擇列表項目 2006-12-04 12:23 mika

          formbean里面用ArrayList會報錯啊!
            回復  更多評論    

          # re: Struts秘籍之第2段,第 3.9式,產(chǎn)生動態(tài)選擇列表項目 2006-12-04 12:46 mika

          而且這樣做的話是不是要form嵌套form?否則我真的提交表單的form放在哪里?
            回復  更多評論    
          主站蜘蛛池模板: 福安市| 常宁市| 崇阳县| 昌图县| 泊头市| 桐梓县| 天长市| 察隅县| 庆安县| 天气| 庆阳市| 喀喇沁旗| 玉山县| 香河县| 石台县| 汶上县| 怀柔区| 兴仁县| 邛崃市| 安义县| 龙里县| 建昌县| 临邑县| 沧源| 红原县| 搜索| 竹山县| 乐山市| 卓资县| 襄汾县| 茂名市| 稻城县| 罗江县| 大姚县| 临潭县| 额敏县| 新巴尔虎右旗| 庄浪县| 武威市| 白河县| 同德县|