Spring 3.0 MVC 中的多选 [英] Multiple Select in Spring 3.0 MVC

查看:38
本文介绍了Spring 3.0 MVC 中的多选的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

好的,所以我一直在尝试在 Spring MVC 中完成多项选择,但没有成功.

Ok so I've been trying to accomplish multiple selects in Spring MVC for a while and have had no luck.

基本上我有一个技能类:

Basically what I have is a Skill class:

public class Skill {
    private Long id;
    private String name;
    private String description;
    //Getters and Setters
}

以及拥有多项技能的员工:

And an Employee who has multiple Skills:

public class Employee {
    private Long id;
    private String firstname;
    private String lastname;
    private Set<Skill> skills;
    //Getters and Setters
}

所有这些都映射到 Hibernate,但这应该不是问题.

All of these are mapped to Hibernate but that shouldn't be an issue.

现在我希望能够在 JSP 中从 <select multiple="true"> 元素中为员工选择技能.

Now I would like to be able to do in the JSP is to select Skills for an Employee from a <select multiple="true"> element.

我在 JSP 中尝试过这个,但没有成功:

I have tried this in the JSP with no luck:

<form:select multiple="true" path="skills">
    <form:options items="skillOptionList" itemValue="name" itemLabel="name"/>
<form:select>

这是我的控制器:

@Controller
@SessionAttributes
public class EmployeeController {
     @Autowired
     private EmployeeService service;

     @RequestMapping(value="/addEmployee", method = RequestMethod.POST)
     public String addSkill(@ModelAttribute("employee") Employee emp, BindingResult result, Map<String, Object> map) {

        employeeService.addEmployee(emp);

        return "redirect:/indexEmployee.html";
    }

    @RequestMapping("/indexEmployee")
    public String listEmployees(@RequestParam(required=false) Integer id, Map<String, Object> map) {

        Employee emp = (id == null ? new Employee() : employeeService.loadById(id));

        map.put("employee", emp);
        map.put("employeeList", employeeService.listEmployees());
        map.put("skillOptionList", skillService.listSkills());

        return "emp";
    }
}

但这似乎不起作用.我收到以下异常:

But this does not seem to work. I get the following Exception:

SEVERE: Servlet.service() for servlet jsp threw exception
javax.servlet.jsp.JspException: Type [java.lang.String] is not valid for option items

我觉得我们应该可以为模型创建一个表单,该表单可以从提供的选项列表中进行多项选择.在 Spring 3.0 MVC 中使用 form:selectform:options 的最佳实践是什么?

I feel like it should be possible where we can have a form for a Model that has multiple select from a list of options provided. What is the best practice to have form:select and form:options in Spring 3.0 MVC?

谢谢!

解决方案:

好的,以防万一有人想知道解决方案是什么.除了用户 01001111 修复:

Ok so just in case anyone wonders what the solution is. In addition to user 01001111 fix:

<form:select multiple="true" path="skills">
    <form:options items="${skillOptionList}" itemValue="name" itemLabel="name"/>
<form:select>

我们需要向控制器添加一个CustomCollectionEditor,如下所示:

We need to add a CustomCollectionEditor to the controller as follows:

@Controller
@SessionAttributes
public class EmployeeController {

    @Autowired
    private EmployeeeService employeeService;

    @Autowired
    private SkillService skillService;

    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(Set.class, "skills", new CustomCollectionEditor(Set.class)
          {
            @Override
            protected Object convertElement(Object element)
            {
                Long id = null;

                if(element instanceof String && !((String)element).equals("")){
                    //From the JSP 'element' will be a String
                    try{
                        id = Long.parseLong((String) element);
                    }
                    catch (NumberFormatException e) {
                        System.out.println("Element was " + ((String) element));
                        e.printStackTrace();
                    }
                }
                else if(element instanceof Long) {
                    //From the database 'element' will be a Long
                    id = (Long) element;
                }

                return id != null ? employeeService.loadSkillById(id) : null;
            }
          });
    }
}

这允许 Spring 在 JSP 和模型之间添加技能集.

This allows Spring to add Sets of Skills between the JSP and Model.

推荐答案

你需要把items属性当作一个变量,而不仅仅是引用变量名:

You need to treat the items attribute as a variable, not just reference the variable name:

<form:select multiple="true" path="skills">
    <form:options items="${skillOptionList}" itemValue="name" itemLabel="name"/>
</form:select>

${skillOptionList} 代替 skillOptionList

这篇关于Spring 3.0 MVC 中的多选的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