Nó thực sự không rõ ràng trong definied spec Servlet, nhưng ít nhất các hình thức HTML spec definies nó một cách rõ ràng trong phần application/x-www-form-urlencoded:
2.The tên kiểm soát/giá trị được liệt kê theo thứ tự chúng xuất hiện trong tài liệu.
Vì vậy, phần đó an toàn.Bây giờ servletcontainer, một cách hợp lý, việc thực hiện tốt và hiệu quả sẽ xử lý luồng đầu vào HTTP ngay lập tức khi nó đi vào, vì vậy các tham số sẽ được xử lý theo thứ tự như chúng xuất hiện trong URI yêu cầu (GET) hoặc cơ thể yêu cầu (POST). Thu thập chúng trong một String[]
là sự lựa chọn đơn giản nhất vì nó cũng được sử dụng như trong API Servlet, vì vậy tôi thực sự không thấy bất kỳ lý do nào để thu thập nó theo cấu trúc HashSet
trước, hoặc thực hiện Collections#shuffle()
hoặc bất kỳ thứ gì chuyển đổi nó thành String[]
sau đó. Tôi có thể ít nhất là từ kinh nghiệm, Tomcat làm đúng cách, vì vậy tất cả các thùng chứa/ứng dụng chính được xây dựng trên đỉnh của Tomcat/Catalina (Websphere của IBM, JBoss AS, Sun Glassfish, v.v.) cũng sẽ hành xử như vậy . Tôi chỉ không có kinh nghiệm với Weblogic, nhưng tôi sẽ ngạc nhiên nếu nó xử lý nó một cách khác nhau (đọc: kém hiệu quả hơn).
Chỉ có thứ tự của tham số tên không được đảm bảo, hợp lý bởi vì nó được hỗ trợ bởi HashMap
.
Tóm tắt: tham số được thu thập trong HashMap<String, String[]>
. Tên được kiểm dịch không được đặt hàng do bản chất của HashMap
. Các giá trị (một tên thông số có thể có nhiều giá trị, ví dụ: foo=bar1&foo=bar2&foo=bar3
) lần lượt được đặt hàng do bản chất của String[]
, mặc dù điều này không được chỉ định rõ ràng trong API Servlet.
Để an toàn, bạn muốn sử dụng một cách tiếp cận khác, ví dụ:
foos=3&foo[0]=bar1&foo[1]=bar2&foo[2]=bar3
với
int foos = Integer.valueOf(request.getParameter("foos"));
for (int i = 0; i < foos; i++) {
int foo = Integer.valueOf(request.getParameter("foo[" + i + "]"));
}
Vì HttpServletRequest là một giao diện, nó phụ thuộc vào việc thực hiện nó. Mặc dù tôi sẽ ngạc nhiên nếu có một triển khai không trả lại các giá trị theo thứ tự nhận được. – Fortega
Tài liệu giao diện * có thể * dictate hành vi nếu nhà thiết kế để lựa chọn, nhưng trong trường hợp này họ đã không. – skaffman