Вы находитесь на странице: 1из 33

CRUD JSF 2.

0 + Hibernate Exemplo Gerenciando Livros


by Jos Alexandre Macedo Posted on 8 de Junho de 2010 Bom dia a todos! Hoje vou apresentar todos os passos necessrios para a construo de um CRUD (Create, Read, Update and Delete) utilizando Java Server Faces 2.0 para facilitar a criao das pginas e a comunicao destas com as classes Java e Hibernate para realizar a persistncia dos dados. Para o desenvolvimento eu utilizei o Netbeans 6.8 que j conta com suporte ao JSF 2.0 e ao Hibernate 3 facilitando o trabalho de baixar os frameworks e coloca-los no projeto, porm, fica a cargo do desenvolvedor escolher a IDE de sua preferncia para a criao! O exemplo para a criao do CRUD ser dado atravs da gerencia de livros, um exemplo simples mas capaz de mostrar como as operaes bsicas de um sistema podem ser efetuadas com JSF. A segunda parte deste CRUD com utilizao de ajax e da biblioteca de componentes PrimeFaces est disponvel aqui! Pr Requisitos - Netbeans ou Eclipse - JSF 2.0 - Hibernate 3 - MySQL Estrutura do CRUD O nosso CRUD segue o padro MVC para programao Web, separando as classes em camadas de acordo com a responsabilidade de cada uma. Abaixo apresentada a estrutura que criaremos onde Dao, Model, Controller e View sero pacotes do projeto.

Cada livro no CRUD ter as seguintes informaes: ttulo, autor, pginas, editora, isbn e avaliao que sero mantidas no banco de dados. Criando o Banco de Dados O CRUD utilizar Banco de Dados MySQL, para isso, crie um squema e uma tabela no seu banco como est descrito abaixo. Squema 1CREATE DATABASE IF NOT EXISTS livraria; Tabela 1 2 CREATE TABLE `livro` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, 3 `autor` varchar(255) DEFAULT NULL, 4 `avaliacao` int(11) NOT NULL, 5 `editora` varchar(255) DEFAULT NULL, 6 `isbn` varchar(255) DEFAULT NULL, 7 `paginas` int(11) NOT NULL, `titulo` varchar(255) DEFAULT NULL, 8 PRIMARY KEY (`id`) 9 ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1; 10 Criando as Camadas Model O pacote Model do projeto deve conter uma classe chamada Livro que ser um POJO (Plain Old Java Object) com as annotations do hibernate necessrias para utilizao do framework. A classe deve ficar de acordo com esta: 1 package Model; 2 3 import java.io.Serializable; import javax.persistence.Entity; 4 import javax.persistence.GeneratedValue; 5 import javax.persistence.Id; 6 7 /** 8 * 9 * @author Jos Alexandre */ 10@Entity 11public class Livro implements Serializable { 12 13@Id 14@GeneratedValue private long id; 15private String titulo; 16private String autor; 17private int paginas;

18private String editora; 19private String isbn; private int avaliacao; 20 21public Livro() { 22} 23 24public Livro(long id, String titulo, String autor, int paginas, String 25editora, String isbn, int avaliacao) { 26this.id = id; titulo; this.titulo = 27this.autor = autor; 28this.paginas = paginas; 29this.editora = editora; 30this.isbn = isbn; this.avaliacao = avaliacao; 31} 32 33public String getAutor() { 34return autor; 35} 36 setAutor(String autor) { 37public void = autor; this.autor 38} 39 40public int getAvaliacao() { 41return avaliacao; 42} 43 public void setAvaliacao(int avaliacao) { 44this.avaliacao = avaliacao; 45} 46 47public String getEditora() { 48return editora; 49} 50 public void setEditora(String editora) { 51this.editora = editora; 52} 53 54public long getId() { 55return id; 56} 57public void setId(long id) { 58this.id = id; 59} 60 61public String getIsbn() { 62return isbn; } 63 64public void setIsbn(String isbn) { 65this.isbn = isbn; 66} 67

68public int getPaginas() { 69return paginas; } 70 71public void setPaginas(int paginas) { 72this.paginas = paginas; 73} 74 75public String getTitulo() { 76return titulo; } 77 78public void setTitulo(String titulo) { 79this.titulo = titulo; 80} 81 82} 83 84 85 86 87 88 89 90 91 92 93 94 Dao O pacote Dao vai realizar a comunicao com o banco utilizando o hibernate para salvar, listar alterar e excluir livros. Dentro deste pacote, deve ser criada uma interface chamada LivroDao, uma classe chamada LivroDaoImp e uma classe chamada HibernateUtil (realizar a conexo com o banco) da mesma forma que estas: Interface LivroDao 1 2 import Model.Livro; 3 import java.util.List; 4 5 /** 6 * 7 * @author Jos Alexandre */ 8 public interface LivroDao { 9 10public void save(Livro livro); 11public Livro getLivro(long id); 12public List<livro> list(); public void remove(Livro livro); 13public void update(Livro livro);
package Dao;

14 15} 16 17 18 Classe LivroDaoImp 1 2 3 4 package Dao; 5 6 import Model.Livro; import java.util.List; 7 import org.hibernate.Session; 8 import org.hibernate.Transaction; 9 10/** 11* 12* @author Jos Alexandre */ 13public class LivroDaoImp implements LivroDao { 14 15public void save(Livro livro) { 16Session session = HibernateUtil.getSessionFactory().openSession(); 17Transaction t = session.beginTransaction(); 18session.save(livro); t.commit(); 19} 20public Livro getLivro(long id) { 21Session session = HibernateUtil.getSessionFactory().openSession(); 22return (Livro) session.load(Livro.class, id); } 23public List<livro> list() { 24Session session = HibernateUtil.getSessionFactory().openSession(); 25Transaction t = session.beginTransaction(); 26List lista = session.createQuery("from Livro").list(); 27t.commit(); return lista; 28} 29public void remove(Livro livro) { 30Session session = HibernateUtil.getSessionFactory().openSession(); 31Transaction t = session.beginTransaction(); session.delete(livro); 32t.commit(); 33} 34public void update(Livro livro) { 35Session session = HibernateUtil.getSessionFactory().openSession(); 36Transaction t = session.beginTransaction(); session.update(livro); 37t.commit(); 38} 39} 40 41 42

