SeamFramework.orgCommunity Documentation

Capítulo 2. Aplicação web JSF de exemplo

Vamos ilustrar estas idéias com um exemplo completo. Nós iremos implementar um login/logout de usuário de uma aplicação que utiliza JSF. Primeiro, vamos definir um Web Bean que irá armazenar o nome do usuário (username) e a senha (password) fornecidos durante o login:

@Named @RequestScoped

public class Credentials {
        
    private String username;
    private String password;
    
    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }
    
    public String getPassword() { return password; }
    public void setPassword(String password) { this.password = password; }
    
}

Esse Web Bean é vinculado ao prompt de login do seguinte formulário JSF:

<h:form>

    <h:panelGrid columns="2" rendered="#{!login.loggedIn}">
        <h:outputLabel for="username"
>Username:</h:outputLabel>
        <h:inputText id="username" value="#{credentials.username}"/>
        <h:outputLabel for="password"
>Password:</h:outputLabel>
        <h:inputText id="password" value="#{credentials.password}"/>
    </h:panelGrid>
    <h:commandButton value="Login" action="#{login.login}" rendered="#{!login.loggedIn}"/>
    <h:commandButton value="Logout" acion="#{login.logout}" rendered="#{login.loggedIn}"/>
</h:form
>

O verdadeiro trabalho é realizado por um Web Bean em escopo de sessão que mantém informações sobre o atual usuário conectado e expõe a entidade User para outros Web Beans:

@SessionScoped @Named

public class Login {
    @Current Credentials credentials;
    @PersistenceContext EntityManager userDatabase;
    private User user;
    
    public void login() {
            
        List<User
> results = userDatabase.createQuery(
           "select u from User u where u.username=:username and u.password=:password")
           .setParameter("username", credentials.getUsername())
           .setParameter("password", credentials.getPassword())
           .getResultList();
        
        if ( !results.isEmpty() ) {
           user = results.get(0);
        }
        
    }
    
    public void logout() {
        user = null;
    }
    
    public boolean isLoggedIn() {
       return user!=null;
    }
    
    @Produces @LoggedIn User getCurrentUser() {
        return user;
    }
}

Certamente, @LoggedIn é uma anotação de binding (binding annotation):

@Retention(RUNTIME)

@Target({TYPE, METHOD, FIELD})
@BindingType
public @interface LoggedIn {}

Agora, qualquer outro Web Bean pode facilmente injetar o usuário atual:

public class DocumentEditor {


    @Current Document document;
    @LoggedIn User currentUser;
    @PersistenceContext EntityManager docDatabase;
    
    public void save() {
        document.setCreatedBy(currentUser);
        docDatabase.persist(document);
    }
    
}

Esperamos que esse exemplo pôde dar um gostinho do modelo de programação com Web Beans. No capítulo seguinte, iremos explorar a injeção de dependência da Web Beans em profundidade.