假設我有一個管理用戶的應用程序。您可以添加新用戶,刪除,編輯細節等每個用戶都有吶ID,並且對URL像這樣詳細頁面:如果與ID用戶123不存在如何「拋出」JSF2 404錯誤?
..../user/detail.jsf?id=123
現在,會發生什麼?我認爲自然的反應會是404標準錯誤。與URL中的拼寫錯誤(如/user/dtail.jsf)完全相同。所以問題是:有沒有這樣的方法?
或者也許是這種反應(404)適當?
謝謝。
假設我有一個管理用戶的應用程序。您可以添加新用戶,刪除,編輯細節等每個用戶都有吶ID,並且對URL像這樣詳細頁面:如果與ID用戶123不存在如何「拋出」JSF2 404錯誤?
..../user/detail.jsf?id=123
現在,會發生什麼?我認爲自然的反應會是404標準錯誤。與URL中的拼寫錯誤(如/user/dtail.jsf)完全相同。所以問題是:有沒有這樣的方法?
或者也許是這種反應(404)適當?
謝謝。
只需將驗證程序附加到id視圖參數,如果驗證失敗,則在響應中設置錯誤代碼404。
例如
考慮一個簡單的facelet:
<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>
而下面的支持bean:
@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;
}
}
(我在這裏結束了尋找類似的東西,但這裏是我在一個類似的問題使用的另一種模式)
上面的Validation/ExternalContext響應是處理它的一個非常好的方法,或者(因爲你是al準備好在上下文中),您可以在解析來自請求的參數並在內部處理它時處理錯誤。我認爲這更多的是你要如何處理它在你的流量比「這裏有一個更好的解決方案」
//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) ... ...
我認爲上述內容通常更容易在框架內部工作(您不必發送到錯誤頁面並中斷流程),但實際上它只是一個架構決策。兩種解決方案都是類似的,這只是一個打破流程或內部處理的問題。無論哪種方式,ExternalContext都是你的朋友。
如上所述,您可以從託管bean中獲取上下文。我嘗試了驗證器的方法,但對我來說它不適用,因爲我使用兩個參數來初始化我的bean,而且我想要扔404。對於我來說,.setResponseStatus沒有拋出404頁面。剛剛給了一個非信息化的瀏覽器頁面。所以我使用responseSendError來代替。
在JSF2中有[`ExternalContext#setResponseStatus()`](http://download.oracle.com/javaee/6/api/javax/faces/context/ExternalContext.html#setResponseStatus%28int%29)。不需要再鑄造了! :)還有一個[`ExternalContext#responseSendError()`](http://download.oracle.com/javaee/6/api/javax/faces/context/ExternalContext.html#responseSendError%28int,%20java .lang.String%29)。 – BalusC 2011-02-04 23:56:59
不錯,我確實掃描了ExternalContext中的方法列表,但完全錯過了它。謝謝!更新答案,因爲這是更直接的解決方案。 – 2011-02-05 00:33:31