43 Classe HibernateUtil 1 2 3 package Utils; 4 5 import Model.Livro; 6 import org.hibernate.cfg.AnnotationConfiguration; 7 import org.hibernate.SessionFactory; 8 /** 9 * Hibernate Utility class with a convenient method to get Session 10Factory object. 11* 12* @author Jos Alexandre 13*/ public class HibernateUtil { 14 15private static SessionFactory sessionFactory; 16 17private HibernateUtil() { 18} 19 20public static SessionFactory getSessionFactory() { if (sessionFactory == null) { 21try { 22// Create the SessionFactory from standard (hibernate.cfg.xml) 23// config file. 24AnnotationConfiguration ac = new AnnotationConfiguration(); 25ac.addAnnotatedClass(Livro.class); sessionFactory = ac.configure().buildSessionFactory(); 26} catch (Throwable ex) { 27// Log the exception. 28System.err.println("Initial SessionFactory creation failed." + ex); 29throw new ExceptionInInitializerError(ex); } 30return sessionFactory; 31} else { 32return sessionFactory; 33} 34} 35 36 Controller O pacote Controller vai realizar a comunicao da Camada de Viso representada por nossas pginas JSF com o banco de dados sendo responsvel por realizar as operaes requisitadas nas pginas JSF e em seguida encaminhar o usurio para uma pgina. A classe a ser criada deve chamar LivroController e precisa ser escrita dessa forma: 1 2 import Dao.LivroDao;
package Controller;

3 import Dao.LivroDaoImp; 4 import Model.Livro; import java.util.List; 5 import javax.faces.bean.ManagedBean; 6 import javax.faces.bean.SessionScoped; 7 import javax.faces.model.DataModel; 8 import javax.faces.model.ListDataModel; 9 10/** * 11* @author Jos Alexandre 12*/ 13@ManagedBean 14@SessionScoped public class LivroController { 15 16private Livro livro; 17private DataModel listaLivros; 18 19public DataModel getListarLivros() { 20List<livro> lista = new LivroDaoImp().list(); 21listaLivros = new ListDataModel(lista); return listaLivros; 22} 23public Livro getLivro() { 24return livro; 25} public void setLivro(Livro livro) { 26this.livro = livro; 27} 28public String prepararAdicionarLivro(){ 29livro = new Livro(); 30return "gerenciarLivro"; } 31public String prepararAlterarLivro(){ 32livro = (Livro)(listaLivros.getRowData()); 33return "gerenciarLivro"; 34} String excluirLivro(){ 35publiclivroTemp = (Livro)(listaLivros.getRowData()); Livro 36LivroDao dao = new LivroDaoImp(); 37dao.remove(livroTemp); 38return "index"; 39} public String adicionarLivro(){ 40LivroDao dao = new LivroDaoImp(); 41dao.save(livro); 42return "index"; 43} alterarLivro(){ 44public String = new LivroDaoImp(); LivroDao dao 45dao.update(livro); 46return "index"; 47} 48} 49 50 51 52

53 54 55 56 57 58 View O pacote View composto por pginas JSF que iro executar o pedido de listagem, alterao, excluso e adio de Livros, o nosso projeto precisar de duas pginas JSF uma chamada index.xhtml que listar os Livros do Usurio e permitir exclu-los e acessar as pginas de alterao e insero, a segunda pgina chamada gerenciarLivro.xhtml ser criada para realizar a adio e alterao dos livros. As duas pginas se comunicam diretamente com os mtodos e atributos da classe LivroController permitindo a interao de forma fcil com o banco de dados. Em seguida so apresentadas as pginas necessrias. Pgina index.xhtml 1 <?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 3 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" 4 xmlns:f="http://java.sun.com/jsf/core"> 5 <h:head> 6 <title>Gerenciador de Livros</title> 7 </h:head> 8 <h:body> <h1>Gerenciador de Livros</h1> 9 <h:dataTable var="livro" 10 value="#{livroController.listarLivros}"> 11 <h:column> 12 <f:facet name="header"> <h:outputText value="Ttulo"/> 13 </f:facet> 14 <h:outputText value="#{livro.titulo}" /> 15 </h:column> 16 <h:column> 17 <f:facet name="header"> <h:outputText value="Autor"/> 18 </f:facet> 19 <h:outputText value="#{livro.autor}"/> 20 </h:column> 21 <h:column> <f:facet name="header"> 22 <h:outputText value="Pginas"/> 23 </f:facet> 24 <h:outputText value="#{livro.paginas}"/> 25 </h:column> 26 <h:column> <f:facet name="header"> 27 <h:outputText value="Editora"/> 28 </f:facet> 29 <h:outputText value="#{livro.editora}"/> 30 </h:column>

<h:column> 31 <f:facet name="header"> 32 <h:outputText value="Isbn"/> 33 </f:facet> 34 <h:outputText value="#{livro.isbn}"/> </h:column> 35 <h:column> 36 <f:facet name="header"> 37 <h:outputText value="Avaliao"/> 38 </f:facet> 39 <h:outputText value="#{livro.avaliacao}"/> </h:column> 40 <h:column> 41 <f:facet name="header"> 42 <h:outputText value="Alterar"/> 43 </f:facet> <h:form> 44 <h:commandButton 45 action="#{livroController.prepararAlterarLivro}" value="Alterar"/> 46 </h:form> 47 </h:column> 48 <h:column> <f:facet name="header"> 49 <h:outputText value="Excluir"/> 50 </f:facet> 51 <h:form> 52 <h:commandButton 53action="#{livroController.excluirLivro}" value="Excluir"/> </h:form> 54 </h:column> 55 </h:dataTable> 56 <br/> 57 <h:form> <h:commandLink value="Novo Livro" 58 action="#{livroController.prepararAdicionarLivro}"/> 59 </h:form> 60 </h:body> 61</html> 62 63 64 65 66 67 68 69 70

Pgina gerenciarLivro.xhtml 1 2 3 4 5 6 7
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"> <h:head> <title>Gerenciador de Livros</title> </h:head>

8 <h:body> 9 <h1>Gerenciador de Livros</h1> <h:form> 10Ttulo <h:inputText value="#{livroController.livro.titulo}"/><br/> 11Autor: <h:inputText value="#{livroController.livro.autor}"/><br/> 12Paginas: <h:inputText value="#{livroController.livro.paginas}"/><br/> 13Editora: <h:inputText value="#{livroController.livro.editora}"/><br/> 14ISBN: <h:inputText value="#{livroController.livro.isbn}"/><br/> Avaliao: <h:selectOneMenu 15value="#{livroController.livro.avaliacao}"> 16<f:selectItem itemLabel="1" itemValue="1"/> 17<f:selectItem itemLabel="2" itemValue="2"/> 18<f:selectItem itemLabel="3" itemValue="3"/> <f:selectItem itemLabel="4" itemValue="4"/> 19<f:selectItem itemLabel="5" itemValue="5"/> 20</h:selectOneMenu><br/> 21<h:commandButton action="#{livroController.adicionarLivro}" 22value="Inserir Novo Livro"/> 23<h:commandButton action="#{livroController.alterarLivro}" value="Alterar Livro"/> 24<br/> 25<h:commandLink action="index" value="Voltar"/> 26</h:form> 27</h:body> </html> 28 29 30 Configuraes necessrias Arquivo web.xml 1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 4 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 5 <context-param> 6 <param-name>javax.faces.PROJECT_STAGE</param-name> <param-value>Development</param-value> 7 </context-param> 8 <servlet> 9 <servlet-name>Faces Servlet</servlet-name> 10<servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 11<load-on-startup>1</load-on-startup> </servlet> 12<servlet-mapping> 13<servlet-name>Faces Servlet</servlet-name> 14<url-pattern>*.jsf</url-pattern> 15</servlet-mapping> <session-config> 16<session-timeout> 1730 18</session-timeout> 19</session-config> 20<welcome-file-list> <welcome-file>index.html</welcome-file> 21</welcome-file-list> 22</web-app>

23 24 Arquivo hibernate.cfg.xml Este arquivo configura o hibernate de acordo com seu banco de dados note que preciso adicionar ainda o seu usurio no banco de dados, sua senha e caso seja necessrio o ip e a porta do banco.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property > <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prope rty> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/livraria< /property> <property name="hibernate.connection.username">seuUsuario</property> <property name="hibernate.connection.password">suaSenha</property> </session-factory> </hibernate-configuration>

1 2 3 4 5 6 7 8 9 1 0 1 1

Essas so as informaes necessrias para a criao de um CRUD bsico para a gerencia de Livros utilizando JSF 2.0 e Hibernate, neste link segue o projeto criado no Netbeans para download.

CRUD JSF 2.0 + Hibernate: Parte 2 Utilizando Primefaces


by Jos Alexandre Macedo Posted on 13 de Setembro de 2010

Depois de algum tempo sem postar nada devido a adaptao ao Rio e a empresa que comecei a trabalhar, Concrete Solutions, volto com muitas ideias novas e tecnologias diferentes para compartilhar aqui no blog. Continuarei escrevendo sobre desenvolvimento java para web mas tratarei tambm de assuntos como arquitetura orientada a servio (SOA), projeto e anlise de servios, padres de projeto empresariais, bibliotecas java script e assuntos referentes ao mercado de trabalho de tecnologia. Vamos descrever neste artigo algumas mudanas no nosso CRUD JSF 2 para que ele passe a interagir com o usurio utilizando ajax, tambm vamos melhorar a interface do CRUD com a biblioteca de componentes JSF PrimeFaces. Esta biblioteca de componentes foi uma das primeiras a dar suporte a nova verso do JSF, alm de estar sendo constantemente melhorada pelo seu autor Cagatay Civici. Uma das ltimas mudanas foi a possibilidade da escolha de diversos skins para os componentes, assim

como a possibilidade de utilizao do suporte de criao de skin do jquery para gerar skins personalizados para os componentes do PrimeFaces atravs do ThemeRoller. Utilizaremos skin tambm neste post. O CRUD passar a ter a seguinte interface:

Pr Requisitos:

Este post uma continuao do CRUD JSF 2.0 + Hibernate Exemplo Gerenciando Livros, portanto interessante que voc acompanhe os passos inicias no CRUD para que entenda o que ser alterado neste.

Biblioteca de componentes PrimeFaces disponvel aqui Os demais pr requisitos esto descritos na primeira parte do CRUD JSF 2

Avisos:

O desenvolvimento dos cdigos foi realizado no Netbeans 6.9, porm voc pode utilizar a IDE de sua preferncia para construir o CRUD. Os projeto disponveis para download no fim do tutorial executvel no Netbeans. A verso do PrimeFaces utilizada foi a 2.2, utilize esta ou uma superior.

Adicionando e configurando a biblioteca PrimeFaces Aps baixar a biblioteca PrimeFaces voc deve adicion-la ao projeto do CRUD de Livros. Caso no tenha ainda o projeto, baixe-o por aqui ou acompanhe a primeira paste do CRUD aqui. A configurao necessria para que o PrimeFaces funcione ZERO, isso mesmo, no necessrio nenhuma configurao xml para comear a utiliza-lo, apenas a sua declarao na pgina que o utilizar. No nosso caso a pgina index.xhtml dever conter a seguinte declarao:
1xmlns:p="http://primefaces.prime.com.tr/ui"

Para que possa ser utilizado um skin diferente na pgina, necessrio a insero do seguinte cdigo no arquivo web.xml
1<context-param> 2<param-name>primefaces.skin</param-name> 3<param-value>none</param-value> 4</context-param>

Esta configurao remove o skin padro do PrimeFaces e permite que outros skins possam ser usados, sendo que, a especificao ocorre na pgina atravs da adio da tag . Voc deve clicar aqui para baixar o skin que utilizado nas modificaes deste CRUD. A pasta do skin deve ser colocada na pasta web do seu projeto. E as pginas que forem utilizar o skin devem conter a seguinte chamada dentro da tag :
1<link type="text/css" rel="stylesheet" href="dot-luv/skin.css" />

Porque utilizar ajax no nosso CRUD de Livros? O ajax a maneira que foi encontrada para que no fosse necessrio recarregar toda uma pgina quando houvesse algumas mudanas apenas em parte dela. O objetivo do uso de ajax tornar as pginas web mais prximas de softwares desktop e com isso poder ter uma aplicao que no depende de uma mquina especfica e que pode ser acessada de qualquer lugar. Isso implica tambm em um novo modelo de negcio que comea a se difundir cada vez mais chamado Software as a Service (SaaS), ou, Software como um Servio, este modelo se baseia em oferecer um servio a diversos usurios pela web. Para o usurio a diferena est em no pagar um alto custo inicial pelo software como no modelo tradicional, alm de poder acessar seu aplicativo de qualquer

lugar. Para a empresa desenvolvedora a diferena est no lucro que no vir de uma vez como no modelo tardicional e tambm na facilidade de manuteno e updates para os usurios, pois, precisar realizadar apenas uma vez. Acho que comecei a me desviar um pouco do foco ento vamos voltar. Em outro momento oportuno escreverei sobre SaaS. Utilizando os componentes PrimeFaces no CRUD Para melhorar a aparncia do CRUD e adicionar a chamada assincrona por ajax aos mtodos ns vamos adicionar alguns componentes da biblioteca PrimeFaces. Entre os componentes utilizados esto o layout, dataTable, commandLink, commandButton e o dialog. Alm de algumas mudanas nos cdigos, nos descartaremos a pgina gerenciarLivro.xhtml e seu contedo ir para a pgina index.xhtml. Este contedo ficar dentro do componente dialog do primefaces e ser chamado quando for necessrio incluir ou alterar um livro. Vamos ver como a pgina index.xhtml fica e depois vamos entender um poucos das mudanas realizadas.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.prime.com.tr/ui"> <h:head> <title>Gerenciador de Livros</title> <link type="text/css" rel="stylesheet" href="dotluv/skin.css" /> </h:head> <h:body> <p:layout fullPage="true"> <p:layoutUnit position="left" width="200" header="Atividades" resizable="true" closable="true" collapsible="true"> <h:form prependId="false"> <p:commandLink value="Novo Livro" actionListener="#{livroController.prepararAdicionarLivro}" update="infosLivro" oncomplete="dialogGerLivro.show()"/> </h:form> </p:layoutUnit> <p:layoutUnit position="center"> <h1>Gerenciador de Livros</h1> <br/> <h:form prependId="false"> <p:dataTable id="tabela" var="livro" value="#{livroController.listarLivros}"> <p:column> <f:facet name="header"> <h:outputText value="Ttulo"/> </f:facet> <h:outputText value="#{livro.titulo}" /> </p:column> <p:column> <f:facet name="header">

32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83

<h:outputText value="Autor"/> </f:facet> <h:outputText value="#{livro.autor}"/> </p:column> <p:column> <f:facet name="header"> <h:outputText value="Pginas"/> </f:facet> <h:outputText value="#{livro.paginas}"/> </p:column> <p:column> <f:facet name="header"> <h:outputText value="Editora"/> </f:facet> <h:outputText value="#{livro.editora}"/> </p:column> <p:column> <f:facet name="header"> <h:outputText value="Isbn"/> </f:facet> <h:outputText value="#{livro.isbn}"/> </p:column> <p:column> <f:facet name="header"> <h:outputText value="Avaliao"/> </f:facet> <h:outputText value="#{livro.avaliacao}"/> </p:column> <p:column> <f:facet name="header"> <h:outputText value="Alterar"/> </f:facet> <p:commandButton actionListener="#{livroController.prepararAlterarLivro}" value="Alterar" update="infosLivro" oncomplete="dialogGerLivro.show()"/> </p:column> <p:column> <f:facet name="header"> <h:outputText value="Excluir"/> </f:facet> <h:commandLink action="#{livroController.excluirLivro}" value="Excluir"/> </p:column> </p:dataTable> </h:form> </p:layoutUnit> </p:layout> <p:dialog header="Gerencia de Livro" widgetVar="dialogGerLivro" resizable="false" modal="true" showEffect="slide" width="500"> <h:form prependId="false"> <h:panelGrid id="infosLivro" columns="2" style="margin-bottom:10px"> <h:outputLabel for="titulo" value="Ttulo:" /> <h:inputText id="titulo" value="#{livroController.livro.titulo}"/>

<h:outputLabel for="autor" value="Autor:" /> 84 <h:inputText id="autor" 85 value="#{livroController.livro.autor}"/> 86 87 <h:outputLabel for="paginas" value="Pginas:" /> 88 <h:inputText id="paginas" 89 value="#{livroController.livro.paginas}"/> 90 <h:outputLabel for="editora" value="Editora:" /> 91 <h:inputText id="editora" 92 value="#{livroController.livro.editora}"/> 93 94 <h:outputLabel for="isbn" value="ISBN:" /> 95 <h:inputText id="isbn" 96 value="#{livroController.livro.isbn}"/> 97 <h:outputLabel for="avaliacao" value="Avaliao:" 98 99 /> <h:selectOneMenu id="avaliacao" 100 value="#{livroController.livro.avaliacao}"> 101 <f:selectItem itemLabel="1" itemValue="1"/> 102 <f:selectItem itemLabel="2" itemValue="2"/> 103 <f:selectItem itemLabel="3" itemValue="3"/> <f:selectItem itemLabel="4" itemValue="4"/> 104 <f:selectItem itemLabel="5" itemValue="5"/> 105 </h:selectOneMenu> 106 107 <p:commandButton update="tabela" 108oncomplete="dialogGerLivro.hide();" 109actionListener="#{livroController.adicionarLivro}" value="Inserir 110Livro"/> <p:commandButton update="tabela" 111 oncomplete="dialogGerLivro.hide();" 112 actionListener="#{livroController.alterarLivro}" value="Alterar Livro"/> </h:panelGrid> </h:form> </p:dialog> </h:body> </html>

O componente layout contm um subcomponente chamado layoutUnit. Nas configuraes deste subcomponente ns informamos onde o cdigo que estiver dentro dele vai se localizar na pgina. Por exemplo utilizando o position=left estamos falando que todo cdigo dentro dete componente ficar do lado esquerdo da tela. Alm disso, definimos a configurao fullPage do layout como true, o que faz o layout preencher toda a tela do browser. A principal mudana do dataTable est na troca dos componentes padres do jsf pelo dataTable do primefaces. Isso permite que a tabela seja renderizada e seja alterada com o uso do skin, alm de muitas outras funcionalidades que no sero abordadas neste post. O dataTable passou a ter um id que serve para identifica-lo para que fosse possvel atualizar a tabela por ajax.

Os commandLinks e os commandButtons tiveram grandes alteraes, pois atravs deles que as chamadas ajax so realizadas. Vamos ver as principais mudanas:

Troca do action pelo actionListener: esta troca necessria porque no vamos mais carregar outra pgina aps a execuo de um mtodo no servidor. Ns vamos executar os mtodos no servidor e depois apenas atualizar os componentes que sofreram mudanas com a execuo do mtodo. O uso do atributo update informa quais componentes devero ser renderizados novamente aps a execuo do actionListener, com isso o usurio passa a ter a sensao que est utilizando um programa desktop e no simplismente acessando um site. O atributo onComplete serve para ativar o dialog que apresenta as informaes de um livro para alteraes ou incluses. A ativao do dialog s ocorre aps a execuo do mtodo que estiver definido no actionListener e tambm aps a renderizao dos componentes que esto na varivel update.

O componente dialog permite a criao de uma janela modal que pode ser arrastada pela tela e torna a aplicao mais prxima ainda de aplicaes desktop, pelo fato das janelas serem comuns nas aplicaes desktop. Uma varivel importante deste componente o widgetVar que serve para definir um nome para o dialog. Com este nome o dialog pode ser apresentado ou escondido na tela atravs das funes javascript nomeDoDialog.show() e nomeDoDialog.hide(), respectivamente. Estas so as informaes importantes para compreender as mudanas realizadas nas pginas xhtml. Agora vamos ver como a classe LivroController.java deve ficar para que tudo funcione corretamente.
1 package Controller; 2 import Dao.LivroDao; 3 import Dao.LivroDaoImp; 4 import Model.Livro; 5 import java.util.List; 6 import javax.faces.bean.ManagedBean; 7 import javax.faces.bean.SessionScoped; import javax.faces.event.ActionEvent; 8 import javax.faces.model.DataModel; 9 import javax.faces.model.ListDataModel; 10 11/** 12* @author Jos Alexandre 13*/ 14@ManagedBean @SessionScoped 15public class LivroController { 16 17private Livro livro; 18private DataModel listaLivros; 19 20public DataModel getListarLivros() { 21List<livro> lista = new LivroDaoImp().list(); listaLivros = new ListDataModel(lista); 22return listaLivros; 23} 24

25public Livro getLivro() { 26return livro; } 27 28public void setLivro(Livro livro) { 29this.livro = livro; 30} 31 32public void prepararAdicionarLivro(ActionEvent actionEvent){ 33livro = new Livro(); 34} 35 public void prepararAlterarLivro(ActionEvent actionEvent){ 36livro = (Livro)(listaLivros.getRowData()); 37} 38 39public String excluirLivro(){ 40 41Livro livroTemp = (Livro)(listaLivros.getRowData()); 42LivroDao dao = new LivroDaoImp(); dao.remove(livroTemp); 43return "index"; 44 45} 46 47public void adicionarLivro(ActionEvent actionEvent){ 48 49LivroDao dao = new LivroDaoImp(); 50dao.save(livro); 51 } 52 53 public void alterarLivro(ActionEvent actionEvent){ 54 55LivroDao dao = new LivroDaoImp(); 56dao.update(livro); 57 58} 59 60} 61 62 63 64 65 66 67 68

A mudana realizada nesta classe est nos mtodos deixarem de retornar uma String com a pgina de destino. Eles passam a no retornar nada e tambm passam a receber como parmetro um objeto ActionEvent. Isso acontece porque o objetivo agora apenas realizar algumas mudanas no servidor e depois atualizar somente algumas partes da pgina atravs de ajax.

Essas foram as mudanas necessrias no CRUD para que ele passasse a utilizar ajax e alguns dos componentes da biblioteca primefaces. Concluso Podemos notar que com poucas mudanas tivemos um ganho enorme com relao a usabilidade e aparncia do CRUD. A partir deste CRUD o usurio pode comear a explorar os diversos outros componentes disponibilizados pelo primefaces, veja aqui os demos de todos eles, lembrando que existem tambm outras bibliotecas de componentes que o usurio pode conhecer e que podem atender melhor as necessidades de componentes de acordo com o caso. Espero que tenham aproveitado e entendido o funcionamento do uso dos componentes primefaces e do ajax! Por hoje s e at a prxima! Qualquer dvida estou a disposio!

CRUD JSF 2 Parte 3: Segurana com Spring Security 3


by Jos Alexandre Macedo Posted on 17 de Janeiro de 2011 Ol pessoal, Nos ltimos posts recebi alguns pedidos para incrementar o CRUD JSF 2 com uma poltica de segurana utilizando o Spring Security 3. Lembrando que at a Parte 2 o CRUD contava com a utilizao do framework Hibernate para auxiliar na persistncia e a biblioteca de componentes PrimeFaces. O Spring Security 3 um framework que tem como objetivo auxiliar na autenticao e autorizao dos usurios das aplicaes. uma ferramenta simples de ser utilizada, porm na integrao com JSF necessrio alguns cuidados que sero apresentados neste artigo. Caso voc queira conhecer mais sobre o Spring Security 3 e suas novidades, est nas bancas neste ms de Janeiro/2011 na Java Magazine um artigo meu sobre o tema, detalhando muito mais o uso do framework e ensinando a utilizar o OpenId para criar alternativas de login nas aplicaes. Clique aqui para acessar a Java Magazine 87. Ao final, a tela de login que desenvolveremos ficar da seguinte forma:

O que j fizemos?
interessante que voc tenha acompanhado as 2 partes iniciais sobre o CRUD JSF 2 para que no fique perdido. Caso no tenha acompanhado seguem abaixo os links: Parte 1: CRUD JSF 2 + Hibernate Parte 2: CRUD JSF 2 + Hibernate + PrimeFaces

Passos para integrar o Spring Security 3


Antes de comear vamos ter uma viso geral do que ser necessrio para utilizar o framework. Cada passo ser explicado e detalhado em seguida.

Incluir Novas Bibliotecas

O funcionamento correto do Spring Security 3 na aplicao exige a incluso de 3 bibliotecas:


Spring Security 3 (download) Spring 3 (download) commons-logging (download)

Caso voc prefira, poder baixar todas essas bibliotecas junto ao projeto disponibilizado no final do tutorial.

Arquivos de Configurao

Depois de adicionar as bibliotecas ns devemos avisar para a aplicao que o Spring Security ser utilizado, dessa forma, os filtros que iro garantir acesso apenas para usurios autenticados e autorizados podero agir. Para avisar devemos complementar o arquivo de configurao da aplicao web.xml e deix-lo assim: 1 2 3 4 5
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" 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-app_2_5.xsd"> <context-param>

6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2

<param-name>javax.faces.PROJECT_STAGE</param-name> <param-value>Development</param-value> </context-param> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servletclass> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping> <session-config> <session-timeout> 30 </session-timeout> </session-config> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <context-param> <param-name>primefaces.skin</param-name> <param-value>none</param-value> </context-param> <!-- Incio das configuraes para o Spring Security 3 --> <filter> <filter-name>springSecurityFilterChain</filter-name> <filterclass>org.springframework.web.filter.DelegatingFilterProxy</filterclass> </filter> <listener> <listenerclass>org.springframework.web.context.ContextLoaderListener</listene r-class> </listener> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- Fim das configurao para utilizar o Spring Security 3 --> </web-app>

3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1 4 2 4 3 4 4 Depois disso temos que criar o arquivo de configurao do Spring Security 3. Este arquivo responsvel por definir as regras de acesso para as pginas, define tambm os usurios com permisso e suas autorizaes, filtros e tudo mais relacionado a segurana da aplicao. O arquivo se chamar applicationContext.xml e dever ser criado na pasta WEB-INF, assim como o arquivo web.xml. Veja como o applicationContext.xml deve ser descrito: 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1
<?xml version="1.0" encoding="UTF-8"?> <b:beans xmlns="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:b="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/bea ns http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/sec urity/spring-security-3.0.xsd"> <http auto-config="true" use-expressions="true"> <intercept-url pattern="/index.jsf" access="hasRole('ROLE_USER')"/> <form-login login-page="/login.jsf" authentication-failureurl="/login.jsf?erro=true"/> </http>

4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4

<authentication-manager> <authentication-provider> <jdbc-user-service data-source-ref="dataSource" users-by-username-query="SELECT username, password, enable FROM usuario WHERE username=?" authorities-by-username-query="SELECT Usuario_username as username, autorizacoes_nome as authority FROM usuario_autorizacao WHERE Usuario_username=?" /> </authentication-provider> </authentication-manager> <b:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" > <b:property name="url" value="jdbc:mysql://localhost:3306/livraria" /> <b:property name="driverClassName" value="com.mysql.jdbc.Driver" /> <b:property name="username" value="root" /> <b:property name="password" value="123" /> </b:bean> </b:beans>

Vamos entender melhor estas configuraes. A tag <http> responsvel por definir as configuraes de segurana para as pginas da aplicao. O atributo auto-config com o valor true automatiza algumas tarefas de configurao como a autenticao HTTP bsica e o logout, alm disso, com o auto-config ativado um formulrio padro de login gerado, porm, como definimos a tag <form-login> este formulrio no ser gerado e sim criado por ns mais a frente. O atributo use-expressions uma novidade da verso 3 do Spring Security, ela permite a utilizao da linguagem de expresso SpEL para auxiliar a definir regras de acesso.

Dentro da tag <http> podemos definir inteceptadores atravs da tag <intercept-url>. Estes interceptadores vo criar restries para as pginas da aplicao. No nosso caso a pgina index.xhtml poder ser acessada apenas por usurios com o papel ROLE_USER. O atributo login-page da tag <form-login> define a pgina na qual o formulrio de login ser descrito. J o atributo authentication-failure-url define a pgina direcionada caso ocorra algum erro durante a autenticao. Em seguida temos a tag <authentication-manager>, responsvel por definir provedores de autenticao que gerenciam usurios e suas autorizaes na aplicao. No nosso CRUD os usurios e suas autorizaes sero buscados no banco de dados (configurado atravs do <bean> com id dataSource). A tag <jdbc-user-service> descreve nos atributos users-by-username-query e authorities-by-username-query as consultas que devero ser realizadas no banco de dados para encontrar os usurios e suas autorizaes. Estas so as configuraes de segurana que permitiro a autentio e autorizao de usurios com o apoio do Spring Security 3. Vamos conhecer agora as novas classes necessrias para o CRUD.

Novas Classes

As novas classes que o CRUD vai precisar pertencem a dois pacotes o Model e o Controller.

Pacote Model o Neste pacote criaremos 2 novas classes. Uma que representa o usurio, com um username, um password, uma lista de autorizaes e uma varivel booleana chamada enable que determina se o usurio est ativo ou no. E a outra que representa a autorizao e possui apenas uma string que descreve o nome de uma autorizao. A seguir podemos ver como essas classes devem ser implementadas:

1 package Model; 2 3 import java.io.Serializable; import java.util.List; 4 import javax.persistence.Column; 5 import javax.persistence.Entity; 6 import javax.persistence.Id; 7 import javax.persistence.OneToMany; 8 @Entity 9 public class Usuario implements Serializable { 10 11 @Id private String username; 12 private String password; 13 @Column(name = "enable", columnDefinition = "BOOLEAN") 14 private boolean enable; 15 @OneToMany 16 private List<Autorizacao> autorizacoes;

17 18 19 20 21 22} 23 24} 25 26 27 28

public Usuario() { } //getters and setters

Perceba que cada usurio pode vrias autorizaes, por isso utilizamos a annotation @OneToMany do Hibernate. Dessa forma quando formos gerar automaticamente as tabelas do banco elas sero criadas de acordo com esta definio. 1 2 package Model; 3 4 import java.io.Serializable; import javax.persistence.Entity; 5 import javax.persistence.Id; 6 7 @Entity 8 public class Autorizacao implements Serializable { 9 @Id 10 private String nome; 11 12 public Autorizacao() { 13 } 14 15 //getter and setter 16 17} 18 Para criar as tabelas correspondentes no banco de dados, voc pode executar o trecho de cdigo abaixo: 1 try { AnnotationConfiguration ac = new AnnotationConfiguration(); 2 ac.addAnnotatedClass(Livro.class); 3 ac.addAnnotatedClass(Autorizacao.class); 4 ac.addAnnotatedClass(Usuario.class); 5 sessionFactory = ac.configure().buildSessionFactory(); SchemaExport se = new SchemaExport(ac); 6 se.create(true, true); 7 }catch (Throwable ex) { 8 System.err.println("Initial SessionFactory creation failed." 9 + ex); 10 throw new ExceptionInInitializerError(ex); } 11

12

Pacote Controller o Neste pacote criaremos uma classe chamada UsuarioController, esta classe um managed bean que ir guardar o usurio logado no sistema. Ela dever ser escrita da seguinte forma:

1 2 3 4 5 package Controller; 6 7 import Model.Usuario; 8 import java.io.Serializable; 9 import javax.faces.bean.ManagedBean; 1 import javax.faces.bean.SessionScoped; import org.springframework.security.core.Authentication; 0 import org.springframework.security.core.context.SecurityContext; 1 import 1 org.springframework.security.core.context.SecurityContextHolder; 1 import org.springframework.security.core.userdetails.User; 2 @ManagedBean 1 @SessionScoped 3 public class UsuarioController implements Serializable { 1 private Usuario usuario; 4 1 public UsuarioController() { 5 usuario = new Usuario(); 1 SecurityContext context = SecurityContextHolder.getContext(); 6 if (context instanceof SecurityContext){ 1 Authentication authentication = 7 context.getAuthentication(); if (authentication instanceof Authentication){ 1 usuario.setUsername(((User)authentication.getPrincipa 8 l()).getUsername()); 1 } } 9 } 2 0 public Usuario getUsuario() { 2 return usuario; 1 } 2 2 public void setUsuario(Usuario usuario) { this.usuario = usuario; 2 } 3 2 4} 2 5 2 6

2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 Este managed bean possui a anotao @SessionScoped, com isso ele ser mantido durante toda a sesso da aplicao. O primeiro momento em que ele ser chamado ao acessar a index.xhtml aps efetuar o login com sucesso. Podemos ver no seu construtor a lgica para obter o usurio que realizou o login, utilizando para isso duas classes do Spring Security 3: a SecurityContext e a Authentication. Com o back-end preparado, vamos conhecer agora as mudanas nas pginas xhtml do nosso CRUD.

Pginas xhtml

Vamos precisar criar apenas uma pgina na qual o usurio far o login. Seu nome ser login.xhtml e ela ficar dentro pasta web. Veja em seguida como a login.xhtml dever ser escrita: 1 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 3 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" 4 xmlns:p="http://primefaces.prime.com.tr/ui"> 5 <h:head> 6 <meta http-equiv="Content-Type" content="text/html; 7 charset=UTF-8"/> 8 <title>Bem vindo ao Gerenciador de Livros!</title> <link type="text/css" rel="stylesheet" href="dot9 10luv/skin.css"/> </h:head> 11 <h:body style="background12image:url('http://pwes.rocklin.k12.ca.us/j0439526.jpg');background-

13position: 50% 0%;background-repeat: no-repeat"> <p:dialog header="Login" visible="true" closable="false" 14 draggable="false" resizable="false" width="420"> 15 <center> 16 <h:outputText value="Usurio ou senha incorretos!" 17rendered="#{param.erro}" style="color: darkred"/> </center> 18 <form action="j_spring_security_check" method="post"> 19 <h:panelGrid columns="2" cellpadding="5"> 20 <h:outputLabel for="j_username" value="Username: 21*" /> <h:inputText id="j_username" required="true"/> 22 <h:outputLabel for="j_password" value="Password: 23 * " /> 24 <h:inputSecret id="j_password" required="true"/> 25 <h:commandButton value="Login"/> </h:panelGrid> 26 </form> 27
</p:dialog> </h:body> </html>

Esta uma pgina simples que utilizamos o component dialog do PrimeFaces para colocar o formulrio de login. Note que no foi usada a tag <h:form> do JSF pois no realizaremos nenhuma lgica com managed beans para o login, deixando a responsabilidade da autenticao e autorizao de usurios para o Spring Security. Por isso, utilizamos no atributo action do formulrio o valor j_spring_security_check. Assim o filtro do Spring Security reconhecer esse formulrio como sendo de login e verificar o username e password dos inputs com valor j_username e j_password no atributo name. Obs.: Como a tag <h:inputText> do JSF no possui o atributo name, era necessrio saber como poderiamos defin-lo com o JSF, ento descobri que o valor descrito no atributo id utilizado para o atributo name quando as tags JSF forem convertidas para HTML, bastando assim utilizar j_username e j_password no id das tags. Devemos prestar ateno tambm na tag <h:outputText> dentro da tag <center>. Ela possui o atributo rendered com valor #{param.erro} que nos diz: a tag ser exibida quando for passado como parametro na url o atributo erro com valor true. Ns configuramos o arquivo de segurana para que isso acontea durante as falhas de autenticao. O dialog de login ficar da seguinte forma quando essa tag estiver visvel:

Nosso CRUD j est pronto para que os usurios efetuam login atravs do Spring Security, vamos apenas adicionar na pgina index.xhtml um link para o logoff e vamos

exibir uma mensagem de Boas vindas com o username do usurio logado. A tela ficar da seguinte forma:

Os cdigos da index.xhtml atualizados ficaram assim: 1 <?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 3 <html xmlns="http://www.w3.org/1999/xhtml" 4 xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" 5 xmlns:p="http://primefaces.prime.com.tr/ui"> 6 <h:head> 7 <title>Gerenciador de Livros</title> 8 <link type="text/css" rel="stylesheet" href="dot9 luv/skin.css"/> </h:head> 10 <h:body> 11 <p:layout fullPage="true"> 12 <p:layoutUnit position="left" width="200" 13 header="Atividades" resizable="true" closable="true" 14 collapsible="true"> <h:form prependId="false"> 15 <p:commandLink value="Novo Livro" 16 actionListener="#{livroController.prepararAdicionarLivro}" 17 update="infosLivro" oncomplete="dialogGerLivro.show()"/> </h:form> 18 <h:outputLink 19 value="#{facesContext.externalContext.requestContextPath}/j_spring_s 20 ecurity_logout"> 21 <h:outputText value="Sair"/> 22 </h:outputLink> </p:layoutUnit> 23 <p:layoutUnit position="center"> 24 <h1>Gerenciador de Livros</h1><br/> 25 <h:outputText value="Bem vindo 26 #{usuarioController.usuario.username}, seus livros so:"/> 27 <br/><br/> <h:form prependId="false"> 28 <p:dataTable id="tabela" var="livro" 29 value="#{livroController.listarLivros}"> 30 <p:column> 31 <f:facet name="header">

<h:outputText value="Ttulo"/> 32 </f:facet> 33 <h:outputText value="#{livro.titulo}" /> 34 </p:column> 35 <p:column> <f:facet name="header"> 36 <h:outputText value="Autor"/> 37 </f:facet> 38 <h:outputText value="#{livro.autor}"/> 39 </p:column> 40 <p:column> <f:facet name="header"> 41 <h:outputText value="Pginas"/> 42 </f:facet> 43 <h:outputText value="#{livro.paginas}"/> 44 </p:column> <p:column> 45 <f:facet name="header"> 46 <h:outputText value="Editora"/> 47 </f:facet> 48 <h:outputText value="#{livro.editora}"/> 49 </p:column> <p:column> 50 <f:facet name="header"> 51 <h:outputText value="Isbn"/> 52 </f:facet> 53 <h:outputText value="#{livro.isbn}"/> 54 </p:column> <p:column> 55 <f:facet name="header"> 56 <h:outputText value="Avaliao"/> 57 </f:facet> 58 <h:outputText 59 value="#{livro.avaliacao}"/> </p:column> 60 <p:column> 61 <f:facet name="header"> 62 <h:outputText value="Alterar"/> 63 </f:facet> <p:commandButton 64 actionListener="#{livroController.prepararAlterarLivro}" 65 value="Alterar" update="infosLivro" 66 oncomplete="dialogGerLivro.show()"/> 67 </p:column> <p:column> 68 <f:facet name="header"> 69 <h:outputText value="Excluir"/> 70 </f:facet> 71 <h:commandLink 72 action="#{livroController.excluirLivro}" value="Excluir"/> </p:column> 73 </p:dataTable> 74 </h:form> 75 </p:layoutUnit> 76 </p:layout> 77 <p:dialog header="Gerencia de Livro" 78 79 widgetVar="dialogGerLivro" resizable="false" modal="true" 80 showEffect="slide" width="500"> <h:form prependId="false"> 81 <h:panelGrid id="infosLivro" columns="2"

82 style="margin-bottom:10px"> 83 <h:outputLabel for="titulo" value="Ttulo:" /> 84 <h:inputText id="titulo" 85 value="#{livroController.livro.titulo}"/> 86 87 <h:outputLabel for="autor" value="Autor:" /> <h:inputText id="autor" 88 value="#{livroController.livro.autor}"/> 89 90 <h:outputLabel for="paginas" value="Pginas:" /> 91 <h:inputText id="paginas" 92 value="#{livroController.livro.paginas}"/> 93 94 <h:outputLabel for="editora" value="Editora:" /> <h:inputText id="editora" 95 value="#{livroController.livro.editora}"/> 96 97 <h:outputLabel for="isbn" value="ISBN:" /> 98 <h:inputText id="isbn" 99 value="#{livroController.livro.isbn}"/> 10 <h:outputLabel for="avaliacao" value="Avaliao:" 0 /> 10 <h:selectOneMenu id="avaliacao" 1 value="#{livroController.livro.avaliacao}"> 10 <f:selectItem itemLabel="1" itemValue="1"/> 2 <f:selectItem itemLabel="2" itemValue="2"/> <f:selectItem itemLabel="3" itemValue="3"/> 10 <f:selectItem itemLabel="4" itemValue="4"/> 3 <f:selectItem itemLabel="5" itemValue="5"/> 10 </h:selectOneMenu> 4 10 <p:commandButton update="tabela" 5 oncomplete="dialogGerLivro.hide();" 10 actionListener="#{livroController.adicionarLivro}" value="Inserir 6 Livro"/> <p:commandButton update="tabela" 10 oncomplete="dialogGerLivro.hide();" 7 actionListener="#{livroController.alterarLivro}" value="Alterar 10 Livro"/> 8 </h:panelGrid> 10 </h:form> 9 </p:dialog> 11 </h:body> 0 </html> 11 1 11 2 11 3 11 4 11 5

O link que permite o logoff possui como valor #{facesContext.externalContext.requestContextPath}/j_spring_security_logout, ao clicar neste link o filtro do Spring Security reconhecer que o usurio deseja realizar o logoff e se responsabilizar por esta tarefa. A tag <h:outputText> com valor Bem vindo #{usuarioController.usuario.username}, seus livros so: vai buscar o username do usurio no managed bean UsuarioController. Estas so as mudanas necessrias nas pginas do nosso CRUD para garantir sua segurana. Agora basta inserir no banco de dados alguns usurios, a autorizao ROLE_USER e ligar os usurios autorizao. Dessa forma, o CRUD estar pronto para funcionar.

Concluso
Podemos observar que no difcil integrar o Spring Security 3 com JSF 2 e este tutorial pode servir como base para o desenvolvedor aplicar uma poltica de segurana mais complexa com Spring Security nas suas aplicaes com JSF 2. O framework permite diversas outras maneiras de trabalhar a segurana da aplicao que no vimos aqui mas que voc pode conhecer melhor nos livros recomendados.

Вам также может понравиться