2010-01-27 14 views
8

ich das folgende Formular-Setup haben:Handhabung Formen mit mehreren Tasten/posts

<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> 

Wie soll ich damit umgehen? Ich verwende Java/JSP/Servlets, bin mir aber nicht sicher, wie ich den Post für den Upload-Teil und die anderen Aktionen behandeln soll.

Ich denke, es wäre am besten, eine Art Formular-Controller zu erstellen, der den Post des Formulars behandelt und an andere Servlets delegiert je nachdem, was der Benutzer tut. Ich weiß nicht, wie ich sagen soll, was der Benutzer ausgewählt hat.

Antwort

3

Wie bei jedem anderen normalen <input> Element wird das Paar eines <input type="button"> als Anforderungsparameter gesendet.

Der Hauptvorbehalt ist nur, dass <input type="button"> und <button> Elemente in MSIE nicht ordnungsgemäß funktioniert. In allen MSIE-Versionen wird das value-Attribut eines Schaltflächenelements nicht als Parameterwert gesendet, sondern sein Body (der Tag-Inhalt) wird gesendet!

Auch im IE6 gibt es einen weiteren erstaunlichen Bug: nicht nur das Name-Wert-Paar der gedrückten Taste wird gesendet, sondern auch die von jeder anderen nicht gedrückten Taste im Formular! Auf diese Weise können Sie den gedrückten Knopf auf der Serverseite überhaupt nicht unterscheiden.

Die Lösung, die in Kombination mit allen Browsern funktioniert, ist <input type="submit"> zu verwenden und ihnen alle einen anderen Namen (oder den gleichen Namen aber einen anderen Wert) zu geben.

z.

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

in Kombination mit

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. 
} 

oder

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

in Kombination mit

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. 
} 

Der letzte Weg schön weg mehr Möglichkeiten zu abstrahieren die eine und andere mehr bietet bei Java l Evel.

By the way, ich gehe davon natürlich, dass Sie bereits Apache Commons FileUpload verwenden die Multipart-Formulardaten zu verarbeiten, mit Hilfe eines Filter which puts the multipart form data back in the request parameter map wenn nötig, sonst werden Sie nichts von HttpServletRequest#getParameter() bekommen.

+0

Ich versuche, den letzten Vorschlag, den Sie gemacht haben, alle Schaltflächen mit dem gleichen Namen, verschiedene Werte zu senden, aber wenn ich die Aktion von meiner Anfrage abrufen, ist es immer Null. Ich habe den gleichen HTML-Code wie oben, außer dass sich der Name ändert. – Casey

+0

Lesen Sie den letzten Absatz meiner Antwort :) – BalusC

+0

Momentan analysiere ich nichts. Ich habe nur das Formular, das mein Controller-Servlet aufruft. Da das Formular jedoch auf multipart/form-data gesetzt ist, nehme ich an, dass ich die Informationen an die richtige Stelle setzen muss? – Casey

0

Apache Commons FileUpload können alle diese für Sie behandeln.

+0

und wie genau? – Bozho

+0

Ich benutze es bereits, um den eigentlichen Upload zu verarbeiten. Nicht alle Schaltflächen senden Dateien, sondern lösen andere Prozesse im Hintergrund aus. – Casey

1

Die Schaltflächen type = "button" senden das Formular nicht automatisch. Nur der type = "submit" wird.

Wenn Sie verschiedene Schaltflächen möchten, die jeweils verschiedene Aktionen übermitteln und ausführen, haben Sie mehrere Möglichkeiten. Ich denke, dass die Option, die Sie erwähnen, um ein einzelnes Servlet zu haben, entscheiden, was der Benutzer tut, und zu einem anderen Servlet weiterleiten, ist eine gute Idee. Sie können erkennen, was der Benutzer tut, indem Sie in der Attributzuordnung nach dem Namen der Schaltfläche suchen.

Die zweite Option, die ich mir vorstellen kann, besteht darin, das Formular in mehrere Formulare aufzuteilen. Müssen Sie die Datei für jede Schaltfläche übermitteln? Wenn nicht, erstellen Sie ein Formular mit den Daten, die Sie jeweils mit einer eigenen Senden-Schaltfläche senden müssen.

2

Der Wert der Übermittlungsschaltfläche wird in der POST-Anforderung zusammen mit allen anderen Formularwerten übertragen, wobei der Name der Schaltflächenname und der Wert der Schaltflächenwert ist.

So können Sie erkennen, welche Taste gedrückt wurde, indem Sie die Existenz von Werten für jede Taste mit variierenden Tasten überprüfen (oder wenn Sie Ihre Tasten gleich benennen, können Sie einfach überprüfen, wie der Wert des Schlüssels ist).

Außerdem müssen BUTTON Elemente onClick-Handler, um tatsächlich das Formular und/oder jede Arbeit tun (zum Zustellen Elemente des Standard onClick-Handler der submit() der Form nennt)

0

Es kann mit JavaScript behandelt werden.

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

...

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

Der beste Ansatz ist es, eine Form Controller haben, um die Logik zu anderen Klassen zu übertragen, auf den Typ Eingangswerte abhängig als Parameter übergeben.