2010-06-07 37 views
37

Làm cách nào để nhận URL yêu cầu trong JSP được Servlet chuyển tiếp?Nhận URL yêu cầu trong JSP được chuyển tiếp bởi Servlet

Nếu tôi chạy sau mã trong JSP,

System.out.println("servlet path= " + request.getServletPath()); 
System.out.println("request URL= " + request.getRequestURL()); 
System.out.println("request URI= " + request.getRequestURI()); 

sau đó tôi nhận được con đường phía máy chủ cho JSP. Nhưng tôi muốn lấy URL như bạn thấy trong thanh địa chỉ của trình duyệt. Tôi có thể lấy nó trong Servlet để chuyển tiếp đến JSP, nhưng tôi muốn lấy nó trong JSP.

+2

Bản sao của http://stackoverflow.com/questions/2089528/how-to-get-the-url-of-the-client – skaffman

+1

Thực ra tôi nghĩ rằng việc sử dụng tiêu đề liên kết giới thiệu thậm chí tệ hơn sau đó chuyển url hợp lệ với mô hình – user12384512

Trả lời

64

Nếu bạn sử dụng RequestDispatcher.forward() để định tuyến yêu cầu từ bộ điều khiển đến chế độ xem, khi đó yêu cầu URI được hiển thị dưới dạng thuộc tính yêu cầu có tên javax.servlet.forward.request_uri. Vì vậy, bạn có thể sử dụng

request.getAttribute("javax.servlet.forward.request_uri") 

hoặc

${requestScope['javax.servlet.forward.request_uri']} 
+1

Đó là theo cách khác. Anh ấy thực sự muốn URL như được hiển thị trong thanh địa chỉ trình duyệt. – BalusC

+1

cảm ơn bạn, đó chính xác là những gì tôi đang tìm kiếm – user12384512

+1

@aauser: nói cách khác, bạn thực sự không ** tìm kiếm URL như được hiển thị trong thanh địa chỉ trình duyệt mà chỉ cho URL của chế độ xem được chuyển tiếp ? (không xuất hiện trong thanh địa chỉ trình duyệt). Nếu vậy, câu hỏi của bạn khá rõ ràng và gây hiểu nhầm. – BalusC

3

Không ai trong số những thuộc tính này là đáng tin cậy bởi vì mỗi spec servlet (2.4, 2.5 và 3.0), những thuộc tính được ghi đè nếu bạn bao gồm/về phía trước một giây thời gian (hoặc nếu ai đó gọi getNamedDispatcher). Tôi nghĩ cách đáng tin cậy duy nhất để nhận chuỗi yêu cầu ban đầu URI/truy vấn là gắn bộ lọc vào đầu chuỗi bộ lọc của bạn trong tệp web.xml đặt thuộc tính yêu cầu tùy chỉnh của riêng bạn dựa trên request.getRequestURI()/getQueryString() trước bất kỳ chuyển tiếp/bao gồm diễn ra.

http://www.caucho.com/resin-3.0/webapp/faq.xtp chứa bản tóm tắt tuyệt vời về cách hoạt động của tính năng này (trừ đi lưu ý kỹ thuật về việc chuyển tiếp thứ hai/bao gồm khả năng sử dụng các thuộc tính này).

7

Hãy thử điều này thay vì:

String scheme = req.getScheme();    
String serverName = req.getServerName(); 
int serverPort = req.getServerPort();  
String uri = (String) req.getAttribute("javax.servlet.forward.request_uri"); 
String prmstr = (String) req.getAttribute("javax.servlet.forward.query_string"); 
String url = scheme + "://" +serverName + ":" + serverPort + uri + "?" + prmstr; 

Lưu ý: Bạn không thể có được neo HREF từ url của bạn. Ví dụ, nếu bạn có url "toc.html # top" sau đó bạn có thể nhận được chỉ "toc.html"

Note: req.getAttribute làm việc ("javax.servlet.forward.request_uri") chỉ trong JSP. nếu bạn chạy này trong điều khiển trước khi JSP thì kết quả là null

Bạn có thể sử dụng mã cho cả hai biến thể:

public static String getCurrentUrl(HttpServletRequest req) { 
    String url = getCurrentUrlWithoutParams(req); 
    String prmstr = getCurrentUrlParams(req); 
    url += "?" + prmstr; 
    return url; 
} 

public static String getCurrentUrlParams(HttpServletRequest request) { 
    return StringUtil.safeString(request.getQueryString()); 
} 

public static String getCurrentUrlWithoutParams(HttpServletRequest request) { 
    String uri = (String) request.getAttribute("javax.servlet.forward.request_uri"); 
    if (uri == null) { 
     return request.getRequestURL().toString(); 
    } 
    String scheme = request.getScheme(); 
    String serverName = request.getServerName(); 
    int serverPort = request.getServerPort(); 
    String url = scheme + "://" + serverName + ":" + serverPort + uri; 
    return url; 
} 
+0

** Lưu ý: **' req.getAttribute ("javax.servlet.forward.request_uri") 'chỉ hoạt động trong JSP. nếu bạn chạy điều này trong bộ điều khiển trước khi JSP thì kết quả là 'null' – Koss

3

Để có được con đường hiện tại từ bên trong JSP nộp bạn chỉ có thể làm một trong các cách sau:

<%= request.getContextPath() %> 
<%= request.getRequestURI() %> 
<%= request.getRequestURL() %> 
1

Ngoài ra bạn có thể sử dụng

${pageContext.request.requestURI} 
+0

Cố gắng trả lời chi tiết hơn. – veducm

2

Để tránh sử dụng scriplets trong jsp, hãy làm theo lời khuyên của "divideByZero" và sử dụng ${pageContext.request.requestURI} Đây là cách tốt hơn để thực hiện.

+2

Điều này khác với câu trả lời cũ mà bạn đang tham khảo như thế nào? – jbindel

+0

Câu trả lời không khác gì trong việc phải làm. Tôi đã thêm một số làm rõ rằng bằng cách sử dụng $ {pageContext.request.requestURI} bạn có thể tránh sử dụng các tập lệnh. – stock

4

Hãy thử điều này,

<c:set var="pageUrl" scope="request"> 
    <c:out value="${pageContext.request.scheme}://${pageContext.request.serverName}"/> 
    <c:if test="${pageContext.request.serverPort != '80'}"> 
     <c:out value=":${pageContext.request.serverPort}"/> 
    </c:if> 
    <c:out value="${requestScope['javax.servlet.forward.request_uri']}"/> 
</c:set> 

Tôi muốn đặt nó trong mẫu cơ sở của tôi và sử dụng trong toàn bộ ứng dụng bất cứ khi nào tôi cần.

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