2011-02-08 56 views
107

Tôi đang tạo một bộ điều khiển phía trước đơn giản, rất nhẹ. Tôi cần phải phù hợp với đường dẫn yêu cầu để xử lý khác nhau (hành động) để chọn một trong những chính xác.Sự khác biệt giữa phương thức getRequestURI và getPathInfo trong HttpServletRequest là gì?

Trên máy cục bộ của tôi HttpServletRequest.getPathInfo()HttpServletRequest.getRequestURI() trả về cùng một kết quả. Nhưng tôi không chắc họ sẽ trở lại điều gì trong môi trường sản xuất.

Vì vậy, sự khác biệt giữa phương pháp này và những gì tôi nên chọn?

+1

Bạn có thể tìm thấy [câu trả lời này] (http://stackoverflow.com/questions/3541077/design-patterns-web-based-applications/3542297 # 3542297) cũng hữu ích. – BalusC

+0

@BalusC: cảm ơn, tôi đã sử dụng một số mẹo từ câu trả lời đó. – Roman

Trả lời

60

getPathInfo() cung cấp thông tin đường dẫn bổ sung sau URI, được sử dụng để truy cập vào Servlet của bạn, trong đó getRequestURI() cung cấp URI hoàn chỉnh.

Tôi đã nghĩ rằng chúng sẽ khác, vì Servlet phải được cấu hình với mẫu URI của nó ngay từ đầu; Tôi không nghĩ mình đã từng phục vụ Servlet từ gốc (/).

Ví dụ nếu Servlet 'Foo' được ánh xạ tới URI '/ foo' sau đó tôi đã có thể nghĩ URI:

/foo/path/to/resource 

sẽ dẫn đến:

RequestURI = /foo/path/to/resource 

PathInfo = /path/to/resource 
+11

đáng nhắc đến về hành vi giải mã. getRequestURI() không giải mã chuỗi. Trường hợp getPathInfo() không giải mã. –

+0

@KcDoD +1 cho điểm rất quan trọng này. –

16

Xem xét conf servlet sau:

<servlet> 
     <servlet-name>NewServlet</servlet-name> 
     <servlet-class>NewServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>NewServlet</servlet-name> 
     <url-pattern>/NewServlet/*</url-pattern> 
    </servlet-mapping> 

Bây giờ, khi tôi nhấn URL http://localhost:8084/JSPTemp1/NewServlet/jhi, nó sẽ gọi NewServlet vì nó được ánh xạ với các mô hình mô tả ở trên.

đây:

getRequestURI() = /JSPTemp1/NewServlet/jhi 
getPathInfo() = /jhi 

Chúng tôi có những người thân:

  • getPathInfo()

    lợi nhuận
    một String, giải mã bởi những trang web chứa, quy định cụ thể thêm thông tin đường dẫn mà đến một fter đường dẫn servlet nhưng trước chuỗi truy vấn trong URL yêu cầu; hoặc null nếu URL không có bất kỳ thông tin đường dẫn thêm

  • getRequestURI()

    lợi nhuận
    một String chứa một phần của URL từ tên giao thức lên đến chuỗi truy vấn

339

Tôi sẽ đặt một bảng so sánh nhỏ ở đây (chỉ để có nó ở đâu đó):

Servlet được ánh xạ là /test%3F/* và ứng dụng được triển khai theo /app.

http://30thh.loc:8480/app/test%3F/a%3F+b;jsessionid=S%3F+ID?p+1=c+d&p+2=e+f#a

Method    URL-Decoded Result   
---------------------------------------------------- 
getContextPath()  no  /app 
getLocalAddr()     127.0.0.1 
getLocalName()     30thh.loc 
getLocalPort()     8480 
getMethod()      GET 
getPathInfo()   yes  /a?+b 
getProtocol()     HTTP/1.1 
getQueryString()  no  p+1=c+d&p+2=e+f 
getRequestedSessionId() no  S%3F+ID 
getRequestURI()   no  /app/test%3F/a%3F+b;jsessionid=S+ID 
getRequestURL()   no  http://30thh.loc:8480/app/test%3F/a%3F+b;jsessionid=S+ID 
getScheme()      http 
getServerName()     30thh.loc 
getServerPort()     8480 
getServletPath()  yes  /test? 
getParameterNames()  yes  [p 2, p 1] 
getParameter("p 1")  yes  c d 

Trong ví dụ trên máy chủ đang chạy trên localhost:8480 và tên 30thh.loc đã được đưa vào hệ điều hành hosts tập tin.

Comments

  • "+" được xử lý như không gian duy nhất trong chuỗi truy vấn

  • Neo "#A" không được chuyển đến máy chủ. Chỉ có trình duyệt mới có thể làm việc với nó.

  • Nếu url-pattern trong việc lập bản đồ servlet không kết thúc với * (ví dụ /test hoặc *.jsp), getPathInfo() lợi nhuận null.

Nếu Spring MVC được sử dụng

  • Phương pháp getPathInfo() trả null.

  • Phương thức getServletPath() trả về phần giữa đường dẫn ngữ cảnh và ID phiên.Trong ví dụ trên giá trị sẽ là /test?/a?+b

  • Hãy cẩn thận với các phần được mã hóa URL của @RequestMapping@RequestParam vào mùa xuân. Đó là lỗi (phiên bản hiện tại 3.2.4) và thường là not working as expected.

+7

Tôi đang in câu trả lời của bạn và đặt nó lên như một áp phích trên văn phòng của chúng tôi. Đó là cách nó hữu ích! –

+1

'Nếu url-pattern trong bản đồ servlet không kết thúc bằng * (ví dụ/test hoặc * .jsp), getPathInfo() trả về null.' rực rỡ. –

+1

Tôi tin rằng cả hai getRequestURI() 'và' getRequestURL() 'nên trả về jsessionid không giải mã, trong trường hợp này' S% 3F + ID'. Ít nhất nó có trên Tomcat/8.5.6. –

10

Hãy phá vỡ toàn bộ URL mà một khách hàng sẽ gõ vào thanh địa chỉ của họ để đạt được servlet của bạn:

http://www.example.com:80/awesome-application/path/to/servlet/path/info?a=1&b=2#boo

Các bộ phận là:

  1. Đề án: http
  2. tên máy chủ: www.example.com
  3. cổng: 80
  4. đường dẫn ngữ cảnh: awesome-application
  5. đường servlet: path/to/servlet
  6. thông tin đường dẫn: path/info
  7. truy vấn: a=1&b=2
  8. đoạn: boo

Yêu cầu URI (được trả về bởi getRequestURI) tương ứng với các phần 4, 5 và 6.

(bất ngờ, mặc dù bạn không yêu cầu điều này, phương pháp getRequestURL sẽ cung cấp cho bạn các phần 1, 2, 3, 4, 5 và 6).

Bây giờ là:

  • từng phần 4 (con đường ngữ cảnh) được sử dụng để chọn ứng dụng cụ thể của bạn từ nhiều ứng dụng khác có thể được chạy trong máy chủ
  • phần 5 (con đường servlet) được sử dụng để chọn một servlet cụ thể từ nhiều servlet khác có thể được đóng gói trong phần WAR
  • phần 6 (thông tin đường dẫn) được giải thích bởi logic của servlet (ví dụ: nó có thể trỏ đến một số tài nguyên do servlet của bạn điều khiển).
  • phần 7 (truy vấn) cũng được tạo sẵn cho servlet của bạn sử dụng getQueryString
  • phần 8 (đoạn) thậm chí không được gửi đến máy chủ và có liên quan và chỉ được biết đến cho khách hàng

Các sau luôn giữ (trừ chênh lệch mã hóa URL):

requestURI = contextPath + servletPath + pathInfo 

Ví dụ sau từ Servlet 3.0 specification là rất hữu ích:


Lưu ý: hình ảnh sau, tôi không có thời gian để tái tạo trong HTML:

enter image description here

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