2017-01-25 2 views
0

Я ищу помощь в понимании того, как создать новый объект через форму, в которой пользователь выбирает несколько под-объектов (которые будут заполнены заранее) и доступен для выберите с помощью флажка.Spring 4 MVC Form: Создать объект со списком вспомогательных объектов

OrderController.java

@RequestMapping(value = { "/order" }, method = RequestMethod.GET) 
public String order(ModelMap model) { 

    List<Exam> exams = examService.findAllExams(); 
    List<Document> documents = documentService.findAllDocuments(); 

    model.addAttribute("exams", exams); 
    model.addAttribute("documents", documents); 

    return "order"; // jsp page reference 
} 

Order.java

@Entity 
@Table(name="\"order\"") 
    public class Order implements Serializable 
    { 
     private static final long serialVersionUID = 1L; 

     @Id 
     @GeneratedValue(strategy=GenerationType.IDENTITY) 
     @Column(name = "order_id", unique = true, nullable = false) 
     private Integer id; 

     @GeneratedValue(generator = "uuid") 
     @GenericGenerator(name = "uuid", strategy = "uuid2") 
     @Column(name = "uuid", unique = true, nullable = false) 
     private String uuid; 

     @Temporal(TemporalType.DATE) 
     @Column(name = "order_date", unique = true, nullable = false) 
     private Date orderDate; 

     @Column(name="order_status", nullable=false) 
     private String orderStatus; 

     @ManyToOne(fetch = FetchType.LAZY) 
     @JoinColumn(name = "user_id", nullable = false) 
     private User user; 

     @OneToMany(fetch = FetchType.LAZY, mappedBy = "order") 
     private Set<OrderExam> orderExams = new HashSet<OrderExam>(0); 

     @OneToMany(fetch = FetchType.LAZY, mappedBy = "order") 
     private Set<OrderDocument> orderDocuments = new HashSet<OrderDocument(0); 

     //getters & setters 
    } 

OrderExam.java

@Entity 
@Table(name="order_exam") 
public class OrderExam implements Serializable 
{ 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(name = "order_exam_id", unique = true, nullable = false) 
    private Integer id; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "order_id", nullable = false) 
    private Order order; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "exam_id", nullable = false) 
    private Exam exam; 

    @Column(name="exam_amount", nullable=true) 
    private Integer examAmount; 

    @Column(name="answer_sheet_amount", nullable=true) 
    private String answerSheetName; 

    @Column(name="students_per_csv", nullable=true) 
    private String studentsPerCSV; 

    @Column(name="pas", nullable=true) 
    private Boolean pearsonAnswerSheet; 

    //getters & setters 
} 

Exam.java

@Entity 
@Table(name="exam") 
public class Exam implements Serializable 
{ 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(name = "exam_id", unique = true, nullable = false) 
    private Integer id; 

    @NotEmpty 
    @Column(name="name", unique=true, nullable=false) 
    private String name; 

    @NotEmpty 
    @Column(name="code", unique=true, nullable=false) 
    private String code; 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "exam") 
    private Set<OrderExam> exams = new HashSet<OrderExam>(0); 

    //getters & setters 
} 

Как вы можете видеть, я передаю в списке экзаменов и документов, которые будут заполнить форму с доступными опциями (можно увидеть на изображении ниже (экзамены в любом случае)). Пользователь должен иметь возможность выбирать несколько строк, чтобы один заказ имел несколько экзаменов и документов, связанных с ним.

OrderForm:Exams

Мой order.jsp немного больше, чтобы разместить все вещи здесь, но вот та часть меня, которая отображается на изображении выше.

Order.jsp

