我们决定升级到JSF 2.0,不幸的是这并没有很好地工作。我们现在有Mojarra, Tomahawk 2.0 1.1.11, Spring Webflow/Faces 2.3.0和JSF 2.0。
我遵循了BalusC的升级教程。第一步是修复web.xml
并迁移到Servlet API 2.5。
<context-param>
<param-name>javax.faces.FACELETS_LIBRARIES</param-name>
<param-value>/WEB-INF/facelets-taglibs/custom.taglib.xml</param-value>
</context-param>
<!-- Use JSF view templates saved as *.xhtml, for use with Facelets -->
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xml</param-value>
</context-param>
之后,我替换了依赖项并使用了新版本的JSF。
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.0.3</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.0.3</version>
</dependency>
我调整了自定义标签库,并迁移到新的XML模式定义,
<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib version="2.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd">
<namespace>http://www.custom.org/facelets-taglib</namespace>
[...]
我也对faces-config.xml
做了所有的更改。
这是我的*.jspx
文件之一。
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" version="2.0"
xmlns:jsp="http://java.sun.com/JSP/Page"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jstl/core"
xmlns:sf="http://www.springframework.org/tags/faces"
xmlns:os="http://www.custom.org/facelets-taglib">
[...]
${os:json()}
</html>
在迁移之前,这个文件工作得很好,它是对特定函数的调用。现在它输出:
Caused by: javax.faces.FacesException: /WEB-INF/views/example.jspx(10,2)
The attribute prefix os does not correspond to any imported tag library
at com.sun.faces.context.ExceptionHandlerImpl.handle(ExceptionHandlerImpl.java:136)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:115)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:135)
at org.springframework.faces.webflow.FlowLifecycle.render(FlowLifecycle.java:80)
at org.springframework.faces.webflow.JsfView.render(JsfView.java:90)
at org.springframework.webflow.engine.ViewState.render(ViewState.java:296)
at org.springframework.webflow.engine.ViewState.refresh(ViewState.java:243)
at org.springframework.webflow.engine.ViewState.resume(ViewState.java:221)
at org.springframework.webflow.engine.Flow.resume(Flow.java:545)
at org.springframework.webflow.engine.impl.FlowExecutionImpl.resume(FlowExecutionImpl.java:261)
... 67 more
Caused by: org.apache.jasper.JasperException: /WEB-INF/views/example.jspx(10,2)
The attribute prefix os does not correspond to any imported tag library
at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40)
at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407)
at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:148)
at org.apache.jasper.compiler.Validator$ValidateVisitor$1FVVisitor.visit(Validator.java:1509)
at org.apache.jasper.compiler.ELNode$Function.accept(ELNode.java:129)
at org.apache.jasper.compiler.ELNode$Nodes.visit(ELNode.java:200)
at org.apache.jasper.compiler.ELNode$Visitor.visit(ELNode.java:242)
at org.apache.jasper.compiler.ELNode$Root.accept(ELNode.java:56)
你能给我任何提示,我错过了什么,或者一个可能的错误可以隐藏在哪里?非常感谢!
您正在使用JSPX而不是Facelets。这不会在JSF 2.0上完美地工作。如果无法升级到支持JSPX的JSF 2.1,则需要将.jspx
文件重命名为.xhtml
,并删除现在多余的xmlns:jsp
标签库声明。也删除默认为.xhtml
的javax.faces.DEFAULT_SUFFIX
上下文参数。
处理.jspx文件的问题在JSF 2.1中得到了解决,这要感谢一些维护MyFaces Trinidad的家伙。参见附录A 1.2.1.1 facelets-processing元素。启用此功能后,您可以使用facelets引擎读取.jspx文件,并将更改保持在最低限度。简而言之,只需将此添加到faces-config.xml:
<faces-config-extension>
<facelets-processing>
<file-extension>.jspx</file-extension>
<process-as>jspx</process-as>
</facelets-processing>
</faces-config-extension>
或者配置javax.faces。FACELETS_VIEW_MAPPINGS或javax.faces。DEFAULT_SUFFIX web config参数用于添加jspx扩展名。
在此之后,您可能遇到的唯一问题是将旧jsp标记转换为facelets TagHandler,并可能将EL函数转换为facelets函数。我认为这是一个简单的任务,值得去做。注意,对于另一种选择(转换为xhtml),无论如何您也需要执行此步骤。
这种替代方法的优点是不需要更改现有的导航规则或页面扩展,因此从JSF规范的角度来看,这种替代方法是首选的。
如果你有更多的问题,你可以订阅到MyFaces用户和开发邮件列表,并在那里提问。