2010-02-05 37 views
84

Đây là kịch bản.Cách lấy tên miền và tên ứng dụng?

My Java ứng dụng web đã đi theo con đường

https://www.mywebsite.com:9443/MyWebApp 

Hãy nói rằng có một tập tin JSP

https://www.mywebsite.com:9443/MyWebApp/protected/index.jsp 

và tôi cần phải lấy

https://www.mywebsite.com:9443/MyWebApp 

trong tệp JSP này.

Tất nhiên, có một cách lười biếng và ngớ ngẩn khi chỉ nhận URL và sau đó truy tìm lại đường dẫn.

Nhưng có cách nào để làm điều này không? Cụ thể, tôi nghĩ rằng tôi có thể nhận được tên miền + cổng, nhưng làm cách nào để thực sự truy xuất tên ứng dụng "MyWebApp"?

Trả lời

85

Tên ứng dụng web (thực tế là đường dẫn ngữ cảnh) có sẵn bằng cách gọi HttpServletrequest#getContextPath() (và do đó KHÔNG getServletPath() như đã đề xuất trước đó). Bạn có thể truy xuất điều này trong JSP theo ${pageContext.request.contextPath}.

<p>The context path is: ${pageContext.request.contextPath}.</p> 

Nếu bạn có ý định sử dụng cho tất cả các đường dẫn tương đối trong trang JSP của bạn (mà sẽ có ý nghĩa câu hỏi này nhiều hơn), sau đó bạn có thể tận dụng các HTML <base> tag:

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 
<c:set var="req" value="${pageContext.request}" /> 
<c:set var="url">${req.requestURL}</c:set> 
<c:set var="uri" value="${req.requestURI}" /> 

<!doctype html> 
<html lang="en"> 
    <head> 
     <title>SO question 2204870</title> 
     <base href="${fn:substring(url, 0, fn:length(url) - fn:length(uri))}${req.contextPath}/"> 
     <script src="js/global.js"></script> 
     <link rel="stylesheet" href="css/global.css"> 
    </head> 
    <body> 
     <ul> 
      <li><a href="home.jsp">Home</a></li> 
      <li><a href="faq.jsp">FAQ</a></li> 
      <li><a href="contact.jsp">Contact</a></li> 
     </ul> 
    </body> 
</html> 

Tất cả các liên kết trong trang sau đó sẽ tự động liên quan đến <base> để bạn không cần phải sao chép đường dẫn ngữ cảnh ở mọi nơi. Lưu ý rằng khi các liên kết tương đối bắt đầu bằng một số /, thì chúng sẽ không còn liên quan đến số <base> nữa mà thay vào đó là gốc của tên miền.

+0

Trạng thái của Doc, "Đường dẫn ngữ cảnh được trả về bởi' ServletContext.getContextPath() 'nên được coi là đường dẫn ngữ cảnh chính hoặc được ưa thích của ứng dụng". Đó là lý do tôi đưa câu trả lời này vào câu trả lời ban đầu của tôi, sau khi nhận ra điều đó. Tôi đã không loại bỏ nỗ lực đầu tiên của mình, vì tôi muốn OP xem xét việc đọc qua các tài liệu và biết thêm một chút về các phương pháp liên quan. Tôi hy vọng bạn đang nhận được quan điểm của tôi. –

+0

@Vinegar: Đối với các tệp JSP, 'getServletPath()' trả về '/ filename.jsp'. OP không đòi hỏi điều đó chút nào, điều này chắc chắn không phải là cách để đi. – BalusC

+0

Tôi chắc chắn sẽ thực hiện chỉnh sửa trong bài đăng của mình, nhưng lần này tôi đã mong đợi phản hồi cho nhận xét của tôi, điều này hoàn toàn khác :). –

6

Tôi thực sự khuyên bạn nên đọc qua số docs để biết các phương pháp tương tự. Nếu bạn quan tâm đến đường dẫn ngữ cảnh, hãy xem ở đây, ServletContext.getContextPath().

93

Hãy xem tài liệu cho HttpServletRequest.
Để xây dựng các URL trong ví dụ của bạn, bạn sẽ cần phải sử dụng:

  • getScheme()
  • getServerName()
  • getServerPort()
  • getContextPath()

Đây là một phương pháp mà sẽ trở về của bạn ví dụ:

public static String getURLWithContextPath(HttpServletRequest request) { 
    return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath(); 
} 
+1

cách nhận ip trong trường hợp servername là localhost? –

+0

chỉ cần lưu ý nhanh chóng, getScheme() không phải lúc nào cũng hoạt động đối với https, một số máy chủ có hành vi kỳ lạ và luôn có thể trả lại http thay vì https. tôi nghĩ rằng tôi nên cho bạn biết. thử request.getRequestURL(). toString() và massage nếu u cần –

+0

@MahmoudSaleh 'request.getLocalAddr()' – bluish

1

Mã sau có thể hữu ích cho ứng dụng web bằng JavaScript.

var newURL = window.location.protocol + "//" + window.location.host + "" + window.location.pathname; 

newURL = newURL.substring(0,newURL.indexOf("")); 
0

Nếu bạn đang được chuyển url dưới dạng Chuỗi và muốn trích xuất ngữ cảnh gốc của ứng dụng đó, bạn có thể sử dụng regex này để trích xuất. Nó sẽ làm việc cho các url đầy đủ hoặc các url tương đối bắt đầu bằng gốc ngữ cảnh.

url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3") 
Các vấn đề liên quan