Migrando do JSF 1.2 para o JSF 2.0

136

Estou trabalhando com um aplicativo bastante grande escrito no JSF 1.2 . O JSF 1.2 tem cerca de 6 anos. Preciso atualizar para o JSF 2.0. Quão doloroso isso será? Percebi que alguns atributos nas tags personalizadas foram alterados etc.

mkoryak
fonte

Respostas:

245

Dores

A dificuldade de atualizar o JSF 1.2 para o 2.0 depende da tecnologia de exibição que você está usando no momento e que deseja usar.

  • JSP 2.x a JSP 2.x = Quase sem esforço.
  • Facelets 1.x a Facelets 2.0 = Pouco esforço.
  • JSP 2.x ao Facelets 2.0 = Muito esforço. Dobre isso se você também tiver componentes personalizados.

Mudanças básicas

Independentemente da opção de tecnologia de visualização, pelo menos as seguintes etapas devem ser executadas:

  • Remova os JARs do JSF 1.2 de /WEB-INF/lib(se houver).
  • Solte os /WEB-INF/libJARs do JSF 2.0 (se o JSF 1.2 foi fornecido pelo servletcontainer, convém alterar a política de carregamento de classe para carregar as bibliotecas de aplicativos da Web antes das bibliotecas do servletcontainer, consulte também os problemas de carregamento de classe JSF2 nos servidores de aplicativos ).
  • Atualize a declaração raiz faces-config.xmlpara cumprir a especificação 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">

    Nota: ao usar o JSF 2.2 ou mais recente, use o http://xmlns.jcp.orgdomínio do espaço para nome, em vez de usar o http://java.sun.comsnippet XML acima.

  • Certifique-se de que a declaração raiz de web.xmljá esteja em conformidade com pelo menos o Servlet 2.5. O JSF 2.0 não funciona em 2.4 ou inferior ( embora seja possível hackear ).

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

    Nota: ao usar o Servlet 3.0 ou mais recente, use o http://xmlns.jcp.orgdomínio do espaço para nome, em vez de usar o http://java.sun.comsnippet XML acima.


JSP 2.x para JSP 2.x

Se você estiver usando o JSP 2.xe quiser continuar usando-o, basicamente não precisará alterar mais nada.

Atualizando gradualmente

Se você já estiver usando um sufixo url-patternpara FacesServlet, como *.jsf, então é bom saber que o arquivo FacesServletprimeiro será verificado *.xhtmle, se não estiver presente, será verificado *.jsp. Isso permite que você converta gradualmente de JSP para Facelets nos bastidores, sem alterar os URLs.

Mas se você estiver usando um prefixo url-pattern, como /faces/*e desejar atualizar gradualmente do JSP para o Facelets, será necessário alterá-lo *.jsfe possivelmente também todos os links nas páginas JSP existentes.

Você só precisa ter em mente que o novo JSF 2.0, desde que a navegação implícita não verifique a presença do arquivo, ele continuará outcome.xhtmlassim mesmo. Portanto, se você quiser vir ou acessar *.jsp, ainda precisará incluí-lo no viewid da maneira JSF 1.x.


Facelets 1.x a Facelets 2.0

Se você estiver usando o Facelets 1.x como tecnologia de exibição e quiser usar o Facelets 2.0 fornecido pelo JSF 2.0 , precisará executar as seguintes etapas adicionais:

  • Remova o Facelets 1.x JAR de /WEB-INF/lib.
  • Remova Facelets 1.x FaceletViewHandlerde faces-config.xml.
  • Qualquer FaceletViewHandlerimplementação personalizada precisa ser atualizada para estender ViewHandlerWrapper.
  • Não é necessário, mas apenas para limpeza, remova quaisquer <context-param>valores relacionados ao Facelets 1.x dos web.xmlquais já sejam padrão no Facelets 2.0, como o javax.faces.DEFAULT_SUFFIXvalor with *.xhtml.
  • Atualize a declaração raiz dos XMLs taglib existentes do Facelet para atender ao 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">

    Nota: ao usar o JSF 2.2 ou mais recente, use o http://xmlns.jcp.orgdomínio do espaço para nome, em vez de usar o http://java.sun.comsnippet XML acima.

Isso deveria ser basicamente isso.


JSP 2.x para Facelets 2.0

Se você estiver usando o JSP 2.x como tecnologia de visualização e quiser atualizar para o Facelets 2.0 imediatamente, precisará fazer muitas alterações antes que o site seja lançado. Você está basicamente mudando a tecnologia de visualização aqui.

Alterações na página principal

Em todas as páginas mestras, você precisa alterar o seguinte modelo JSP básico.

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

..para o seguinte modelo básico de 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>

Nota: ao usar o JSF 2.2 ou mais recente, use o http://xmlns.jcp.orgdomínio do espaço para nome em vez dos http://java.sun.comtrechos XHTML acima.

Incluir alterações de página

Se suas páginas JSP existentes forem bem projetadas, você não deve ter nenhuma linha de código de scriptlet e também deve ter apenas a <jsp:include>tag exclusiva do JSP. Qualquer um desses precisa ser alterado de:

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

para

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

O JSP básico inclui o modelo de página de ..

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

.. deve ser alterado para o seguinte modelo básico de página do Facelets incluem:

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

Nota: ao usar o JSF 2.2 ou mais recente, use o http://xmlns.jcp.orgdomínio do espaço para nome em vez dos http://java.sun.comtrechos XHTML acima.

Alterações de componentes personalizados

Você precisa alterar os arquivos JSP TLD para Facelets TLD, conforme descrito neste Guia de migração de Mojarra .


Rescaldo

Independentemente da abordagem de migração, você pode eliminar gradualmente faces-config.xmlas novas anotações do JSF 2.0 ou mesmo o CDI . Qualquer um <managed-bean>pode ser anotado por @ManagedBean:

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

Ao lado @RequestScoped, também existem @ViewScoped, @SessionScopede @ApplicationScopeddisponível. Se você omitir o nameatributo do @ManagedBean, será padronizado o nome da classe com o primeiro caractere em minúsculas.

@ManagedBean
@RequestScoped
public class SomeBean {}

Neste exemplo em particular, será #{someBean}.

Qualquer um <managed-property>pode ser anotado usando @ManagedProperty:

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

Qualquer um <validator>pode ser anotado usando @FacesValidator:

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

Qualquer um <converter>pode ser anotado usando@FacesConverter

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

Qualquer um <renderer>pode ser anotado usando@FacesRenderer

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

Qualquer um <navigation-case>que use o nome de arquivo da página XHTML como ambos <from-outcome>e <to-view-id>possa ser removido, pois isso será feito implicitamente . Isso pode ser feito gradualmente alterando todos os valores de resultado para corresponder ao nome do arquivo da visualização de destino.

Por fim, qualquer bean com escopo de sessão que foi colocado na sessão com o único motivo para reter os dados do bean em solicitações subsequentes na mesma guia / janela pode ser melhor marcado @ViewScoped, porque dessa maneira o bean não será afetado quando o usuário final abrir a mesma página em diferentes guias / janelas.


Bibliotecas de componentes

Observe que eu não levo em conta nenhuma biblioteca de componentes de terceiros como PrimeFaces / RichFaces / IceFaces nesta resposta; seria impossível escrever uma resposta confiável, pois ela se resume basicamente a "depende". Em geral, é suficiente apenas atualizar a biblioteca de componentes para uma versão compatível com JSF 2.0, conforme eles mesmos, conforme suas instruções. O melhor é escrever testes de unidade, executá-los antes e depois da atualização e corrigir todos os problemas individualmente.

Aqui estão pelo menos alguns links úteis com relação à migração da biblioteca de componentes específicos:

O PrimeFaces não possui um guia de migração para o PrimeFaces 1.x para 2.x, pois o PrimeFaces 1.x já requer o Facelets 1.x, portanto, basta seguir as etapas de migração do Facelets 1.x para 2.x. No entanto, há um guia de migração do PrimeFaces 2.x para 3.x (e superior) que pode ser aplicado também na migração do PrimeFaces 1.x para 3.x (ou superior). O Tomahawk também não possui um guia de migração. Basicamente, o único que você precisa alterar são os JARs e, se necessário, se livra de todas as <t:saveState>referências em um bean com escopo de solicitação, tornando o escopo da exibição de bean.

BalusC
fonte
@ManagedBean (name = "managedBeanName") @RequestScoped It is :)
Daniel Szalay
ótimo post, me ajudou muito. Algo a ser observado: ao passar do jsf 1.2 para o jsf 2, é quase certo que as pessoas usaram o a4j do richfaces 3.3.x. Decidi usar o richfaces 3.3.3 junto com o jsf 2, pois parecia uma mudança medíocre para atualizar para o richfaces 4.x. Então, eu fiz o seu guia (desfiz todas as coisas relacionadas a facelets em faces-config (o manipulador de exibição ativado removeu a anotação de taglig), segui community.jboss.org/wiki/RichFaces333AndJSF20 e finalmente tive que fazer isso stackoverflow.com/questions/85532/…
Toskan
Ótima resposta. No meu caso, também tive que definir o javax.faces.VALIDATE_EMPTY_FIELDSparâmetro falsepara obter a validação classificada. Veja também: stackoverflow.com/questions/6113935/…
Jasper de Vries
2
Também posso recomendar a todos que leiam balusc.blogspot.nl/2011/09/communication-in-jsf-20.html
Jasper de Vries
1
@ Fold: Eu consertei o link.
BalusC
7

Uma coisa a mencionar é que, se alguém estiver usando JSTL com JSF 1.2, ao atualizar para o JSF2, você deve alterar o espaço para nome de:

http://java.sun.com/jstl/core

para:

http://java.sun.com/jsp/jstl/core

Rafal G.
fonte
2
Nota: isso se aplica apenas ao migrar do Facelets 1.x para 2.x.
BalusC
E para as
versões
6

O JSF 2.0 possui muitos recursos e componentes novos e não acho que a migração seja dolorosa. A única área que você achará difícil é usar bibliotecas de terceiros. Se o seu aplicativo depender muito de bibliotecas como o Richfaces, você terá problemas. Nem todos os componentes do Richfaces 3 são portados para o Richfaces 4.

Isso também pode ajudar na migração de aplicativos JSF 1.2 para JSF 2.0

Verifique também o que há de novo no JSF 2?

mvg
fonte
Teria sido o mesmo quando você usa o Richfaces com o JSF 1.x - você passa por toda a "dor" para descobrir como integrar componentes de terceiros ao JSF. A abordagem do JSF 2.x não faz diferença. Essa é a "alegria" da programação, não é? :)
ChuongPham
4

Web.xml

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

Etapa 1: alterar 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>

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

Etapa 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">
Pravin
fonte
0

Se você estiver usando o Apache Trinidad, também será necessário atualizá-lo para a versão 2.0, para que ele suporte o JSF 2.0. Há mais informações no Hacker's Valhalla .

designatevoid
fonte