目标无法访问,标识符“Bean Name”已解析为null

时间:2013-07-21 10:28:05

标签: jsf primefaces

我遇到了错误。我是JSF的新手。

Jul 21, 2013 6:24:04 PM com.sun.faces.lifecycle.ProcessValidationsPhase execute
WARNING: /index.xhtml @18,65 value="#{userbean.userName}": Target Unreachable, identifier 'userbean' resolved to null
javax.el.PropertyNotFoundException: /index.xhtml @18,65 value="#{userbean.userName}": Target Unreachable, identifier 'userbean' resolved to null
    at com.sun.faces.facelets.el.TagValueExpression.getType(TagValueExpression.java:100)
    at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:95)
    at javax.faces.component.UIInput.getConvertedValue(UIInput.java:1030)
    at javax.faces.component.UIInput.validate(UIInput.java:960)
    at javax.faces.component.UIInput.executeValidate(UIInput.java:1233)
    at javax.faces.component.UIInput.processValidators(UIInput.java:698)
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
    at javax.faces.component.UIForm.processValidators(UIForm.java:253)
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
    at org.primefaces.component.panel.Panel.processValidators(Panel.java:284)
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
    at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1172)
    at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Unknown Source)

这是我的代码:

package com.jsf.dev.bean;

import java.io.Serializable;

import javax.faces.bean.ManagedBean;

@ManagedBean(name = "userbean")
public class UserBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private String userName;
    private String userPassword;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserPassword() {
        return userPassword;
    }

    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }

    public String login(){
        return "login";
    }
}

XHTML:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3c.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui">

<h:head>

</h:head>
<h:body>
    <center>
        <p:panel header="Login Form" style="width:350;">
            <h:form>
                <h:panelGrid columns="2" cellpadding="2">
                    <h:outputLabel for="#{userbean.userName}" value="UserName" />
                    <h:inputText value="#{userbean.userName}" label="UserName"></h:inputText>
                    <h:outputLabel for="#{userbean.userPassword}" value="Password" />
                    <h:inputSecret value="#{userbean.userPassword}"></h:inputSecret>
                    <h:commandButton type="submit" value="Login"
                        action="#{userbean.login}"></h:commandButton>
                </h:panelGrid>
            </h:form>
        </p:panel>
        <div>
            <h:messages></h:messages>
        </div>
    </center>
</h:body>
</html>

1 个答案:

答案 0 :(得分:4)

h:outputLabel中,for属性必须在JSF生命周期的早期阶段评估为String,而不能评估表达式"#{userbean.userName}"。因此,您需要给它一个这样的String值:

<h:outputLabel for="userName" value="UserName" />
<h:inputText id="userName" value="#{userbean.userName}" label="UserName"/>

有关JSF生命周期的信息,请参阅this link

  

恢复查看阶段   在此阶段,JavaServer Faces实现构建页面视图...   如果页面请求是初始请求,则为JavaServer   Faces实现在此阶段创建一个空视图   生命周期进入渲染响应阶段,在此期间   空视图使用标记中引用的组件填充   页面。

因此,在渲染响应阶段(已经构建了(空)视图)之前,不会评估bean值。