কীভাবে ডোমেন ইউআরএল এবং অ্যাপ্লিকেশন নাম পাবেন?


98

এখানে দৃশ্যপট।

আমার জাভা ওয়েব অ্যাপ্লিকেশনটির নিম্নলিখিত পথ রয়েছে

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

ধরা যাক একটি জেএসপি ফাইল আছে

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

এবং আমার পুনরুদ্ধার করা দরকার

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

এই JSP ফাইলের মধ্যে।

অবশ্যই, কেবলমাত্র ইউআরএল পাওয়ার এবং তারপরে আবার পথটি অনুসরণ করার একটি অলস এবং নির্বোধ উপায় রয়েছে।

তবে এটি করার কোনও অগ্রগতিমূলক উপায় আছে কি? বিশেষত, আমি মনে করি যে আমি ডোমেন + পোর্ট পেতে পারি তবে আমি কীভাবে "MyWebApp" অ্যাপ্লিকেশন নামটি পুনরুদ্ধার করব?

উত্তর:


91

ওয়েব অ্যাপ্লিকেশন নাম (প্রকৃতপক্ষে প্রসঙ্গের পাথ) কল করে উপলব্ধ HttpServletrequest#getContextPath()(এবং এভাবে getServletPath()আগে যেমন প্রস্তাবিত নয় )। আপনি এটি দ্বারা জেএসপিতে পুনরুদ্ধার করতে পারেন ${pageContext.request.contextPath}

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

আপনি যদি নিজের জেএসপি পৃষ্ঠায় সমস্ত আপেক্ষিক পাথের জন্য এটি ব্যবহার করার মনস্থ করেন (যা এই প্রশ্নটি আরও বুদ্ধিমান করে তোলে) তবে আপনি এইচটিএমএল <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। ওপি মোটেও তা চাইছিল না, এটি অবশ্যই যাওয়ার উপায় নয়।
বালুসসি

আমি অবশ্যই আমার পোস্টে সংশোধন করব, তবে এবার আমি আমার মন্তব্যের প্রতিক্রিয়া আশা করছিলাম, যা সম্পূর্ণ ভিন্ন :)
আদিল আনসারী

4
এক্সএইচটিএমএল ডক্টইপিতে আপনাকে প্রসঙ্গপথের জন্য একটি '/' অক্ষর যুক্ত করতে হবে। <বেস href = "$ {pageContext.request.contextPath ath /">
বাসিল মুসা

আপনি <base>ট্যাগটি বন্ধ করেননি কেন ? সব ট্যাগ বন্ধ করা উচিত নয়?
ফাবিয়ানো ফ্রান্সেসকোনি

107

জন্য ডকুমেন্টেশন একবার দেখুন HttpServletRequest
আপনার উদাহরণে ইউআরএল তৈরি করতে আপনার ব্যবহার করতে হবে:

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

এখানে একটি পদ্ধতি যা আপনার উদাহরণ ফিরিয়ে দেবে:

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

4
সার্ভারনেম লোকালহোস্টের ক্ষেত্রে আইপি পাবেন কীভাবে?
মাহমুদ সালেহ

কেবলমাত্র দ্রষ্টব্য নোট, getScheme () সর্বদা https এর জন্য কাজ করে না, কিছু সার্ভারের অদ্ভুত আচরণ রয়েছে এবং সর্বদা https এর পরিবর্তে এইচটিপি ফিরে আসতে পারে। আমি ভেবেছিলাম যে আমি আপনাকে জানাতে হবে। অনুরোধ করে চেষ্টা করুন .getRequestURL ()। টু স্ট্রিং () এবং আপনার প্রয়োজনে ম্যাসেজ করুন
কে ''

4
@ মাহমুদসালেহrequest.getLocalAddr()
নীল

আপনি যদি প্রতিটি পদ্ধতির জন্য উদাহরণ আউটপুটও দেখান তবে ভাল হবে। ওয়েব সার্ভারটি পেতে এবং প্রতিটিের আউটপুট কী হতে পারে তা খতিয়ে দেখার জন্য এটি ব্যথা হয়।
Jus12

4
getContextPath()পদ্ধতিতে কিছুই ফিরিয়ে দেয় না! এবং getServerPort()4 নম্বর সংখ্যার নয়, কেবল 2 সংখ্যার নম্বর দেয়! আমি কি এটিতে কিছু সহায়তা নিতে পারি?
স্যাম

25

আবেদনের নাম এসেছে getContextPath

আমি এগ্রিল সফ্টওয়্যার কারুকাজ থেকে এই গ্রাফিকটি পেয়েছি এইচটিটিপি সার্ভেলকুইয়েস্ট পাথ ডিকোডিং উপলভ্য সমস্ত বিভিন্ন পদ্ধতি সন্ধান করে:

এখানে চিত্র বর্ণনা লিখুন


4
এই গ্রাফিকটি অনেক প্রশ্নের উত্তর দেওয়ার জন্য দরকারী। আমি এটি অনেক প্রশ্নের উত্তরে ব্যবহার করার চেষ্টা করেছি, তবে সেগুলি সব মুছে ফেলা হয়েছিল: একই উত্তরটি পুনরায় ব্যবহারের বিরুদ্ধে একটি বিধি রয়েছে। যা লজ্জাজনক। তত্ত্বটি হ'ল যদি আপনি একই উত্তরটি ব্যবহার করেন তবে অবশ্যই প্রশ্নগুলি একই হওয়া উচিত এবং এর জন্য আপনার প্রশ্নটি কেবল নকল হিসাবে চিহ্নিত করা উচিত। তবে তা বাস্তবতা নয়। একই গ্রাফিক দিয়ে বিভিন্ন উত্তর দেওয়া যেতে পারে যে বিভিন্ন প্রশ্ন আছে। এ জাতীয় স্বেচ্ছাসেবী নিয়ম প্রয়োগ করা স্বল্প-মনের বিষয়। যদি আপনি এমন কোনও প্রশ্ন দেখে থাকেন যা এই গ্রাফিকের সাথে সবচেয়ে ভাল উত্তর দেওয়া হয়েছে, দয়া করে এটি ব্যবহার করুন।
AgilePro

7

অনুরূপ পদ্ধতিগুলির জন্য আমি আপনাকে দৃ strongly়ভাবে ডক্সের মাধ্যমে পড়ার পরামর্শ দিচ্ছি । আপনি যদি প্রসঙ্গের পথে আগ্রহী হন তবে সার্ভলেটকন্টেক্সট.জেটকন্টেক্সটপথ () এখানে দেখুন ।


4

নিম্নলিখিত কোডটি জাভাস্ক্রিপ্ট ব্যবহার করে ওয়েব অ্যাপ্লিকেশনের জন্য কার্যকর হতে পারে।

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

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

0

আপনি যদি স্ট্রিং হিসাবে একটি url পাস করে চলেছেন এবং সেই অ্যাপ্লিকেশনটির প্রসঙ্গের মূলটি বের করতে চান, আপনি এটি বের করার জন্য এই রেজেক্সটি ব্যবহার করতে পারেন। এটি পূর্ণ url বা আপেক্ষিক url এর জন্য কাজ করবে যা প্রসঙ্গের মূলের সাথে শুরু হয়।

url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.