Respostas:
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.
Independentemente da opção de tecnologia de visualização, pelo menos as seguintes etapas devem ser executadas:
/WEB-INF/lib
(se houver)./WEB-INF/lib
JARs 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.xml
para 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.org
domínio do espaço para nome, em vez de usar o http://java.sun.com
snippet XML acima.
Certifique-se de que a declaração raiz de web.xml
já 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.org
domínio do espaço para nome, em vez de usar o http://java.sun.com
snippet XML acima.
Se você estiver usando o JSP 2.xe quiser continuar usando-o, basicamente não precisará alterar mais nada.
Se você já estiver usando um sufixo url-pattern
para FacesServlet
, como *.jsf
, então é bom saber que o arquivo FacesServlet
primeiro será verificado *.xhtml
e, 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 *.jsf
e 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.xhtml
assim mesmo. Portanto, se você quiser vir ou acessar *.jsp
, ainda precisará incluí-lo no viewid da maneira JSF 1.x.
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:
/WEB-INF/lib
.FaceletViewHandler
de faces-config.xml
.FaceletViewHandler
implementação personalizada precisa ser atualizada para estender ViewHandlerWrapper
.<context-param>
valores relacionados ao Facelets 1.x dos web.xml
quais já sejam padrão no Facelets 2.0, como o javax.faces.DEFAULT_SUFFIX
valor 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.org
domínio do espaço para nome, em vez de usar o http://java.sun.com
snippet XML acima.
Isso deveria ser basicamente isso.
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.
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.org
domínio do espaço para nome em vez dos http://java.sun.com
trechos XHTML acima.
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.org
domínio do espaço para nome em vez dos http://java.sun.com
trechos XHTML acima.
Você precisa alterar os arquivos JSP TLD para Facelets TLD, conforme descrito neste Guia de migração de Mojarra .
Independentemente da abordagem de migração, você pode eliminar gradualmente faces-config.xml
as 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
, @SessionScoped
e @ApplicationScoped
disponível. Se você omitir o name
atributo 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.
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.
javax.faces.VALIDATE_EMPTY_FIELDS
parâmetro false
para obter a validação classificada. Veja também: stackoverflow.com/questions/6113935/…
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?
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">
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 .