2010-09-19 59 views
14

Tôi đã viết Mẫu điều khiển phía trước và chạy thử nghiệm. Bằng cách nào đó request.getPathInfo() trả về null khi nó trả về thông tin đường dẫn.Cách request.getPathInfo() trong phương thức dịch vụ trả về null?

1. HTML mà các cuộc gọi servlet

<a href="tmp.do">Test link to invoke cool servlet</a> 

2. Ánh xạ các servlet trong DD.
Bất cứ điều gì có .do mở rộng (ví dụ tmp.do) sẽ gọi servlet "Redirector"

<!-- SERVLET (centralized entry point) --> 
    <servlet> 
     <servlet-name>RedirectHandler</servlet-name> 
     <servlet-class>com.masatosan.redirector.Redirector</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>RedirectHandler</servlet-name> 
     <url-pattern>*.do</url-pattern> 
    </servlet-mapping> 

3. Các servlet mà có yêu cầu từ * .do

public class Redirector extends HttpServlet { 

     protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
      try { 
       //test - THIS RETURNS NULL!!!! 
       System.out.println(request.getPathInfo()); 

       Action action = ActionFactory.getAction(request); //return action object based on request URL path 
       String view = action.execute(request, response); //action returns String (filename) 
       if(view.equals(request.getPathInfo().substring(1))) { 
        request.getRequestDispatcher("/WEB-INF/" + view + ".jsp").forward(request, response); 
       } 
       else { 
        response.sendRedirect(view); 
       } 
      } 
      catch(Exception e) { 
       throw new ServletException("Failed in service layer (ActionFactory)", e); 
      } 
     } 
    }//end class 

Các vấn đề là request.getPathInfo() trả về null. Dựa trên cuốn sách Head First,

Các servlet vòng đời chuyển từ "does not exist" nhà nước để "initialized" nhà nước (có nghĩa là sẵn sàng để phục vụ yêu cầu của khách hàng) bắt đầu với constructor của nó. Init() luôn hoàn thành trước cuộc gọi đầu tiên đến dịch vụ().

Điều này cho tôi biết rằng ở đâu đó giữa hàm tạo và phương thức init(), servlet không phải là servlet đầy đủ. Vì vậy, có nghĩa là, theo phương thức service() được gọi, servlet nên được servlet phát triển đầy đủ và phương thức request có thể gọi getPathInfo() và mong đợi giá trị hợp lệ trả về thay vì null.

UDPATE

Rất thú vị. (http://forums.sun.com/thread.jspa?threadID=657991)

(HttpServletRequest - getPathInfo())

Nếu URL là như dưới đây:

http://www.myserver.com/mycontext/myservlet/hello/test?paramName=value.

Nếu bạn web.xml tả mô hình servlet như/mycontext/* getPathInfo() sẽ trả myservlet/hello/kiểm tra và getQueryString() sẽ trả về giá trị paramName =

(HttpServletRequest - getServletPath())

Nếu URL là như dưới đây:

http://hostname.com:80/mywebapp/servlet/MyServlet/a/b;c=123?d=789

Chuỗi servletPath = req.getServletPath();

Nó trả "/ servlet/MyServlet"

Trang này cũng rất tốt một: http://www.exampledepot.com/egs/javax.servlet/GetReqUrl.html

Trả lời

15

@Vivien là chính xác. Bạn muốn sử dụng HttpServletRequest#getServletPath() thay vào đó (xin lỗi, tôi đã bỏ qua bit đó khi viết answer mà bạn chắc chắn đã đọc, tôi đã cập nhật câu trả lời).

Để làm rõ: getPathInfo() không không bao gồm đường dẫn servlet như definied trong web.xml (chỉ con đường sau đó) và getServletPath() cơ bản trả chỉ con đường servlet như definied trong web.xml (và do đó không phải là con đường sau đó). Nếu mẫu url chứa ký tự đại diện, đặc biệt là thì phần bao gồm.

+0

Tôi nên xem tài liệu, không biết getServletPath() tồn tại! –

+0

Gottya như vậy trong DD, nếu tôi chỉ định /foo/*., getPathInfo() sẽ chỉ nhận được đường dẫn SAU ".do"
Điều đó có nghĩa là /foo/test.do/blah?name = myname sau đó nó trả về "/ blah? name = myname" –

+2

'/ foo/*. do' không phải là mẫu url hợp lệ, vì vậy nó sẽ không thể trả về bất cứ điều gì :) Ngay cả sau đó, về mặt lý thuyết nó sẽ chỉ cung cấp cho '/ blah'. Nó không bao gồm chuỗi truy vấn. Bạn có phương thức 'getQueryString()' (hoặc chỉ là phương thức 'getParameter()' bình thường). – BalusC

4

Theo Javadoc:

Returns bất kỳ thông tin đường dẫn thêm liên kết với URL khách hàng được gửi khi nó đưa ra yêu cầu này. Thông tin đường dẫn bổ sung theo sau đường dẫn servlet nhưng trước chuỗi truy vấn. Phương thức này trả về null nếu không có thêm thông tin đường dẫn.

Bạn không có bất kỳ thông tin đường dẫn nào khi sử dụng ánh xạ có tiền tố (*.do, trong trường hợp của bạn).

+0

Cảm ơn mẹo! –

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