2009-08-16 30 views
15

मैं जावा एप्लिकेशन के लिए एक वेब उपयोगकर्ता इंटरफ़ेस बनाने की कोशिश कर रहा हूं। उपयोगकर्ता इंटरफ़ेस बहुत सरल होने जा रहा है, जिसमें उपयोगकर्ताओं के लिए उनके प्रश्न पूछने के लिए एक पृष्ठ वाला एक पृष्ठ शामिल है, और एक परिणाम पृष्ठ - Google के खोज इंजन या Ask.com की तरह।जावा अनुप्रयोग के लिए वेब उपयोगकर्ता इंटरफेस

मैं जावा के बेस एपीआई से काफी परिचित हूं, लेकिन मुझे वेब वातावरण के लिए जावा का उपयोग करने में अधिक अनुभव नहीं है (हालांकि मैंने एएसपी.नेट का उपयोग किया है), इसलिए मैं कुछ सलाह ढूंढ रहा हूं:

  • क्या वेब अनुप्रयोग सर्वर उपयोग करना चाहिए? ध्यान दें कि मेरा इंटरफ़ेस बहुत हल्का है, और मुझे बस कुछ ऐसा चाहिए जो तेज़ है, शुरू करने/रीसेट/स्टॉप करने के लिए आसान है और (पुनः) मेरे आवेदन को तैनात करना है। इसके अलावा, मुझे पर कई वातावरण, अर्थात्, जीएनयू/लिनक्स, मैक ओएस एक्स, और विंडोज एक्सपी/विस्टा पर काम करने की आवश्यकता है। इसके अतिरिक्त, मैं ant और Eclipse का उपयोग कर रहा हूं, इसलिए यह बहुत अच्छा होगा अगर मैं आसानी से सर्वर प्रबंधन के लिए कुछ ant लक्ष्य जोड़ सकता हूं, और/या आईडीई का उपयोग कर सर्वर का प्रबंधन कर सकता हूं। मैंने टॉमकैट और जेटी में देखा है, और बाद में स्थापित करने और तैनात करने में बहुत हल्का और आसान लगता है। यह आदर्श है, क्योंकि जीयूआई केवल प्रदर्शन उद्देश्यों के लिए है, और मुझे शायद इसे विभिन्न कंप्यूटरों में तैनात करने की आवश्यकता होगी। हालांकि, टोमकैट बहुत लंबे समय से आसपास रहा है, और यह अधिक परिपक्व लगता है।

  • वेब पृष्ठों का सवाल है, जावा सर्वर पेज, एक अच्छा फिट की तरह लग रहे वे के लिए पर्याप्त रूप से सरल प्रतीत के रूप में मैं क्या पूरा करने के लिए (एक फार्म प्रसंस्करण और परिणाम outputting) कोशिश कर रहा हूँ, लेकिन मैं सब कर रहा हूँ सुझावों के लिए कान।

  • मैं भी एक और आवश्यकता है, जो मुझे आवश्यकता है आवेदन की "बुनियादी" कार्यप्रवाह समझाना पड़ेगा: असल में, मैं एक वर्ग Engine जो एक विधि run(String) जो उपयोगकर्ता के इनपुट की प्रक्रिया और प्रदर्शन के लिए परिणाम देगा है की है। यह कक्षा आवेदन के कोर है। अब, मैं चाहता हूँ इन्स्तांत इस वर्ग केवल एक बार, के रूप में यह स्मृति का एक बहुत आवश्यकता है, और एक बहुत लंबे समय प्रारंभ करेंगे करने के लिए ले जाता है, तो मैं जब आवेदन/सर्वर शुरू होता है यह बनाना चाहते हैं जो करने के लिए , और एप्लिकेशन के पूरे अवधि के लिए संदर्भित स्टोर (यानी, जब तक कि मैं सर्वर को रोक नहीं देता)। फिर, प्रत्येक उपयोगकर्ता अनुरोध के लिए, मैं बस Engine उदाहरण की विधि का आह्वान करता हूं, और इसके परिणाम प्रदर्शित करता हूं। जावा में यह कैसे पूरा किया जा सकता है?

