Spring4MVC表单:使用子对象列表创建对象
我正在寻找帮助,了解如何通过一个表单创建一个新对象,该表单让用户选择多个子对象(将预先填充)并可通过复选框进行选择 OrderController.javaSpring4MVC表单:使用子对象列表创建对象,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&
@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转换为相关类型(例如,通过数据库查找)。