Di chuyển từ JSF 1.2 sang JSF 2.0


136

Tôi đang làm việc với một ứng dụng khá lớn được viết trong JSF 1.2 . Hiện tại, JSF 1.2 đã khoảng 6 tuổi. Tôi cần nâng cấp lên JSF 2.0. Điều này sẽ đau như thế nào? Tôi nhận thấy rằng một số thuộc tính trong thẻ tùy chỉnh đã được thay đổi, v.v.

Câu trả lời:


245

Đau đớn

Mức độ đau đớn của việc nâng cấp JSF 1.2 lên 2.0 phụ thuộc vào công nghệ xem mà bạn hiện đang sử dụng và bạn muốn sử dụng.

  • JSP 2.x sang JSP 2.x = Hầu như không cần nỗ lực.
  • Facelets 1.x to Facelets 2.0 = Ít nỗ lực.
  • JSP 2.x to Facelets 2.0 = Rất nhiều nỗ lực. Nhân đôi điều này nếu bạn cũng có các thành phần tùy chỉnh.

Những thay đổi cơ bản

Bất kể chuyển đổi công nghệ xem, ít nhất các bước sau đây nên được thực hiện:

  • Xóa JAR 1.2 JAR khỏi /WEB-INF/lib(nếu có).
  • Thả JAR 2.0 JAR vào /WEB-INF/lib(nếu JSF 1.2 được cung cấp bởi servletcontainer, bạn có thể muốn thay đổi chính sách tải lớp để tải thư viện ứng dụng web trước các thư viện của servletcontainer, xem thêm các vấn đề về tải lớp của JSF2 trong các máy chủ ứng dụng ).
  • Cập nhật khai báo gốc faces-config.xmlđể tuân thủ thông số kỹ thuật JSF 2.0.

    <faces-config
        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-facesconfig_2_0.xsd"
        version="2.0">

    Lưu ý: khi bạn đang sử dụng JSF 2.2 hoặc mới hơn, hãy sử dụng http://xmlns.jcp.orgmiền không gian tên thay vì trong http://java.sun.comsuốt đoạn mã XML ở trên.

  • Đảm bảo rằng khai báo gốc web.xmlđã tuân thủ ít nhất Servlet 2.5. JSF 2.0 sẽ không hoạt động trên 2.4 hoặc thấp hơn ( mặc dù có thể hack được ).

    <web-app 
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
        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-app_2_5.xsd"
        id="YourWebappID"
        version="2.5">

    Lưu ý: khi bạn đang sử dụng Servlet 3.0 hoặc mới hơn, hãy sử dụng http://xmlns.jcp.orgmiền không gian tên thay vì trong http://java.sun.comsuốt đoạn mã XML ở trên.


JSP 2.x sang JSP 2.x

Nếu bạn đang sử dụng JSP 2.x và muốn tiếp tục sử dụng nó, thì về cơ bản bạn không cần phải thay đổi bất cứ điều gì khác.

Dần dần nâng cấp

Nếu bạn đã sử dụng hậu tố url-patterncho FacesServlet, như vậy *.jsf, thật tốt khi biết rằng FacesServletlần đầu tiên sẽ quét *.xhtmltệp và nếu không có, thì hãy quét *.jsptệp. Điều này cung cấp cho bạn chỗ để chuyển dần từ JSP sang Facelets phía sau hậu trường mà không thay đổi URL.

