2010-06-03 44 views
5

Có cách nào để đặt yêu cầu thuộc tính (không phải thông số) khi biểu mẫu được đăng không?Đặt thuộc tính yêu cầu khi Biểu mẫu được đăng

Vấn đề tôi đang cố giải quyết là: Tôi có trang JSP hiển thị một số dữ liệu trong một vài danh sách thả xuống. Khi biểu mẫu được đăng, servlet Controller của tôi xử lý yêu cầu này (dựa trên các tham số được thiết lập/được chỉ định trong biểu mẫu) và chuyển hướng đến cùng một trang JSP được cho là hiển thị các chi tiết bổ sung. Bây giờ tôi muốn hiển thị cùng một dữ liệu/trước đó trong danh sách thả xuống mà không phải tính toán lại hoặc tính toán lại để có được cùng dữ liệu đó.

Và trong trang JSP đã nói, danh sách thả xuống trong biểu mẫu được điền bằng dữ liệu được chỉ định thông qua các thuộc tính yêu cầu. Ngay bây giờ, sau khi Biểu mẫu được BÀI ĐĂNG và tôi được chuyển hướng đến cùng một trang JSP, các danh sách thả xuống bị trống vì các thuộc tính yêu cầu cần thiết không có mặt.

Tôi khá là n00b khi nói đến các ứng dụng web, do đó, một giải pháp dễ dàng & dễ dàng cho vấn đề này thoát khỏi tôi vào lúc này!

Tôi đang mở cho các đề xuất về cách cấu trúc lại luồng điều khiển trong Servlet.

Một số chi tiết về ứng dụng này: tiêu chuẩn Servlet + JSP, JSTL, chạy trong Apache Tomcat 6.0.

Cảm ơn.

+0

Bạn có nghĩa là tham số chuỗi truy vấn không? – Affe

+0

Không, tôi có nghĩa là các thuộc tính phạm vi yêu cầu. Tôi muốn giữ chuỗi truy vấn ngắn và ngọt nhất có thể. – ssahmed555

+0

Bạn có thể đăng mã mẫu từ JSP của mình không? – Michael

Trả lời

4

.. và chuyển hướng đến cùng một trang JSP ..

Bạn không nên bắn một chuyển hướng ở đây, nhưng một mong. I E. không làm

response.sendRedirect("page.jsp"); 

nhưng thay vì làm

request.getRequestDispatcher("page.jsp").forward(request, response); 

Bằng cách này, yêu cầu ban đầu vẫn còn sống, bao gồm tất cả các thông số và các thuộc tính. Chuyển hướng cụ thể là hướng dẫn khách hàng kích hoạt yêu cầu hoàn toàn mới theo yêu cầu, bằng cách này sẽ hủy yêu cầu ban đầu.

Trong JSP bạn có thể truy cập vào các thông số yêu cầu của ${param} trong EL và bạn có thể truy cập yêu cầu các thuộc tính theo cùng một cách với ${attributeKey} nơi attributeKey là chìa khóa thuộc tính mà bạn đã sử dụng để thiết lập các đối tượng trong phạm vi yêu cầu trong servlet như sau :

request.setAttribute("attributeKey", someObject); 

Như để duy trì các giá trị đầu vào HTML trong một JSP, bạn chỉ cần thiết lập value attribtue các <input> phần tử phù hợp với các giá trị tham số yêu cầu:

<input name="foo" value="${param.foo}"> 

Điều này in kết quả của request.getParameter("foo") trong văn bản mẫu. Đây có tuy nhiên nguy cơ XSS, tốt hơn là để thoát khỏi bất kỳ người sử dụng kiểm soát đầu vào với sự giúp đỡ của fn:escapeXml() JSTL như sau:

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> 
... 
<input name="foo" value="${fn:escapeXml(param.foo)}"> 

Giữ lại các tùy chọn được chọn trong một danh sách thả xuống là một câu chuyện khác nhau chút.Về cơ bản, bạn cần đặt thuộc tính selected của phần tử <option> được đề cập. Giả sử bạn có thể sử dụng thẻ <c:forEach> của JSTL để hiển thị Map<String, String> hoặc có thể là List<JavaBean> giá trị tùy chọn, bạn có thể giải quyết nó như sau (giả sử ${countries}Map<String, String> mà bạn đã đặt làm thuộc tính trong phạm vi yêu cầu, phiên hoặc phạm vi ứng dụng):

<select name="country"> 
    <c:forEach items="${countries}" var="country"> 
     <option value="${country.key}" ${country.key == param.country ? 'selected' : ''}>${country.value}</option> 
    </c:forEach> 
</select> 

Thuộc tính này khi khóa tùy chọn hiện tại lặp lại bằng khóa được gửi trong bản đồ tham số yêu cầu.

+0

Tôi quên đề cập đến rằng tôi đã làm một 'rd.forward (yêu cầu, phản hồi)'. Nhưng những gì gây nhầm lẫn cho tôi ngay bây giờ là sau khi forward() danh sách thả xuống của JSP trống - và tôi có thể thấy trong màn hình HTTP của Netbeans rằng các thuộc tính yêu cầu chứa dữ liệu được sử dụng để điền danh sách thả xuống không còn hiện diện sau khi chuyển tiếp() hoàn thành. Tôi đang mất tích! – ssahmed555

+1

Huh, màn hình HTTP? Bạn không nhầm lẫn các thuộc tính yêu cầu với các tham số yêu cầu? Các thuộc tính không hiển thị trong tiêu đề/phản hồi HTTP/body, nhưng chỉ trong bộ nhớ của máy chủ. Các tham số yêu cầu được hiển thị trong tiêu đề/phản hồi HTTP request/body. Bạn thực sự cần phải cung cấp thêm chi tiết về vấn đề này. Bất kể, câu trả lời của tôi có mang lại những hiểu biết mới không? – BalusC

+0

Không, nhưng màn hình HTTP của NB có thể gỡ lỗi yêu cầu HTTP và lưu lượng phản hồi giữa các thành phần khác nhau trong ứng dụng web và hiển thị cả thông số yêu cầu và thuộc tính yêu cầu - khi có sẵn. – ssahmed555

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