使用多个按钮/帖子处理表单

时间:2010-01-27 14:11:00

标签: java jsp servlets java-ee

我有以下表单设置:

<html>
<head></head>

<body>
<form method="post" enctype="multipart/form-data" action="FileUpload">
    <table>
        <th>WEX SI Online Validation</th>
        <tr>
            <td>Step 1: Select File for Validation: </td>
            <td><input name="filename" type="file"/></td>
        </tr>
        <tr>
            <td>Step 2: Validate File:</td>
            <td><input name="validate" type="button" value="Validate"/></td>
        </tr>
        <tr>
            <td>Step 3: Download and Fix Errors:</td>
            <td><input name="download" type="button" value="Download"/></td>
        </tr>
        <tr>
            <td>Step 4: Submit</td>
            <td><input name="submit" type="submit" value="Submit"/></td>
        </tr>
    </table>
</form>
</body>

</html>

我应该如何处理?我正在使用Java / JSP / Servlets,但我不知道如何处理上传部分和其他操作的帖子。

我认为最好创建某种表单控制器来处理表单的帖子,并根据用户的操作委托给其他servlet。我不知道如何判断用户选择了什么。

6 个答案:

答案 0 :(得分:3)

对于其他所有正常<input>元素,name-value<input type="button">将作为请求参数发送。

主要警告只是<input type="button"><button>元素在MSIE中无法正常运行。在所有MSIE版本中,按钮元素的value属性不会作为参数值发送,而是将发送其正文(标记内容)!

此外,在IE6中还有另一个令人惊讶的错误:不仅会发送按下按钮的名称 - 值对,而且还会发送表单中每个其他未按下按钮的名称 - 值对!这样就无法区分服务器端的按下按钮。

与所有浏览器结合使用的解决方案是使用<input type="submit">并为它们提供不同的名称(或相同的名称,但不同的值)。

E.g。

<input type="submit" name="validate" value="Validate">
<input type="submit" name="download" value="Download">
<input type="submit" name="submit" value="Submit">

结合使用
if (request.getParameter("validate") != null) {
    // Validate button pressed.
} else if (request.getParameter("download") != null) {
    // Download button pressed.
} else if (request.getParameter("submit") != null) {
    // Submit button pressed.
}

<input type="submit" name="action" value="Validate">
<input type="submit" name="action" value="Download">
<input type="submit" name="action" value="Submit">

结合使用
String action = request.getParameter("action");
if ("Validate".equals(action)) {
    // Validate button pressed.
} else if ("Download".equals(action)) {
    // Download button pressed.
} else if ("Submit".equals(action)) {
    // Submit button pressed.
}

最后一种方式提供了更多的可能性,可以在Java级别上更好地抽象一个和另一个。

顺便说一下,我当然假设您已经使用Apache Commons FileUpload来处理多部分表单数据,必要时可以借助Filter which puts the multipart form data back in the request parameter map,否则您将无法从{{3}}获得任何内容{1}}。

答案 1 :(得分:2)

提交按钮的值在POST请求中与所有其他表单值一起传输,名称为按钮名称,值为按钮值。

因此,您可以通过检查与变化按钮相关联的每个键的值的存在来检测按下了哪个按钮(或者如果您将按钮命名为相同,则只能检查该键的值是什么)。

另外,BUTTON元素需要onClick处理程序来实际提交表单和/或做任何工作(对于SUBMIT元素,默认的onClick处理程序调用表单的submit()

答案 2 :(得分:1)

type =“button”按钮不会自动提交表单。只有type =“submit”才会。

如果您想要各自提交并执行不同操作的各种按钮,那么您有几个选项。我认为你提到的有一个servlet的选项决定用户正在做什么并转发给另一个servlet是个好主意。您可以通过在属性映射中查找按钮的名称来判断用户正在做什么。

   String btn = request.getParameter("submitbuttonname");
   if(btn != null){
      //this was the button clicked.
   }

我能想到的第二个选择是将表单分解为多种形式。你需要为每个按钮提交文件吗?如果没有创建一个表单,其中包含您需要使用自己的提交按钮提交的数据。

答案 3 :(得分:0)

Apache Commons FileUpload可以为您处理所有这些。

答案 4 :(得分:0)

可以使用JavaScript处理。

function submitTo(url) {
    form.action = url;
    form.submit();
}

...

<input name="download" onClick="submitTo('/download')" ... />

答案 5 :(得分:0)

最好的方法是让一个表单控制器将逻辑委托给其他类,具体取决于作为参数传递的输入类型值。