Spring 3.0 MVC 中的多选

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/4331532/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-08 04:14:17  来源:igfitidea点击:

Multiple Select in Spring 3.0 MVC

springjspselectspring-mvc

提问by Ian Dallas

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

好的,所以我一直试图在 Spring MVC 中完成多项选择,但没有运气。

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
}

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

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

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 中做的是从<select multiple="true">元素中为员工选择技能。

I have tried this in the JSP with no luck:

我在 JSP 中尝试过这个,但没有运气:

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

Here is my Controller:

这是我的控制器:

@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

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:selectand form:optionsin Spring 3.0 MVC?

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

Thanks!

谢谢!

Solution:

解决方案:

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

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

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

We need to add a CustomCollectionEditorto the controller as follows:

我们需要向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;
            }
          });
    }
}

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

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

采纳答案by 01001111

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

您需要将 items 属性视为变量,而不仅仅是引用变量名称:

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

put ${skillOptionList}instead of skillOptionList

${skillOptionList}而不是skillOptionList

回答by Vik

You don't need the custom editors - this is all I do and it copies the values back and forth correctly:

您不需要自定义编辑器 - 这就是我所做的一切,它可以正确地来回复制值:

<form:select path="project.resources">
    <form:option value="XX"/>
    <form:option value="YY"/>
</form:select>

Project class:-
private Set<String> resources;

This is how I add the data in the controller:

这是我在控制器中添加数据的方式:

Set<String> resources3 = new HashSet<String>();
resources3.add("XX");

回答by Alexandros

I found the above non working. In addition to the things mentioned below i also used the answer in: Spring select multiple tag and binding(simply put overide equals and hashcode). I have also changed initBinder based on the comment above

我发现上述不起作用。除了下面提到的东西,我还使用了答案:Spring select multiple tag and binding(简单地覆盖equals和hashcode)。我还根据上面的评论更改了 initBinder

It took me a lot of time to cope with it so i thought to give a hint to anyone looking the same thing and having the problems i met with.

我花了很多时间来处理它,所以我想给任何看起来相同并且遇到我遇到的问题的人一个提示。

回答by rapt

tkeE2036: I wonder how you said it worked for you at all? The value of each option is "name", not "id". But then in the convertElement method you treat the received element (which is a name), as if it were the id. My guess is that if you tried to set the value of each option as "id", you would get an empty string as the value of each option, because you are using the wrong PropertyEditor.

tkeE2036:我想知道你怎么说它对你有用?每个选项的值是“name”,而不是“id”。但是在 convertElement 方法中,您将接收到的元素(这是一个名称)视为 id。我的猜测是,如果您尝试将每个选项的值设置为“id”,您将得到一个空字符串作为每个选项的值,因为您使用了错误的 PropertyEditor。