簡體   English   中英

從 JSF 1.2 遷移到 2.0 的問題

[英]Problems with migration from JSF 1.2 to 2.0

我們決定升級到 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>

在遷移之前,此文件運行良好,它是對特定 function 的調用。現在它打印:

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 taglib 聲明。 還刪除默認為.xhtmljavax.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 配置參數以添加 jspx 擴展。

在此之后,您可能遇到的唯一問題就是將舊的 jsp 標簽轉換為 facelets TagHandler,並可能將 EL 函數轉換為 facelets 函數。 我認為這是一項簡單的任務,值得去做。 請注意其他替代方法(轉換為 xhtml),無論如何您也需要執行此步驟。

此替代方案的優點是您無需更改現有的導航規則或頁面擴展,因此從 JSF 規范的角度來看,此替代方案是首選。

如果您對此有更多疑問,可以訂閱MyFaces Users 和 Dev Mailing Lists並在那里提問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM