2011-02-04 19 views
11

Kullanıcıları yöneten bir uygulamam olduğunu varsayalım. Bunları silmek, yeni bir kullanıcı ekleyebilir, düzenleyebilir detay vb Her kullanıcı kimliği na sahiptir ve böyle URL'yi detay sayfası vardır: kimliğine sahip kullanıcı 123 da mevcut değil iseJSF2 404 hatası nasıl verilir?

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

ne olur ki? Doğal reaksiyonun 404 standart hata olacağını düşünüyorum. URL'de bir yazım hatası yaptığınızda (/user/dtail.jsf gibi) tam olarak aynıdır. Yani soru şu: böyle bir yöntem var mı? Ya da belki bu reaksiyon (404) uygun mu?

Teşekkürler.

cevap

13

Kimlik denetimi parametresine bir doğrulayıcı ekleyin ve doğrulama başarısız olursa, yanıt üzerinde 404 hata kodunu ayarlayın.

örn.

<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> 

Ve aşağıdaki destek fasulye:

bu basit facelet düşünün

@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

JSF2'de ['ExternalContext # setResponseStatus()'] vardır (http://download.oracle.com/javaee/6/api/javax/faces/context/ExternalContext.html#setResponseStatus%28int%29). Artık döküm yapmaya gerek yok! :) Bu arada bir de ['ExternalContext # responseSendError()'] (http://download.oracle.com/javaee/6/api/javax/faces/context/ExternalContext.html#responseSendError%28int,%20java var)% 29 .lang.String. – BalusC

+0

Güzel, aslında ExternalContext'teki yöntemlerin listesini taradım ama tamamen özledim. Teşekkürler! Cevabı güncelledik, çünkü bu daha kolay bir çözüm. –

+0

@BalusC: Teşekkürler, tam ihtiyacım olan buydu. – Tomik

1

(burada ben de benzer problem üzerinde kullanılan başka desen benzer bir şey ararken ama burada sona erdi)

Yukarıdaki Doğrulama/ExternalContext yanıtı, bununla başa çıkmak için çok iyi bir yoldur. içeriğin içinde hazırlanırken), istekte bulunan parametrelerin ayrıştırılması sırasında hatayla başa çıkabilir ve dahili olarak ele alabilirsiniz. Bunun bir

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

    } 

// MTU 2.0 Kaynak (something.xhtml) ... "burada daha iyi bir çözüm" den senin akışında ele istiyorum nasıl daha fazla olduğunu düşünüyorum ...

Yukarıdakilerin genel olarak çerçevenin içinde çalışmak daha kolay olduğunu düşünüyorum (bir hata sayfasına göndermek ve akışı bozmak zorunda kalmazsınız), ama gerçekten de bu sadece bir mimari karardır. Her iki çözüm de benzerdir, sadece akış ya da iç işleme kırma meselesidir. Her iki şekilde de ExternalContext senin arkadaşın.

1

Belirtildiği gibi, içeriği yönetilen bir fasülyeden alabilirsiniz. Doğrulayıcı yaklaşımını denedim, ama benim için fasulyemi başlatmak için iki parametreyi kullandığımdan ve 404'ü atmak istediğimden beri geçerli değildi. Benim için .setResponseStatus, 404 sayfasını alamadı. Sadece bilgilendirici olmayan bir tarayıcı sayfası verdi. Bu yüzden responseSendError yerine kullandım.

+0

Bana hata sayfasını gösterdiğinden daha fazla yardım edin. Sadece tamamlamak için, İşte kodu: ((HttpServletResponse) FacesContext.getCurrentInstance().. GetExternalContext() getResponse()) sendError (HttpServletResponse.SC_NOT_FOUND.); – James

İlgili konular