2009-06-17 29 views
9

Trong ASP, có các thuộc tính request.formrequest.queryString, nhưng trong Java. Nó có vẻ như chúng ta chỉ có một bộ sưu tập, có thể được truy cập thông qua request.getParamaterMap, getParametersNames, getParameterValues, vvLàm thế nào để xác định xem một tham số đã được "đăng" hoặc "lấy" từ Java?

Có một số cách nào để cho các giá trị đã được đăng lên và những người thân đã được quy định trong URL?


PS:

Những gì tôi đang cố gắng để đạt được là để tạo ra một trang có thể xử lý các tình huống sau đây

  • Đọc biến đến từ các chuỗi truy vấn (được)
  • Đọc một bài đăng với một tên nhất định (ví dụ: "xml").
  • Nếu bài đăng đó bị thiếu, hãy đọc toàn bộ phần thân (với số request.getReader()).

Tôi đang sử dụng tomcat 6.

Theo những gì tôi đã nhìn thấy cho đến nay, nếu tôi ra request.getReader(), giá trị đăng tải không còn xuất hiện trong bộ sưu tập getParamater, tuy nhiên chuỗi truy vấn các thông số vẫn còn ở đó.

Mặt khác, nếu tôi phát hành bất kỳ phương thức getParameters nào, thì getReader sẽ trả về chuỗi trống.

Có vẻ như tôi không thể ăn bánh và ăn nó.

như vậy, tôi nghĩ giải pháp là folowwing:

  • Đọc cơ thể với getReader.
  • Xem nếu bài xml là có (nhược điểm, tôi phải tự phân tích cơ thể.
  • Nếu có, có được nội dung thư http và thoát khỏi những "xml =" phần.
  • Nếu nó không phải , tốt, chỉ nhận được cơ thể
  • đọc các thông số chuỗi truy vấn thông qua request.getParameter

Bất kỳ ý tưởng tốt hơn

  • PS:.? có ai biết làm thế nào để phân tích cú pháp cơ thể sử dụng cùng phương pháp được sử dụng bởi HttpServlet?
  • PS: Here là hàm ASP giải mã. Tôi có nên viết lại nó trong Java không?
  • PS: Cũng found (không có máy để thử nghiệm nó ngay bây giờ)

Chỉ cần làm rõ điều này.Vấn đề có vẻ là rằng với getParameter bạn nhận được giá trị cũng như giá trị được truyền với URL được đăng, xem xét ví dụ sau:

<%@page import="java.util.*"%> 
<% 
    Integer i; 
    String name; 
    String [] values; 

    for (Enumeration e = request.getParameterNames(); e.hasMoreElements();) { 

    name = (String) e.nextElement(); 
    values = request.getParameterValues(name); 

    for (i=0; i < values.length; i ++) { 
     out.println(name + ":" + values[i] + "<br/>"); 
    } 
    } 
%> 

<html> 
<head><title>param test</title> 
</head> 
<body> 
    <form method="post" action="http://localhost:8080/jsp_debug/param_test.jsp?data=from_get"> 
    <input type="text" name="data" value="from_post"> 
    <input type="submit" value="ok"> 
    </form> 
</body> 
</html> 

đầu ra của mã này là

data:from_get 
data:from_post 

... 

Có vẻ như để để tìm thông số đến từ đâu, tôi phải kiểm tra request.getQueryString.

+0

máy chủ gì bạn đang sử dụng? mặt trời HttpServer? – gubby

+0

Bạn sẽ nhận được toàn bộ URL và deserialize các tham số. nếu tham số mong muốn của bạn ở đó, đó là GET. Nếu nó không có nhưng tồn tại, thì đó là tham số POST. – PSyLoCKe

Trả lời

5

Không có cách nào trực tiếp. Không trực tiếp - hãy kiểm tra .getQueryString()

1

Tại sao bạn không bắt đầu kiểm tra các tham số chuỗi truy vấn, nếu bạn không thấy thông tin nào, hãy đăng bài và sau đó tìm ra các biến biểu mẫu?

+0

tham số truy vấn là không có vấn đề, tôi giả sử tôi sẽ allways có chúng xung quanh ... vấn đề là một khi tôi phát hành getReader, getParamters không còn trả về giá trị được đăng ... và tôi đã hy vọng tránh phân tích cú pháp bài đăng ... – opensas

2

Nếu bạn đang viết một servlet, bạn có thể phân biệt bằng cách xem phương thức doGet hoặc doPost được gọi hay không.

public void doGet(HttpServletRequest request, 
        HttpServletResponse response) 
     throws ServletException{ 

//Set a variable or invoke the GET specific logic 
    handleRequest(request, response); 

} 

public void doPost(HttpServletRequest request, 
        HttpServletResponse response) 
     throws ServletException{ 

//Set a variable or invoke the POST specific logic 
handleRequest(request, response); 

} 


public void handleRequest(HttpServletRequest request, 
        HttpServletResponse response) 
     throws ServletException{ 

//Do stuff with the request 

} 
+1

bạn có thể có một bài viết có được thông tin, xem bình luận của tôi để matt b – opensas

22

HttpServletRequest.getMethod():

Trả về tên của phương thức HTTP mà yêu cầu này đã được thực hiện, ví dụ, GET, POST, PUT hoặc. Tương tự như giá trị của biến CGI REQUEST_METHOD.

Tất cả bạn cần làm là:

boolean isPost = "POST".equals(request.getMethod()); 

Ngoài ra tôi thật sự bối rối về lý do tại sao bạn sẽ không chỉ đơn giản là sử dụng request.getParameter("somename") để lấy giá trị gửi như thông số yêu cầu. Phương thức này returns the parameter regardless of whether the request was sent via a GET or a POST:

Thông số yêu cầu là thông tin bổ sung được gửi cùng với yêu cầu. Đối với các servlet HTTP, các tham số được chứa trong chuỗi truy vấn hoặc dữ liệu biểu mẫu được đăng.

Cách đơn giản hơn rất nhiều so với việc tự phân tích cú pháp getQueryString().

+0

Nếu bài viết đã được thực hiện bằng cách sử dụng cơ thể của http, thay vì một tham số, tôi không thể nhận được nó với request.getParameter ("somename"), tôi phải sử dụng request.getReader() ... và sau đó tôi không thể sử dụng yêu cầu nữa.getParameter – opensas

+2

cũng đừng quên tôi có thể có một bài đăng với thông tin chuỗi truy vấn, (bạn chỉ cần một cái gì đó như 'xx.jsp? field1 = value1, field2 = value2' trong tham số hành động của thẻ biểu mẫu), trong trường hợp đó, request.getMethod sẽ trả về "POST", nhưng tôi sẽ có các tham số "được đăng" và "geted" được trộn lẫn trong bộ sưu tập getParameter ... đó là vấn đề ... – opensas

+0

Tôi nghĩ bạn đang sử dụng các thuật ngữ khác hoặc không chính xác để mô tả vấn đề của bạn sau đó. Đọc dữ liệu postdata hoặc multipart khác với chỉ đọc "tham số" –

0

Tôi biết nó không giải quyết được vấn đề của bạn, nhưng nếu tôi nhớ chính xác, khi sử dụng Struts, ActionForm sẽ được điền nếu các biến của bạn được gửi trong chuỗi truy vấn hoặc trong nội dung bài đăng.

Tôi tìm thấy mã nguồn cho lớp RequestUtils, có lẽ phương pháp "cư" là những gì bạn cần:

http://svn.apache.org/repos/asf/struts/struts1/trunk/core/src/main/java/org/apache/struts/util/RequestUtils.java

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