THE MOMENT, THE MEMENTO

2010年01月11日

Apache MyFaces 无法在JBoss-5.0.1GA中直接使用

吴德文 @ 18:35

使用Eclipse WTP创建动态网页项目,添加JSF Facets之后,如果使用的是Apache MyFaces而且最后项目又是在JBoss-5.0.1GA中运行的话,一个简单的JSF页面就会导致“java.lang.RuntimeException - Cannot find FacesContext”的错误。检查了一下日志,发现项目在发布的时候就已经出错了,出错信息是:

ERROR [MyfacesConfig] Both MyFaces and the RI are on your classpath. Please make sure to use only one of the two JSF-implementations.

17:45:47,742 INFO  [FacesConfigurator] Reading standard config META-INF/standard-faces-config.xml

17:45:48,021 INFO  [FacesConfigurator] Reading config /WEB-INF/faces-config.xml

17:45:48,040 INFO  [FacesConfigurator] MyFaces-package : myfaces-api not found.

17:45:48,040 INFO  [FacesConfigurator] MyFaces-package : myfaces-impl not found.

17:45:48,040 INFO  [FacesConfigurator] MyFaces-package : tomahawk-sandbox15 not found.

17:45:48,041 INFO  [FacesConfigurator] MyFaces-package : tomahawk-sandbox not found.

17:45:48,041 INFO  [FacesConfigurator] MyFaces-package : tomahawk not found.

将这个信息google了以后,找到MyfacesConfig类的源代码,发现该类在创建和初始化时会检测系统中是否分别存在org.apache.myfaces.application.ApplicationImpl和com.sun.faces.application.ApplicationImpl,前者则说明存在MyFaces JSF-Implementation,后者则说明存在SUN的RI JSF-Implementation。由于JBoss-5.0.1GA已经包含的SUN的JSF-Implementation,因此两个实现就冲突了。

又根据后面的出错信息:

WARN  [JBossJSFConfigureListener] MyFaces JSF implementation found!  This version of JBoss AS ships with the java.net implementation of JSF.  There are known issues when mixing JSF implementations.  This warning does not apply to MyFaces component libraries such as Tomahawk.  However, myfaces-impl.jar and myfaces-api.jar should not be used without disabling the built-in JSF implementation.  See the JBoss wiki for more details.

这已经很明显就是在说不能同时使用两个JSF实现了,然后如何禁用built-inJSF实现来使用Myfaces还不知道,目前最好的办法就是直接使用SUN的实现吧,反正对于初学者的我来说,应该还用不到什么MyFaces特殊的东西。

A mistake in JSF Template of Eclipse WTP(Galileo)

吴德文 @ 17:22

Eclipse WTP中提供了模板功能,再创建CSS、HTML、JSP等文件时可以根据不同的标记规范选择不同的格式模板,为开发者提供了方便。其中JSP文件模板就分别提供了html、xhtml、xhtml(xml syntax)三种标记规范的模板,在此三种模板的基础上又提供了三种JSF的页面模板。

基于html标记格式的JSF模板使用起来很正常,其与JSP模板的差别主要就是在<%@ page…>下增加了下面两行(当然<f:view />那是都需要的)

<%@ taglib prefix="f"  uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h"  uri="http://java.sun.com/jsf/html"%>

使用基于xhtml标记格式的JSF模板就总是会出现“#{..} is not allowed in template text”的错误。通常情况只有纯粹的jsp文件才会提示这种错误,因为其不支持#{}的标记。但是发布过程和访问方式是按照JSF的教程来进行的呀。最后终于发现问题在于这个模板上。

这个模板是在JSP模板的html标记内增加了xmlns:f和xmlns:h的相关内容,如下所示。可是<html>标记是给浏览器读的并不是给web容器读的,因此web服务器无法识别JSF文件中的#{}标记。

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html">

第三种基于xml形式的xhtml标记模板也使用正常,它是在<jsp:root>内增加xmlns:f和xmlns:h的相关内容,这个web容器也是可以处理的。

因此,如果在使用xhtml标记格式的JSF模板时,就得在<%@ page…>的下一行增加上面提到的<%@ tablib….>的内容,当然最好是把<html….>中多余的xmlns:f和xmlns:h去掉。

Valid XHTML 1.1 Valid CSS! Creative Commons License WordPress 所驱动