运行简单的JSF应用程序时出现错误
问题描述:
我在尝试运行基本的JSF应用程序时出现以下异常。我使用的是JSF1.1,JDK 6和tomcat 6.0.18。运行简单的JSF应用程序时出现错误
例外
description The server encountered an internal error() that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: Error testing property 'lastname' in bean of type null
javax.faces.webapp.FacesServlet.service(FacesServlet.java:209)
root cause
javax.faces.el.PropertyNotFoundException: Error testing property 'lastname' in bean of type null
com.sun.faces.el.PropertyResolverImpl.getType(PropertyResolverImpl.java:342)
com.sun.faces.el.impl.ArraySuffix.getType(ArraySuffix.java:240)
com.sun.faces.el.impl.ComplexValue.getType(ComplexValue.java:208)
com.sun.faces.el.ValueBindingImpl.getType(ValueBindingImpl.java:345)
com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:111)
javax.faces.component.UIInput.getConvertedValue(UIInput.java:713)
javax.faces.component.UIInput.validate(UIInput.java:638)
javax.faces.component.UIInput.executeValidate(UIInput.java:849)
javax.faces.component.UIInput.processValidators(UIInput.java:412)
javax.faces.component.UIForm.processValidators(UIForm.java:170)
javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:912)
javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:342)
com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:78)
com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:90)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:197)
以下是我为同一创建的文件:
//jsfmbean.jsp
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<f:view>
<html>
<body bgcolor="cyan">
<h:form id="form1" >
<h:inputText id="text1" value="#{text2}" />
<h:inputText id="text2" value="#{player.lastname}" />
<h:commandButton action="success" value="success" />
<h:commandButton action="#{player.changeName}" value="failure" />
</h:form>
</body>
</html>
</f:view>
//faces-config.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE faces-config PUBLIC
"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
"http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
<faces-config>
<application>
<locale-config>
<default-locale>en</default-locale>
</locale-config>
</application>
<navigation-rule>
<from-view-id>
/jsfevent.jsp
</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/mathew.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>failure</from-outcome>
<to-view-id>/amy.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/jsfmbean.jsp</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/mathew.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<managed-bean>
<managed-bean-name>player</managed-bean-name>
<managed-bean-class>
ourdemo.player
</managed-bean-class>
<managed-bean-scope>
session
</managed-bean-scope>
<managed-property>
<property-name>firstname</property-name>
<property-type>java.lang.String</property-type>
<value>Mahatma</value>
</managed-property>
<managed-property>
<property-name>lastname</property-name>
<property-type>java.lang.String</property-type>
<value>Gandhiji</value>
</managed-property>
</managed-bean>
</faces-config>
//Player.java
package ourdemo;
import javax.faces.context.*;
import javax.faces.component.*;
import javax.faces.validator.*;
public class Player
{
String firstname ;
String lastname ;
public void setFirstname(String a)
{
firstname=a;
}
public String getFirstname()
{
return firstname;
}
//----------
public void setLastname(String b)
{
lastname=b;
}
public String getLastname()
{
return lastname;
}
//-------------------
public void changeName()
{
lastname= firstname+" "+lastname;
}
}
请帮助...
答
豆子指向#{player}
尚未正确初始化,所以#{player.lastname}
抛出一个NullPointerException。
答
Java区分大小写。您创建了一个具有完全合格类名称ourdemo.Player
的托管bean,但是您仍然将faces-config.xml
中的bean声明为ourdemo.player
(请注意小写字母p
而不是大写P
)。通过这种方式,JSF无法找到并创建bean类,这导致#{player}
为null
,这反过来导致此异常。
修复它的相应:
<managed-bean>
<managed-bean-name>player</managed-bean-name>
<managed-bean-class>ourdemo.Player</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
无关到具体的问题:我与阿尔扬Tijms完全同意在这个问题意见:使用JSF 2.0,或者如果可能过更新。 JSF 1.1已经过时5年多了,并且有很多缺点。如果您因业务限制而使用JSF 1.1,请致电convince。或者,如果您使用的是JSF 1.1,因为您正在阅读过时的书籍/教程,请将其扔掉并阅读正确的书籍。
答
Your faces-config.xml错误。
类名称声明必须是相同的
<managed-bean-class>
ourdemo.Player
</managed-bean-class>
>我使用JSF1.1 - 请你自己和其他人谁有权读取或与您的代码工作忙,至少使用JSF 1.2,但更好的JSF 2.0(适用于Tomcat 6)。如果有可能,请使用JSF 2.1。 –