<form:form method="POST" modelAttribute="order" class="form-horizontal form-label-left"> 
<c:forEach items="${exams}" var="exam"> 
               <tr> 
                <th scope="row"><input type="checkbox" class="flat"></th> 
                <td><input id="middle-name" type="text" name="middle-name" readonly="readonly" value="${exam.name} - ${exam.code}" class="form-control col-md-7 col-xs-12"></td> 
                <td><input id="middle-name" type="text" name="middle-name" value="0" class="form-control col-md-3 col-xs-12"></td> 
                <td><input id="middle-name" type="text" name="middle-name" value="0" class="form-control col-md-3 col-xs-12"></td> 
                <td><input id="middle-name" type="text" name="middle-name" value="0" class="form-control col-md-3 col-xs-12"></td> 
                <c:choose> 
                 <c:when test="${exam.name == 'Algebra 2 (Common Core)'}"> 
                  <th scope="row"><input type="checkbox" class="flat"></th> 
                 </c:when> 
                 <c:otherwise> 
                  <th scope="row"></th> 
                 </c:otherwise> 
                </c:choose> 
               </tr> 
              </c:forEach> 
<!-- Other Stuff Goes Here --> 
</form:form> 

Короче говоря, будет ли кто-то готов показать мне, как создать форму в пути я описал выше? Заранее спасибо.

ответ

1

Ваш вопрос немного широк, однако вы можете попробовать это, как показано ниже. Я занимался только экзаменами. Принципал для документов будет таким же.

Вам потребуется несколько новых классов для захвата отправленной формы входа:

Форма заказа Захват Подборки

public class OrderForm{ 

    private List<ExamWrapper> allAvailableExams = new ArrayList<>(); 

    private XOptionPrintWrapper selectedWrapper; 

    public OrderForm(){ 

    } 

    //getters and setters 
} 

экзамен Wrapper: Украшает экзамен со свойством «выбранного»

public class ExamWrapper{ 

    private boolean selected; 
    private Exam exam; 

    public ExamWrapper(Exam exam){ 
     this.exam = exams; 
    } 

    //getters and setters 
} 

Изменить В регулятора,

public class OrderController{ 

    //Exams model populated by the method below 
    //moved as we also need it populated on POST 
    @RequestMapping(value = { "/order" }, method = RequestMethod.GET) 
    public String order(ModelMap modelMap) { 

     //only needed on GET so put in model here 
     List<XOptionPrintWrapper> availableWrappers = //someList; 
     modelMap.put("availableWrappers", availableWrappers); 

     return "order"; 
    } 

    //handles for submit 
    //model atribute is automatically populated by the framework 
    @RequestMapping(value = { "/order" }, method = RequestMethod.POST) 
    public String order(@ModelAttribute("orderForm") OrderForm orderForm) { 

     //process selected exams 

     return "nextView"; 
    } 

    //on get populates the initial model for display 
    //on post create an instance which the form params will be bound to 
    @ModelAttribute("orderForm") 
    public OrderForm getOrderForm(){ 
     OrderForm orderForm = new OrderForm(); 
     List<Exam> exams = examService.findAllExams(); 

     for(Exam exam : exams){ 
      orderForm.getAllAvailableExams.add(new ExamWrapper(exam)); 
     } 

     return orderForm; 
    } 
} 

В JSP использованием поддержки Sping для связывания с индексированных свойств:

<form:form method="POST" modelAttribute="orderForm" class="form-horizontal form-label-left"> 
    <c:forEach items="${orderForm.allAvailableExams}" var="exam" varStatus="status"> 
     <tr> 
      <th scope="row"><input name="allAvailableExams[${status.index}].selected" 
        type="checkbox" class="flat"></th> 
     </tr> 
    </c:forEach> 

     <form:select path="selectedWrapper"> 
     <form:options items="${availableWrappers}" 
       itemValue="somePropertyOfXOptionPrintWrapper " 
       itemLabel="somePropertyOfXOptionPrintWrapper " /> 
     </form:select> 
</form> 

я, очевидно, не удалось попробовать все это, но думаю, что все должно быть в порядке.

+0

Спасибо за ответ Алан, я дам вам этот шанс и дам вам знать, как это работает. –

+1

Что вы хотели знать? –

+0

В той же форме мне нужно заполнить выпадающий список и разрешить пользователю выбирать один вариант и публиковать его обратно с остальной информацией. Как мне настроить этот код с приведенным выше кодом? –