2012-07-10 18 views
12

पर एक से अधिक संसाधन निर्देशिका जोड़ें जेटी के साथ कई स्थिर निर्देशिकाओं का उपयोग करना चाहते हैं। सर्वर रन कब:जेटी

http://localhost:8282/A 
    http://localhost:8282/B 
    http://localhost:8282/C 
  • एक एक्स/वी में रखा गया है/ए
  • बी क्यू/Z में रखा गया है/बी
  • सी पी में रखा गया है/टी/सी

निम्नलिखित विफल रहा:

ResourceHandler resource_handler = new ResourceHandler(); 
    resource_handler.setWelcomeFiles(new String[]{"index.html"}); 
    resource_handler.setResourceBase(HTML_SITE); 

    ResourceHandler resource_handler1 = new ResourceHandler(); 
    resource_handler1.setWelcomeFiles(new String[]{"index.html"}); 
    resource_handler1.setResourceBase(HTML_CLIENTZONE_SITE); 

    // deploy engine 
    WebAppContext webapp = new WebAppContext(); 

    String dir = System.getProperty("user.dir"); 
    webapp.setResourceBase(getWebAppPath()); 
    webapp.setContextPath("/"); 


    HandlerList handlers = new HandlerList(); 
    handlers.setHandlers(new Handler[]{resource_handler,resource_handler1 ,webapp, new DefaultHandler()}); 
    server.setHandler(handlers); 

मैं कैसे जोड़ सकते हैं एक से अधिक स्थिर संसाधन निर्देशिका?

Server server = new Server(8282); 
WebAppContext context = new WebAppContext(); 
context.setContextPath("/"); 
ResourceCollection resources = new ResourceCollection(new String[] { 
    "project/webapp/folder", 
    "/root/static/folder/A",  
    "/root/static/folder/B",  
}); 
context.setBaseResource(resources); 
server.setHandler(context); 
server.start(); 

बाद में एक फ़ाइल को खोलने के ServletContext (जैसे, WebAppContext) का उपयोग है, जो एक का हिस्सा हो सकता:

उत्तर

16

6.1.12 के बाद से, यह WebAppContext के आधार संसाधन के लिए एक ResourceCollection का उपयोग कर के द्वारा समर्थित है इंटरफ़ेस परिभाषा, जैसे:

/** 
    * Opens a file using the servlet context. 
    */ 
    public default InputStream open(ServletContext context, String filename) { 
    String f = System.getProperty("file.separator") + filename; 
    return context.getResourceAsStream(f); 
    } 

जैसे:

InputStream in = open(context, "filename.txt"); 

यह filename.txt खुल जाएगा यदि यह किसी दिए गए निर्देशिका में से एक में मौजूद है। ध्यान दें कि getResourceAsStream null वापस आ जाएगी, बजाय एक अपवाद फेंक, तो यह एक अच्छा विचार है यह जांच करने के लिए:

return validate(context.getResourceAsStream(filename), filename); 
2

यदि आप चाहते हैं: इस प्रकार

public default InputStream validate(InputStream in, String filename) 
    throws FileNotFoundException { 
    if(in == null) { 
     throw new FileNotFoundException(filename); 
    } 

    return in; 
    } 

तो फिर तुम open विधि को अपडेट कर सकते हैं कॉन्फ़िगरेशन के साथ DefaultServlet के कई उदाहरणों का उपयोग करके सर्वर नेमस्पेस में मनमानी यूआरआई में स्वतंत्र संसाधन निर्देशिकाओं को "माउंट" करने के लिए सबसे अच्छा विकल्प है।

Server server = new Server(); 
SelectChannelConnector connector = new SelectChannelConnector(); 
connector.setPort(Integer.parseInt(port)); 
server.addConnector(connector); 

ServletContextHandler servletHandler = new ServletContextHandler(null, "/", true, false); 

// Configuration for serving /A/* from X/V/A 
DefaultServlet aServlet = new DefaultServlet(); 
ServletHolder aHolder = new ServletHolder(aServlet); 
aHolder.setInitParameter("resourceBase", "X/V/A"); 
aHolder.setInitParameter("pathInfoOnly", "true"); 
servletHandler.addServlet(aHolder, "/A/*"); 

// Configuration for serving /B/* from Q/Z/B 
DefaultServlet bServlet = new DefaultServlet(); 
ServletHolder bHolder = new ServletHolder(bServlet); 
bHolder.setInitParameter("resourceBase", "Q/Z/B"); 
bHolder.setInitParameter("pathInfoOnly", "true"); 
servletHandler.addServlet(bHolder, "/B/*"); 

HandlerList handlers = new HandlerList(); 
handlers.setHandlers(new Handler[] { servletHandler }); 
server.setHandler(handlers); 

server.start(); 

नोट::

यह स्निपेट फाइल सिस्टम पथ Q/Z/B से फाइल सिस्टम पथ X/V/A और /B/* से यूआरआई /A/* में काम करेगा कि आप ऊपर के कोड से देख सकते हैं, कोई जरूरत नहीं है कि निर्देशिका का नाम जिसमें से /A/* परोसा जाता है, उदाहरण के तौर पर A है। दोनों नाम - निर्देशिका के लिए फाइल सिस्टम का नाम और यूआरआई सामग्री को मैप करने के लिए - पूरी तरह से स्वतंत्र हैं।

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