好的,所以一段时间以来我一直在尝试在Spring MVC中完成多项选择,但是没有运气。
基本上我有一个技能课:
public class Skill { private Long id; private String name; private String description; //Getters and Setters }
拥有多种技能的员工:
public class Employee { private Long id; private String firstname; private String lastname; private Set<Skill> skills; //Getters and Setters }
所有这些都映射到了Hibernate,但这不应该成为问题。
现在,我希望能够在JSP中从<select multiple="true">元素中选择雇员的技能。
<select multiple="true">
我在JSP中尝试过此方法,但没有运气:
<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"; } }
但这似乎不起作用。我收到以下异常:
SEVERE: Servlet.service() for servlet jsp threw exception javax.servlet.jsp.JspException: Type [java.lang.String] is not valid for option items
我觉得应该可以在其中提供一个模型表单,该表单可以从提供的选项列表中进行多项选择。什么是有最佳实践form:select,并form:options在Spring MVC 3.0?
form:select
form:options
谢谢!
解:
好的,以防万一有人想知道解决方案是什么。除了用户01001111修复:
<form:select multiple="true" path="skills"> <form:options items="${skillOptionList}" itemValue="name" itemLabel="name"/> <form:select>
我们需要向CustomCollectionEditor控制器添加a ,如下所示:
CustomCollectionEditor
@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和模型之间添加技能集。
您需要将items属性视为一个变量,而不仅仅是引用变量名称:
<form:select multiple="true" path="skills"> <form:options items="${skillOptionList}" itemValue="name" itemLabel="name"/> </form:select>
放${skillOptionList}而不是skillOptionList
${skillOptionList}
skillOptionList