鐵手劍譜

          上善若水
          數(shù)據(jù)加載中……
          Struts秘籍之第2段:第3.8式:使用JavaScript動(dòng)態(tài)改變選擇項(xiàng)

          第3.8式. 使用JavaScript動(dòng)態(tài)改變選擇項(xiàng)

          問(wèn)題

          你希望使用JavaScript 來(lái)根據(jù)從應(yīng)用模型中獲得的數(shù)據(jù)來(lái)動(dòng)態(tài)設(shè)置顯示在一個(gè)HTML select元素中的條目。

          動(dòng)作要領(lǐng)

          使用Struts logic:iterate標(biāo)簽來(lái)為不同的選項(xiàng)集創(chuàng)建JavaScript 數(shù)組。然后使用JavaScript 的onchange事件句柄來(lái)在運(yùn)行時(shí)修改options集。Example 3-8就展示了一個(gè)完整的JSP ,在其中JavaScript 數(shù)組是使用Struts 標(biāo)簽動(dòng)態(tài)創(chuàng)建的。changeOptions事件句柄函數(shù)使用JavaScript數(shù)組重設(shè)了select控件的選項(xiàng).

          Example 3-8. 使用Struts產(chǎn)生DHTML

           

          <%@ 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" %>
          <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>

          <html>
          <head>
              
          <title>Apache Struts Web Framework - JavaScript Example</title>
              
          <script language="JavaScript">
                  
          // 為第一組選項(xiàng)創(chuàng)建一個(gè)數(shù)組
                  fooArray = new Array( );
                  
          <logic:iterate id="fooValue" indexId="ctr" 
                               name
          ="MyForm"  property="fooList">
                      fooArray[
          <bean:write name="ctr"/>= 
                          
          new Option("<bean:write name='fooValue'/>",
                                     
          "<bean:write name='fooValue'/>",
                                     
          falsefalse);
                  
          </logic:iterate>

                  
          // 為第二組選項(xiàng)創(chuàng)建數(shù)組
                  barArray = new Array( );
                  
          <logic:iterate id="barValue" indexId="ctr" 
                               name
          ="MyForm"  property="barList">
                      fooArray[
          <bean:write name="ctr"/>= 
                          
          new Option("<bean:write name='barValue'/>",
                                     
          "<bean:write name='barValue'/>",
                                     
          falsefalse);
                  
          </logic:iterate>

                  
          function changeOptions(var control) {       
                      
          // control 是觸發(fā)的控件
                      // baz 是select 控件
                      baz = document.MyForm.baz;
                      baz.options.length
          =0;

                      
          if (control.value == 'Foo') 
                          bazArray 
          = fooArray;
                      
          else
                          bazArray 
          = barArray;

                      
          for (i=0; i < bazArray.length; i++)
                         baz.options[i] 
          = bazArray[i];
                  }

              
          </script>
          </head>
          <body>
              
          <html:form name="MyForm" action="processMyForm">
                  
          <html:radio property="fooBar" value="Foo" 
                               onclick
          ="changeOptions(this);"/> Foo<br/>
                  
          <html:radio property="fooBar" value="Bar" 
                               onclick
          ="changeOptions(this);"/> Bar<br/>
                  Baz: 
          <html:select property="baz">         
                       
          </html:select>
              
          </html:form>
          </body>
          </html>

           

          動(dòng)作變化

          你可以使用Struts 來(lái)產(chǎn)生JavaScript,就像用它生成HTML一樣。某些開(kāi)發(fā)人員認(rèn)為JavaScript 簡(jiǎn)直是"惡魔";實(shí)際上,它只是稍微有那么一點(diǎn)壞而已。考慮這個(gè)編程原則:如果JavaScript 能使你的應(yīng)用更好而且用戶(hù)喜歡,那就用它。但是用它的原則是,仍然將你的應(yīng)用邏輯保留在你的業(yè)務(wù)層,而不是放在頁(yè)面中。Struts 對(duì)此有幫助。

          用一個(gè)具體的例子可以說(shuō)明這個(gè)原則。假定你想要一個(gè)用戶(hù)選擇他喜歡的編程語(yǔ)言,并且,據(jù)此選擇他喜歡的IDE。語(yǔ)言可以通過(guò)使用單選按鈕來(lái)選擇,而IDE 將通過(guò)下拉列表來(lái)選擇。如果語(yǔ)言是Java, 那么IDE 下拉列表將顯示諸如Eclipse, Net Beans, IDEA, 等等。而如果語(yǔ)言是C#, 則下拉列表顯示Visual Studio 和SharpDevelop。

          Example 3-9 展示了持有這些數(shù)據(jù)的action form。

          Example 3-9. ActionForm for favorite language/IDE

           

          package com.oreilly.strutsckbk;

          import org.apache.struts.action.ActionForm;

          public final class MyForm extends ActionForm  {
              
              
          private static String[] javaIdes = 
                  
          new String[] {"Eclipse""IDEA""JBuilder"
                                 
          "JDeveloper""NetBeans"}
          ;
              
          private static String[] csharpIdes = 
                  
          new String[] {"SharpDevelop""Visual Studio"};
              
              
          public String[] getJavaIdes( ) {return javaIdes;}
              
          public String[] getCsharpIdes( ) {return csharpIdes;}
              
              
          public String getLanguage( ) {
                  
          return language;
              }

              
              
          public void setLanguage(String language) {
                  
          this.language = language;
              }


              
          public String getIde( ) {
                  
          return ide;
              }

              
          public void setIde(String ide) {
                  
          this.ide = ide;
              }

              
          private String language;
              
          private String ide;
          }

           

          Example 3-10 則列出了渲染輸入頁(yè)面的JSP (favorite_language.jsp) 。這個(gè)例子和基本動(dòng)作中的例子有些相似。

          Example 3-10. JSP Page using Apache Struts Web Framework-rendered DTHML

           

          <%@ 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" %>
          <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
          <html>
          <head>
            
          <title>Apache Struts Web Framework - JavaScript Example</title>
            
          <script language="JavaScript">
               
          // 為第一組選項(xiàng)創(chuàng)建數(shù)組
               javaIdesArray = new Array( );
               
          <logic:iterate id="ide" indexId="ctr" 
                            name
          ="MyForm"  property="javaIdes">
                    javaIdesArray[
          <bean:write name="ctr"/>= 
                       
          new Option("<bean:write name='ide'/>",
                                  
          "<bean:write name='ide'/>",
                                  
          falsefalse);
               
          </logic:iterate>

               
          // 為第二組選項(xiàng)創(chuàng)建數(shù)組
               csharpIdesArray = new Array( );
               
          <logic:iterate id="ide" indexId="ctr" 
                            name
          ="MyForm"  property="csharpIdes">
                    csharpIdesArray[
          <bean:write name="ctr"/>= 
                       
          new Option("<bean:write name='ide'/>",
                                  
          "<bean:write name='ide'/>",
                                  
          falsefalse);
               
          </logic:iterate>

               
          function changeOptions(control) {       
                 ideControl 
          = document.MyForm.ide;
                 ideControl.options.length
          =0;

                 
          if (control.value == 'Java') 
                   ideArray 
          = javaIdesArray;
                 
          else
                   ideArray 
          = csharpIdesArray;

                 
          for (i=0; i < ideArray.length; i++)
                     ideControl.options[i] 
          = ideArray[i];
               }

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

           

          茜套在head元素中的script塊包含了JavaScript。logic:iterate標(biāo)簽遍歷JavaBean 屬性以創(chuàng)建兩個(gè)JavaScript 數(shù)組:一個(gè)針對(duì)IDE,另一個(gè)針對(duì)C# IDE。每一個(gè)數(shù)組都包含一組Option的JavaScript 對(duì)象。一個(gè)Option對(duì)象表示HTML select控件中的一個(gè)選項(xiàng)。這些對(duì)象在其構(gòu)造器重使用了四個(gè)參數(shù):用來(lái)現(xiàn)實(shí)的text 值,表單提交時(shí)傳遞的值,指示該值是否是默認(rèn)值的一個(gè)Boolean值,以及指示其是否是當(dāng)前選擇的Boolean值。

          用于修改選項(xiàng)的JavaScript 函數(shù)緊跟logic:iterate循環(huán)。這個(gè)函數(shù)是個(gè)純粹的靜態(tài)JavaScript。觸發(fā)修改的單選按鈕是作為參數(shù)傳遞給這個(gè)函數(shù)的。如果單選按鈕的當(dāng)前值是那么e select控件則根據(jù)表達(dá)Java IDE的Option對(duì)象組裝。否則,控件使用表達(dá)C# IDE的Option對(duì)象組裝。

          HTML body 則包含表單,使用Struts html標(biāo)簽來(lái)渲染。Struts 標(biāo)簽通過(guò)on函數(shù)屬性來(lái)支持JavaScript 的改變監(jiān)聽(tīng)器。對(duì) radio 按鈕來(lái)說(shuō),onclick監(jiān)聽(tīng)器可正常工作。傳遞給這個(gè)函數(shù)的唯一參數(shù)是對(duì)HTML radio button的引用。當(dāng)頁(yè)面被第一次渲染時(shí),看起來(lái)應(yīng)該是這樣:

          Figure 3-1. Form using DHTML and Apache Struts Web Framework

          clip_image001_0015.gif

           

          一旦你點(diǎn)擊一個(gè)單選按鈕,下拉列表中的選項(xiàng)便會(huì)根據(jù)來(lái)自form bean中的數(shù)據(jù)動(dòng)態(tài)組裝。下圖顯示了點(diǎn)擊Java radio button的顯示結(jié)果:

          Figure 3-2. Dynamically rendered drop-down menu

          clip_image002_0003.gif

           

          類(lèi)似的,如果你點(diǎn)擊C-Sharp radio button,下來(lái)列表中的選項(xiàng)也會(huì)變化以反映對(duì)應(yīng)的JavaScript 數(shù)組中的值。

          JSTL 其實(shí)也可以用于上述地方代替Struts bean和logic標(biāo)簽。比如,使用JSTL c:forEach和c:out來(lái)代替logic:iterate和bean:write。這些標(biāo)簽可以產(chǎn)生相同的效果。

           

          javaIdesArray = new Array(  );
          <c:forEach var="ide" varStatus="status" 
                   items
          ="${MyForm.javaIdes}">
             javaIdesArray[
          <c:out value="${status.index}"/>= 
             
          new Option("<c:out value='${ide}'/>",
                        
          "<c:out value='${ide}'/>",
                        
          falsefalse);
          </c:forEach>

           

          JavaScript 變成可能非常令人受挫,特別是那些熟悉強(qiáng)類(lèi)型和編譯時(shí)檢查的開(kāi)發(fā)人員。但是使用這種客戶(hù)端動(dòng)態(tài)交互,確實(shí)可以改善用戶(hù)體驗(yàn)特征。

          所以, AXAJ如今正在熱門(mén),并結(jié)合到很多傳統(tǒng)技術(shù)之上。

          相關(guān)動(dòng)作

          如果需要業(yè)務(wù)邏輯來(lái)決定動(dòng)態(tài)數(shù)據(jù),可參考下一個(gè)動(dòng)作的方法,興許更好些。

           

          posted on 2005-06-08 12:34 鐵手 閱讀(5995) 評(píng)論(4)  編輯  收藏 所屬分類(lèi): JavaStruts系列

          評(píng)論

          # re: Struts秘籍之第2段:第3.8式:使用JavaScript動(dòng)態(tài)改變選擇項(xiàng) 2005-07-20 14:37 小小鳥(niǎo)

          <html:form action="/admin/ViewFavoriteLanguage">
          鐵手兄,找不到上面這個(gè)動(dòng)作啊..

          # re: Struts秘籍之第2段:第3.8式:使用JavaScript動(dòng)態(tài)改變選擇項(xiàng) 2005-07-20 15:52 鐵手

          這部分內(nèi)容編譯自oreiley的Struts cook book,你可以到它的網(wǎng)站去下載源代碼。
          本系列改編來(lái)源自多個(gè)各種struts相關(guān)的書(shū)籍。

          # re: Struts秘籍之第2段:第3.8式:使用JavaScript動(dòng)態(tài)改變選擇項(xiàng) 2005-07-28 18:44 CALM

          這個(gè)Struts秘籍系列是您改編的么?我覺(jué)得很好呀,現(xiàn)在1.2版本的入門(mén)的文章太少了,希望能繼續(xù)寫(xiě)下去。

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

          本系列源改編自O(shè)'Reily的Strus Cookbook
          [引用提示]阿泠引用了該文章, 地址: http://blog.donews.com/inclear/archive/2005/11/12/624363.aspx
          主站蜘蛛池模板: 逊克县| 山东省| 宜宾县| 台北县| 四川省| 大邑县| 新余市| 旌德县| 康平县| 新疆| 宁明县| 宣武区| 革吉县| 绥化市| 德令哈市| 萨嘎县| 侯马市| 信阳市| 天柱县| 郎溪县| 彰化县| 安图县| 丽水市| 清镇市| 奉化市| 延寿县| 遂川县| 水城县| 资阳市| 周至县| 城固县| 贡觉县| 彰化县| 水城县| 金昌市| 桓台县| 抚远县| 共和县| 达拉特旗| 铜陵市| 双桥区|