उत्तर

10
  1. ऐप सर्वर।आप टॉमकैट को रनटाइम पदचिह्न, या सीखने की मात्रा या ... के मामले में भारी के रूप में देखते हैं? मैं ऐसा कुछ चुनना चाहता हूं जिसने आईडीई के साथ अच्छी तरह से एकीकरण स्थापित किया हो। तो ग्रहण + टोमकैट या अपाचे गेरोनिमो, शायद WebSphere Community Edition में यह काम करेगा। जो मैंने देखा है उससे जो आप चाहते हैं उसके लिए पर्याप्त हैं, और सीखने के वक्र वास्तव में बहुत प्रबंधनीय हैं।
  2. हाँ जेएसपी। आपको अभी तक पता चल सकता है कि आपकी प्रस्तुति की आवश्यकता एक और अधिक जटिल हो गई है। जेएसएफ में जाने का अतिरिक्त प्रयास अभी भी भुगतान कर सकता है - डेट पिकर्स जैसे अच्छे विजेट।
  3. आपके प्रसंस्करण में आपके पास एक सर्वलेट (या यदि आप जेएसएफ का उपयोग कर रहे हैं तो एक एक्शन क्लास) होगा, उस वर्ग में स्टार्टअप पर प्रारंभ किए गए इंजन प्रकार का सदस्य चर हो सकता है और फिर प्रत्येक अनुरोध के लिए उपयोग किया जा सकता है। ध्यान में रखना यह बात है कि कई उपयोगकर्ता उस सर्वलेट को हिट करेंगे, और इसलिए इंजन एक ही समय में होगा। क्या आपका इंजन एक ही समय में एक से अधिक धागे से उपयोग किया जा सकता है?

इस बिंदु में विस्तार करने के लिए। जेएसपी लागू करते समय, मॉडल 1 और मॉडल 2 के रूप में दो मॉडल (कुछ आविष्कारशीलता के साथ) के रूप में पेश किए जाते हैं। this explanation देखें।

मॉडल 1 के मामले में आप सीधे जेएसपी में कोड डालते हैं, यह नियंत्रक भूमिका में काम कर रहा है। Persoanlly, छोटे, जल्दी विकसित एप्स से निपटने के बावजूद, मैं ऐसा नहीं करता। मैं हमेशा मॉडल 2 का उपयोग करता हूं। हालांकि यदि आप चुनते हैं तो आप कुछ जावा को अपने जेएसपी में डाल सकते हैं।

<% MyWorker theWorker = MyWorkerFactory.getWorker(); 
    // theWorker.work(); 
%> 

मैं इस तरह के एक कारखाने के पक्ष में woudl पक्ष है ताकि आप कार्यकर्ता के निर्माण को नियंत्रित कर सकें। कारखाने की तरह (एक बहुत ही सरल उदाहरण देने के लिए) कुछ होता है जब कि विधि पहले कहा जाता है

private static MyWorker s_worker = new MyWorker(); 
public static synchronized getWorker() { 
     return s_worker; 
} 

वैकल्पिक रूप से आप कार्यकर्ता बना सकते हैं।

मॉडल 2 के मामले में आप स्वाभाविक रूप से एक सर्वलेट जिसमें आप कुछ कोड डाल करने के लिए जा रहे हैं है, तो आप सिर्फ जब सर्वलेट भरी हुई है

private MyWorker m_worker = MyWorkerFactory.getWorker(); 

यह initialised किया जाएगा हो सकता है। इसे स्टार्टअप पर लोड करने के बारे में चिंता करने की आवश्यकता नहीं है, आपको बस पता है कि पहले अनुरोध चलाने से पहले इसे आरंभ किया जाएगा। बेहतर अभी भी, सर्वलेट की init() विधि का उपयोग करें। किसी भी अनुरोध पर संसाधित होने से पहले इसे बुलाया जाने वाला है और इस तरह के काम के लिए सर्वलेट एपीआई आर्किटेक्टेड जगह है।

