1. 简介
随着web应用的越来越复杂,表单的内容也越来越丰富,这就需要表单字段之间的联动和依赖。
2. 前端实现
2.1 JSP页面
JSP页面中的表单元素,需要添加相应的JavaScript代码,实现表单字段之间的联动和依赖。下面是一个简单的例子:
<form>
<label>汽车品牌:</label>
<select id="brand" onchange="changeBrand()">
<option value="1">奔驰</option>
<option value="2">宝马</option>
</select>
<br><br>
<label>汽车型号:</label>
<select id="model">
<option value="1" class="1">GLC</option>
<option value="2" class="1">C级</option>
<option value="3" class="2">5系</option>
<option value="4" class="2">7系</option>
</select>
</form>
<script type="text/javascript">
function changeBrand() {
var brand = document.getElementById("brand").value;
var city = document.getElementById("model");
for (var i = 0; i < city.options.length; i++) {
city.options[i].style.display = "none";
if (city.options[i].getAttribute("class") == brand) {
city.options[i].style.display = "";
}
}
city.value = city.options[0].value;
}
</script>
上面的代码展示了两个下拉菜单:汽车品牌和汽车型号,当选择不同的品牌时,会根据品牌显示不同的型号。比如选择奔驰时,只能选择GLC和C级,而不能选择5系和7系。
在这段JavaScript代码中,我们使用了onchange事件,当汽车品牌发生变化时,就会执行changeBrand()函数。
函数实现的就是选择汽车型号的过程:根据当前选择的汽车品牌,隐藏不属于该品牌的型号,然后默认选择第一个型号。
2.2 jQuery插件
如果使用jQuery库,可以使用各种插件实现表单联动和依赖功能。这里介绍一个比较好用的jQuery插件——jQuery-Dependent-Fields。
jQuery-Dependent-Fields就是实现表单字段之间联动和依赖的一个jQuery插件。使用它可以避免手写JavaScript代码,简化开发工作。
下面的代码展示了如何使用jQuery-Dependent-Fields实现汽车品牌和汽车型号的联动:
<form>
<label>汽车品牌:</label>
<select id="brand">
<option value="1">奔驰</option>
<option value="2">宝马</option>
</select>
<br><br>
<label>汽车型号:</label>
<select id="model" data-dependent-field='{"source":"#brand","items":{"1":[ "GLC", "C级"],"2":["5系","7系"]}}'>
</select>
</form>
<script type="text/javascript">
$(function() {
$('#model').dependentFields({
source : '#brand',
items : {
"1" : [ "GLC", "C级" ],
"2" : [ "5系", "7系" ]
}
});
});
</script>
在上面的代码中,我们使用了data-dependent-field属性,用来存储关于联动部分的数据。当选择不同的品牌时,会根据相应的数据刷新下拉菜单中的选项。
使用jQuery-Dependent-Fields能省去很多手写代码的麻烦,大大提高了开发效率。
3. 后端实现
3.1 Struts2框架
在Struts2框架中,我们可以使用一个叫做Struts2-jQuery的插件来实现表单联动和依赖。
下面的代码展示了如何使用Struts2-jQuery插件实现汽车品牌和汽车型号的条理:
<sj:select href="%{ajaxUri}" id="brand" list="{'奔驰','宝马'}" onChangeTopics="refresh" emptyOption="false" headerValue="0" headerKey="-1"/>
<sj:select href="%{ajaxUri}" id="model" list="%{modelList}" formIds="brand" reloadTopics="refresh" emptyOption="false" headerValue="0" headerKey="-1"/>
<script type="text/javascript">
$.subscribe('refresh', function(event,data) {
$.publish('load-models');
});
$.subscribe('load-models', function(event,data) {
var url = "%{baseurl}/ajax/loadModels";
$.get(url, { brand : $('#brand').val() }, function(responseData) {
$('#model').html(responseData);
});
});
</script>
在这个例子中,我们使用了两个标签:sj:select标签和sj:a标签。这些标签有关联的下拉菜单,sj:select标签依赖于sj:a标签的onClick事件。
当用户选择一个品牌时,就会出发onChangeTopics,这个事件的作用是发布一个refresh事件,再由subscribe订阅,最后发出一个load-models事件。
我们在load-models事件处理函数中,使用了jQuery的get方法来获取汽车型号的列表,并根据它更新页面上的“汽车型号”下拉列表菜单的内容。
3.2 Spring MVC框架
在Spring MVC框架中,我们可以使用Spring的Form标签库来实现表单字段的联动和依赖。
下面的代码展示了如何使用Spring Form标签库实现汽车品牌和汽车型号的联动:
<form:select id="brand" path="brand" onchange="onBrandChange()">
<form:option value="" label="--请选择--" />
<form:option value="1" label="奔驰" />
<form:option value="2" label="宝马" />
</form:select>
<form:select id="model" path="model">
<form:options items="${modelList}" itemValue="id" itemLabel="name"/>
</form:select>
<script type="text/javascript">
function onBrandChange() {
var brand = $("#brand").val();
$.getJSON("getModels", { brand : brand }, function(data) {
var options = "";
$.each(data, function(index, option) {
options += "";
});
$("#model").html(options);
});
}
</script>
在这个例子中,我们使用了Spring的Form标签库,其中form:select标签用于创建带有选项的下拉菜单。在onchange事件中,我们使用jQuery的getJson方法来获取汽车型号的列表,并根据列表数据更新页面上的“汽车型号”下拉菜单的内容。
4. 结论
表单联动和依赖是现代web应用中不可或缺的一环。在前端,我们可以使用JavaScript框架和插件来实现;在后端,我们可以使用各种Java框架的标签库来实现。无论哪种方式,它们的本质都是为了提高应用的易用性和用户体验。