2012-01-17 11 views
10

में यूआरएल मैपिंग मैं Design Patterns web based applications पर पैटर्न का पालन करने की कोशिश कर रहा हूं। जब यह "रूट" यूआरएल मैप करने की बात आती है तो यह सब ठीक काम करता है।टॉमकैट में फ्रंटकंट्रोलर सर्वलेट

मैं "मोर्चा नियंत्रक" के माध्यम से सभी अनुरोधों को शामिल करना चाहते हैं तो मैं web.xml में

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

रख दिया है। NetBeans के साथ के माध्यम से पता चलता है कदम अनुरोध में आ रहा है, और कार्रवाई ठीक काम कर रहा है, लेकिन फिर लाइन

request.getRequestDispatcher("/WEB-INF/" + view + ".jsp").forward(request, response); 

भी नियंत्रक द्वारा पकड़ा जाता है, इसे फिर से कार्रवाई करने के लिए चला जाता है और यह सब विफल रहता है।

मैं इसे यूआरएल रूट से नहीं जाकर काम कर सकता हूं उदा।

<servlet-mapping> 
     <servlet-name>ControllerServlet</servlet-name> 
     <url-pattern>/pages/*</url-pattern> 
    </servlet-mapping> 

लेकिन यह वही नहीं है जो मैं चाहता हूं। क्या इसे "रूट" यूआरएल के साथ काम करने का कोई तरीका है?

उत्तर

8

/* URL पैटर्न सब कुछ, यह भी अग्रेषित JSP फ़ाइलें और निश्चित संसाधनों की तरह शामिल किया गया सीएसएस/जे एस/छवियों। आप इसे फ्रंट कंट्रोलर सर्वलेट पर नहीं रखना चाहते हैं।

अपने नियंत्रक सर्वलेट को /pages/* जैसे अधिक विशिष्ट URL पैटर्न पर रखें। आप /resources की तरह एक आम फ़ोल्डर में निश्चित संसाधनों समूहीकरण और एक Filter जो /* पर मैप किया गया है बनाने के द्वारा URL में "/ पृष्ठों" से छुटकारा पाने के कार्यात्मक आवश्यकता को प्राप्त करने और doFilter() विधि में निम्नलिखित काम करता है सकते हैं:

HttpServletRequest req = (HttpServletRequest) request; 
String path = req.getRequestURI().substring(req.getContextPath().length()); 

if (path.startsWith("/resources/")) { 
    // Just let container's default servlet do its job. 
    chain.doFilter(request, response); 
} else { 
    // Delegate to your front controller. 
    request.getRequestDispatcher("/pages" + path).forward(request, response); 
} 

एक अग्रेषित जेएसपी संसाधन डिफ़ॉल्ट रूप से इस फ़िल्टर से मेल नहीं खाता है, इसलिए इसे कंटेनर के JspServlet द्वारा ठीक से उठाया जाएगा।

+0

उत्तर के लिए धन्यवाद, यह जटिल लग रहा है, तो यह मुझे कुछ समय लग रहा है, फिल्टर करने के लिए अब मैं सिर्फ में सब कुछ छोड़ देंगे के लिए/पृष्ठों/ – Mark

+0

आप path.match ("^। * \\/[^ \\।] * $") के साथ एक्सटेंशन रहित अनुरोधों से मेल खा सकते हैं और आगे अपने फ्रंट कंट्रोलर पर भेज सकते हैं। – Ring

+0

@ बालससी 'सबस्ट्रिंग' का क्या मतलब है? – user2418306

0

/* यूआरएल पैटर्न आपके आवेदन में सभी servlets, jsp और स्थिर सामग्री से मेल खाता है।

Whay आप की आवश्यकता होगी बिलाव डिफ़ॉल्ट jsp सर्वलेट का उपयोग की अनुमति के लिए एक * .jsp पैटर्न को परिभाषित करने के लिए है:

<servlet-mapping> 
    <servlet-name>jsp</servlet-name> 
    <url-pattern>*.jsp</url-pattern> 
</servlet-mapping> 
3

हमें प्रत्येक URL को मानचित्र करने की आवश्यकता क्यों है। यदि आपको सभी यूआरएल को मैप करने की ज़रूरत है, तो आपको फ़िल्टर में यूआरएल छोड़ने की आवश्यकता हो सकती है।

<filter> 
    <display-name>SessionFilter</display-name> 
    <filter-name>SessionFilter</filter-name> 
    <filter-class>com.colabcom.goshare.app.base.filter.SessionFilter</filter-class> 
    </filter> 
    <filter-mapping> 
    <filter-name>sessionFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    </filter-mapping> 

आपका फ़िल्टर में,

 HttpServletRequest request = (HttpServletRequest) req; 
     HttpServletResponse response = (HttpServletResponse) res; 
     String url = request.getServletPath(); 
     boolean allowedRequest = Utility.filterURL(url, avoidUrls); 
     if(allowedRequest){ 
      chain.doFilter(request, response); 
     }else{ 
      //Main Filter Code   
     } 

उपयोगिता कक्षा अपने URL फिल्टर करने के लिए:

public static boolean filterURL(String str, List<String> avoidURLList) { 
    boolean exist = false; 

    if(avoidURLList == null){ 
     return exist; 
    } 
    for (int i = 0; i < avoidURLList.size(); i++) { 
     if (str.contains(avoidURLList.get(i))) { 
      exist = true; 
      break; 
     } 
    } 
    return exist; 
} 

वरना आप

<filter-mapping> 
    <filter-name>sessionFilter</filter-name> 
    <url-pattern>*.action</url-pattern> 
    </filter-mapping> 
+0

उत्तर के लिए धन्यवाद, यह जटिल लग रहा है, इसलिए मुझे फ़िल्टर करने के लिए कुछ समय लगेगा, क्योंकि अब मैं बस/पेज/ – Mark

0
की तरह अपने web.xml में विशिष्ट यूआरएल मैप कर सकते हैं

आप डिफ़ॉल्ट सर्विलेट का विस्तार कर सकते हैं आपके वेब सर्वर का। विस्तारित सर्वलेट आपका फ्रंट कंट्रोलर होगा। डीओजीईटी या डूपॉस्ट विधि में अपने स्थिर पृष्ठों को सुपर क्लास में अग्रेषित करें। DefaultServlet वह सर्वलेट है जिसे डिफ़ॉल्ट रूप से url "/" में मैप किया गया है। मैंने जेटी सर्वर के साथ इसका इस्तेमाल किया है लेकिन इसे टॉमकैट में भी लागू किया जा सकता है।

public class FrontController extends DefaultServlet { 

@Override 
public void init() throws UnavailableException { 
    super.init(); 
} 

@Override 
protected void doGet(HttpServletRequest request, 
     HttpServletResponse response) throws ServletException, IOException { 

    String uri = request.getRequestURI(); 

    /* 
    * if request is trying to access inside /static then use the default 
    * servlet. YOU CAN USE YOUR OWN BUSINESS LOGIC TO FORWARD REQUESTS 
    * TO DEFAULTSERVLET 
    */ 
    if (uri.startsWith("/static/")) { 

     super.doGet(request, response); 
     return; 
    } else { 

     // else use your custom action handlers 
    } 
} 

}

ऊपर कोड नमूने मैं सभी/स्थिर/करने के लिए डिफ़ॉल्ट सर्वलेट पर कार्रवाई करने के साथ शुरू अनुरोध अग्रेषित कर दिया है। इस तरह आप FrontController को "/" स्तर पर मैप कर सकते हैं।

<servlet> 
<description></description> 
<display-name>FrontController</display-name> 
<servlet-name>FrontController</servlet-name> 
<servlet-class>FrontController</servlet-class> 

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

+0

में सब कुछ छोड़ दूंगा क्या यह आपके समाधान को किसी विशिष्ट कंटेनर से बांधता है? दूसरे शब्दों में, एक बार जब मैं इस कोड को अपने आवेदन में लिखता हूं तो क्या मैं टॉमकैट या जेट्टी या तब से जो कुछ भी कर रहा हूं, तब तक जब तक मुझे बाद में वापस आना और इस कोड को बदलना पड़े? – Ring

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