public class EngineServlet extends HttpServlet { 

private Engine engine; 

// init is the "official" place for initialisation 
public void init(ServletConfig config) throws ServletException { 
    super.init(config); 
    engine = new Engine(); 
} 
+1

टिप्पणी के लिए धन्यवाद। 1) इस अर्थ में भारी है कि ऐसा लगता है कि मुझे ऐसी कई सुविधाएं हैं जिनकी मुझे आवश्यकता नहीं है, और ऐसा लगता है कि इसे स्थापित करने के लिए कुछ अतिरिक्त कदमों की आवश्यकता है। दूसरी तरफ, जेटी से मैंने जो देखा है, उससे शुरू होने के लिए यह सब 'जावा -जर start.jar' चलाने के लिए होता है। वहाँ भी एक अच्छा योगदान परियोजना जो मुझे तू सिर्फ 'जावा जार घाट-runner.jar application.war' है, जो बहुत अच्छा है, जैसा कि मैंने प्रदर्शन के उद्देश्य से वेब इंटरफेस चलाना चाहते हैं विभिन्न कंप्यूटरों पर, का उपयोग करके अपने आवेदन को चलाने के लिए अनुमति देता है है । हालांकि, टोमकैट में वास्तव में ठोस प्रतिष्ठा है, इसलिए यह एक कठिन विकल्प है। –

+0

2) यह वास्तव में एक (काफी) जटिल आवेदन के लिए एक बहुत ही सरल अंतरफलक है, और मुझे नहीं लगता कि मैं वास्तव में और अधिक उन्नत विगेट्स आवश्यकता पड़ने वाली है, लेकिन सुझाव के लिए धन्यवाद। आखिरकार, मुझे परिणाम पृष्ठ पर कुछ एपीआई (जैसे Google मानचित्र) को एकीकृत करने की आवश्यकता होगी, लेकिन मैं इसके लिए बस जेएसपी पेज में जावास्क्रिप्ट को कोड कर दूंगा। –

+0

3) क्या आप जेएसपी का उपयोग करके मुझे इसके लिए एक उदाहरण प्रदान कर सकते हैं? जो मैंने अभी तक पढ़ा है, उससे मुझे सर्वलेट कॉन्फ़िगरेशन के 'लोड-ऑन-स्टार्टअप' को "सक्रिय" करने की आवश्यकता है, ताकि सर्वर प्रारंभ होने पर लोड हो। लेकिन मैं जेएसपी के अंदर से सर्वलेट के सदस्य चर 'इंजन' को कैसे एक्सेस कर सकता हूं? असल में, मेरे पास एक इनपुट टेक्स्ट फ़ील्ड वाला एक पृष्ठ 'एजेस्प' है, जिसका सामग्री 'जीईटी' पृष्ठ 'बीजेएसपी' का उपयोग करके पारित किया जा रहा है। इस पृष्ठ में, मुझे 'इंजन' उदाहरण प्राप्त करने की आवश्यकता है, 'क्वेरी स्ट्रिंग' की सामग्री का उपयोग करके एक विधि का आह्वान करें, और परिणामों को आउटपुट करें। –

0

यह एक बहुत खुला एंडेड सवाल है, और आपकी आवश्यकताओं के आधार संभव जवाब की एक बड़ी संख्या है। मानक वेब अनुप्रयोग लिखने का तरीका जावा ईई प्लेटफ़ॉर्म का उपयोग कर रहा है, जिसका अर्थ व्यावसायिक तर्क के लिए जेएसपी, सर्वलेट और ईजेबी है। हालांकि, वसंत, सीम, जीडब्ल्यूटी, और रेलवे पर जेआरबी जैसे अधिक कट्टरपंथी विकल्प जैसे कुछ लोकप्रिय और वैध विकल्प हैं। ऐसा लगता है कि आपकी ज़रूरतें बहुत सरल हैं इसलिए आप जेटी + सर्वलेट्स + जेएसपी जैसे साधारण समाधान के साथ जाना चाहेंगे।

