[SPRING] Spring 3.0에서 다중 선택 MVC
SPRINGSpring 3.0에서 다중 선택 MVC
그렇기 때문에 나는 봄 MVC에서 여러 개의 select를 잠시 수행하려고 노력했지만 아무런 운이 없었습니다.
기본적으로 내가 가지고있는 것은 스킬 클래스입니다.
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에서
나는 행운과 함께 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
제공된 옵션 목록에서 여러 항목을 선택하는 모델에 대한 양식을 사용할 수 있어야하는 곳에서 가능한 것처럼 느껴집니다. 폼을 가지고있는 가장 좋은 방법은 무엇입니까 : Spring 3.0 MVC에서 선택 및 양식 : 옵션?
감사!
해결책:
그렇다면 누구나 솔루션이 무엇인지 궁금 할 때를 대비해 좋습니다. 사용자 01001111 수정 외에도 :
<form:select multiple="true" path="skills">
<form:options items="${skillOptionList}" itemValue="name" itemLabel="name"/>
<form:select>
다음과 같이 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와 모델간에 기술 집합을 추가 할 수 있습니다.
해결법
-
==============================
1.변수 이름을 참조하는 것뿐만 아니라 items 속성을 변수로 처리해야합니다.
변수 이름을 참조하는 것뿐만 아니라 items 속성을 변수로 처리해야합니다.
<form:select multiple="true" path="skills"> <form:options items="${skillOptionList}" itemValue="name" itemLabel="name"/> </form:select>
skillOptionList 대신 $ {skillOptionList} 넣기
-
==============================
2.커스텀 에디터가 필요 없습니다. 이것은 내가하는 전부이며 값을 앞뒤로 올바르게 복사합니다 :
커스텀 에디터가 필요 없습니다. 이것은 내가하는 전부이며 값을 앞뒤로 올바르게 복사합니다 :
<form:select path="project.resources"> <form:option value="XX"/> <form:option value="YY"/> </form:select> Project class:- private Set<String> resources;
이것은 컨트롤러에 데이터를 추가하는 방법입니다.
Set<String> resources3 = new HashSet<String>(); resources3.add("XX");
-
==============================
3.나는 위의 작동하지 않는 것으로 나타났습니다. 아래에 언급 된 것들 이외에 나는 또한 대답을 사용했다 : Spring select multiple tag and binding (단순히 equals와 hashcode를 오버라이드). 또한 위의 주석에 따라 initBinder를 변경했습니다.
나는 위의 작동하지 않는 것으로 나타났습니다. 아래에 언급 된 것들 이외에 나는 또한 대답을 사용했다 : Spring select multiple tag and binding (단순히 equals와 hashcode를 오버라이드). 또한 위의 주석에 따라 initBinder를 변경했습니다.
그것은 나에게 많은 시간이 걸렸으므로 나는 똑같은 것을보고, 내가 만난 문제를 가지고있는 누군가에게 힌트를주기로 생각했다.
-
==============================
4.tkeE2036 : 그것이 당신을 위해 일했다고 어떻게 말했는지 궁금합니다. 각 옵션의 값은 "id"가 아니라 "name"입니다. 그러나 convertElement 메소드에서는 수신 된 요소 (이름)를 ID 인 것처럼 처리합니다. 내 생각 엔 각 옵션의 값을 "id"로 설정하려고하면 잘못된 PropertyEditor를 사용하기 때문에 각 옵션의 값으로 빈 문자열을 얻게됩니다.
tkeE2036 : 그것이 당신을 위해 일했다고 어떻게 말했는지 궁금합니다. 각 옵션의 값은 "id"가 아니라 "name"입니다. 그러나 convertElement 메소드에서는 수신 된 요소 (이름)를 ID 인 것처럼 처리합니다. 내 생각 엔 각 옵션의 값을 "id"로 설정하려고하면 잘못된 PropertyEditor를 사용하기 때문에 각 옵션의 값으로 빈 문자열을 얻게됩니다.
from https://stackoverflow.com/questions/4331532/multiple-select-in-spring-3-0-mvc by cc-by-sa and MIT license