Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring4MVC表单:使用子对象列表创建对象_Spring_Spring Mvc_Spring Data - Fatal编程技术网

Spring4MVC表单:使用子对象列表创建对象

Spring4MVC表单:使用子对象列表创建对象,spring,spring-mvc,spring-data,Spring,Spring Mvc,Spring Data,我正在寻找帮助,了解如何通过一个表单创建一个新对象,该表单让用户选择多个子对象(将预先填充)并可通过复选框进行选择 OrderController.java @RequestMapping(value = { "/order" }, method = RequestMethod.GET) public String order(ModelMap model) { List<Exam> exams = examService.findAllExams(); List&

我正在寻找帮助,了解如何通过一个表单创建一个新对象,该表单让用户选择多个子对象(将预先填充)并可通过复选框进行选择

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
}
@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
    }
@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
}
@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
}
Exam.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
}
@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
    }
@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
}
@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
}
@实体
@表(name=“考试”)
公共类考试实现了可序列化
{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“exam\u id”,unique=true,nullable=false)
私有整数id;
@空空如也
@列(name=“name”,unique=true,nullable=false)
私有字符串名称;
@空空如也
@列(name=“code”,unique=true,nullable=false)
私有字符串码;
@OneToMany(fetch=FetchType.LAZY,mappedBy=“考试”)
私有集检查=新哈希集(0);
//接球手和接球手
}
如您所见,我正在提交一份考试和文档列表,这些列表将用可用选项填充表单(如下图所示(无论如何都要考试)。用户需要能够选择多行,以便一个订单具有多个相关联的检查和文档

我的order.jsp对于在这里发布整个内容来说有点过分,但这是我在上图中显示的部分

Order.jsp

<form:form method="POST" modelAttribute="order" class="form-horizontal form-label-left">



总之,是否有人愿意向我展示如何按照我上面描述的方式设置表单?提前谢谢。

您的问题有点宽泛,但您可以尝试以下方法。我只参加了考试。文件的委托人将是相同的

您需要几个新类来捕获提交的表单输入:

用于捕获选择的订单

public class OrderForm{

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

    private XOptionPrintWrapper selectedWrapper;

    public OrderForm(){

    }

    //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;
    }
}
公共类OrderController{
//考试模型由下面的方法填充
//移动,因为我们还需要在POST上填充它
@RequestMapping(值={“/order”},方法=RequestMethod.GET)
公共字符串顺序(ModelMap ModelMap){
//只需要在这里放进模型
List availableWrappers=//someList;
放置(“availableWrappers”,availableWrappers);
返回“订单”;
}
//提交的句柄
//模型atribute由框架自动填充
@RequestMapping(值={“/order”},方法=RequestMethod.POST)
公共字符串顺序(@modeldattribute(“orderForm”)orderForm orderForm){
//处理选定的考试
返回“nextView”;
}
//on get填充初始模型以进行显示
//在post上创建表单参数将绑定到的实例
@ModelAttribute(“订单”)
public OrderForm getOrderForm(){
OrderForm OrderForm=新的OrderForm();
列表检查=examService.findAllExams();
用于(考试:考试){
orderForm.getAllAvailableExams.add(新的ExamRapper(考试));
}
退货订单;
}
}
在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>


很明显,我还没能尝试所有这些,但我认为应该没问题。

谢谢你的回复,艾伦,我会给你一个机会,让你知道它是如何运作的。你想知道什么?在同样的形式下,我需要填充一个下拉列表,允许用户选择一个选项,然后将其与其余信息一起发布回来。我将如何使用您上面提供的代码进行设置?我尝试向表单中添加“private List allAvailableOptionPrints=new ArrayList();”,类似于OrderForm类。我像在getOrderForm方法中一样填充了它。但当涉及到获取要发布的数据时,我想我不确定该怎么办。请参阅控制器、订单和JSP表单中的更新以获取方法。要实现这一点,您需要注册一个简单的转换器,该转换器将自动将所选表单选项的id转换为相关类型(例如,通过数据库查找)。