首页 > 解决方案 > 如何将对象传递给表单:输入字段生成到模板

问题描述

我正在使用 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>

标签: javaspringjsp

解决方案


推荐阅读