Câu trả lời:
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.
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:
/WEB-INF/lib
(nếu có)./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.org
miền không gian tên thay vì trong http://java.sun.com
suố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.org
miền không gian tên thay vì trong http://java.sun.com
suốt đoạn mã XML ở trên.
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.
Nếu bạn đã sử dụng hậu tố url-pattern
cho FacesServlet
, như vậy *.jsf
, thật tốt khi biết rằng FacesServlet
lần đầu tiên sẽ quét *.xhtml
tệp và nếu không có, thì hãy quét *.jsp
tệ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 *.jsf
và 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.xhtml
dù 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.
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:
/WEB-INF/lib
.FaceletViewHandler
khỏi faces-config.xml
.FaceletViewHandler
thực hiện tùy chỉnh cần phải được cập nhật để mở rộng ViewHandlerWrapper
thay thế.<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_SUFFIX
giá 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.org
miền không gian tên thay vì trong http://java.sun.com
suốt đoạn mã XML ở trên.
Điều đó về cơ bản nên là nó.
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.
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.org
miền không gian tên thay vì http://java.sun.com
trong các đoạn XHTML ở trên.
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.org
miền không gian tên thay vì http://java.sun.com
trong các đoạn XHTML ở trên.
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 .
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.xml
bằ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
và @ApplicationScoped
có sẵn. Nếu bạn bỏ qua name
thuộc tính của @ManagedBean
thì 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>
và <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.
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.
javax.faces.VALIDATE_EMPTY_FIELDS
tham số để false
xác thực sắp xếp. Xem thêm: stackoverflow.com/questions/6113935/ khăn
Một điều cần đề cập là nếu bất kỳ ai đang sử dụng JSTL với JSF 1.2 thì khi nâng cấp lên JSF2, bạn nên thay đổi không gian tên từ:
đến:
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?
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">
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 .