<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    鐵手劍譜

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

     

     

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

    問題

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

     

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

     

    動作要領(lǐng)

    使用onchange或者onclick JavaScript 監(jiān)聽器來調(diào)用一個將表單提交至一個Struts Action的JavaScript 函數(shù)。在Action中,執(zhí)行必要的業(yè)務(wù)邏輯來構(gòu)造一個新的select選項集,并且將控制轉(zhuǎn)發(fā)回原來的JSP 頁面。Example 3-11就展示了當(dāng)用戶點(diǎn)擊一個單選按鈕時將表單提交至一個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>

     

    動作分解

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

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

    創(chuàng)建一個單獨(dú)的Action來處理HTML 控件中的值的改變好像有些過分。但是,這里展示的技術(shù)提供了一個利用了動態(tài)HTML背后的服務(wù)器端的全部威力的靈活方案??紤]一下你要基于同一個表單中的另一個字段的輸入值來計算某個字段的金融數(shù)據(jù)的情形。執(zhí)行計算的服務(wù)就應(yīng)該由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,指定了轉(zhuǎn)發(fā)到Example 3-12的JSP的action 。第二個mapping, /GetIdeOptions, 則指定了當(dāng)用戶點(diǎn)擊單選按鈕時調(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"));
        }

    }

     

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

     

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

     

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

    相關(guān)動作

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

    DispatchAction將在第6.8式講解。

     

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

    評論

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

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

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

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

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

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

    我將不禁感激!!

    謝謝!真的有點(diǎn)急
    !1!

    zjmoya@163.com

      回復(fù)  更多評論    

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

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

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

    view_favorite_language.jsp??


    這個文件是哪個???
      回復(fù)  更多評論    

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

    能不能告訴我啊 !
    ??

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

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

    refer to 3.8
      回復(fù)  更多評論    

    # 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ù)  更多評論    

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

    formbean里面用ArrayList會報錯?。?/div>
      回復(fù)  更多評論    

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

    而且這樣做的話是不是要form嵌套form?否則我真的提交表單的form放在哪里?
      回復(fù)  更多評論    
    主站蜘蛛池模板: 丝袜捆绑调教视频免费区| 亚洲福利电影一区二区?| 内射无码专区久久亚洲| 国产高清在线免费视频| 成人黄18免费视频| 午夜dj免费在线观看| 免费看美女让人桶尿口| 成全高清视频免费观看| 精品国产免费观看| 免费v片在线观看无遮挡| 免费一级毛片在线播放| 亚洲高清最新av网站| 久久亚洲色一区二区三区| 亚洲色爱图小说专区| 亚洲AV无码一区二区二三区入口 | av免费不卡国产观看| 可以免费看黄视频的网站| 在线观看特色大片免费视频| 成人毛片18女人毛片免费视频未| 日韩免费高清一级毛片在线| 成人伊人亚洲人综合网站222| 精品亚洲视频在线观看| 亚洲国产婷婷六月丁香| 亚洲电影国产一区| 亚洲人成在线免费观看| 亚洲AV一区二区三区四区| 免费人成在线观看播放a| 99免费精品视频| 国产人成免费视频网站| 四虎成人免费影院网址| 亚洲片一区二区三区| 亚洲国产精品特色大片观看完整版| 亚洲高清美女一区二区三区| 亚洲综合欧美色五月俺也去 | 亚洲黄色在线观看视频| 国内精品久久久久影院亚洲 | 亚洲精品国产精品国自产网站 | 亚洲人成影院在线| 亚洲色精品VR一区区三区| 黄色网址大全免费| 99爱在线观看免费完整版|