1

在其他人编写的 jsf 应用程序上工作,我一定遗漏了一些非常基本的东西。我把它精简到这个,这是行不通的:

page.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<!doctype html>
<html>
<body>
    <f:view>
        <h:messages id="error" globalOnly="true"/>
        <h:outputText value="#{testBean.msg}"/>
    </f:view>
</body>
</html>

testBean.java

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

public class testBean {

    public String getMsg() {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "getMsg"), null));
        return "getMsg";
    }
}

该代码不显示生成的错误消息testBean#getMsg。如果我将 to 移到该<h:messages>行之后<h:outputText>,则会显示该消息。这是为什么?这应该工作吗?

4

1 回答 1

2

您正在使用 getter 方法执行业务工作,在此特定示例中,该方法仅在呈现响应阶段生成 HTML 输出期间调用。如果消息组件的 HTML 表示已经预先生成,那么在这个特定的构造中添加一个 faces 消息为时已晚。您无法从响应中取回已写入的字节。

事实上,你永远不应该在 getter 中做业务逻辑。您没有在任何地方明确说明具体的功能要求,因此很难提出正确的解决方案,但在这个特定示例中,解决方案之一是在预渲染视图侦听器方法中执行该工作。

<f:view>
    <f:event type="preRenderView" listener="#{testBean.init}" />
    <h:messages id="error" globalOnly="true"/>
    <h:outputText value="#{testBean.msg}"/>
</f:view>

private String msg;

public void init() { 
    msg = "getMsg";
    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "getMsg"), null));
}

public String getMsg() { // Keep getter untouched! Don't do business logic in there!
    return msg;
}

以上更新仅适用于 JSF2 Facelets。在遗留和已弃用的 JSP 上没有类似的方法。您最好的选择是返回一个空字符串并在 JSP 顶部引用它的 getter。

<f:view>
    <h:outputText value="#{testBean.initHack}" />
    <h:messages id="error" globalOnly="true"/>
    <h:outputText value="#{testBean.msg}"/>
</f:view>

private String msg;

public String getInitHack() {
    msg = "getMsg";
    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "getMsg"), null));
    return "";
}

public String getMsg() { // Keep getter untouched! Don't do business logic in there!
    return msg;
}
于 2013-04-09T13:36:47.413 回答