在JSP/Servlet中填充级联下拉列表
假设我有三个名为在JSP/Servlet中填充级联下拉列表,jsp,servlets,drop-down-menu,cascading,Jsp,Servlets,Drop Down Menu,Cascading,假设我有三个名为dd1、dd2和dd3的下拉列表控件。每个dropdownlist的值都来自数据库dd3的值取决于dd2的值,dd2的值取决于dd1的值。有人能告诉我如何调用servlet来解决这个问题吗?您可能需要多个servlet来解决这个问题 Servlet 1:从数据库加载第一个下拉列表的值。在JSP页面上构建下拉列表。在用户选择一个值时,提交给servlet 2 Servlet 2:从第一个列表中检索值,并对第二个列表的值执行数据库搜索。构建第二个列表。当用户选择第二个值时,将其提交给
dd1
、dd2
和dd3
的下拉列表控件。每个dropdownlist的值都来自数据库dd3
的值取决于dd2
的值,dd2
的值取决于dd1
的值。有人能告诉我如何调用servlet来解决这个问题吗?您可能需要多个servlet来解决这个问题
Servlet 1:从数据库加载第一个下拉列表的值。在JSP页面上构建下拉列表。在用户选择一个值时,提交给servlet 2
Servlet 2:从第一个列表中检索值,并对第二个列表的值执行数据库搜索。构建第二个列表。当用户选择第二个值时,将其提交给servlet 3
Servlet3:检索在第二个下拉列表中选择的值,并执行数据库搜索以获取最后一个下拉列表的值
您可能想考虑Ajax来让列表填充对用户来说是无缝的。jQuery有一些非常好的插件,如果您愿意的话,可以让这变得非常简单
....
您可以编写JavaScript,在onchange事件中提交表单。同样,如果您使用像jQuery这样的现有库,它将简单10倍。根据您的问题判断,您实际上并没有使用web框架,而是使用servlet来呈现html 我会很高兴地说,你已经落后于时代十年了:),人们使用JSP(以及类似struts的web框架)来做这类事情。然而,话虽如此,这里是:
我再说一遍,只需使用一个web框架,或者至少使用简单的旧jsp即可。实现这一点基本上有三种方法:
映射
,让它将它们存储在请求范围中。最后,让JSP/JSTL在第二个下拉列表中显示值。您可以为此使用(只需插入/WEB-INF/lib
)标记。您可以在与JSP页面关联的Servlet
的doGet()
方法中预填充第一个列表
${option.value}
请选择家长
${option.value}
请选择家长
${option.value}
然而,有一次需要注意的是,这将提交整个表单,并导致“内容闪现”,这可能对用户体验不利。您还需要根据请求参数以相同的形式保留其他字段。您还需要在servlet中确定请求是更新下拉列表(子下拉列表值为null)还是提交实际表单
var dd2options=${dd2optionsAsJSObject};
var dd3options=${dd3optionsAsJSObject};
功能dd1更改(dd1){
//根据选定的dd1值填写dd2选项。
所选变量=dd1。选项[dd1.selectedIndex]。值;
...
}
功能dd2更改(dd2){
//根据选定的dd2值填写dd3选项。
var selected=dd2。选项[dd2.selectedIndex]。值;
...
}
${option.value}
请选择家长
请选择家长
然而,有一个警告是,当您拥有大量物品时,这可能会变得不必要的冗长和昂贵。假设每100个可能的项目有3个步骤,这意味着JS对象中有100*100*100=1000000个项目。HTML页面的长度将超过1MB
因此,问题2263996
$(文档).ready(函数(){
$('#dd1').change(function(){fillOptions('dd2',this);});
$('#dd2').change(function(){fillOptions('dd3',this);});
});
函数填充选项(ddId、callingElement){
变量dd=$('#'+ddId);
$.getJSON('json/options?dd='+ddId+'&val='+$(callingElement).val(),函数(opts){
$('>option',dd).remove();//首先清除旧选项。
如果(选择){
$。每个(选项、功能(键、值){
追加($('').val(键).text(值));
});
}否则{
dd.append($('').text(“请选择父项”);
}
});
}
<form action="servlet2.do">
<select name="dd1" onchange="Your JavaScript Here">
<option>....
</select>
</form>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String dd = request.getParameter("dd"); // ID of child DD to fill options for.
String val = request.getParameter("val"); // Value of parent DD to find associated child DD options for.
Map<String, String> options = optionDAO.find(dd, val);
String json = new Gson().toJson(options);
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(json);
}
<script>
$(document).ready(function()
{
$('#dd1').change(function() { fillOptions('dd1', 'dd2'); });
$('#dd2').change(function() { fillOptions('dd2', 'dd3'); });
});
function fillOptions(parentId, ddId)
{
var dd = $('#' + ddId);
var jsonURL = 'json/options?dd=' + ddId + '&val=' + $('#' + parentId + ' :selected').val();
$.getJSON(jsonURL, function(opts)
{
$('>option', dd).remove(); // Clean old options first.
if (opts)
{
$.each(opts, function(key, value)
{
dd.append($('<option/>').val(key).text(value));
});
}
else
{
dd.append($('<option/>').text("Please select parent"));
}
});
}
</script>