मुझे लगता है कि आपका इंजन एकाधिक एक साथ अनुरोधों को संभाल सकता है? यदि नहीं, तो आप जेएमएस जैसे अनुरोधों को कतारबद्ध करने का एक तरीका ढूंढना चाहते हैं।

1

मान लिया जाये कि यह एक बंद आवेदन जो भविष्य में अद्यतन करने/रखरखाव के किसी भी प्रकार की जरूरत नहीं है नहीं है, मैं आपको निम्न कारणों से Apache Wicket साथ दृश्य परत करना (पढ़ने की सलाह देते हैं पहले मुखपृष्ठ से) लघु infoblurb:

  • के बाद विकेट दृश्य परत को अलग करती है और एक साफ तरह से MVC के मॉडल परत में काम करता है, यह हो सकता है आसानी से स्पष्ट किया कि दृश्य पूरी तरह से आवेदन के बाकी हिस्सों से अलग किया जाता है और विकेट का IModel interface डेटा को कंट्रोलर परत से दृश्य परत से जोड़ने के लिए उपयोग किया जाता है एक विश्वसनीय तरीके से। इस प्रकार जब तक आप इसे इस तरह उपयोग करते हैं, तब तक आपका कंट्रोलर लेयर शायद एक ही एप्लीकेशन सिंगलटन हो सकता है।
  • विकेट कोड को बनाए रखने के लिए आश्चर्यजनक रूप से आसान है, आपके वेब एप्लिकेशन की कार्यक्षमता को भी विस्तारित किया जा सकता है क्योंकि यह कोड को व्यक्त करने वाले अन्य प्रकार के मार्कअप के साथ मिश्रित मार्कअप के बजाय ओओपी फ्रेमवर्क है।
+0

टिप्पणियों के लिए धन्यवाद। यह साफ दिखता है, लेकिन मुझे वास्तव में केवल "फॉर्म => सबमिट => प्रक्रिया => परिणाम दिखाएं" की आवश्यकता है, क्योंकि यह केवल एप्लिकेशन के प्रदर्शन उद्देश्यों के लिए है। –

3

आपको जिस तकनीक को सीखने की आवश्यकता है वह सूर्य जावा सर्वलेट विनिर्देश है क्योंकि यह सभी गैर-तुच्छ जावा जावा सर्वर लागू होते हैं। यह आपको सर्वलेट लिखने में सक्षम बनाता है जो आपको उन सभी चीजों को कर सकता है जिन्हें आपको सर्वर की आवश्यकता होती है। फिर आप अपने आईडीई के साथ अच्छी तरह से काम कर रहे किसी भी कंटेनर के खिलाफ विकसित हो सकते हैं, और उत्पादन में अच्छी तरह से काम कर रहे किसी अन्य कंटेनर पर तैनात कर सकते हैं।

आपको बुनियादी HTML सीखने की भी आवश्यकता है क्योंकि अन्यथा आपको जावासेवर फेस या इसी तरह सीखने की आवश्यकता होगी जो HTML फ़ॉर्म में अन्य प्रविष्टियों के साथ सबमिट बटन सबमिट करने के लिए एक बड़ा मुकाबला है।

काम करने के लिए आप web.xml में एक सिंगलटन है जिसे आप कॉल कर सकते हैं के साथ एक सर्वलेट बना सकते हैं अपने इंजन के लिए

