从JSF 1.2迁移到2.0的问题

我们决定升级到JSF 2.0,遗憾的是这并不是很好 . 我们现在有Mojarra,Tomahawk 2.0 1.1.11,Spring Webflow / Faces 2.3.0和JSF 2.0 .

我跟着upgrading tutorial from 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>

我调整了自定义taglib并迁移到新的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)

你能否给我任何暗示我错过的东西或者可能存在的错误隐藏的地方?非常感谢你!

回答(2)

3 years ago

您使用的是JSPX而不是Facelets . 这在JSF 2.0上无法完美运行 . 如果升级到支持JSPX的JSF 2.1不是一个选项,那么您需要将 .jspx 文件重命名为 .xhtml 并删除现在多余的 xmlns:jsp taglib声明 . 同时删除 javax.faces.DEFAULT_SUFFIX 上下文参数,默认为 .xhtml .

3 years ago

处理.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配置参数来添加jspx扩展 .

在此之后,也许唯一的问题是将旧的jsp标签转换为facelets TagHandler,并可能将EL函数转换为facelets函数 . 我认为这是一项容易的任务,值得这样做 . 注意另一种选择(转换为xhml)无论如何你也需要做这个步骤 .

这种替代方案的优点是您不需要更改现有的导航规则或页面扩展名,因此从JSF规范的角度来看,这种替代方案是首选 .

如果您对此有更多疑问,可以订阅MyFaces Users and Dev Mailing Lists并在那里提问 .