Usando o JSF como tecnologia de visualização do Spring MVC

Atualmente, estou implementando um pequeno Spring MVC PoC e gostaria de usar o JSF como a tecnologia de exibição, já que a maioria das pessoas na minha empresa está acostumada a um ambiente J2EE com PrimeFaces.

O Spring MVC 3 suporta JSF ou simplesmente JSP? Eu li vários artigos misturando os dois.

Minha necessidade é criar uma interface de usuário atraente. Existe uma maneira simples de fazer isso usando o Spring MVC com o JSP como a tecnologia de exibição?

Nosso aplicativo usa agendas / calendars em várias páginas. É basicamente um aplicativo de gerenciamento de tempo

Você está cometendo um erro conceitual. O JSF não é uma tecnologia de visualização. O JSF é um framework MVC. Exatamente como Spring MVC, embora eles tenham uma ideologia diferente; O JSF é baseado em componentes MVC e o Spring MVC é baseado em solicitação MVC. Assim, eles são concorrentes completos. Você não pode misturá-los. Você deve escolher um ou outro. Em vez disso, JSP e Facelets são verdadeiras tecnologias de visualização. Desde o Java EE 6 (dezembro de 2009), o JSP é preterido e substituído pelo Facelets (XHTML) como tecnologia de visualização padrão para o JSF.

Você pode usar o Spring MVC com tecnologia de visualização JSP . Você também pode usar o Spring MVC com tecnologia de visualização Facelets (e muitos outros ). Mas você não pode usar o Spring MVC com componentes JSF e muito menos com bibliotecas de componentes JSF como o PrimeFaces. Os componentes de saída do JSF podem funcionar, mas os componentes de input do JSF não funcionarão. O Spring MVC já possui suas próprias tags para input. Mesmo se você misturá-los, você vai acabar com metade da funcionalidade de ambas as estruturas em uma base de código confuso e misturado. Isso não faz nenhum sentido. Se tudo que você quer é usar a mesma interface do usuário como PrimeFaces, basta pegar o jQuery UI . Também é exatamente o que PrimeFaces está usando sob as capas. PrimeFaces é uma biblioteca de componentes JSF baseada em jQuery.

Do outro lado, também pode ser muito bom que você tenha confundido o Spring IoC / DI com o Spring MVC. Spring IoC / DI é, por sua vez, utilizável em conjunto com o JSF. Você pode replace o recurso de bean gerenciado do JSF ( @ManagedBean e amigos) pelo recurso de bean gerenciado do Spring ( @Component e amigos), geralmente com o único propósito de usar @Autowired em um bean @Autowired JSF. Mas é isso. O ciclo de vida da estrutura JSF MVC, os componentes JSF e a tecnologia de visualização permanecem inalterados. O equivalente Java EE padrão disso seria usar CDI (e EJB ).

A mesma história se aplica ao Spring Security. Você pode usá-lo junto com o JSF, mas você não deve seguir os exemplos / documentação direcionados do Spring Security + Spring MVC para configurá-lo, mas apenas os do Spring Security + JSF. Observe que as restrições Spring Security nas ações de negócios só funcionam quando você substitui o recurso de bean gerenciado JSF pelo recurso de bean gerenciado do Spring. Então, isso ainda exigiria um “Integrate Spring in JSF”, conforme descrito no parágrafo anterior. O equivalente padrão Java EE disso seria usar a segurança gerenciada por contêiner (JAAS / JASPIC) por meio de inputs em web.xml .

A mesma história também se aplica ao Spring WebFlow. Você só precisa verificar se está usando a versão mais recente do Spring WebFlow, pois versões mais antigas causam conflitos quando usadas junto com várias bibliotecas de componentes JSF. Além disso, desde o JSF 2.2, o novo recurso Faces Flows foi introduzido como parte da API Java EE padrão, basicamente tornando o Spring WebFlow supérfluo.

Então há o Spring Boot. Isso não tem um equivalente direto no Java EE. O Spring Boot basicamente permite que você execute um aplicativo Java EE usando uma class de aplicativo Java simples com um método main() “de maneira fácil e abstrata”. Sem o Spring Boot, certamente é possível (caso contrário, o Spring Boot nunca teria existido), é apenas um pouco mais de trabalho para a configuração, pois você deve levar em conta detalhes específicos do servidor com base em sua documentação. Por exemplo: Undertow e Jetty .

Voltando ao JSF e ao Spring MVC, se for realmente necessário, você pode executar com segurança o Spring MVC eo JSF um ao lado do outro no mesmo aplicativo da Web, mas eles não interoperarão no lado do servidor. Eles vão rodar de forma totalmente independente. No máximo, eles se tocam no lado do cliente, se algum JavaScript em uma página HTML gerada por JSF invocar uma chamada de serviço da Web REST baseada em Spring no mesmo aplicativo da Web. Mas esse serviço web do Spring não precisaria / teria que saber nada sobre o JSF para responder adequadamente. O equivalente padrão do Java EE desse webservice do Spring REST é o JAX-RS .

O próximo Java EE 8 virá com uma nova estrutura MVC baseada em solicitação, chamada apenas ” MVC “, baseada nas lições do JSF e do Spring MVC, substituindo o Spring MVC e fornecendo uma alternativa padrão ao JSF.

Veja também:

  • O que exatamente é o Java EE?
  • Diferença entre o pedido MVC e o componente MVC
  • Quais são as principais desvantagens do Java Server Faces 2.0?
  • Qual é a necessidade do JSF, quando a interface do usuário pode ser obtida de CSS, HTML, JavaScript, jQuery?
  • Quando é necessário ou conveniente usar Spring ou EJB3 ou todos eles juntos?
  • Integração Spring JSF: como injetar um componente / serviço Spring no JSF managed bean?
  • Por que os Facelets são preferidos ao JSP como a linguagem de definição de visualização do JSF2.0 em diante?

Spring MVC e JSF não se misturam. Você pode usar o JSF para o material relacionado à visualização e fazer com que o Spring gerencie e conecte o backup (serviços, daos etc.). Mas tentar combinar @Controllers com páginas JSF não é algo que realmente funcione bem (ao lado de ambos são pedidos de pilhas diferentes baseados em componentes).

Para integrar o Spring com o JSF, você precisará adicionar o SpringBeanFacesELResolver ao seu faces-config.xml. Isso irá procurar os beans no contexto da aplicação Springs. Para que isso funcione, você tem que usar annotations JSF simples e não as annotations baseadas em CDI.

Spring Webflow pode ser uma ajuda aqui. Confira este projeto de amostra. https://github.com/spring-projects/spring-webflow-samples/tree/master/primefaces-showcase