当前位置: 首页 > 知识库问答 >
问题:

列表对象上的SpringJSP复选框

白博易
2023-03-14

我正在尝试使用<code>

所以我想做的是:我有一个类似

 class Person{

    List<IceCreams> creams;

    }

所以现在我想给我的用户一个表格,让他可以选择他喜欢的冰淇淋。

控制器:

@Controller
public class IceCreamController{

@RequestMapping(value="icecream", method=RequestMethod.GET)
public String showPage(Model model){
Person person = repository.getPerson(); //Returns a Person, "creams" is not empty
model.addAttribute("creams", person.getIceCreams();
}

@RequestMapping(value="icecream", method=RequestMethod.POST)
public String showPage( @ModelAttribute("teilnehmer") List<IceCreams> likedCreams, Model model){
//do something with selected iceCreams
}

现在我不明白如何在JSP中继续。我知道我必须使用checkboxes标记,但是我不知道它在提交时返回什么,也不知道我是否正确地使用了它。

<form:form>
<form:checkboxes path="creams" items="${creams}"/>
<input type="Submit" value="Submit">
</form:form>

所以问题是:我在JSP中写什么,什么将返回给控制器?

在评论后添加:IceCream类:

  public class IceCream{
   private long id;
   private String creamName;

//getters/setters}

编辑:在得到一个有用的答案后,我尝试这样做:将它们添加到模型中:

model.addAttribute("person", person);
     model.addAttribute("creams", person.getCreams()); 

在JSP中我做到了

<form:checkboxes  path="teilnehmer"
                      items="${creams}"
                      itemValue="id"
                      itemLabel="creamName"
                      />

所以在后方法中,我取一个ModelAttribute Person。

添加到控制器:

@InitBinder
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
   binder.registerCustomEditor(IceCream.class, new IceCreamsPropertyEditor());

和新的编辑器类:

public class ContactsPropertyEditor extends PropertyEditorSupport{

    @Autowired
    IceCreamRepository creamrep;

   @Override
   public void setAsText(String text) throws IllegalArgumentException {

         Integer creamId = new Integer(text);
         IceCream cream = creamrep.findOne(creamId);
         super.setValue(con);

   }
}

不幸的是,结果是错误400。

共有1个答案

盖绪
2023-03-14

首先,您不能绑定到原始列表。您需要绑定到包装列表的对象:在您的情况下,这是Person的实例,而不是list奶油。

所以,把这个人放在模型里。使用< code>@ModelAttribute方法,这样框架将在提交时重新加载同一个人并设置值。最有可能的是,我们希望展示所有可用的冰淇淋以供选择。

@RequestMapping(method=RequestMethod.GET)
public String loadForEdit(){
    return "";
}

@RequestMapping(method=RequestMethod.POST)
public String save(@ModelAttribute("person") Person person){
    repository.savePerson(person);  

    return "";
}

//called by the framework on 'get' to load the person you wish to edit
//called by the framework on on 'post' to get the same instance for binding
//send personId as a hidden form element in the form
@ModelAttribute("person")
public Person getPerson(@RequestParam int personId){
    return repository.getPerson(personId);  
} 

@ModelAttribute("iceCreams")
public List<String> getAvailableIceCreams(){
    return repository.findAll();    
}

其次,框架不能从提交的表单参数自动转换成冰淇淋的实例。为此,你需要考虑使用转换器,但这是另一个问题。看这里:

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/validation.html

鉴于上述情况,我们可以通过将集合类型更改为String来获得一个更简单的示例:

class Person{
    List<String> creams;
}

然后,JSP应该简单地变成:

<form:form modelAttribute="person">
    <!-- bind to the creams property of person -->
    <!-- create check boxes for all available ice creams -->
    <!-- any already in person.creams should be automatically checked -->
    <form:checkboxes path="creams" items="${iceCreams}" />
    <input type="hidden" value="${person.id}" name="personId"/>
    <input type="Submit" value="Submit">
</form:form>

一旦您熟悉转换器,就可以转换为绑定到IceCream实例,但这是一个太广泛的主题。然而,在JSP中,您只需更新复选框标记,如下所示:

<form:checkboxes path="creams" items="${iceCreams}"  itemValue="id" itemLabel="labelName"/>

其中value是将提交给服务器的属性,您的转换器将使用它来创建正确的实例(例如保存在数据库中的项目的ID),标签是用于显示的属性。

 类似资料:
  • 我是新的java开发人员,我需要你的帮助。我已经看到了类似主题的问答,但我仍然不知道如何处理它,所以我想寻求一些帮助。 我用的是Liferay 6.2 提前感谢您的任何帮助!

  • 我的发帖方法: 索引页表单: 当我单击submit时,browser显示为错误的请求,但没有th:field=“*{userRole}”,我可以提交表单。有什么办法解决这个问题吗? 然后如@roel所述更改了表单。 多谢了。

  • 我正试图找出如何解决这两个问题,我有我的ES 5.6索引。 我需要创建两个单独的脚本过滤器: 1-筛选employee数组大小==3的文档 2-筛选数组第一个元素为“name”==“John”的文档 我试图做一些第一步,但我无法迭代列表。我总是有一个空指针异常错误。

  • 这是我使用得到的结果 使用下面的代码,我得到了键列表:值 如何读取特定值,如?我可以使用,但可能还有另一种方法

  • 我有以下列表,里面是另一个列表,然后是字符串列表 <代码>列表 示例 除了执行嵌套循环并最终替换列表之外,还有更好的方法吗?也许有溪流?

  • 我需要筛选我的对象列表: 以便将具有相同和的所有对象合并到具有以下属性的单个对象中: 作为所有值的和 作为所有值的字符串级联 所以结果是: Java 8中的溪流有可能做到吗? 我尝试了几种方法(例如,还使用),但我没有找到解决方案! 谢谢 编辑: 下面是我尝试的: 但由于某种原因,在计算过程中,我在上得到了,无论如何,我非常肯定这不是一个有效的解决方案。