2011-08-10 155 views
7

我正在一个struts2项目,我有3个html选择控件每个依赖于以前的选择。假设第一个选择是针对国家,第二个针对国家,第三个针对城市。状态选择中的选项列表将被过滤以仅显示该国家的状态等。由于其他限制,我使用的是基本的html选择控件而不是struts2。下面是我当前如何填充选择一个样本:struts2:更新第二选择基于第一选择值使用javascript和jquery

<select id="stateSelect" name="selectedState"> 
<s:iterator value="#session['myModel'].states" status="itr"> 
    <option value="<s:property value="code"/>"> 
     <s:property value="label"/> 
</option> 
</s:iterator> 
</select> 

我认为我需要做的是onchange事件做一个AJAX调用来检索基础上,选择了“全国”,“国家”的名单。问题是:
1.我该如何使用jQuery来做这个ajax调用?
2.我需要通过什么作为ajax调用的URL?只是行动名称?
3.我如何解析结果?从java代码中,我可以返回具有“代码”和“标签”以及其他属性的“状态”对象列表。我该如何解析JavaScript中的这个列表并为select标签生成适当的选项?

+2

我以前做过这个。我会做jonathan建议使用struts2-json-plugin(它非常易于使用),使用它的动作会返回一个json字符串。如果你使用chrome,你会在屏幕上看到它,用firefox你会看到它使用萤火虫。有了json,你可能会使用jQuery的$ .getJSON()这个页面上的cat示例在启动时帮助了我很多:http://api.jquery.com/jQuery.getJSON/您可以将它复制到您自己的页面中,它将使用json和cat图像离开闪烁的网站,让你使用json而不需要服务器。 – Quaternion

回答

2
<select id="stateSelect" name="selectedState" onchange="loadCities(this.value)"> 
<s:iterator value="#session['myModel'].states" status="itr"> 
    <option value="<s:property value="code"/>"> 
     <s:property value="label"/> 
</option> 
</s:iterator> 
</select> 

<select id="citySelect" name="selectedCity" > 
</select> 

JQuery的

function loadCities(value){ 

     $("#citySelect").get(0).options.length = 0; 
     $("#citySelect").get(0).options[0] = new Option("Loading cities", "-1"); 

     $.ajax({ 
      type: "POST", 
      url: "MyStrutsActionToGetCities", 
      data: "{stateID:" + value+ "}", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function(msg) { 
       $("#citySelect").get(0).options.length = 0; 
       $("#citySelect").get(0).options[0] = new Option("Select city", "-1"); 

       $.each(msg.d, function(index, item) { 
        $("#citySelect").get(0).options[$("#citySelect").get(0).options.length] = new Option(item.Display, item.Value); 
       }); 
      }, 
      error: function() { 
       $("#citySelect").get(0).options.length = 0; 
       alert("Failed to load cities"); 
      } 
     }); 
} 

this tutorial

更新摘自:本例使用基于选择的状态来加载城市名单。你可以做类似的事情来加载国家选择的状态列表。另外here is a link描述了没有使用任何插件的struts的Ajax请求/响应

2

通常情况下,使用最新版本的Struts2附带的Struts2 JSON plugin。要在JSP中与jQuery交互,您需要使用s:url为您的JSON动作创建一个URL,然后使用jQuery的.getJSON()或.load()来调用它。

但是,如果您的下拉选项确实不那么复杂,请勿过度设计。在初始页面加载时使用s:iterator可以更容易地呈现它们,并且在下拉框中使用.change()可以在选定组件之间移动数据,或者增强表单提交的其中一个选择框的名称属性。

相关问题