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
Tôi nên xem tài liệu, không biết getServletPath() tồn tại! –
Gottya như vậy trong DD, nếu tôi chỉ định/foo/*. Url-pattern>, 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" –
'/ 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