2012-01-03 6 views
24

इस प्रकार सर्वलेट समर्थन यूआरएल है:सर्वलेट और पथ मानकों/xyz/{value}/परीक्षण की तरह, कैसे web.xml में मैप करने के लिए?

/xyz/{value}/test 

जहां मूल्य पाठ या संख्या से बदला जा सकता है।

कि web.xml में कैसे मैप करने के लिए?

+0

से संबंधित: http://stackoverflow.com/questions/8252442/servlet-mappings-with-variablestomcat-7-0 (संभावित डुप्लिकेट)। – shelley

उत्तर

39

यह सर्वलेट एपीआई द्वारा समर्थित नहीं है मानचित्रण के बीच में URL पैटर्न वाइल्डकार्ड * है। यह केवल इसलिए /prefix/* तरह मानचित्रण के अंत में या तो *.suffix तरह मानचित्रण के शुरू में वाइल्डकार्ड * अनुमति देता है।

मानक अनुमत यूआरएल पैटर्न वाक्यविन्यास के साथ आपकी सबसे अच्छी शर्त /xyz/* पर मैप करना है और HttpServletRequest#getPathInfo() का उपयोग करके पथ जानकारी निकालना है।

तो, दिए गए एक <url-pattern>/xyz/*</url-pattern>, यहाँ एक बुनियादी किकऑफ़ उदाहरण है कि कैसे सीमा चेकों के बाहर पथ जानकारी, अशक्त चेक और सरणी सूचकांक छोड़े गए निकालने के लिए:

String pathInfo = request.getPathInfo(); // /{value}/test 
String[] pathParts = pathInfo.split("/"); 
String part1 = pathParts[1]; // {value} 
String part2 = pathParts[2]; // test 
// ... 

आप के रूप में संभव तरह अधिक महीन बेहतर नियंत्रण चाहते हैं अपाचे HTTPD के mod_rewrite साथ है, तो आप Tuckey के URL rewrite filter पर दिखाई दे सकता है।

+0

धन्यवाद! यह मेरी समस्या हल करता है। – BlackEagle

+0

क्या यह वास्तव में * तरीका है * किसी को यूआरएल पैरामीटर निकालने की ज़रूरत है जो जीईटी-पैरामीटर नहीं हैं? यह काफी फूला हुआ, बनाए रखने में कठोर, ऑफ़सेट-बग और 1995 में सामान्य रूप से प्रतीत होता है। – Herbert

+2

@ हर्बर्ट: बस सर्वलेट एपीआई के शीर्ष पर एक ढांचा का उपयोग करें जो पथ पैरामीटर, जैसे जैक्स-आरएस या एमवीसी का समर्थन करता है। – BalusC

3

यह समर्थन मानचित्रण कि यूआरएल करता है, लेकिन कोई सत्यापन प्रदान नहीं करता है।

अपने वेब एक्सएमएल में, आप ऐसा कर सकता है ....

/xyz/* 

लेकिन वह गारंटी नहीं है कि अनुगामी test मौजूद है और यह पिछले आइटम है। यदि आप कुछ और परिष्कृत खोज रहे हैं, तो आपको urlrewritefilter का प्रयास करना चाहिए।

http://code.google.com/p/urlrewritefilter/

0

जैसा कि ऊपर कहा, आधार सर्वलेट की तरह आप अपने प्रश्न में निर्दिष्ट पैटर्न का समर्थन नहीं करता। वसंत एमवीसी पैटर्न का समर्थन करता है। HereSpring Reference Document में प्रासंगिक खंड का एक लिंक है।

0

आप कर नहीं होना चाहिए कि web.xml में नहीं बल्कि आप अपने फ़िल्टर (Patternfilter) के लिए हर अनुरोध इंगित कर सकते हैं और के रूप में दूसरों को संकेत दिया है यूआरएल

package com.inventwheel.filter; 

import java.io.IOException; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.annotation.WebFilter; 
import javax.servlet.http.HttpServletRequest; 

/** 
* Servlet Filter implementation class PatternFilter 
*/ 
@WebFilter("/*") 
public class PatternFilter implements Filter { 

    /** 
    * Default constructor. 
    */ 
    public PatternFilter() { 
     // TODO Auto-generated constructor stub 
    } 

    /** 
    * @see Filter#destroy() 
    */ 
    public void destroy() { 
     // TODO Auto-generated method stub 
    } 

    /** 
    * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) 
    */ 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
      String servletPath = ((HttpServletRequest)request).getServletPath(); 
      String requestURI = ((HttpServletRequest)request).getRequestURI(); 
      Pattern pattern = Pattern.compile(".*"+servletPath+"/(.*)"); 
      Matcher matcher = pattern.matcher(requestURI); 
      if (matcher.matches()) 
      { 
      String param = matcher.group(1); 
      // do stuff with param here.. 
      } 

     chain.doFilter(request, response); 
    } 

    /** 
    * @see Filter#init(FilterConfig) 
    */ 
    public void init(FilterConfig fConfig) throws ServletException { 
     // TODO Auto-generated method stub 
    } 

} 
7

के लिए जाँच कर सकते हैं, सर्वलेट विनिर्देश की अनुमति नहीं है ऐसे पैटर्न; हालांकि, आप JAX-RS पर विचार कर सकते हैं जो इस तरह के पैटर्न की अनुमति देता है, यदि यह आपके उपयोग के मामले के लिए उपयुक्त है।

@Path("/xyz/{value}/test") 
public class User { 

    public String doSomething(@PathParam("value") final String value) { ... } 

} 

या:

@Path("/xyz/{value}") 
public class User { 

    @Path("test") 
    public String doTest(@PathParam("value") final String value) { ... } 

} 

(से संबंधित:। https://stackoverflow.com/a/8303767/843093)

-2

आप इस लाइब्रेरी का उपयोग कर सकते हैं: http://zerh.github.io/ServletIO/ है, तो आप MVC नियंत्रकों में आपके सर्वलेट्स बदलने और सुंदर उपयोग कर सकते हैं यूआरएल

+1

आपके लिंक के डोमेन/यूआरएल के आधार पर, या आपके उपयोगकर्ता नाम के समान, आप अपनी साइट से जुड़े हुए प्रतीत होते हैं। यदि आप ऐसा करते हैं, तो आपको * यह खुलासा करना होगा कि यह आपकी साइट * है। यदि आप यह खुलासा नहीं करते कि यह आपकी साइट है, तो इसे प्रायः स्पैम माना जाता है। देखें: [** क्या "अच्छा" आत्म प्रचार को दर्शाता है? **] (// meta.stackexchange.com/q/182212) और [स्पैमर कैसे नहीं है] (// stackoverflow.com/help/promotion)। – Makyen

+0

संभावित समाधान का एक लिंक हमेशा स्वागत है, लेकिन कृपया [लिंक के चारों ओर संदर्भ जोड़ें] (// meta.stackoverflow.com/a/8259) ताकि आपके साथी उपयोगकर्ताओं को कुछ पता चल जाएगा कि यह क्या है और यह क्यों है। ** यदि लक्षित साइट पहुंच योग्य नहीं है या स्थायी रूप से ऑफलाइन हो जाती है, तो हमेशा एक महत्वपूर्ण लिंक के सबसे प्रासंगिक भाग को उद्धृत करें। ** ध्यान रखें कि बाहरी साइट_ के लिंक से अधिक स्पष्ट रूप से होने का एक संभावित कारण है [क्यों और कुछ उत्तरों कैसे हटाए गए हैं?] (// stackoverflow.com/help/deleted-answers)। – Makyen

संबंधित मुद्दे