星期二, 十二月 27, 2005

JBoss JavaServerFace 里的配置诡异.

在JBoss 4.0.3 sp1里配置JSF,不用Myfaces用Sun实现的版本。
经常出现以下两个错误:

1.:JavaServerFace:Cannot find FacesContext
NullPointer 错误
2.
java.lang.NoClassDefFoundError: org.apache.myfaces.taglib.core.ViewTag


通过web.xml里如下配置,依然不能解决问题。

<listener>
<listener-class>
com.sun.faces.config.ConfigureListener
</listener-class>
</listener>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>

原因在于我们对这段话的理解,同JSF规范里定义的语义的不一致。
这个mapping只是询问我们,给包含JSF标签的jsp起一个别名
实际的文件后缀都是jsp,如果一个jsp里包含了JSF的标签。就不能按照
普通jsp来解释,必须通过把用同名文件但是后缀是mapping的文件来告诉web container
用JSF来解释这个JSP。
比如:index.jsp包含了JSF标签,如果我们直接引用http://localhost:8080/HelloWorld/index.jsp
则出现Cannot find FacesContext错误。
但如果我们使用:
1.
http://localhost:8080/HelloWorld/faces/index.jsp
2.http://localhost:8080/HelloWorld/index.jsf

都能得到正确的结果!!!

错误2:
java.lang.NoClassDefFoundError: org.apache.myfaces.taglib.core.ViewTag
在删除Jboss自带的Myface的执行包后,依然不能解决问题,需要删除tmp和work目录。
重新启动Jboss来解决.

BTW:如果以上配置依然不能解决问题,在tomcat里,需要删除tmp和work目录后,重新
启动,就可以解决这个问题。Opensource的hot deploy的不稳定可见一斑了。:(

诡异!!