2010-01-27 23 views
8

tôi đã thiết lập hình thức sau đây:hình thức xử lý với nhiều nút/bài

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

Làm thế nào tôi nên xử lý này? Tôi đang sử dụng Java/JSP/Servlets nhưng tôi không chắc chắn làm thế nào để xử lý các bài viết cho phần tải lên của điều này và hơn các hành động khác.

Tôi nghĩ tốt nhất là nên tạo một số loại trình điều khiển biểu mẫu xử lý bài đăng biểu mẫu và được giao cho các servlet khác tùy thuộc vào những gì người dùng đang làm. Tôi không chắc chắn làm thế nào để nói những gì người dùng đã chọn mặc dù.

Trả lời

3

Đối với mọi thành phần thông thường khác <input>, cặp name-value của <input type="button"> sẽ được gửi làm thông số yêu cầu.

Thông báo chính chỉ là các yếu tố <input type="button"><button> không hoạt động đúng trong MSIE. Trong tất cả các phiên bản MSIE, thuộc tính value của phần tử nút sẽ không được gửi dưới dạng giá trị thông số, nhưng thay vào đó phần tử của nó (nội dung thẻ) sẽ được gửi!

Ngoài ra, trong IE6 có một lỗi đáng kinh ngạc khác: không chỉ cặp tên-giá trị của nút nhấn sẽ được gửi, mà còn của mỗi nút chưa được nhấn trong biểu mẫu cũng sẽ được gửi! Bằng cách này, bạn không thể phân biệt được nút bấm ở phía máy chủ.

Giải pháp hoạt động kết hợp với tất cả các trình duyệt là sử dụng <input type="submit"> và cung cấp cho họ tất cả tên khác (hoặc cùng tên nhưng có giá trị khác).

Ví dụ:

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

kết hợp với

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

hoặc

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

kết hợp với

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

Cách cuối cùng cung cấp khả năng hơn để trừu tượng một và khác hơn độc đáo đi tại Java l evel. Bằng cách này, tất nhiên tôi giả định rằng bạn đã sử dụng Apache Commons FileUpload để xử lý dữ liệu biểu mẫu nhiều phần, nếu cần với sự giúp đỡ của một số Filter which puts the multipart form data back in the request parameter map, nếu không bạn sẽ không nhận được bất cứ điều gì từ HttpServletRequest#getParameter().

+0

Tôi đang cố gắng sử dụng gợi ý cuối cùng bạn đã thực hiện, tất cả các nút gửi, có cùng tên, các giá trị khác nhau, nhưng khi tôi truy xuất hành động từ yêu cầu của tôi, nó luôn là rỗng. Tôi có cùng một html như trên, ngoại trừ với những thay đổi tên. – Casey

+0

Đọc đoạn cuối cùng của câu trả lời của tôi :) – BalusC

+0

Hiện tại, tôi không phân tích cú pháp gì cả. Tôi chỉ có hình thức gọi servlet điều khiển của tôi. Tuy nhiên, vì biểu mẫu được đặt thành multipart/form-data, tôi lấy nó, tôi phải đặt thông tin vào đúng chỗ? – Casey

0

Apache Commons FileUpload có thể xử lý tất cả những điều này cho bạn.

+0

và cách chính xác? – Bozho

+0

Tôi đã sử dụng nó để xử lý tải lên thực tế. Không phải tất cả các nút đều đang gửi tệp nhưng kích hoạt các quy trình khác trong nền. – Casey

1

Nút loại = "nút" không tự động gửi biểu mẫu. Chỉ loại = "gửi" sẽ.

Nếu bạn muốn các nút khác nhau mà mỗi lần gửi và thực hiện các tác vụ khác nhau thì bạn có một số tùy chọn. Tôi nghĩ rằng tùy chọn bạn đề cập để có một servlet đơn quyết định những gì người dùng đang làm và chuyển tiếp đến một servlet khác là một ý tưởng hay. Bạn có thể biết người dùng đang làm gì bằng cách tìm kiếm tên của nút trong bản đồ thuộc tính.

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

Tùy chọn thứ hai mà tôi có thể nghĩ là chia nhỏ biểu mẫu thành nhiều biểu mẫu. Bạn có cần gửi tệp cho mỗi nút không? Nếu không tạo một biểu mẫu với dữ liệu mà bạn cần gửi mỗi biểu mẫu với nút gửi của chính nó.

2

Giá trị của nút gửi được truyền trong yêu cầu POST cùng với tất cả các giá trị biểu mẫu khác, với tên là tên nút và giá trị là giá trị nút. Vì vậy, bạn có thể phát hiện nút nào được đẩy bằng cách kiểm tra sự tồn tại của các giá trị cho mỗi khóa được liên kết với các nút khác nhau (hoặc nếu bạn đặt tên cho các nút giống nhau, bạn chỉ có thể kiểm tra giá trị của khóa).

Ngoài ra, các yếu tố NÚT cần xử lý onClick để thực sự gửi biểu mẫu và/hoặc làm bất cứ công việc (đối với SUBMIT yếu tố mặc định onClick handler gọi của hình thức submit())

0

Nó có thể được xử lý với JavaScript.

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

...

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

Cách tiếp cận tốt nhất là phải có một bộ điều khiển hình thức ủy logic đến các lớp học khác, tùy thuộc vào giá trị loại đầu vào thông qua như là tham số.

Các vấn đề liên quan