2011-02-04 16 views
11

मान लें कि मेरे पास एक ऐसा एप्लिकेशन है जो उपयोगकर्ताओं को प्रबंधित करता है। तुम्हें पता है, नया उपयोगकर्ता जोड़ सकते उन्हें हटा दें, संपादित विस्तार आदि प्रत्येक उपयोगकर्ता na आईडी है और इस तरह यूआरएल पर विस्तार पृष्ठ है:JSF2 404 त्रुटि "फेंक" कैसे करें?

..../user/detail.jsf?id=123 

अब, अगर आईडी के साथ उपयोगकर्ता 123 मौजूद नहीं है कि क्या होने चाहिए? मुझे लगता है कि प्राकृतिक प्रतिक्रिया 404 मानक त्रुटि होगी। जब आप URL में कुछ टाइपो (जैसे /user/dtail.jsf) बनाते हैं तो बिल्कुल वही आउटपुट होता है। तो सवाल यह है कि क्या ऐसी विधि है?

या शायद यह प्रतिक्रिया (404) उपयुक्त है?

धन्यवाद।

उत्तर

13

बस आईडी व्यू पैरामीटर के लिए एक वैधकर्ता संलग्न करें और यदि सत्यापन विफल रहता है, तो प्रतिक्रिया पर त्रुटि कोड 404 सेट करें।

उदा।

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core"> 

    <f:metadata> 
     <f:viewParam id="id" name="id" value="#{myBean.id}" validator="#{myBean.validate}"/> 
    </f:metadata> 

    <h:body> 

     <h:outputText value="#{myBean.id}"/> 

    </h:body> 

</html> 

और निम्न समर्थन सेम:

इस सरल Facelet पर विचार करें

@ManagedBean 
@ViewScoped 
public class MyBean { 

    private Long id; 

    public void validate(FacesContext context, UIComponent component, Object object) { 
     // Do some validation 
     // And if failed: 
     context.getExternalContext().setResponseStatus(404); 
     context.responseComplete(); 
    } 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

} 
+6

जेएसएफ 2 में ['बाहरी कॉन्टेक्स्ट # सेट रेस्पॉन्सस्टैटस()'] (http://download.oracle.com/javaee/6/api/javax/faces/context/ExternalContext.html#setResponseStatus%28int%29) है। अब कास्टिंग करने की कोई ज़रूरत नहीं है! :) जिस तरह से एक ['बाहरी कॉन्टेक्स्ट # प्रतिक्रिया SendError()'] है (http://download.oracle.com/javaee/6/api/javax/faces/context/ExternalContext.html#responseSendError%28int,%20java % 29 .lang.String)। – BalusC

+0

अच्छा, मैंने वास्तव में बाहरी कॉन्टेक्स्ट में विधियों की सूची के माध्यम से स्कैन किया लेकिन पूरी तरह से इसे याद किया। धन्यवाद! उत्तर को अपडेट किया क्योंकि यह अधिक सरल समाधान है। –

+0

@ बालससी: धन्यवाद, यही वही था जो मुझे चाहिए था। – Tomik

1

(मैं यहाँ कुछ इसी तरह के लिए खोज, लेकिन यहाँ एक और पद्धति मैं एक ऐसी ही समस्या पर इस्तेमाल किया है समाप्त हो गया)

ऊपर सत्यापन/बाहरी कॉन्टेक्स्ट प्रतिक्रिया इसे संभालने का एक बहुत अच्छा तरीका है, वैकल्पिक रूप से (क्योंकि आप अल हैं संदर्भ के अंदर तैयार) आप अनुरोध से पैरामीटर में पार्स करते समय त्रुटि को संभाल सकते हैं और आंतरिक रूप से इसके साथ सौदा कर सकते हैं। मुझे लगता है कि आप कैसे अपने प्रवाह की तुलना में एक

//Inside "SomeManagedBean" 
    public String getParam() 
    { 
    String value = (String) FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("key"); 
    if(value == null) 
     return "key not Exist"; 
    else 
     return value; 

    } 

// JSF 2.0 स्रोत (something.xhtml) ... "यहाँ एक बेहतर समाधान है" में इसे संभाल करना चाहते हैं और अधिक है ...

मुझे लगता है कि उपरोक्त ढांचे के अंदर काम करना आम तौर पर आसान है (आपको किसी त्रुटि पृष्ठ पर भेजने और प्रवाह को बाधित करने की आवश्यकता नहीं है), लेकिन वास्तव में यह केवल एक वास्तुशिल्प निर्णय है। दोनों समाधान समान हैं, यह प्रवाह या आंतरिक हैंडलिंग को तोड़ने का सिर्फ एक सवाल है। किसी भी तरह से बाहरी कॉन्टेक्स्ट आपका मित्र है।

1

जैसा कि बताया गया है, आप एक प्रबंधित बीन के भीतर से संदर्भ प्राप्त कर सकते हैं। मैंने सत्यापनकर्ता दृष्टिकोण की कोशिश की, लेकिन मेरे लिए यह लागू नहीं था क्योंकि मैं अपने बीन को शुरू करने के लिए दो पैरामीटर का उपयोग कर रहा था, और मैं 404 फेंकना चाहता हूं। मेरे लिए .setResponseStatus ने 404 पेज फेंक नहीं दिया। बस एक गैर-सूचनात्मक ब्राउज़र पृष्ठ दिया। तो मैंने इसके बजाय प्रतिक्रिया SendError का उपयोग किया।

+0

मुझे और मदद करें क्योंकि यह त्रुटि पृष्ठ दिखाता है। बस पूरा करने के लिए, यहां कोड है: ((HttpServletResponse) FacesContext.getCurrentInstance()।। GetExternalContext() GetResponse()) sendError (HttpServletResponse.SC_NOT_FOUND)। – James

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