View – Criando e configurando o JSF
Vamos criar um novo projeto Dynamic Web Project. Configure-o conforme as imagens abaixo :





Atenção, em algum momento o Eclipse irá te perguntar se você quer adicionar as capacidades do JSF (auto complete), diga que sim. Uma tela como a tela abaixo irá aparecer:


Após finalizar a criação, vamos editar nosso arquivo web.xml que deve ficar como o arquivo abaixo:
<?xml version="1.0" encoding="UTF-8"?> <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_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>CrudJSF</display-name> <welcome-file-list> <welcome-file>pages/protected/user/listAllDogs.xhtml</welcome-file> </welcome-file-list> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>/faces/*</url-pattern> <url-pattern>*.jsf</url-pattern> <url-pattern>*.xhtml</url-pattern> </servlet-mapping> <!-- Protected area definition --> <security-constraint> <web-resource-collection> <web-resource-name>Restricted Area - ADMIN Only</web-resource-name> <url-pattern>/pages/protected/admin/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>ADMIN</role-name> </auth-constraint> </security-constraint> <security-constraint> <web-resource-collection> <web-resource-name>Restricted Area - USER and ADMIN</web-resource-name> <url-pattern>/pages/protected/user/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>USER</role-name> <role-name>ADMIN</role-name> </auth-constraint> </security-constraint> <!-- Login page --> <login-config> <auth-method>FORM</auth-method> <form-login-config> <form-login-page>/pages/public/login.xhtml</form-login-page> <form-error-page>/pages/public/loginError.xhtml</form-error-page> </form-login-config> </login-config> <!-- System roles --> <security-role> <role-name>ADMIN</role-name> </security-role> <security-role> <role-name>USER</role-name> </security-role> </web-app>
Não se importe caso apareça algum warning/erro, nós iremos resolver daqui a pouco. Repare também que já adicionei todo o código do JAAS que vamos precisar. (Caso queira uma explicação mais detalhada sobre JAAS visite este post: Login de Usuário com JSF e JAAS)
De acordo com o JAAS um usuário normal poderá apenas os arquivos que estiverem dentro da pasta user, que será apenas a listagem dos cachorros cadastrados; o ADMIN poderá realizar os procedimentos do CRUD completo, pois as páginas do CRUD estarão dentro do seu diretório.
O arquivo faces-config.xml deve ficar como abaixo:
<?xml version="1.0" encoding="UTF-8"?>
<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">
<navigation-rule>
<navigation-case>
<from-outcome>logout</from-outcome>
<to-view-id>/pages/protected/user/listAllDogs.xhtml</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
<navigation-rule>
<navigation-case>
<from-outcome>listAllDogs</from-outcome>
<to-view-id>/pages/protected/user/listAllDogs.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<navigation-case>
<from-outcome>createDog</from-outcome>
<to-view-id>/pages/protected/admin/createDog.xhtml</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
<navigation-rule>
<navigation-case>
<from-outcome>updateDog</from-outcome>
<to-view-id>/pages/protected/admin/updateDog.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<navigation-case>
<from-outcome>deleteDog</from-outcome>
<to-view-id>/pages/protected/admin/deleteDog.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
<application>
<resource-bundle>
<base-name>messages</base-name>
<var>msgs</var>
</resource-bundle>
</application>
</faces-config>
Repare que para algumas ações eu utilizei o comando <redirect/>. Esse comando é necessário para que o JAAS possa captar e atualizar a URL solicitada pelo usuário, com isso ele irá barrar o acesso indevido.
Temos também um arquivo que irá conter todas as mensagens da nossa aplicação. Veja que todos os textos exibidos no projeto se encontram dentro dele (crie um arquivo chamado “messages.properties” dentro da pasta “src”):
#Dog dog=Dog dogName=Name dogWeight=Weight #Dog messages dogCreateHeader=Create a new Dog dogUpdateHeader=Update the Dog dogDeleteHeader=Delete this Dog dogNameRequired=The dog needs a name. dogWeightRequired=The dog needs a weight. #Actions update=Update create=Create delete=Delete cancel=Cancel #Login loginHello=Hello loginErrorMessage=Could not login. Check you UserName/Password loginUserName=Username loginPassword=Password logout=Log Out


Olá Hebert, como ficaria esse protected T findOneResult(String namedQuery, Map parameters)
e public User findUserByEmail(String email)
sendo que em Hibernate, já rodei aqui para tentar implementar utilizando a mesma ideologia que vc usou mais até agora nao obtive sucesso.
Marcos, boa tarde.
Do modo como se encontra no projeto ele está funcionando.
Caso você tenha alguma exception após realizar alguma alteração poste o código no guj que ficará mais fácil de ajudar.
Obrigado pela visita.
Pingback: 1389 Ideias para aplicativos Android – GUJ | S60Aplicativos
Hebert, boa tarde.
Parabéns pelo post.
Só uma dúvida. A estrutura que você propõe pode gerar um inconveniente na aplicação. Se você atualizar a página gerará um “re-post” no seu CRUD. Já pensou em implementar o padrão POST-Redirect-GET para resolver o problema?
Roger, boa noite.
Esse patern é bom de ser utilizado, não o coloquei no post para não adicionar mais complexidade para quem está começando agora. [=
Obrigado pela visita e pelo apoio.
Cara parei na parte “adicione o EJB no JBoss”, adicionei, criei o crudDB no Postgres, executei o JBoss e nada, nenhuma tabela foi criada.
Sou iniciante, segui todos os passos certinho até aqui, mas não deu certo.
Eu uso Linux, Eclipse Indigo, JBoss 7 e Postgres 9.1.18
Você criou o módulo do postgres? E também configurou o standalone.xml?
Até mais.
Hebert, boa tarde.
Estou recebendo o seguinte erro quando autenticado pelo servidor:
HTTP Status 408 – The time allowed for the login process has been exceeded. If you wish to continue you must either click back twice and re-click the link you requested or close and re-open your browser.
Já procurei algumas soluções e nada de me ajudarem. Teria alguma solução mais explicita para aumentar o tempo de sessão para o Login? (acho que é esse o problema).
Obrigado!
Marcos, boa noite.
Nunca tomei esse erro.
Baixe o projeto aqui do post e tente executá-lo.
Obrigado pela visita.
Só pra complementar na linha 58 do código:
Query query = em.createNamedQuery(namedQuery);
// Method that will populate parameters if they are passed not null and empty
if (parameters != null && !parameters.isEmpty()) {
populateQueryParameters(query, parameters);
}
result = (T) query.getSingleResult();
Existe sim um método tipado,
TypedQuery javax.persistence.EntityManager.createNamedQuery(String arg0, Class arg1)
Diogo, boa tarde.
Na época que criei esse post eu conhecia apenas o JPA 1.0 e não havia o método tipado.
O TypedQuery veio com o JPA 2.0 que vim aprender algum tempo depois.
Obrigado pela visita. [=
Hebert, mais uma dúvida:
No seu exemplo, listalldogs.xhml já estava no diretório protected, logo ao tentar acessar esta página o JAAS chama a página de login, que após validado já redireciona para a página desejada (listalldogs.xhtml). Porém, como faço, sendo a página de login a primeira por exemplo, para após o login, redirecionar para uma outra página qualquer?
Bruno, bom dia.
Olhe no arquivo de web.xml tem o welcome-page que indica qual a página de login.
Quando o usuário acessar http://localhost:8080/suaAplicacao após login ele será direcionado para a página demarcada lá.
Caso você queira um controle mais refinado, como caso ADM envie para página A se for usuário para a página B, você teria que criar um módulo de JAAS.
Até mais.