। पूरी तरह से सुनिश्चित करें कि यह थ्रेड सुरक्षित है अन्यथा आपको बहुत दर्द होगा। शुरुआत के लिए आप) अपने प्रेरक सर्वलेट रन की कि ज़्यादा से ज़्यादा एक कॉल (सुनिश्चित करने के लिए सिंक्रनाइज़ किसी भी समय सक्रिय है घोषणा कर सकते हैं।

+1

टिप्पणियों के लिए धन्यवाद। हाँ, यही मैंने सोचा था। मेरा लक्ष्य एक हल्का कंटेनर रखना है जहां मैं आसानी से प्रदर्शन उद्देश्यों के लिए आवेदन को तैनात कर सकता हूं। हालांकि, मुझे अंततः एक अलग कंटेनर का उपयोग करके, स्थायी रूप से एप्लिकेशन को होस्ट करने की आवश्यकता हो सकती है। मैं, HTML और अन्य वेब तकनीकों (सीएसएस/जावास्क्रिप्ट, वगैरह) पता है मैं उन्हें ASP.NET के साथ पहले का इस्तेमाल किया है है। हालांकि, मैं जावा में वेब अनुप्रयोग विकास के लिए नया हूं। –

+1

यदि आप एक अनुरूप जावा वेब एप्लिकेशन लिखते हैं तो कौन सा कंटेनर लगभग अप्रासंगिक है। टॉमकैट में आमतौर पर उत्कृष्ट आईडीई समर्थन होता है जो विकास करते समय अमूल्य है। अभी, मैं तुम्हें :-) –

+1

करने के लिए सीखने का एक सा है कहने के लिए माफी चाहता हूँ हाँ, मैं जानता हूँ कि, मैं इस विषय पर कुछ लेख पढ़ने के लिए किया गया है, कोई जरूरत नहीं खेद है;)। साथ ही, यदि आप कर सकते हैं, तो कृपया उस कोड पर टिप्पणी करें जिसे मैंने प्रश्न में जोड़ा है। –

0
  1. अनुप्रयोग सर्वर: बिल्ला
  2. वेब पेज: jsp
  3. आप एक वर्ग जो सिंगलटन या स्थिर विधि के साथ वर्ग है की जरूरत है। सावधानी का शब्द: दौड़ की स्थिति से सावधान रहें। आप अद्यतन को शामिल उन तरीकों के लिए सिंक्रनाइज़ कीवर्ड का उपयोग करने की आवश्यकता हो सकती/आपरेशन संशोधित करते हैं।
+0

आपको निश्चित रूप से वेब कंटेनर को थ्रेड असुरक्षित सर्वलेट को जानना और प्रबंधित करना चाहिए। सिंक्रनाइज़नाइज्ड जेवीएम को इसके बजाए ऐसा करने दें जो एक अनुत्तरदायी वेब कंटेनर का कारण बन सकता है। –

1
  1. जेट्टी एक बहुत ही हल्के कंटेनर है, और अपने विकास के परिदृश्य के लिए एकदम सही है।

  2. आप अपने प्रतिपादन पक्ष के लिए Wicket को देखने के लिए चाहते हो सकता है; आप सीधी यूआई के विपरीत कोड-जैसे कार्यों को और अधिक आरामदायक लगते हैं।

  3. पैटर्न आप का वर्णन कर रहे हैं सिंगलटन पैटर्न है। singleton in java के लिए Google परिणामों पर एक नज़र डालें।

3

संपादित: अब तक, मैं तय कर ली है निम्नलिखित:

  • वेब अनुप्रयोग सर्वर: जेट्टी;
  • जावा सर्वर पेज विचारों के लिए;
  • @djna के सुझावों के आधार पर, मैंने मॉडल 2 के बारे में कुछ लेख पढ़े हैं, और मैं इस समाधान के साथ आया (जिसे मैंने अभी तक परीक्षण नहीं किया है, क्योंकि मुझे आगे बढ़ने से पहले अपना आवेदन पूरा करने की आवश्यकता है इंटरफ़ेस में): EngineServlet.java

form.jsp

<form action="/servlet/EngineServlet" method="GET"> 
    <input type="text" name="text" /> 
</form> 

public class EngineServlet extends HttpServlet { 
    private Engine engine = new Engine(); 
    // does this make sure engine only gets instantiated one time in the entire lifespan of the web application; from what I've read from the servlet lifecycle, it seems like it, but I'd like to hear opinions 

