【问题标题】:Spring form does not submit when hidden field is added添加隐藏字段时Spring表单不提交
【发布时间】:2013-12-29 15:31:05
【问题描述】:

我在一个jsp文件中有一个如下表格:

form.jsp

<table>
<form:form modelAttribute="command" action="daoselect.app">
    <tr>
        <td>Store this data</td>
        <td><form:checkbox path="query"/>
    </tr>
    <form:hidden path="list"/>
    <tr>
        <td colspan="2" align="right"><input type="submit" value="Submit" /></td>
    </tr>
</form:form>

这就是我的 app-servlet.xml 文件的样子:

app-servlet.xml

<bean name="/daoselect.app" class="de.xx.DAOSelectController">
    <property name="commandClass" value="de.xx.DAOSelectCommand"/>

    <property name="xmlservice" ref="GuestBookDataXML"/>
</bean>

这就是 DAOSelectCommand.java 文件的样子

public class DAOSelectCommand {

private boolean query = false;
private List<GuestBookData> list;

public List<GuestBookData> getList() {
    return list;
}

public void setList(List<GuestBookData> list) {
    this.list = list;
}

public boolean getQuery() {
    return query;
}

public void setQuery(boolean query) {
    this.query = query;
}

public DAOSelectCommand() {

}


/*This constructor is used before loading the jsp file to add the list data to the hidden field*/
public DAOSelectCommand(List<GuestBookData> t) {
    this.list = t;
}

我遇到的问题是当我添加&lt;form:hidden path="list"/&gt; 字段并且浏览器试图加载daoselect.jsp 文件instead 时,DAOSelectController 类的onSubmit 函数没有执行。如果我删除了这个隐藏字段,那么 onSubmit 函数就会正常执行。

为什么会这样?

【问题讨论】:

    标签: java spring jsp jakarta-ee servlets


    【解决方案1】:

    问题在于生成的&lt;input type=hidden&gt; 元素位于 DOM 树中的“意外”位置;浏览器试图理解这一点,但最终将元素重新定位到表格之外,从而将其置于表单之外。这使得对以下&lt;input type=submit&gt; 的解释出现各种错误。弄清楚到底发生了什么让所有东西都进入那种状态会很棘手,而且真的不值得,因为解决方法是将&lt;form:hidden&gt; up 移到&lt;form:checkbox&gt; 旁边,即&lt;tr&gt; 内,并将&lt;form:form&gt; 移出表。这会将元素置于适合此类事物元素的 DOM 上下文中,从而使浏览器不必费力地工作以找出事物的含义(并鼓励它正确处理......)

    <form:form modelAttribute="command" action="daoselect.app">
    <table>
        <tr>
            <td>Store this data</td>
            <td><form:checkbox path="query"/>
                <form:hidden path="list"/></td>
        </tr>
        <tr>
            <td colspan="2" align="right"><input type="submit" value="Submit" /></td>
        </tr>
    </table>
    </form:form>
    

    另外,始终关闭 &lt;td&gt;&lt;table&gt; 元素;它避免了各种问题。

    【讨论】:

    • 我明白你的意思,但是虽然我做了修改,但你建议 onSubmit 函数仍然没有执行。 :(
    • @Stefanos 然后使用浏览器的开发工具查看您实际最终得到的 DOM 树类型,而不仅仅是向我们展示处理的输入。 (另外,你使用的是什么版本的东西?)
    • 我使用了 chrome 检查器,页面源代码看起来与我预期的完全一样……你的意思是不同的吗?我正在使用 Spring 2.5.6
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    相关资源
    最近更新 更多