2012-04-02 13 views
7

देता है मैं अपने वेब ऐप के लॉगिन हिस्से के साथ पिछले कुछ दिनों से संघर्ष कर रहा हूं। मैं उस बिंदु पर पहुंच गया हूं जहां मैं टॉमकैट पर जेडीबीसीआरम का उपयोग कर उपयोगकर्ता को सफलतापूर्वक प्रमाणीकृत कर सकता हूं (एसक्यूएल सर्वर डेटाबेस से उपयोगकर्ताओं को पढ़कर)। अब मैं किसी प्रकार की फीडबैक भेजना चाहता हूं जब उपयोगकर्ता का खाता अवरुद्ध कर दिया गया हो, या जब क्रेडेंशियल्स गलत हो, तो यह वह जगह है जहां मैं अब अटक गया हूं।FacesContext.getCurrentInstance() का उपयोग कैसे करें, यह शून्य

मैं इस उपयोग करना चाहता था:

try { 
     request.login(request.getParameter("user"), request.getParameter("pass")); 
    } catch (ServletException se) { 
     FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Wrong Username/Password combination")); 
     log(se.getMessage()); 
    } 

लेकिन FacesContext.getCurrentInstance() हमेशा रिटर्न अशक्त ..

कुछ शोध मुझे पता चला है कि अनुरोध में स्थित एक पेज से आना चाहिए करने के बाद/चेहरों का सामना करना पड़ता है ताकि FacesServlet को बुलाया जा सके और FacesContext प्रारंभ हो जाए (कम से कम यही मुझे समझ में आया)।

इसलिए मैंने लॉगिन पेज को वेब पेज फ़ोल्डर के अंदर चेहरे नाम के एक नए फ़ोल्डर में स्थानांतरित कर दिया। लेकिन अब हर मैं login.xhtml पेज कॉल करने के लिए प्रयास करते हैं, मैं इस त्रुटि मिलती है:

/login.xhtml Not Found in ExternalContext as a Resource 

और यह स्टैकट्रेस है:

com.sun.faces.context.FacesFileNotFoundException: /login.xhtml Not Found in ExternalContext as a Resource 
at com.sun.faces.facelets.impl.DefaultFaceletFactory.resolveURL(DefaultFaceletFactory.java:232) 
at com.sun.faces.facelets.impl.DefaultFaceletFactory.resolveURL(DefaultFaceletFactory.java:273) 
at com.sun.faces.facelets.impl.DefaultFaceletFactory.getFacelet(DefaultFaceletFactory.java:201) 
at com.sun.faces.application.view.FaceletViewHandlingStrategy.buildView(FaceletViewHandlingStrategy.java:764) 
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:100) 
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) 
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:410) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:304) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
at java.lang.Thread.run(Thread.java:619) 

जब मैं में सीधे URL दर्ज मैं भी इस त्रुटि मिलती है ब्राउज़र

इम Netbeans 7.1 का उपयोग कर अपाचे बिलाव 7

इसे ठीक करने पर कोई मदद (जो वैसे एक दर्द है क्योंकि मैं -.- स्मृति अपवाद से बाहर PermGen का एक बहुत मिलता है) के साथ बहुत सराहना की जाएगी ।

उत्तर

8

यह null वापस आ जाएगा जब आप एक प्रबंधित बीन या किसी अन्य जेएसएफ आर्टिफैक्ट में नहीं हैं। उदाहरण के लिए, एक सादे वेनिला सर्वलेट या एक सर्वलेट फ़िल्टर जो FacesServlet रन से पहले चलता है। FacesServlet अर्थात् वह है जो FacesContext बनाता है और वर्तमान HTTP अनुरोध में इसे ThreadLocal के रूप में रखता है। आपको जेएसएफ प्रबंधित बीन में सामान्य तरीके से लॉगिन नौकरी करने की ज़रूरत है। उस कोड लॉगिन का वह टुकड़ा जो आपके पास है, एक जेएसएफ प्रबंधित बीन में है।

लॉगिन पेज के रूप में, यह किसी अन्य जेएसएफ पृष्ठ से अलग नहीं है जिसे आपने कभी विकसित किया है। या आपने वास्तव में जेएसएफ के साथ कभी विकसित नहीं किया है और क्या यह आपका पहला जेएसएफ प्रयास है? खैर, आपको अपने प्रश्न में इसके बारे में और भी स्पष्ट होना चाहिए था। /faces फ़ोल्डर से छुटकारा पाएं, बस वेबकंटेंट में login.xhtml डालें और सुनिश्चित करें कि FacesServlet का URL पैटर्न web.xml पर *.xhtml पर सेट है। फिर आप इसे http://localhost:8080/yourapp/login.xhtml द्वारा खोल सकते हैं।

जेएसएफ बेहतर सीखने के लिए, पहले थोड़ा सभ्य पुस्तक/ट्यूटोरियल के माध्यम से जाएं और इंटरनेट पर जो ढीले टुकड़े मिलते हैं, उन्हें वास्तव में समझने के बिना कोड की उन पंक्तियों को समझने के बिना प्रयास न करें। एक बार जब आप इसे वास्तव में समझते हैं तो आपको स्वयं लिखने/समझाने में सक्षम होना चाहिए। यहां प्रारंभ करें: Our JSF wiki page

+0

हाँ, यह मेरा पहला जेएसएफ प्रयास है :) आपके उत्तर के लिए धन्यवाद, यह मेरे प्रश्न का उत्तर देता है। मूल रूप से मैं FacesServlet चलाने से पहले कहीं भी FacesContext तक नहीं पहुंच सकता, इसलिए जब भी मैं Fctx तक पहुंचना चाहता हूं तो मुझे एक प्रबंधित बीन का उपयोग करना होगा। सीखने के हिस्से के बारे में, मैं एक किताब पढ़ने शुरू करने से पहले एक भाषा पर बुनियादी चीजें करने की कोशिश करना चाहता हूं, इस तरह जब मैं इसे पढ़ रहा हूं, तो यह आसान हो जाएगा और मैं वास्तव में जानूंगा कि पुस्तक किस बारे में बात कर रही है । किसी भी तरह से मुझे अभी भी यकीन नहीं है कि मैं पृष्ठ को एक/चेहर फ़ोल्डर के अंदर क्यों नहीं रख सकता? मैं आपकी सलाह का पालन करूंगा और फेस सर्विसलेट पैटर्न बदलूंगा। –