2012-02-21 18 views
7

मैं जेटी एम्बेड करके अपने आवेदन के लिए एक सरल webservice स्थापित करने की कोशिश कर रहा हूं। मैं दो अलग-अलग वेब सेवाएं उपलब्ध करना चाहता हूं, एक साधारण HTTP सर्वर जो स्थिर सामग्री (जो अंत में एक जीडब्ल्यूटी ऐप होगा) और एक कस्टम सर्वलेट जो सेवा के लिए जेएसओएन स्टेटस संदेश थूक सकता है।मैं एम्बेडेड जेटी के साथ स्थिर संसाधन और कस्टम सेवाएं कैसे स्थापित करूं?

मेरे वितरण फ़ोल्डर संरचना इस तरह दिखता है:

+ dist/ 
    - MyApp.jar 
    + lib/ 
    + html/ 
    - index.html 

और यहाँ क्या मैं अब तक एम्बेडेड सर्वर विन्यस्त करने के लिए है है। http://localhost/data/ पर जाकर मुझे अपने कस्टम सर्वलेट से सही ढंग से मेरा टेस्ट आउटपुट मिलता है, लेकिन मुझे डिफ़ॉल्ट अनुक्रमणिका को मेरी index.html फ़ाइल ढूंढने के लिए प्रतीत नहीं होता है।

public Webserver(int port) { 
    server = new Server(port); 

    ServletContextHandler context = new ServletContextHandler(); 
    context.setResourceBase("./html/"); 
    server.setHandler(context); 


    JsonDataApiServlet dataServlet = new JsonDataApiServlet(); 
    DefaultServlet staticServlet = new DefaultServlet(); 

    context.addServlet(new ServletHolder(dataServlet), "/data/*"); 
    context.addServlet(new ServletHolder(staticServlet), "/*"); 
} 

यह इस तरह बातों में जेट्टी embedding लोगों के लिए एक आम कार्य होगा .. मैं भी सही रास्ते पर लगता है कर रहा हूँ?

संपादित

बाहर कर देता है इस समस्या को जिस तरह से संबंधित पथ जेट्टी के अंदर गणना कर रहे हैं की एक गलतफहमी की वजह से था। मैं इसे java -jar dist\MyApp.jar का उपयोग करके, दूरस्थ फ़ोल्डर के ऊपर एक फ़ोल्डर से चला रहा था, और जेटी dist\html के बजाय dist\..\html की तलाश में था। दूर फ़ोल्डर के अंदर से जार चलाना समस्या को हल करता है। मैं जवाब दूंगा कि मैंने इसे दूरस्थ निर्देशिका के अंदर से चलाने के बिना कैसे काम किया है।

+1

_I को indexServlet को मेरी index.html file_ खोजने के लिए प्रतीत नहीं होता है, तो, जब आप "/index.html" पर जाते हैं तो आप क्या व्यवहार देख रहे हैं। जेटी किस उत्पादन का उत्पादन करता है? – Tim

+0

धन्यवाद टिम, वह टिप्पणी मुझे सही दिशा में ले जाती है। – Collin

उत्तर

6

जैसा कि संपादन कहता है, यह उस निर्देशिका के साथ एक मुद्दा था जिसे मैं जार चला रहा था। यहां जिस विधि से मैं जार चलाया गया था, वहां से HTML फ़ोल्डर ढूंढने के लिए उपयोग की गई विधि:

सबसे पहले, मैंने जार के मैनिफेस्ट क्लास-पथ में HTML फ़ोल्डर जोड़ा। निम्नलिखित कोड जहाँ भी जार से भरी हुई है के लिए एचटीएमएल फ़ोल्डर देता है:

ClassLoader loader = this.getClass().getClassLoader(); 
File indexLoc = new File(loader.getResource("index.html").getFile()); 
String htmlLoc = indexLoc.getParentFile().getAbsolutePath(); 

यह classpath में सूचकांक फ़ाइल खोजने के लिए classloader का उपयोग करता है, तो पूर्ण निर्देशिका पाता जेट्टी के लिए पारित करने के लिए:

server = new Server(port); 

ServletContextHandler context = new ServletContextHandler(); 
context.setResourceBase(htmlLoc); 
context.setWelcomeFiles(new String[] { "index.html" }); 
server.setHandler(context); 


JsonDataApiServlet dataServlet = new JsonDataApiServlet(); 
DefaultServlet staticServlet = new DefaultServlet(); 

context.addServlet(new ServletHolder(dataServlet), "/data/*"); 
context.addServlet(new ServletHolder(staticServlet), "/*");