JSF 1.2에서 JSF 2.0으로 마이그레이션


136

JSF 1.2로 작성된 다소 큰 앱으로 작업하고 있습니다. JSF 1.2는 6 세 정도입니다. JSF 2.0으로 업그레이드해야합니다. 이것이 얼마나 고통 스러울까요? 맞춤 태그의 일부 속성이 변경되었음을 알았습니다.

답변:


245

고통 스러움

JSF 1.2를 2.0으로 업그레이드하는 데 따르는 고통은 현재 사용중인 뷰 기술에 따라 다릅니다.

  • JSP 2.x에서 JSP 2.x로 = 거의 노력이 없습니다.
  • Facelets 1.x-Facelets 2.0 = 적은 노력.
  • Facelets 2.0에 대한 JSP 2.x = 많은 노력. 사용자 컴포넌트가있는 경우이를 두 배로 늘리십시오.

기본 변경

뷰 기술 스위치에 관계없이 최소한 다음 단계를 수행해야합니다.

  • JSF 1.2 JAR을 /WEB-INF/lib(있는 경우) 제거하십시오 .
  • JSF 2.0 JAR을 삭제하십시오 /WEB-INF/lib(JSF 1.2가 서블릿 컨테이너 제공 인 경우, 서블릿 컨테이너 라이브러리보다 먼저 웹 애플리케이션 라이브러리를로드하도록 클래스로드 정책을 변경하고자 할 수도 있습니다 ( 애플리케이션 서버의 JSF2 클래스로드 문제 참조 ).
  • faces-config.xmlJSF 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">

    참고 : JSF 2.2 이상을 사용하는 경우 위의 XML 스 니펫 http://xmlns.jcp.org대신 네임 스페이스 도메인을 사용하십시오 http://java.sun.com.

  • 루트 선언이 web.xml이미 서블릿 2.5 이상을 준수하는지 확인하십시오 . JSF 2.0은 2.4 이하에서 작동하지 않습니다 ( 해킹 가능하지만 ).

    <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">

    참고 : Servlet 3.0 이상을 사용하는 경우 위의 XML 스 니펫 http://xmlns.jcp.org대신 네임 스페이스 도메인을 사용하십시오 http://java.sun.com.


JSP 2.x에서 JSP 2.x로

당신이 사용하는 경우 JSP 2.x를을 하고 싶어 유지 를 사용하여, 당신은 기본적으로 다른 변경 아무것도 필요하지 않습니다.

점차 업그레이드

와 같은 접미사 url-pattern를 이미 사용 하고 있다면 먼저 파일을 스캔하고 파일이 없으면 파일을 스캔 한다는 것을 아는 것이 좋습니다 . 이를 통해 URL을 변경하지 않고 JSP에서이면 뒤에서 Facelets로 점차 변환 할 수있는 공간을 제공합니다.FacesServlet*.jsfFacesServlet*.xhtml*.jsp

당신이 접두사를 사용하는 경우 그러나 url-pattern처럼, /faces/*당신은 점차적으로 JSP에서 Facelets의로 업그레이드하려면, 당신은 정말 그것을 변경해야 할 *.jsf도 가능 기존의 JSP 페이지에있는 모든 링크를합니다.

새로운 JSF 2.0 제공 암시 적 탐색은 파일의 존재를 스캔하지 않으므로 outcome.xhtml어쨌든 진행된다는 것을 명심해야 합니다. 따라서에서 오거나 나가려면 *.jspJSF 1.x 방식으로 viewid에 포함시켜야합니다.


Facelets 1.x에서 Facelets 2.0으로

당신이 사용하는 경우 Facelets의 1.x에서 보기 기술 등을하고 JSF 2.0 공급 사용할 Facelets의 2.0 , 당신은 다음과 같은 추가 단계를 수행해야합니다

  • 에서 Facelets 1.x JAR을 제거하십시오 /WEB-INF/lib.
  • FaceletViewHandler에서 Facelets 1.x 를 제거하십시오 faces-config.xml.
  • 대신 FaceletViewHandler확장하려면 모든 사용자 지정 구현을 업데이트해야 ViewHandlerWrapper합니다.
  • 필요하지는 않지만 정리의 경우 with 값이 있는 Facelets 2.0에서 이미 기본값 인 Facelets 1.x 관련 <context-param>값을 제거하십시오 .web.xmljavax.faces.DEFAULT_SUFFIX*.xhtml
  • Facelets 2.0을 준수하도록 기존 Facelet taglib XML의 루트 선언을 업데이트하십시오.

    <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">

    참고 : JSF 2.2 이상을 사용하는 경우 위의 XML 스 니펫 http://xmlns.jcp.org대신 네임 스페이스 도메인을 사용하십시오 http://java.sun.com.

기본적으로 그렇습니다.


Facelets 2.0에 대한 JSP 2.x

JSP 2.x 를 뷰 기술로 사용 하고 Facelets 2.0으로 즉시 업그레이드하려는 경우 사이트를 활성화하기 전에 많은 변경을 수행해야합니다. 기본적으로 뷰 기술을 변경하고 있습니다.

마스터 페이지 변경

모든 마스터 페이지에서 다음 기본 JSP 템플리트를 변경해야합니다.

<%@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>

.. 다음 기본 Facelets 템플릿으로 :

<!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>

참고 : JSF 2.2 이상을 사용하는 경우 위의 XHTML 스 니펫 http://xmlns.jcp.org대신 네임 스페이스 도메인을 사용하십시오 http://java.sun.com.

페이지 변경 사항 포함

기존 JSP 페이지가 잘 디자인 된 경우 스크립틀릿 코드 줄 이 없어야 <jsp:include>하며 유일한 JSP 특정 태그 만 있어야합니다 . 다음 중 하나를 변경해야합니다.

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

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

기본 JSP에는 페이지 템플리트가 포함되어 있습니다.

<%@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>

.. 페이지 템플리트를 포함하는 다음 기본 Facelets로 변경해야합니다.

<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>

참고 : JSF 2.2 이상을 사용하는 경우 위의 XHTML 스 니펫 http://xmlns.jcp.org대신 네임 스페이스 도메인을 사용하십시오 http://java.sun.com.

사용자 컴포넌트 변경

Mojarra Migration Guide에 설명 된대로 JSP TLD 파일을 Facelets TLD 파일로 변경해야합니다 .


여파

마이그레이션 방식에 관계없이 faces-config.xml새로운 JSF 2.0 주석 또는 CDI로 점진적으로 제거 할 수 있습니다 . 다음 <managed-bean>으로 주석을 달 수 있습니다 @ManagedBean.

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

옆에는 @RequestScoped,이 또한 @ViewScoped, @SessionScoped@ApplicationScoped가능합니다. 의 name속성 을 생략 @ManagedBean하면 기본적으로 첫 번째 문자가 소문자로 classname이됩니다.

@ManagedBean
@RequestScoped
public class SomeBean {}

이 특정 예에서는입니다 #{someBean}.

다음을 <managed-property>사용하여 주석을 달 수 있습니다 @ManagedProperty.

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

다음을 <validator>사용하여 주석을 달 수 있습니다 @FacesValidator.

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

어떤을 <converter>사용하여 주석이 될 수있다@FacesConverter

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

어떤을 <renderer>사용하여 주석이 될 수있다@FacesRenderer

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

<navigation-case>XHTML 페이지의 파일 이름을 둘 다로 사용 <from-outcome>하고 암시 적으로 수행 <to-view-id>되므로 제거 할 수있는 모든 파일입니다 . 대상보기의 파일 이름과 일치하도록 모든 결과 값을 변경하여 점진적으로 수행 할 수 있습니다.

마지막으로, 모든 세션은 창을 더 표시 할 수 있습니다 / 같은 탭의 후속 요청에서 빈 데이터를 유지하는 유일한 이유는 세션에 넣어 된 콩을 범위 @ViewScoped이 방법은 콩이 영향을받지 않습니다 때문에 최종 사용자가 열릴 때, 다른 탭 / 창의 동일한 페이지.


컴포넌트 라이브러리

PrimeFaces / RichFaces / IceFaces와 같은 타사 컴포넌트 라이브러리는이 답변에서 고려하지 않습니다. 그러면 기본적으로 "의존"으로 귀결되기 때문에 신뢰할 수있는 답변을 작성하는 것이 불가능합니다. 일반적으로 지침에 따라 구성 요소 라이브러리를 자체 검증 된 JSF 2.0 호환 버전으로 업그레이드하는 것으로 충분합니다. 가장 좋은 방법은 단위 테스트를 작성하고 업그레이드 전후에 실행하고 문제를 개별적으로 수정하는 것입니다.

다음은 특정 구성 요소 라이브러리의 마이그레이션과 관련된 유용한 링크입니다.

PrimeFaces 1.x에 Facelets 1.x가 이미 필요하므로 PrimeFaces 1.x에서 2.x 로의 마이그레이션 안내서가 없습니다. 따라서 Facelets 1.x에서 2.x 로의 마이그레이션 단계 만 수행하면됩니다. 그러나 PrimeFaces 1.x에서 3.x (또는 그 이상)로 마이그레이션 할 때 적용 할 수 있는 PrimeFaces 2.x에서 3.x (이상) 로의 마이그레이션 안내서 가 있습니다. Tomahawk에는 마이그레이션 안내서도 없습니다. 기본적으로 변경해야 할 것은 JAR 뿐이며 필요한 경우 <t:saveState>Bean보기의 범위를 지정하여 요청 범위 Bean 의 모든 참조를 제거 하십시오.


@ManagedBean (name = "managedBeanName") @RequestScoped 그것은 :)
Daniel Szalay

좋은 게시물, 많은 도움이되었습니다. 참고 사항 : jsf 1.2에서 jsf 2로 이동할 때 richfaces 3.3.x에서 a4j를 사용한 사람들이 거의 확실합니다. richfaces 4.x로 업그레이드하기 위해 수행하는 평범한 변경처럼 보이기 때문에 richfaces 3.3.3을 jsf 2와 함께 사용하기로 결정했습니다. 나는 (얼굴 - 설정의 모든 Facelets에 관련된 것을 취소 한 (제거 taglig 주석 viewhandler 활성화) 당신의 가이드를했다 그래서, 다음 다음 community.jboss.org/wiki/RichFaces333AndJSF20 마지막이해야 할 일을했을 stackoverflow.com/questions/85532/...을
Toskan

좋은 대답입니다. 필자의 경우 유효성 검사를 정렬 하도록 javax.faces.VALIDATE_EMPTY_FIELDS매개 변수를 설정해야했습니다 false. 또한보십시오 : stackoverflow.com/questions/6113935/…
Jasper de Vries


1
@ 접기 : 링크를 수정했습니다.
BalusC


6

JSF 2.0에는 많은 새로운 기능과 구성 요소가 있으며 마이그레이션이 고통스럽지 않다고 생각합니다. 타사 라이브러리를 사용하는 것이 어려운 영역 만 있습니다. 응용 프로그램이 Richfaces와 같은 라이브러리에 크게 의존하는 경우 문제가 발생합니다. Richfaces 3의 모든 구성 요소가 Richfaces 4로 이식되는 것은 아닙니다.

이것은 또한 JSF 1.2 애플리케이션을 JSF 2.0으로 마이그레이션하는 데 도움이 될 수 있습니다

또한이 확인 JSF 2의 새로운 무엇입니까?


JSF 1.x에서 Richfaces를 사용할 때도 마찬가지 였을 것입니다. JSF와 써드 파티 컴포넌트를 통합하는 방법을 찾기 위해 모든 "통증"단계를 거칩니다. JSF 2.x에 대한 접근 방식은 차이가 없습니다. 이것이 프로그래밍의 "기쁨"입니까? :)
ChuongPham

4

Web.xml

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

1 단계 : 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>

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>

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">

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.