डोमेन URL और एप्लिकेशन नाम कैसे प्राप्त करें?


98

यहाँ परिदृश्य है।

मेरे जावा वेब एप्लिकेशन का पथ निम्नलिखित है

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

मान लीजिए कि एक JSP फाइल है

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

और मुझे पुनः प्राप्त करने की आवश्यकता है

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

इस JSP फ़ाइल के भीतर।

बेशक, केवल URL प्राप्त करने का एक आलसी और मूर्खतापूर्ण तरीका है और फिर वापस पथ को फिर से ट्रेस करना है।

लेकिन क्या ऐसा करने का एक प्रोग्रामेटिक तरीका है? विशेष रूप से, मुझे लगता है कि मुझे डोमेन + पोर्ट मिल सकता है, लेकिन मैं वास्तव में एप्लिकेशन का नाम "MyWebApp" कैसे प्राप्त कर सकता हूं?

जवाबों:


91

वेब एप्लिकेशन नाम (वास्तव में संदर्भ पथ) कॉल करके उपलब्ध है HttpServletrequest#getContextPath()(और इस प्रकार getServletPath()पहले जैसा सुझाव नहीं दिया गया है)। आप इसे JSP द्वारा पुनः प्राप्त कर सकते हैं ${pageContext.request.contextPath}

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

यदि आप अपने JSP पेज में सभी रिश्तेदार रास्तों के लिए इसका उपयोग करने का इरादा रखते हैं (जो इस प्रश्न को और अधिक समझ में आएगा), तो आप HTML <base>टैग का उपयोग कर सकते हैं :

<%@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>

पृष्ठ के सभी लिंक तब स्वचालित रूप से आपके सापेक्ष होंगे <base>ताकि आपको हर जगह संदर्भ पथ को कॉपी करने की आवश्यकता न हो। ध्यान दें कि जब रिश्तेदार लिंक ए के साथ शुरू होते हैं /, तो वे <base>अब के सापेक्ष नहीं होंगे , बल्कि डोमेन रूट के बजाय।


डॉक्टर कहते हैं, "जिस संदर्भ पथ को लौटाया ServletContext.getContextPath() जाना चाहिए, उसे अनुप्रयोग का प्रमुख या पसंदीदा संदर्भ पथ माना जाना चाहिए"। यही कारण था कि मैंने इस बात को महसूस करने के बाद अपने मूल उत्तर में इसे शामिल किया। मैंने अपना पहला प्रयास नहीं हटाया, क्योंकि मैं चाहता हूं कि ओपी डॉक्स के माध्यम से पढ़ने पर विचार करें और संबंधित तरीकों के बारे में थोड़ा और जानें। मुझे उम्मीद है कि आप मेरी बात समझ रहे होंगे।
आदिल अंसारी

@ वाइनगर: जेएसपी फाइलों के लिए, getServletPath()रिटर्न /filename.jsp। ओपी बिल्कुल नहीं पूछ रहा था, यह निश्चित रूप से जाने का रास्ता नहीं है।
BalusC

मैं निश्चित रूप से अपनी पोस्ट में सुधार करूंगा, लेकिन इस बार मुझे अपनी टिप्पणी की प्रतिक्रिया की उम्मीद थी, जो पूरी तरह से अलग है :)।
अदील अंसारी

2
XHTML DOCTYPE में, आपको संदर्भपथ पर '/' वर्ण जोड़ना होगा। <आधार href = "$ {pageContext.request.contextPath} /">
तुलसी मूसा

आपने <base>टैग को बंद क्यों नहीं किया ? क्या सभी टैग बंद नहीं होने चाहिए?
फाबियानो फ्रांसेस्कोनी

106

के लिए प्रलेखन पर एक नज़र डालें HttpServletRequest
अपने उदाहरण में URL बनाने के लिए आपको उपयोग करने की आवश्यकता होगी:

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

यहाँ एक तरीका है जो आपका उदाहरण लौटाएगा:

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

1
सर्वर के लोकलहोस्ट होने की स्थिति में आईपी कैसे प्राप्त करें?
महमूद सालेह

बस त्वरित ध्यान दें, getScheme () हमेशा https के लिए काम नहीं करता है, कुछ सर्वर अजीब व्यवहार करते हैं और हमेशा https के बजाय http वापस कर सकते हैं। मैंने सोचा कि मुझे पता होना चाहिए। request.getRequestURL ()। toString () और मालिश करें, अगर यू की ज़रूरत है
K ''

1
@MahmoudSalehrequest.getLocalAddr()
नीले

यह अच्छा होगा यदि आप प्रत्येक विधि के लिए उदाहरण आउटपुट दिखाते हैं। एक वेब-सर्वर प्राप्त करना और प्रत्येक की आउटपुट क्या हो सकता है, इसकी जांच करने के लिए इसे चलाना एक दर्द है।
जुस 12

1
getContextPath()विधि में कुछ भी वापस नहीं करता है! और getServerPort()केवल 2 अंकों की संख्या देता है, न कि 4 अंकों की संख्या! क्या मैं इस पर कुछ मदद कर सकता हूं?
सैम

22

आवेदन नाम से आया है getContextPath

मुझे यह ग्राफिक फुर्तीली सॉफ्टवेयर शिल्प कौशल HttpServletRequest पाथ डिकोडिंग से उपलब्ध सभी अलग-अलग तरीकों की तरह लगता है:

यहां छवि विवरण दर्ज करें


1
यह ग्राफिक कई सवालों के जवाब देने के लिए उपयोगी है। मैंने कई प्रश्नों के उत्तर में इसका उपयोग करने की कोशिश की है, लेकिन वे सभी हटा दिए गए थे: उसी उत्तर को फिर से उपयोग करने के खिलाफ एक नियम है। जो शर्म की बात है। सिद्धांत यह है कि यदि आप एक ही उत्तर का उपयोग करते हैं, तो प्रश्न समान होना चाहिए, और उसके बाद आपको केवल प्रश्न को डुप्लिकेट के रूप में चिह्नित करना चाहिए। लेकिन यह वास्तविकता नहीं है। कई अलग-अलग प्रश्न हैं जिनका उत्तर एक ही ग्राफिक से दिया जा सकता है। इस तरह के मनमाने नियमों को लागू करना छोटी सोच है। यदि आप इस ग्राफिक के साथ सबसे अच्छा उत्तर देने वाला प्रश्न देखते हैं, तो कृपया इसका उपयोग करें।
एजिलेप्रो


4

निम्नलिखित कोड जावास्क्रिप्ट का उपयोग करके वेब एप्लिकेशन के लिए उपयोगी हो सकता है।

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

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

0

यदि आप स्ट्रिंग के रूप में एक url पास कर रहे हैं और उस एप्लिकेशन के संदर्भ रूट को निकालना चाहते हैं, तो आप इसे निकालने के लिए इस regex का उपयोग कर सकते हैं। यह पूर्ण urls या सापेक्ष url के लिए काम करेगा जो संदर्भ रूट से शुरू होता है।

url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.