2012-03-16 30 views
7

Tôi đang sử dụng Spring 3.1.0.RELEASE. Tôi có lĩnh vực này trong đối tượng lệnh của tôi ...Làm cách nào để chọn hộp kiểm mùa xuân theo mặc định?

public Set<EventFeed> getUserEventFeeds() { 
    return this.userEventFeeds; 
} 

Trên trang mùa xuân JSP của tôi, tôi muốn hiển thị một danh sách của tất cả các hộp kiểm sự kiện có thể nguồn cấp dữ liệu, và sau đó có hộp kiểm kiểm tra nếu người dùng có một trong set mình . Tôi muốn có một số định dạng HTML đặc biệt xung quanh mỗi hộp kiểm, vì vậy tôi đang cố gắng ...

<form:form method="Post" action="eventfeeds.jsp" commandName="user"> 
    ... 
     <c:forEach var="eventFeed" items="${eventFeeds}"> 
     <tr> 
      <td><form:checkbox path="userEventFeeds" value="${eventFeed}"/></td> 
      <td>${eventFeed.title}</td> 
     </tr> 
     </c:forEach> 
    ... 

Tuy nhiên, các mục này sẽ không được kiểm tra theo mặc định nếu có trong bộ này. Làm thế nào để tôi làm điều này? Đây là binder tôi đang sử dụng trong lớp điều khiển của tôi ...

@InitBinder 
public void initBinder(WebDataBinder binder) { 
    binder.registerCustomEditor(EventFeed.class, new EventFeedEditor()); 
} 

private class EventFeedEditor extends PropertyEditorSupport { 
    @Override 
    public void setAsText(String text) throws IllegalArgumentException { 
     setValue(eventFeedsDao.findById(Integer.valueOf(text))); 
    } 

    @Override 
    public String getAsText() { 
     return ((EventFeed) getValue()).getId().toString(); 
    } 
} 

Trả lời

7

@Dave, có một cái gì đó gọi là form: checkBoxes. Bạn có thể thử với điều đó.

<form:checkboxes path="userEventFeeds" items="${eventFeeds}" itemLabel="id" itemValue="value"/> 

Giả định của tôi ở đây là bạn nên có "id" và "giá trị" được xác định trong lớp EventFeed.

Tôi vừa thử điều này bằng cách chọn Danh sách đã chọn String [] availableList và String []. Nó hoạt động như sự quyến rũ. Bạn cũng có thể thử.

+0

Mỗi mô tả của tôi trong câu hỏi, tôi muốn đặt thêm HTML xung quanh mỗi hộp kiểm. Vì vậy, tôi vẫn có thể kéo ra khỏi HTML tôi muốn (được liệt kê trong câu hỏi) bằng cách sử dụng hình thức: hộp kiểm? Cho đến nay tôi đã không tìm thấy một cách để làm điều đó. – Dave

+0

Bạn có nghĩa là bạn muốn bảng xung quanh hộp kiểm đó có nhãn hộp kiểm trong một cột và hộp kiểm trong cột liền kề? – raddykrish

+0

Có một thuộc tính được gọi là "phần tử" trong biểu mẫu: thẻ kiểm tra, theo tài liệu của họ cho biết "Chỉ định phần tử HTML được sử dụng để đính kèm mỗi thẻ 'đầu vào' với loại 'hộp kiểm'. Mặc định là 'span'." Bạn có thể tham khảo tài liệu ở đây trong liên kết này http://static.springsource.org/spring/docs/2.0.x/reference/spring-form.tld.html#spring-form.tld.checkboxes. – raddykrish

5

Bạn có thể làm điều này bằng cách đặt thuộc tính mặc định lựa chọn đúng trong lớp học của bạn

class User { 
    boolean userEventFeeds = true; 

} 
0

Tôi đã thử cả hai form:checkboxesform:checkbox với cùng một dữ liệu và các công trình đầu tiên, thứ hai thì không. (Bản phát hành tương tự của Mùa xuân mà bạn có)

Có vẻ như có một số bug, mặc dù khiếu nại của họ dường như vẫn ở đó.

6

Điều thú vị là các công trình này:

<form:checkbox path="services" value="${type}" checked="checked"/> 
+0

Thực hành tốt hơn là đặt giá trị mặc định của trường cụ thể như Jhonathan được đề xuất. Nếu, vì lý do gì, bạn không thể sau đó giải pháp này không hoạt động. – theblang

0

Đối với usecase của tôi (phản ứng trên công cụ trong một danh sách không có gì để làm với các đối tượng được lấp đầy), mã này làm việc:

(Xin lưu ý rằng đây là loại mã cuối cùng, các giải pháp khác có nhiều khả năng phù hợp hơn.)

<%@ taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core" %> 
<jstl:forEach var="listObject" items="${someList}"> 
    <jstl:if test="${listObject.active}"> 
    <form:checkbox path="active" checked="checked"/> 
    </jstl:if> 
    <jstl:if test="${!listObject.active}"> 
    <form:checkbox path="active"/> 
    </jstl:if> 
</jstl:forEach> 
Các vấn đề liên quan