সার্লেটলেট ম্যাপিং url প্যাটার্নে / এবং / * এর মধ্যে পার্থক্য


175

পরিচিত কোড:

<servlet-mapping>
    <servlet-name>main</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>main</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

আমার বোঝার জন্য /*মানচিত্র http://host:port/context/*

কীভাবে /? এটি নিশ্চিত যে http://host:port/contextকেবল রুট করার মানচিত্র নেই । আসলে, এটি গ্রহণ করবে http://host:port/context/hello, কিন্তু প্রত্যাখ্যান করবে http://host:port/context/hello.jsp

কেউ কীভাবে http://host:port/context/helloম্যাপ করা যায় তা ব্যাখ্যা করতে পারেন ?

উত্তর:


268

<url-pattern>/*</url-pattern>

/*একটি সার্ভলেট এই ধরনের ডিফল্ট সার্ভলেট এবং JSP সার্ভলেট যেমন servletcontainer দ্বারা উপলব্ধ সমস্ত সার্ভলেট সহ অন্যান্য সব সার্ভলেট ওভাররাইড করে। আপনি যেই অনুরোধটি বরখাস্ত করুন না কেন, তা শেষ হয়ে যাবে serv এটি সার্লেলেটগুলির জন্য এটি একটি খারাপ URL প্যাটার্ন। সাধারণত, আপনি ব্যবহার করতে চান সেটি /*একটি উপর Filterশুধুমাত্র। এটি কল করে আরও নির্দিষ্ট ইউআরএল প্যাটার্ন শোনার যে কোনও সার্লেটকে অনুরোধটি চালিয়ে যেতে সক্ষম করে FilterChain#doFilter()

<url-pattern>/</url-pattern>

এটি /অন্য কোনও সার্লেটকে ওভাররাইড করে না। এটি কেবলমাত্র সমস্ত অনুরোধের জন্য সার্লেটলেট কনটেনারের বিল্টিন ডিফল্ট সার্লেটকে প্রতিস্থাপন করে যা অন্য কোনও নিবন্ধিত সার্লেটের সাথে মেলে না। এটি সাধারণত স্থিতিশীল সংস্থানগুলিতে (সিএসএস / জেএস / চিত্র / ইত্যাদি) এবং ডিরেক্টরি তালিকাতে অন্তর্ভুক্ত থাকে। সার্ভলেটকন্টেনারের বিল্টিন ডিফল্ট সার্লেটটি এইচটিটিপি ক্যাশে অনুরোধ, মিডিয়া (অডিও / ভিডিও) স্ট্রিমিং এবং ফাইল ডাউনলোড পুনঃসূচনাগুলির সাথে মোকাবিলা করতেও সক্ষম। সাধারণত, আপনি ডিফল্ট সার্লেটটি ওভাররাইড করতে চান না কারণ অন্যথায় আপনাকে তার সমস্ত কাজের যত্ন নিতে হবে, যা হুবহু নয় (জেএসএফ ইউটিলিটি লাইব্রেরি ওমনিফিসের একটি মুক্ত উত্স রয়েছে উদাহরণ রয়েছে)। এটি সার্লেলেটগুলির জন্য এটি একটি খারাপ URL প্যাটার্নও। জেএসপি পৃষ্ঠাগুলি কেন এই সার্লেটটিকে আঘাত করে না, কারণ সার্লেটলেট কনটেনারের বিল্টিন জেএসপি সার্লেটটি আহ্বান করা হবে, যা ইতিমধ্যে আরও নির্দিষ্ট ইউআরএল ধরণে ডিফল্টভাবে ম্যাপ করা হয়েছে *.jsp

<url-pattern></url-pattern>

তারপরে খালি স্ট্রিং ইউআরএল প্যাটার্নও রয়েছে । প্রসঙ্গের মূলটি অনুরোধ করা হলে এটি চাওয়া হবে। এটি এমন <welcome-file>পদ্ধতির থেকে পৃথক যে কোনও সাবফোল্ডারকে অনুরোধ করা হলে এটি চাওয়া হয় না। সম্ভবত আপনি " হোম পেজ সার্ভলেট " চান এমন URL প্যাটার্নটি সম্ভবত আপনি খুঁজছেন । আমাকে কেবল স্বীকার করতে হবে যে আমি খালি স্ট্রিং ইউআরএল প্যাটার্ন এবং স্ল্যাশ ইউআরএল প্যাটার্নটি স্বজ্ঞাতভাবে আশা করব expect/ ঠিক অন্যভাবে সংজ্ঞায়িত করা হয়েছিল, তাই আমি বুঝতে পারি যে প্রচুর শুরুর এই বিষয়টি নিয়ে বিভ্রান্ত হয়েছিল। তবে এটি যা হয়।

ফ্রন্ট কন্ট্রোলার

যদি আপনি আসলে একটি সামনের নিয়ামক সার্ভলেট আছে মনস্থ, তারপর আপনি সেরা পছন্দ একটি আরও নির্দিষ্ট URL প্যাটার্ন তে এটি মানচিত্র চাই *.html, *.do, /pages/*, /app/*, ইত্যাদি আপনি দূরে একটি সাধারণ URL প্যাটার্ন উপর সামনে নিয়ামক URL প্যাটার্ন এবং কভার স্ট্যাটিক সম্পদ লুকিয়ে রাখতে পারেন মত /resources/*, /static/*ইত্যাদি একটি সার্ভলেট ফিল্টার সাহায্যে। আরও দেখুন সামনের নিয়ামক সার্ভলেট যার উপর / * ম্যাপ করা হয় দ্বারা পরিচালিত হওয়া থেকে স্ট্যাটিক সম্পদ প্রতিরোধ কিভাবে । লক্ষণীয় হওয়া উচিত যে স্প্রিং এমভিসির একটি বিল্টিন স্ট্যাটিক রিসোর্স সার্ভলেট রয়েছে, তাই /আপনি স্প্রিংয়ের স্থিতিশীল সংস্থাগুলির জন্য একটি সাধারণ ইউআরএল প্যাটার্নটি কনফিগার করে যদি আপনি এর সম্মুখ নিয়ামকটি মানচিত্র করতে পারেন। আরও দেখুন কিভাবে বসন্ত এমভিসিতে স্থির সামগ্রী হ্যান্ডেল করা যায়?


9
ধন্যবাদ। কিছু গবেষণা করার পরে, আমি একটি সূক্ষ্ম বিষয় স্পষ্ট করতে চাই। / ওয়েব সার্ভার ইনস্টল করা ডিফল্ট সার্লেটকে ওভাররাইট করে। উদাহরণস্বরূপ, টমক্যাট একটি ডিফল্ট সার্ভলেট ইনস্টল করে যা স্থিতিশীল সংস্থানগুলিতে পরিবেশন করে। ডিফল্ট সার্লেটকে (সম্ভবত সম্ভবত অবাঞ্ছিত) পার্শ্ব প্রতিক্রিয়া হিসাবে ব্যবহার করা / ছাড়িয়ে যায়।
ক্যান্ডি চিউ

ঠিক আছে, আমি এটিকে "ওভাররাইটিং" বলব না, "প্রতিস্থাপন" করব। এটির মতো ডিফল্ট সার্লেটটি প্রতিস্থাপন করতে কার্যকর হতে পারে।
বালাসসি

1
<url-pattern> </url-pattern> একটি ত্রুটি ছুড়ে ফেলেছে: সার্লেটলেট ম্যাপিংয়ে অবৈধ <url- Pattern>
স্লিম

ত্রুটি বার্তাটি টমক্যাট থেকে এসেছে, আমার আইডিই নয়; তবে, আমি টমক্যাট 6 ব্যবহার করছি, তাই সম্ভবত এটিই সমস্যা;)
পাতলা

2
@ বালুসসি, আপনি দয়া করে আমাকে বলতে পারেন কোন /**প্যাটার্নটি নির্দেশ করে?
সজিব আচার্য

45

আমি ম্যালাপিং বিধি এবং একটি উদাহরণ দিয়ে বালুসকের উত্তর পরিপূরক করতে চাই।

সার্লেলেট 2.5 স্পেসিফিকেশন থেকে ম্যাপিংয়ের নিয়ম:

  1. মানচিত্রের সঠিক URL
  2. ওয়াইল্ডকার্ডের পাথ মানচিত্র
  3. মানচিত্র এক্সটেনশান
  4. ডিফল্ট সার্লেটে মানচিত্র

আমাদের উদাহরণে, তিনটি সার্লেট রয়েছে lets / আমাদের দ্বারা ইনস্টল করা ডিফল্ট সার্লেট। টমক্যাট jsp এবং jspx পরিবেশন করতে দুটি সার্ভলেট ইনস্টল করে। সুতরাং মানচিত্রhttp://host:port/context/hello

  1. কোনও সঠিক ইউআরএল সার্লেটলেট ইনস্টল করা নেই next
  2. পরবর্তী কোনও ওয়াইল্ডকার্ড পাথ সার্ভলেট ইনস্টল করা নেই।
  3. পরবর্তী কোনও এক্সটেনশনের সাথে মেলে না।
  4. ডিফল্ট সার্লেটে মানচিত্র, ফিরে আসুন।

মানচিত্রে http://host:port/context/hello.jsp

  1. কোনও সঠিক ইউআরএল সার্লেটলেট ইনস্টল করা নেই next
  2. পরবর্তী কোনও ওয়াইল্ডকার্ড পাথ সার্ভলেট ইনস্টল করা নেই।
  3. এক্সটেনশন সার্লেট পাওয়া গেছে, ফিরে আসুন।

25

ইউআরএলগুলি কীভাবে ম্যাপ করা হয় তা সম্ভবত আপনার জানতে হবে, যেহেতু আমি 404কয়েক ঘন্টা ধরে ভুগছি। হ্যান্ডলারের হ্যান্ডলিং অনুরোধ দুটি ধরণের আছে। BeanNameUrlHandlerMappingএবং SimpleUrlHandlerMapping। যখন আমরা একটি সংজ্ঞায়িত করি servlet-mapping, আমরা ব্যবহার করছি SimpleUrlHandlerMapping। একটি জিনিস আমাদের জানা দরকার যে এই দুটি হ্যান্ডলারের একটি সাধারণ সম্পত্তি ভাগ করে নেওয়া হয় alwaysUseFullPathযার নাম ডিফল্ট false

falseএখানে অর্থ স্প্রিং একটি নিয়ামককে ইউআরএল ম্যাপ করার জন্য পুরো পথ ব্যবহার করবে না। এর মানে কী? এর অর্থ যখন আপনি একটি সংজ্ঞা দেন servlet-mapping:

<servlet-mapping>
    <servlet-name>viewServlet</servlet-name>
    <url-pattern>/perfix/*</url-pattern>
</servlet-mapping>

*নিয়ামকটি সন্ধান করতে হ্যান্ডলার আসলে অংশটি ব্যবহার করবে । উদাহরণস্বরূপ, 404আপনি যখন এটি ব্যবহারের অনুরোধ করছেন তখন নীচের নিয়ামক একটি ত্রুটির মুখোমুখি হবে/perfix/api/feature/doSomething

@Controller()
@RequestMapping("/perfix/api/feature")
public class MyController {
    @RequestMapping(value = "/doSomething", method = RequestMethod.GET) 
    @ResponseBody
    public String doSomething(HttpServletRequest request) {
        ....
    }
}

এটি একটি নিখুঁত ম্যাচ, তাই না? তবে কেন 404। পূর্বে উল্লিখিত হিসাবে, এর ডিফল্ট মানটি alwaysUseFullPathমিথ্যা, যার অর্থ আপনার অনুরোধে কেবলমাত্র /api/feature/doSomethingএকটি সংশ্লিষ্ট নিয়ামক সন্ধান করতে ব্যবহৃত হয়, তবে কোনও নিয়ামকই সেই পথটির বিষয়ে চিন্তা করেন না। আপনার নিজের ইউআরএলটি মাইকন্ট্রোলার বেস থেকে পরিবর্তন করতে হবে /perfix/perfix/api/feature/doSomethingবা সরিয়ে ফেলতে হবে ।perfix@RequestingMapping


8

আমি মনে করি ক্যান্ডির উত্তর বেশিরভাগই সঠিক। আমি অন্যথায় মনে করি একটি ছোট অংশ আছে।

হোস্ট মানচিত্র করতে: পোর্ট / প্রসঙ্গ / হ্যালো। জেএসপি

  1. কোনও সঠিক ইউআরএল সার্লেটলেট ইনস্টল করা নেই next
  2. ওয়াইল্ডকার্ড পাথ সার্লেটস পাওয়া গেছে , ফিরে আসুন

আমি বিশ্বাস করি যে কেন "/ *" হোস্টের সাথে মেলে না: পোর্ট / প্রসঙ্গ / হ্যালো কারণ এটি "/ হ্যালো" ফাইলের পরিবর্তে একটি পথ হিসাবে বিবেচনা করে (যেহেতু এটির কোনও এক্সটেনশন নেই)।


2

মধ্যে অপরিহার্য পার্থক্য /*এবং /যে ম্যাপিং সঙ্গে একটি সার্ভলেট হল /*একটি এক্সটেনশন ম্যাপিং (যেমন যে কোনো সার্ভলেট সামনে নির্বাচিত করা হবে *.html, যখন ম্যাপিং সঙ্গে একটি সার্ভলেট) /নির্বাচিত করা হবে পরই এক্সটেনশন ম্যাপিং বলে মনে করা হয় (এবং কোনো অনুরোধ যা ফেলে না 'এর জন্য ব্যবহার করা হবে অন্য কোনও কিছুর সাথে মেলে না --- এটি "ডিফল্ট সার্লেট")।

বিশেষত, /*ম্যাপিংয়ের আগে সর্বদা একটি /ম্যাপিং নির্বাচন করা হবে । হয় কনটেনারের নিজস্ব ডিফল্ট সার্লেটে পৌঁছানো থেকে কোনও অনুরোধ রোধ করে।

হয় কেবল সার্লেলেট ম্যাপিংয়ের পরে নির্বাচিত হবে যা সঠিক মিল (যেমন /foo/bar) এবং যা পাথ ম্যাপিংগুলি /*(পছন্দ /foo/*) এর চেয়ে দীর্ঘ । নোট করুন যে খালি স্ট্রিং ম্যাপিংটি প্রসঙ্গের মূল ( http://host:port/context/) এর সাথে একটি সঠিক মিল ।

জাভা সার্লেট নির্দিষ্টকরণের অধ্যায় 12 দেখুন, http://download.oracle.com/otndocs/jcp/servlet-3_1-fr-eval-spec/index.html এ 3.1 সংস্করণে উপলব্ধ ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.