Nhưng nếu bạn đang sử dụng một tiền tố url-pattern, như /faces/*và bạn muốn nâng cấp dần dần từ JSP thành Facelets, thì bạn thực sự phải thay đổi nó thành *.jsfvà có thể là tất cả các liên kết trong các trang JSP hiện có.

Bạn chỉ cần lưu ý rằng JSF 2.0 mới được cung cấp điều hướng ngầm không quét tìm sự hiện diện của tệp, outcome.xhtmldù sao nó cũng sẽ đi đến . Vì vậy, nếu bạn muốn đến hoặc đi đến *.jsp, thì bạn vẫn cần đưa nó vào chế độ xem theo cách của JSF 1.x.


Facelets 1.x đến Facelets 2.0

Nếu bạn đang sử dụng Facelets 1.x làm công nghệ xem và muốn sử dụng Facelets 2.0 do JSF cung cấp , thì bạn cần thực hiện các bước bổ sung sau:

  • Xóa Facelets 1.x JAR khỏi /WEB-INF/lib.
  • Xóa Facelets 1.x FaceletViewHandlerkhỏi faces-config.xml.
  • Bất kỳ FaceletViewHandlerthực hiện tùy chỉnh cần phải được cập nhật để mở rộng ViewHandlerWrapperthay thế.
  • Không cần thiết, nhưng chỉ để dọn dẹp, hãy xóa mọi <context-param>giá trị liên quan đến Facelets 1.x web.xmlđã được mặc định trong Facelets 2.0, như javax.faces.DEFAULT_SUFFIXgiá trị với *.xhtml.
  • Cập nhật khai báo gốc của thẻ Faclet XML hiện có để tuân thủ Facelets 2.0.

    <facelet-taglib 
        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"
        version="2.0">

    Lưu ý: khi bạn đang sử dụng JSF 2.2 hoặc mới hơn, hãy sử dụng http://xmlns.jcp.orgmiền không gian tên thay vì trong http://java.sun.comsuốt đoạn mã XML ở trên.

Điều đó về cơ bản nên là nó.


JSP 2.x sang Facelets 2.0

Nếu bạn đang sử dụng JSP 2.x làm công nghệ xem và bạn muốn nâng cấp lên Facelets 2.0 ngay lập tức, thì bạn cần thực hiện nhiều thay đổi trước khi trang web có thể hoạt động. Về cơ bản bạn đang thay đổi công nghệ xem ở đây.

Thay đổi trang chính

Trên mỗi trang chính, bạn cần thay đổi mẫu JSP cơ bản sau đây ..

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<!DOCTYPE html>
<f:view>
    <html lang="en">
        <head>
            <title>JSP page</title>
        </head>
        <body>
            <h:outputText value="JSF components here." />
        </body>
    </html>
</f:view>

.. đến mẫu Facelets cơ bản sau:

<!DOCTYPE html>
<html lang="en"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <h:head>
        <title>XHTML page</title>
    </h:head>
    <h:body>
        <h:outputText value="JSF components here." />
    </h:body>  
</html>

Lưu ý: khi bạn đang sử dụng JSF 2.2 hoặc mới hơn, hãy sử dụng http://xmlns.jcp.orgmiền không gian tên thay vì http://java.sun.comtrong các đoạn XHTML ở trên.

Bao gồm thay đổi trang

Nếu các trang JSP hiện tại của bạn được thiết kế tốt, bạn không nên có bất kỳ dòng mã scriptlet nào và bạn cũng chỉ nên có <jsp:include>thẻ duy nhất là một thẻ cụ thể của JSP. Bất kỳ trong số đó cần phải được thay đổi từ:

<jsp:include page="include.jsp" />

đến

<ui:include src="include.xhtml" />

JSP cơ bản bao gồm mẫu trang của ..

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<f:subview id="include">
    <h:outputText value="JSF components here." />
</f:subview>

.. có thể được thay đổi thành Facelets cơ bản sau bao gồm mẫu trang:

<ui:composition
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <h:outputText value="JSF components here." />
</ui:composition>

Lưu ý: khi bạn đang sử dụng JSF 2.2 hoặc mới hơn, hãy sử dụng http://xmlns.jcp.orgmiền không gian tên thay vì http://java.sun.comtrong các đoạn XHTML ở trên.

Thay đổi thành phần tùy chỉnh

Bạn cần thay đổi các tệp TLD của JSP thành các tệp TLD Facelets như được mô tả trong Hướng dẫn di chuyển Mojarra này .


Hậu quả

Bất kể cách tiếp cận di chuyển, bạn có thể loại bỏ dần dần faces-config.xmlbằng các chú thích JSF 2.0 mới hoặc thậm chí CDI . Bất kỳ <managed-bean>có thể được chú thích bởi @ManagedBean:

@ManagedBean(name="managedBeanName")
@RequestScoped
public class SomeBean {}

Bên cạnh @RequestScoped, cũng có @ViewScoped, @SessionScoped@ApplicationScopedcó sẵn. Nếu bạn bỏ qua namethuộc tính của @ManagedBeanthì nó sẽ mặc định là tên lớp với ký tự thứ 1 được hạ thấp.

@ManagedBean
@RequestScoped
public class SomeBean {}

Trong ví dụ cụ thể này, nó sẽ được #{someBean}.

Bất kỳ <managed-property>có thể được chú thích bằng cách sử dụng @ManagedProperty:

@ManagedProperty("#{otherBean}")
private OtherBean otherBean;

Bất kỳ <validator>có thể được chú thích bằng cách sử dụng @FacesValidator:

@FacesValidator("someValidator")
public class SomeValidator implements Validator {}

Bất kỳ <converter>có thể được chú thích bằng cách sử dụng@FacesConverter

@FacesConverter("someConverter")
public class SomeConverter implements Converter {}

Bất kỳ <renderer>có thể được chú thích bằng cách sử dụng@FacesRenderer

@FacesRenderer(componentFamily="someComponentFamily", rendererType="someRendererType")
public class SomeRenderer extends Renderer {}

Bất kỳ <navigation-case>sử dụng tên tệp của trang XHTML là cả hai <from-outcome><to-view-id>có thể được xóa vì điều này sẽ được thực hiện hoàn toàn . Điều này có thể được thực hiện dần dần bằng cách thay đổi tất cả các giá trị kết quả để khớp với tên tệp của chế độ xem đích.

Cuối cùng, bất kỳ bean có phạm vi phiên nào được đưa vào phiên với lý do duy nhất là giữ lại dữ liệu của bean trong các yêu cầu tiếp theo trong cùng một tab / cửa sổ có thể được đánh dấu tốt hơn @ViewScoped, bởi vì cách này bean sẽ không bị ảnh hưởng khi mở enduser cùng một trang trong các tab / cửa sổ khác nhau.


Thư viện thành phần

Lưu ý rằng tôi không đưa bất kỳ thư viện thành phần bên thứ 3 nào như PrimeFaces / RichFaces / IceFaces vào câu trả lời này, sau đó không thể viết một câu trả lời đáng tin cậy vì về cơ bản nó có nghĩa là "nó phụ thuộc". Nói chung, chỉ cần nâng cấp thư viện thành phần lên một phiên bản tương thích với JSF 2.0 đã được xác minh theo hướng dẫn của họ. Tốt nhất là chỉ viết các bài kiểm tra đơn vị, chạy chúng trước và sau khi nâng cấp và khắc phục mọi sự cố riêng lẻ.

Dưới đây là ít nhất một số liên kết hữu ích liên quan đến việc di chuyển thư viện thành phần cụ thể:

PrimeFaces không có hướng dẫn di chuyển cho PrimeFaces 1.x đến 2.x vì PrimeFaces 1.x yêu cầu Facelets 1.x, vì vậy bạn chỉ cần thực hiện theo các bước di chuyển Facelets 1.x đến 2.x. Tuy nhiên, có một hướng dẫn di chuyển PrimeFaces 2.x đến 3.x (và cao hơn) cũng có thể áp dụng cho việc di chuyển từ PrimeFaces 1.x sang 3.x (hoặc cao hơn). Tomahawk cũng không có hướng dẫn di cư. Về cơ bản, thứ duy nhất bạn cần thay đổi là JAR và nếu cần, hãy loại bỏ tất cả các <t:saveState>tham chiếu trên một hạt đậu có phạm vi yêu cầu bằng cách làm cho khung nhìn bean nằm trong phạm vi.


@ManagedBean (name = "ManagedBeanName") @RequestScoped Đó là :)
Daniel Szalay

bài đăng tuyệt vời, đã giúp tôi rất nhiều. Một vài điều cần lưu ý: khi chuyển từ jsf 1.2 sang jsf 2, bạn có thể gần như chắc chắn một số người đã sử dụng a4j từ richfaces 3.3.x. Tôi đã quyết định sử dụng richfaces 3.3.3 cùng với jsf 2 vì có vẻ như đó là một thay đổi tầm thường để thực hiện để nâng cấp lên richfaces 4.x. Vì vậy, tôi đã hướng dẫn (phá hoại tất cả những thứ liên quan Facelets trong faces-config (kích hoạt viewhandler chú thích taglig loại bỏ), sau đó theo sau community.jboss.org/wiki/RichFaces333AndJSF20 và cuối cùng đã phải làm điều này stackoverflow.com/questions/85532/...
Toskan

Câu trả lời chính xác. Trong trường hợp của tôi, tôi cũng phải đặt javax.faces.VALIDATE_EMPTY_FIELDStham số để falsexác thực sắp xếp. Xem thêm: stackoverflow.com/questions/6113935/ khăn
Jasper de Vries

2
Tôi cũng có thể khuyên mọi người nên đọc balusc.blogspot.nl/2011/09/c truyền thông
Jasper de Vries

1
@Cprint: Tôi đã sửa liên kết.
BalusC


6

JSF 2.0 có nhiều tính năng và thành phần mới và tôi không cảm thấy việc di chuyển sẽ gây đau đớn. Chỉ có khu vực bạn sẽ thấy khó khăn là sử dụng các thư viện bên thrid. Nếu ứng dụng của bạn phụ thuộc nhiều vào các thư viện như Richfaces thì bạn sẽ gặp vấn đề. Không phải tất cả các thành phần từ Richfaces 3 được chuyển sang Richfaces 4.

Điều này cũng có thể giúp chuyển đổi ứng dụng JSF 1.2 sang JSF 2.0

Đồng thời kiểm tra cái này Có gì mới trong JSF 2?


Sẽ giống như vậy khi bạn sử dụng Richfaces với JSF 1.x - bạn trải qua tất cả "nỗi đau" để tìm hiểu cách tích hợp các thành phần của bên thứ ba với JSF. Cách tiếp cận với JSF 2.x không có gì khác biệt. Đó là "niềm vui" của lập trình phải không? :)
ChuongPham

4

Web.xml

 Add the jars
    1. jsf-api-2.0.jar 
    2. jsf-impl.2.0.2.jar

Bước 1: Thay đổi tệp web.xml

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
            xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
            id="WebApp_ID" version="2.5">


    <servlet>
            <servlet-name>facesServlet</servlet-name>
            <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>

        <servlet-mapping>
            <servlet-name>facesServlet</servlet-name>
            <url-pattern>/faces/*</url-pattern>
        </servlet-mapping>
        <servlet-mapping>

            <servlet-name>facesServlet</servlet-name>
            <url-pattern>*.jsf</url-pattern>
        </servlet-mapping>

        <servlet-mapping>
            <servlet-name>facesServlet</servlet-name>
            <url-pattern>*.faces</url-pattern>
        </servlet-mapping>

        <servlet-mapping>
            <servlet-name>facesServlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
        </servlet-mapping>

Bước 2: webmvc-config.xml

<!-- Handles requests mapped to the Spring Web Flow system -->
    <bean id="flowController" class="org.springframework.webflow.mvc.servlet.FlowController">
        <property name="flowExecutor" ref="flowExecutor" />
        <property name="ajaxHandler">
            <bean class="org.springframework.faces.webflow.JsfAjaxHandler" />
        </property>
</bean>

Bước 3: facess-config.xml

<faces-config 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-facesconfig_2_0.xsd" version="2.0">

0

Nếu bạn đang sử dụng Apache Trinidad, bạn cũng sẽ phải nâng cấp nó lên phiên bản 2.0 để nó sẽ hỗ trợ JSF 2.0. Có thêm thông tin tại Hacker's Valhalla .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.