代码之家  ›  专栏  ›  技术社区  ›  Casey

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

  •  8
  • Casey  · 技术社区  · 15 年前

    我有以下表单设置:

    <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/Servlet,但不知道如何处理这个上传部分的帖子,而不是其他操作。

    我认为最好创建一种表单控制器,它处理表单的发布,并根据用户所做的工作委托给其他servlet。但我不知道如何知道用户选择了什么。

    6 回复  |  直到 7 年前
        1
  •  3
  •   BalusC    15 年前

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

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

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

    与所有浏览器结合使用的解决方案是 <input type="submit"> 给他们一个不同的名字(或者相同的名字,但是不同的值)。

    例如。

    <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 ,否则您将无法从 HttpServletRequest#getParameter() .

        2
  •  2
  •   DVK    15 年前

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

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

    此外,button元素需要onclick处理程序来实际提交表单和/或执行任何工作(对于submit元素,默认onclick处理程序调用表单的 submit() )

        3
  •  1
  •   Vincent Ramdhanie    15 年前

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

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

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

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

        4
  •  0
  •   kgiannakakis    15 年前

    Apache Commons FileUpload 可以帮你处理所有这些。

        5
  •  0
  •   artemb    15 年前

    它可以用javascript处理。

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

    <input name="download" onClick="submitTo('/download')" ... />
    
        6
  •  0
  •   Aito    15 年前

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