    public void doGet(HttpServletRequest request, 
        HttpServletResponse response) { 
    String text = request.getParameter("text"); 
    ResultBean result = engine.run(text); 
    request.setAttribute("result", result); 
    RequestDispatcher dispatcher = request.getRequestDispatcher("result.jsp"); 
    dispatcher.forward(request, response); 
    // what's the difference between forward, and request.sendRedirect() ? 
    }  
} 

परिणाम।जेएसपी

<div>The result was: ${result.text}</div> 

इस समाधान के बारे में आप क्या सोचते हैं? जे 2 एसई पृष्ठभूमि से आने वाले किसी भी व्यक्ति के लिए कोई समस्या नहीं हो सकती है? मैंने कुछ संदेह भी लिखे हैं कि मेरे पास टिप्पणियों के रूप में कोड है। धन्यवाद।

+1

इंजन आरंभ: "स्वच्छ" अगर सर्वलेट init() विधि में किया है, मैं अपने जवाब में संशोधन कर लिया है कि कहने के लिए। सर्वलेट लाइफ-साइक्ल पर चर्चा की जाती है http://www.j2ee.me/j2ee/tutorial/1_3-fcs/doc/Servlets4.html आप देखेंगे कि किसी भी समय सर्वलेट क्लास का बिल्कुल एक उदाहरण होगा, इसलिए आपके कोड में एक समय में इंजन ** का एक उदाहरण ** होगा। ऐप सर्वर आपके सर्वलेट को अंतिम रूप देने और पुनः-इन करने का विकल्प चुन सकता है। मैंने कभी भी एक ऐप सर्वर नहीं देखा है, लेकिन 100% सुनिश्चित करने के लिए इंजन के साथ सिंगलटन होने की ज़िम्मेदारी रखी है। अगली टिप्पणी देखें। – djna

+2

यह आवश्यक हो सकता है कि एक से अधिक इंजन उदाहरण न हों।या यह मेमोरी खपत परिप्रेक्ष्य से वांछनीय वांछनीय हो सकता है। किसी भी मामले में मैं कहूंगा कि आपको क्लाइंट (इस मामले में सर्वलेट) पर पुलिस पर भरोसा नहीं करना चाहिए कि एक उदाहरण हो। इसके बजाय मेरे उत्तर में दिखाए गए कारखाने का उपयोग करें। सर्टल का कहना है, "मुझे एक इंजन दें" कारखाना कहता है "इस का उपयोग करें", और यह सुनिश्चित करने के लिए जिम्मेदारी ले सकता है कि सिंगलटन इंजन का उपयोग किया जाता है। यह समाधान असामान्य सर्वलेट जीवन चक्र की घटनाओं के लिए लचीला है, और भविष्य के रखरखाव के लिए भी, यदि आपके पास दो सेर्लोवेट हैं तो क्या होता है? – djna

+1

फॉरवर्ड: सर्वलेट कुछ काम करता है, कुछ डेटा एकत्र करता है, और फिर प्रतिपादन के लिए जेएसपी पर ** ** ** अनुरोध पास करता है। ब्राउजर सर्वलेट का यूआरएल देखता है। रीडायरेक्ट: सर्वेट ब्राउज़र को एक प्रतिक्रिया भेजता है, "इसे प्रदर्शित न करें, इसके बजाय ** ** ** ** के लिए एक अनुरोध भेजें, एक अलग यूआरएल। आप बाद वाले का उपयोग करते हैं जब मूल अनुरोध ने कुछ काम किया था जिसे आप गलती से दोहराना नहीं चाहते हैं (उदाहरण के लिए कुछ पैसे का भुगतान करें)। एक रीडायरेक्ट भेजकर ब्राउज़र के इतिहास में "जीईटी" डिस्प्ले अनुरोधों का अनुक्रम हो सकता है, बिना "पोस्ट" क्रियाओं के, यदि पुन: सबमिट किया गया तो कार्य दोहराएगा। – djna

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