java - 如何将对象传递给表单:输入字段生成到模板
问题描述
我正在使用 Spring 和 jsp 创建表单布局。我有一个用于生成表单输入字段的 FormFields 类。它有 2 个 CustomData 对象。现在我正在使用不同的 jsp 页面为两个 CustomData 对象生成表单输入字段。为了减少样板代码,我想使用模板,但我似乎无法弄清楚如何将对象数据作为表单输入传递。到目前为止,我一直在使用这种方法进行输入生成:
<form:form modelAttribute="formFields" method="post" enctype="multipart/form-data">
<c:if test="${not empty formFields.initialData}">
<form:input path="initialData.number"/>
<form:input path="initialData.dateFrom"/>
</c:if>
<c:if test="${not empty formFields.updatedData}">
<form:input path="updatedData.number"/>
<form:input path="updatedData.dateFrom"/>
</c:if>
</form:form>
但这远非完美,因为我必须重用代码。我试图将对象作为参数传递给包含的 jsp 页面,但 form:input 标记似乎无法正确呈现它。
索引.jsp
<jsp:include page="/WEB-INF/jsp/test/includeTest.jsp">
<jsp:param name="initialDataTest" value="${formFields.initialData}" />
</jsp:include>
包含测试.jsp
<form:input path="param.initialDataTest.number"/>
<form:input path="param.initialDataTest.dateFrom"/>
我也尝试将对象传递给模板,如下所示:
索引.jsp
<c:set var="initialData" value="${formFields.initialData}" scope="request"/>
<jsp:include page="/WEB-INF/jsp/test/includeTest.jsp" />
包含测试.jsp
<form:input path="initialData.number"/>
<form:input path="initialData.dateFrom"/>
那么将对象传递给jsp模板并避免样板代码的最佳实践是什么?我会很感激任何答案。
更多代码:
自定义数据.java
public class CustomData implements java.io.Serializable {
//
// variables
//
// number
private String number;
// valid form
private Date validFrom;
//
// getters/setters
//
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public Date getValidFrom() {
return validFrom;
}
public void setValidFrom(Date validFrom) {
this.validFrom = validFrom;
}
}
FormFields.java
public class FormFields implements java.io.Serializable {
//
// variables
//
// key
private String key;
// initial data
private CustomData initialData;
// updated data
private CustomData updatedData;
//
// contructors
//
public FormFields()
{
}
public FormFields(String key)
{
this.key = key;
this.initialData = null;
this.updatedData = null;
}
//
// getters/setters
//
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public CustomData getInitialData() {
return initialData;
}
public void setInitialData(CustomData initialData) {
this.initialData = initialData;
}
public CustomData getUpdatedData() {
return updatedData;
}
public void setUpdatedData(CustomData updatedData) {
this.updatedData = updatedData;
}
}
测试控制器.java
@RequestMapping(value = "test", method = RequestMethod.GET)
public String getTestPage(Model model, @RequestParam(required = false) String key)
{
// fields
FormFields fields = null;
if (StringHelper.IsNullOrEmpty(key))
{
// initialize fields
fields = new FormForeignPersonRegisterFields();
// store fields
session.setFormFields(fields.getKey(), fields);
return "redirect:/test?key=" + fields.getKey();
}
else
{
fields = session.getFormFields(key);
}
// add fields to model
model.addAttribute("formFields", fields);
return "test/index";
}
索引.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page pageEncoding="UTF-8"%>
<%@ page session="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<html>
<head></head>
<body>
<div>
<form:form modelAttribute="formFields" method="post" enctype="multipart/form-data">
<form:input path="key" />
<c:if test="${not empty formFields.initialData}">
<form:input path="initialData.number"/>
<form:input path="initialData.dateFrom"/>
</c:if>
<jsp:include page="/WEB-INF/jsp/test/includeTest.jsp">
<jsp:param name="initialDataTest" value="${formFields.initialData}" />
</jsp:include>
</form:form>
</div>
</body>
</html>
包含测试.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page pageEncoding="UTF-8"%>
<%@ page session="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<div class="testInclude">
<c:if test="${not empty param.initialDataTest}">
<form:input path="param.initialDataTest.number"/>
<form:input path="param.initialDataTest.dateFrom"/>
</c:if>
</div>
解决方案
推荐阅读
- javascript - 如何使用 keyup 函数删除 div 类?
- flask - jinja2 中的范围和 url_for
- angular - 基于全局变量的动态路由
- powerbi - 《COUNTIFS》我们在 Power BI 中是否也有类似的乐趣
- r - rmarkdown中的数据表交叉标签
- sql - 我有 AWS API 网关,它通过主体映射模板与 lambda 函数集成
- powerbi - 带有“,”的货币数据类型
- ionic-framework - Ionic 4 嵌套选项卡
- nativescript-vue - 网格布局中的非活动按钮 - Nativescript-vue
- python - Pandas - zfill 混合列中的仅数值