【问题标题】:how to display data in dropwdowns using JSTL in spring?如何在春季使用 JSTL 在下拉菜单中显示数据?
【发布时间】:2014-09-05 19:32:37
【问题描述】:

我有 PersonDTO 对象,它有:

String name;
List<String> skills;//getter setter

当 jsp 第一次加载时,我从 @ModelAttribute 获取下拉值,如下所示:

List<PersonDTO> personInfo= personService.getInfomation(id);    
model.addAttribute("personInfo",personDTO);  

并在jsp中显示:

<div>
<form:select  name="name" path="name">
<c:forEach items="${personInfo}" var="var">
<form:option value="${var.name}">"${var.name}" /></form:option>
</c:forEach>
</form:select>
<div>
<div>
<form:select  name="skills" path="skills">
<c:forEach items="${personInfo.skills}" var="skill">
<form:option value="${skill}">"${skill}" /></form:option>
</c:forEach>
</form:select>
<div>

所以现在我该怎么做:如果用户在第一个下拉列表中更改名称,那么第二个下拉值必须根据所选人员所拥有的技能自动更改。我正在使用 Spring 4、maven、JSTL、jQuery、 javascript 和 spring 表单标签。这都是客户端。在这里,我们没有使用名称参数进行任何 ajax 调用来获取技能值并将其显示在下拉列表中。请帮助。谢谢

【问题讨论】:

    标签: javascript jquery spring jsp jstl


    【解决方案1】:

    您只需要一个包含所有名称和技能的 javascript 对象,因此当名称更改时,技能已经在客户端可用。通常,您最好通过将列表序列化为控制器中的 JSON 字符串来执行此操作,但为了避免告诉您向项目添加新的依赖项(如 Gson),您可以通过在脚本标记中填充 javascript 对象来执行此操作。

    <script type="text/javascript">
        var peopleSkills = {};  
    
        <c:forEach var="person" items="${personInfo}">
            peopleSkills['${person.name}'] = new Array();
            <c:forEach var="skill" items="${person.skills}">
                peopleSkills['${person.name}'].push('${skill}');
            </c:forEach>
        </c:forEach>
    
        function updateSkills(name) {
            var skillsArray = peopleSkills[name];
            var markup = ''
            for (var i = 0; i < skillsArray.length; i++)
                markup += '<option value="' + skillsArray[i] + '">' + skillsArray[i] + '</option>';
            $('#skillsselect').html(markup);            
        }   
    
        $(document).ready(function(){
            updateSkills($('#nameselect').val()); // for initial option on page load
    
            $('#nameselect').change(function(){
                var personName = $(this).val();
                updateSkills(personName);   
            });
        });
    </script>
    
    <div>
        <form:select name="name" id="nameselect" path="name">
            <c:forEach items="${personInfo}" var="var">
                <form:option value="${var.name}">"${var.name}" /></form:option>
            </c:forEach>
        </form:select>
    <div>
    <div>
        <form:select name="skills" id="skillsselect" path="skills"></form:select>
    <div>
    

    一定要考虑在控制器中创建 JSON 字符串,以避免在脚本标签中混合服务器端和客户端代码。还要为两个不同的人同名的情况做好准备。

    【讨论】:

    • 非常感谢您给我答案。但我现在只有一个问题。在迭代和显示技能时,(名称下拉列表中的 3 个名称),前两个人的技能是正确的,但有些人即使第三人只有一项技能,下拉菜单显示三个。知道有什么问题吗?我调试了它并且数据非常好,直到我使用 JSTL 在 JSP 中迭代它们。第一人称3技能,第二人2技能,第三人只有1技能。
    • 您是否查看过 html 源代码以验证 javascript 对象中的数据是否正确?另外,你的名字中有引号吗?如果您还没有这样做,请使用 javascript 调试器并查找更改名称选择时引发的任何 javascript 错误。
    【解决方案2】:

    不需要&lt;c:foreach 来迭代所有选项,而是使用 spring &lt;form:options 标签,例如:

    我正在考虑你的 PersonDTO 类有属性 idname 那么,

    <form:select id="name" path="name">
      <option value="0">--select--</option>
      <form:options items="${personInfo}" itemLabel="name" itemValue="id">
    </form:select>
    

    技能也一样:

    <form:select id="skills" path="skills">
      <form:options items="${personInfo.skills}"> />
    </form:select>
    

    要加载所选人员的技能,请使用人员 ID 向控制器发出 AJAX 获取请求,并从控制器返回基于人员 ID 的人员技能,例如:

    控制器中的 GET 处理程序方法如下所示:

    @RequestMapping(value="/{personId}/getSkills", method=RequestMethod.GET,
            consumes=MediaType.APPLICATION_JSON_VALUE,
            produces=MediaType.APPLICATION_JSON_VALUE)
    public @ResponseBody List<Skills> getSkills(@PathVariable("personId")Integer personId){
    
        List<Skills> personSkills = personService.getPersonSkills(personId);
        return personSkills;
    }
    

    Ajax 调用如下所示:

    $('select#name').change(function(){
        $.getJSON('/'+$('select#name option:selected').val()+'/getSkills', function(skills) {
            $('select#skills').empty(); //first remove existing options then append new options
            $.each( skills, function( key, val ) {
                $('select#skills').append($("<option></option>")
                         .attr("value",key)
                         .text(val));
              });
        });         
     });
    

    注意:要激活 @ResponseBody,请添加 &lt;mvc:annotation-driven/&gt;Jackson mapper 或构建路径上应提供的任何其他映射器,以便进行 JSON 序列化和反序列化。

    另请参阅:

    编辑:根据您的评论,解决方案将是

    <script type="text/javascript">
        var peopleSkills = {};  
    
        <c:forEach var="person" items="${personInfo}">
            peopleSkills['${person.name}'] = new Array();
            <c:forEach var="skill" items="${person.skills}">
                peopleSkills['${person.name}'].push('${skill}');
            </c:forEach>
        </c:forEach>
    
        $('select#name').change(function(){
             var skills = peopleSkills[$(this).val()];
             console.log($(this).val()+' has: '+JSON.stringify(skills));
             $('select#skills').empty();
             $.each( skills, function( key, val ) {
                 $('select#skills').append($("<option></option>")
                             .attr("value",val)
                             .text(val));
             });
        });
    </script>
    

    【讨论】:

    • 感谢您的回答,但这只是客户端,我无法进行 ajax 调用。一旦所有数据都到达 JSP,我就不能再做另一个 ajax 调用名称或 id 参数来获取技能了。
    • @user3388802 检查答案已更新,确保选择框 ID 相同并检查浏览器控制台消息。它会正常工作的。
    猜你喜欢
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多