如何“抛出”JSF2 404错误?

时间:2011-02-04 18:41:58

标签: java web-applications jsf-2

假设我有一个管理用户的应用程序。您可以添加新用户,删除它们,编辑详细信息等。每个用户都有na ID,并在URL上有详细页面,如下所示:

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

现在,如果ID为123的用户不存在,会发生什么?我认为自然反应将是404标准误差。当您在URL中输入一些拼写错误时(例如/user/dtail.jsf)与输出完全相同。所以问题是:有这样的方法吗?

或者这个反应(404)可能合适吗?

感谢。

3 个答案:

答案 0 :(得分:14)

只需将验证器附加到id视图参数,如果验证失败,请在响应中设置错误代码404。

e.g。

考虑这个简单的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;
    }

}

答案 1 :(得分:1)

(我最终在这里寻找类似的东西,但这是我在类似问题上使用的另一种模式)

上面的Validation / ExternalContext响应是处理它的一种非常好的方法,或者(因为你已经在上下文中),你可以在从请求中解析参数并在内部处理它时处理错误。我认为更多的是你想要在流程中处理它而不是“这是一个更好的解决方案”

//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 Source(something.xhtml) ...    ...

我认为以上内容通常更容易在框架内部工作(您不必发送到错误页面并中断流程),但实际上它只是一个架构决策。两种解决方案都类似,只是打破流程或内部处理的问题。无论哪种方式,ExternalContext都是你的朋友。

答案 2 :(得分:1)

如上所述,您可以从托管bean中获取上下文。我尝试了验证器方法,但对我来说它不适用,因为我使用两个参数来初始化我的bean,我确实想要抛出404.对我来说.setResponseStatus没有抛出404页面。刚刚提供了一个非信息性的浏览器页面。所以我使用了responseSendError。