2010-01-27 34 views
8

我有以下形式設置:處理形式與多個按鈕/職位

<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。我不知道如何分辨用戶選擇的內容。

回答

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 l埃維爾。順便說一下,我當然假設你已經在使用Apache Commons FileUpload來處理多部分表格數據,如果需要的話,在Filter which puts the multipart form data back in the request parameter map的幫助下,否則你將不會從HttpServletRequest#getParameter()得到任何東西。

+0

我正在嘗試使用您所做的最後一個建議,所有提交按鈕都具有相同的名稱和不同的值,但是當我從我的請求中檢索到該操作時,它始終爲空。除了名稱更改之外,我擁有與上述相同的HTML。 – Casey 2010-01-27 16:00:48

+0

閱讀我答案的最後一段:) – BalusC 2010-01-27 16:17:40

+0

目前,我沒有解析任何東西。我只是調用我的控制器servlet。但是,由於表單設置爲多部分/表單數據,因此我必須將信息放在正確的位置? – Casey 2010-01-27 17:43:16

0

Apache Commons FileUpload可以處理所有這些給你。

+0

怎麼樣? – Bozho 2010-01-27 14:24:24

+0

我已經在使用它來處理實際上傳。並非所有按鈕都提交文件,但在後臺觸發其他進程。 – Casey 2010-01-27 14:25:59

1

type =「button」按鈕不會自動提交表單。只有類型=「提交」將會。

如果你想要各種提交併執行不同操作的按鈕,那麼你有幾個選項。我認爲你提到的具有單個servlet的選項決定了用戶在做什麼並轉發到另一個servlet是個不錯的主意。您可以通過查找屬性映射中按鈕的名稱來告訴用戶正在做什麼。

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

我能想到的第二種選擇是將窗體分解爲多個窗體。你需要提交每個按鈕的文件嗎?如果沒有創建一個包含您需要使用自己的提交按鈕提交數據的表單。

2

提交按鈕的值在POST請求中與所有其他表單值一起傳輸,其中名稱是按鈕名稱,值是按鈕值。

因此,通過檢查與各種按鈕相關聯的每個按鍵的值的存在情況(或者如果您將按鈕命名爲相同,您只能檢查按鍵的值是多少),您可以檢測到哪個按鈕被按下。

此外,BUTTON元素需要onclick處理實際提交表單和/或做任何工作(對於提交元素的默認的onClick處理程序調用形式的submit()

0

它可以用JavaScript來處理。

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

...

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

的最好的方法是有一個表格控制器委派邏輯他人類,這取決於作爲參數傳遞的輸入類型值。