ManagedBeans
No pacote “com.mb” crie as classes abaixo:
package com.mb;
import org.primefaces.context.RequestContext;
import com.util.JSFMessageUtil;
public class AbstractMB {
private static final String KEEP_DIALOG_OPENED = "KEEP_DIALOG_OPENED";
public AbstractMB() {
super();
}
protected void displayErrorMessageToUser(String message) {
JSFMessageUtil messageUtil = new JSFMessageUtil();
messageUtil.sendErrorMessageToUser(message);
}
protected void displayInfoMessageToUser(String message) {
JSFMessageUtil messageUtil = new JSFMessageUtil();
messageUtil.sendInfoMessageToUser(message);
}
protected void closeDialog(){
getRequestContext().addCallbackParam(KEEP_DIALOG_OPENED, false);
}
protected void keepDialogOpen(){
getRequestContext().addCallbackParam(KEEP_DIALOG_OPENED, true);
}
protected RequestContext getRequestContext(){
return RequestContext.getCurrentInstance();
}
}
package com.mb;
import java.io.Serializable;
import java.util.List;
import javax.faces.bean.*;
import com.facade.DogFacade;
import com.model.Dog;
@ViewScoped
@ManagedBean
public class DogMB extends AbstractMB implements Serializable {
private static final long serialVersionUID = 1L;
private Dog dog;
private List<Dog> dogs;
private DogFacade dogFacade;
public DogFacade getDogFacade() {
if (dogFacade == null) {
dogFacade = new DogFacade();
}
return dogFacade;
}
public Dog getDog() {
if (dog == null) {
dog = new Dog();
}
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
public void createDog() {
try {
getDogFacade().createDog(dog);
closeDialog();
displayInfoMessageToUser("Created With Sucess");
loadDogs();
resetDog();
} catch (Exception e) {
keepDialogOpen();
displayErrorMessageToUser("Ops, we could not create. Try again later");
e.printStackTrace();
}
}
public void updateDog() {
try {
getDogFacade().updateDog(dog);
closeDialog();
displayInfoMessageToUser("Updated With Sucess");
loadDogs();
resetDog();
} catch (Exception e) {
keepDialogOpen();
displayErrorMessageToUser("Ops, we could not create. Try again later");
e.printStackTrace();
}
}
public void deleteDog() {
try {
getDogFacade().deleteDog(dog);
closeDialog();
displayInfoMessageToUser("Deleted With Sucess");
loadDogs();
resetDog();
} catch (Exception e) {
keepDialogOpen();
displayErrorMessageToUser("Ops, we could not create. Try again later");
e.printStackTrace();
}
}
public List<Dog> getAllDogs() {
if (dogs == null) {
loadDogs();
}
return dogs;
}
private void loadDogs() {
dogs = getDogFacade().listAll();
}
public void resetDog() {
dog = new Dog();
}
}
package com.mb;
import java.io.Serializable;
import javax.faces.bean.*;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import com.model.User;
@SessionScoped
@ManagedBean(name="userMB")
public class UserMB implements Serializable {
public static final String INJECTION_NAME = "#{userMB}";
private static final long serialVersionUID = 1L;
private User user;
public boolean isAdmin() {
return user.isAdmin();
}
public boolean isDefaultUser() {
return user.isUser();
}
public String logOut() {
getRequest().getSession().invalidate();
return "/pages/public/login.xhtml";
}
private HttpServletRequest getRequest() {
return (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
package com.mb;
import java.io.Serializable;
import java.util.*;
import javax.faces.bean.*;
import com.facade.*;
import com.model.*;
import com.sun.faces.context.flash.ELFlash;
@ViewScoped
@ManagedBean
public class PersonMB extends AbstractMB implements Serializable {
private static final long serialVersionUID = 1L;
private static final String SELECTED_PERSON = "selectedPerson";
private Dog dog;
private Person person;
private Person personWithDogs;
private Person personWithDogsForDetail;
private List<Dog> allDogs;
private List<Person> persons;
private DogFacade dogFacade;
private PersonFacade personFacade;
public void createPerson() {
try {
getPersonFacade().createPerson(person);
closeDialog();
displayInfoMessageToUser("Created With Sucess");
loadPersons();
resetPerson();
} catch (Exception e) {
keepDialogOpen();
displayErrorMessageToUser("Ops, we could not create. Try again later");
e.printStackTrace();
}
}
public void updatePerson() {
try {
getPersonFacade().updatePerson(person);
closeDialog();
displayInfoMessageToUser("Updated With Sucess");
loadPersons();
resetPerson();
} catch (Exception e) {
keepDialogOpen();
displayErrorMessageToUser("Ops, we could not create. Try again later");
e.printStackTrace();
}
}
public void deletePerson() {
try {
getPersonFacade().deletePerson(person);
closeDialog();
displayInfoMessageToUser("Deleted With Sucess");
loadPersons();
resetPerson();
} catch (Exception e) {
keepDialogOpen();
displayErrorMessageToUser("Ops, we could not create. Try again later");
e.printStackTrace();
}
}
public void addDogToPerson() {
try {
getPersonFacade().addDogToPerson(dog.getId(), personWithDogs.getId());
closeDialog();
displayInfoMessageToUser("Added With Sucess");
reloadPersonWithDogs();
resetDog();
} catch (Exception e) {
keepDialogOpen();
displayErrorMessageToUser("Ops, we could not create. Try again later");
e.printStackTrace();
}
}
public void removeDogFromPerson() {
try {
getPersonFacade().removeDogFromPerson(dog.getId(), personWithDogs.getId());
closeDialog();
displayInfoMessageToUser("Removed With Sucess");
reloadPersonWithDogs();
resetDog();
} catch (Exception e) {
keepDialogOpen();
displayErrorMessageToUser("Ops, we could not create. Try again later");
e.printStackTrace();
}
}
public Person getPersonWithDogs() {
if (personWithDogs == null) {
if (person == null) {
person = (Person) ELFlash.getFlash().get(SELECTED_PERSON);
}
personWithDogs = getPersonFacade().findPersonWithAllDogs(person.getId());
}
return personWithDogs;
}
public void setPersonWithDogsForDetail(Person person) {
personWithDogsForDetail = getPersonFacade().findPersonWithAllDogs(person.getId());
}
public Person getPersonWithDogsForDetail() {
if (personWithDogsForDetail == null) {
personWithDogsForDetail = new Person();
personWithDogsForDetail.setDogs(new ArrayList<Dog>());
}
return personWithDogsForDetail;
}
public void resetPersonWithDogsForDetail(){
personWithDogsForDetail = new Person();
}
public String editPersonDogs() {
ELFlash.getFlash().put(SELECTED_PERSON, person);
return "/pages/protected/defaultUser/personDogs/personDogs.xhtml";
}
public List<Dog> complete(String name) {
List<Dog> queryResult = new ArrayList<Dog>();
if (allDogs == null) {
dogFacade = new DogFacade();
allDogs = dogFacade.listAll();
}
allDogs.removeAll(personWithDogs.getDogs());
for (Dog dog : allDogs) {
if (dog.getName().toLowerCase().contains(name.toLowerCase())) {
queryResult.add(dog);
}
}
return queryResult;
}
public PersonFacade getPersonFacade() {
if (personFacade == null) {
personFacade = new PersonFacade();
}
return personFacade;
}
public Person getPerson() {
if (person == null) {
person = new Person();
}
return person;
}
public void setPerson(Person person) {
this.person = person;
}
public List<Person> getAllPersons() {
if (persons == null) {
loadPersons();
}
return persons;
}
private void loadPersons() {
persons = getPersonFacade().listAll();
}
public void resetPerson() {
person = new Person();
}
public Dog getDog() {
if (dog == null) {
dog = new Dog();
}
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
public void resetDog() {
dog = new Dog();
}
private void reloadPersonWithDogs() {
personWithDogs = getPersonFacade().findPersonWithAllDogs(person.getId());
}
}
package com.mb;
import javax.faces.bean.*;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import com.facade.UserFacade;
import com.model.User;
@RequestScoped
@ManagedBean
public class LoginMB extends AbstractMB {
@ManagedProperty(value = UserMB.INJECTION_NAME)
private UserMB userMB;
private String email;
private String password;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String login() {
UserFacade userFacade = new UserFacade();
User user = userFacade.isValidLogin(email, password);
if(user != null){
userMB.setUser(user);
FacesContext context = FacesContext.getCurrentInstance();
HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
request.getSession().setAttribute("user", user);
return "/pages/protected/index.xhtml";
}
displayErrorMessageToUser("Check your email/password");
return null;
}
public void setUserMB(UserMB userMB) {
this.userMB = userMB;
}
}
Sobre o código acima:
- Note que o ManagedBean é responsável apenas por determinar o destino do fluxo da chamada do usuário de acordo com o resultado da operação. Não existe regra de negócio nos ManagedBeans. Apesar da facilidade de se colocar qualquer tipo de validação de regra de negócio, não é aconselhável.
- A classe LoginMB utiliza outro ManagedBean que foi injetado que é o UserMB. Para injetar um ManagedBean dentro de outro ManagedBean todos os passos abaixo devem ser tomados:
- Utilizar a anotação @ManagedProperty sobre o ManagedBean a ser injetado.
- Criar o método “public void setUserMB(…)” que até o dia de hoje é obrigatório.
- Certamente a classe PersonMB poderia ser refatorada para diminuir o número de métodos. A classe PersonMB se encontra com esse tamanho por comodidade e para o melhor entendimento de desenvolvedores juniores.
Sobre @ViewScoped
Nas classes que utilizam o escopo @ViewScoped existem métodos do tipo reload e reset. Ambos os métodos são necessários para voltar o estado do objeto ao seu estado original ou aplicar o resultado de alguma ação persistida no banco de dados. Ao criar um objeto novo usando um “dialog”, por exemplo do tipo “dog”, o objeto dog permanecerá com o estado de sua última chamada. Caso você entre no “dialog” de cadastro novamente, os valores que foram preenchidos no primeiro cadastro efetuado continuarão lá. Por isso os métodos reset são necessários.
Caso você realize alguma alteração no banco de dados será necessário atualizar essa informação no objeto que se encontra no ManagedBean. Se você alterou o nome do “dog” no banco de dados, você também deve alterar o objeto da lista dogs. Você pode buscar essa informação do banco de dados, ou apenas alterar na diretamente no ManagedBean.
Apenas fique atento para qual abordagem você for escolher:
- Realizar atualização do objeto pelo banco de dados (métodos reload): caso a valor a ser trazido do banco de dados seja uma lista grande ou um objeto com muitos relacionamentos, essa ação pode causar um problema de desempenho. Uma opção seria utilizar um datatable com LazyLoading. Clique aqui para ver mais sobre o assunto.
- Realizar atualização do objeto diretamente no ManagedBean: imagine um caso onde o usuário1 atualize o dog1 no banco de dados e ao mesmo tempo o usuário2 atualize o dog2. O primeiro usuário continuará vendo informações antigas do dog2 o que pode ser um problema para a integridade do banco de dados caso o usuario1 altere o campo age do dog2. Uma solução seria utilizar um campo contendo um número de versão no objeto. Ao fazer update no DB a aplicação poderia ver se houve alguma alteração na versão e com isso alertar o usuário. Se o usuário1 tentasse alterar o dog2 esse campo de versão estaria diferente no banco de dados.


Hebert, no caso, seu eu nao quiser definir um Converter para cada class, de puder fazer um converter Generico, e definir no AutoComplete, neh?
Mas no meu ex, esta acontecendo o seguinte
GRAVE: java.lang.ClassCastException: MeuEntity cannot be cast to java.lang.String
Tem ideia do que acontece?
Felipe, boa noite.
Parece que o retorno do seu converter está errado (o que recebe String e return um Object). [=
Infelizemente não tenho como analizar códigos agora, coloque no GUJ que se eu não ajudar, alguém o fará.
Até mais. \o_
Pingback: 1389 Ideias para aplicativos Android – GUJ | S60Aplicativos
Cara, muito bom o projeto, e o tutorial!
Parabéns pelo ótimo trabalho!
Abraços!
Fico feliz por ter ajudado.
Olá Hebert, Excelente post!!!
Eu segui todos os passos mas obtive o seguinte erro após passar pela tela de login
javax.faces.el.EvaluationException: java.lang.NoClassDefFoundError: Could not initialize class com.dao.UserDAO
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
at javax.faces.component.UICommand.broadcast(UICommand.java:315)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:787)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1252)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at com.filter.LoginCheckFilter.doFilter(LoginCheckFilter.java:68)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:947)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1009)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.NoClassDefFoundError: Could not initialize class com.dao.UserDAO
at com.facade.UserFacade.(UserFacade.java:7)
at com.mb.LoginMB.login(LoginMB.java:38)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.apache.el.parser.AstValue.invoke(AstValue.java:278)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
… 27 more
Tem idéia di que possa ser?
Desde já muito obrigado pela atenção
———————————–
Consegui resolver. O Problema era no persistence.xml, tinha colocado o nome da base errado. Quem quiser dar uma conferida a aplicação está disponível em:
http://54.232.193.142/JSFCrudApp
Vlw
Fico feliz por você ter conseguido. =D
Olá Hebert!! Teria como manda um link de como criar o projeto desde o início, configurando e etc?
Augusto, boa noite.
Esse post que você comentou mostra isso.
Na última página você encontra o código para download.
Até mais.
Já resolvi o problema, muito obrigado.
Eu que agradeço a visita! =D