Dúvida: Servlets + BO + DAO

Pessoal,

Estou desenvolvendo uma aplicação web utilizando este fluxo: JSP -> Servlet -> BO -> DAO.

A minha dúvida é a seguinte:
O meu método execute do servlet recebe como um dos parâmetros um objeto HttpServletRequest request. Este objeto request tem todas as informações da requisição do usuário. Gostaria de saber se eu monto o objeto (por exemplo, montagem de um objeto usuário, o qual terá as informações no objeto request) na servlet ou delego a montagem do objeto para a camada de negócio. Se for para a camada de negócio, eu teria que passar como parâmetro o objeto request (acho que não seria uma boa prática). Queria que o servlet apenas fizesse a função de redirecionamento.

Me dê uma idéia de como eu posso fazer isso, de modo que siga as boas práticas deste modelo.

agradeço a atenção de todos.

Creio que você deve montar seu objeto na camada de negócios. Caso deixe este código no servlet, se um dia você mudar sua camada de apresentação inteira, terá que reescrever a montagem do objeto.
Crie uma camada de aplicação entre as camadas de apresentação e negócios, que nada mais é do que um conjunto de Façades.

Muito simploriamente, seria algo assim:

[code]// Esta classe pertence à camada de aplicação
public class UsuarioService {
// A classe Usuario possui validação dos parâmetros. Caso estes sejam inválidos, uma UsuarioInvalidoException é lançada.
public void novoUsuario(String nome) throws UsuarioInvalidoException {
Usuario usuario = new Usuario(nome);
usuarioDao.save(usuario);
}
}

public class ServletUsuario extends HttpServlet {
public void doPost bla bla bla… {
// Obtenha os parâmetros da requisição

    try {
            UsuarioService service = new UsuarioService();
            service.novoUsuario(nome);

            // Aqui você dá um forward para a página que indica se o usuário foi cadastrado com sucesso.
    } catch (Exception e) {
            // Aqui você dá um redirect para a página de erro.
    }
}

}[/code]

Abraços

Certo, em seu código só tem um atributo do usuário, chamado nome. E se tivesse 10 atributos? eu passaria os 10 atributos para o método novoUsuario() ? Acho que isso perde o encapsulamento.

Esta eh justamente minha dúvida. Será que eu posso passar todo o objeto request para a camada de negócio e, lá na camada, eu extraio os valores e monto o objeto?

abraços.

[quote=jose_neto]Certo, em seu código só tem um atributo do usuário, chamado nome. E se tivesse 10 atributos? eu passaria os 10 atributos para o método novoUsuario() ? Acho que isso perde o encapsulamento.

Esta eh justamente minha dúvida. Será que eu posso passar todo o objeto request para a camada de negócio e, lá na camada, eu extraio os valores e monto o objeto?

abraços.[/quote]

Na minha visão, dessa forma, você quebra a arquitetura. Acho que a sua camada de negócios não deve nem sentir o cheiro de um objeto HttpServletRequest. Isso faz parte do Controller.

Outra coisa. Tente evitar BOs e VOs. Você pode acabar criando um modelo anêmico.

Ainda não entendo completamente esses conceitos, mas estou correndo atrás para aprender.

Abraços

[quote=jose_neto]Certo, em seu código só tem um atributo do usuário, chamado nome. E se tivesse 10 atributos? eu passaria os 10 atributos para o método novoUsuario() ? Acho que isso perde o encapsulamento.

Esta eh justamente minha dúvida. Será que eu posso passar todo o objeto request para a camada de negócio e, lá na camada, eu extraio os valores e monto o objeto?

abraços.[/quote]
Nesse caso, você poderia passar um Map como parâmetro, contendo os argumentos mapeados com seus nomes. Mas não passe um HttpRequest, senão você aumenta o acoplamento.

Outra alternativa seria montar uma DSL interna para criação de usuários.

[quote=jose_neto]Pessoal,

Estou desenvolvendo uma aplicação web utilizando este fluxo: JSP -> Servlet -> BO -> DAO.

A minha dúvida é a seguinte:
O meu método execute do servlet recebe como um dos parâmetros um objeto HttpServletRequest request. Este objeto request tem todas as informações da requisição do usuário. Gostaria de saber se eu monto o objeto (por exemplo, montagem de um objeto usuário, o qual terá as informações no objeto request) na servlet ou delego a montagem do objeto para a camada de negócio. Se for para a camada de negócio, eu teria que passar como parâmetro o objeto request (acho que não seria uma boa prática). Queria que o servlet apenas fizesse a função de redirecionamento.

Me dê uma idéia de como eu posso fazer isso, de modo que siga as boas práticas deste modelo.
[/quote]

A boa prática é: camadas inferirores não conhecem objetos das camadas superiores.
Portanto vc cria o objeto de negocio no próprio servlet e preenche com os dados do request e depois passa ao BO.
Não faz sentido o BO criar o objeto a partir do request porque isso significa que ele teria responsabilidade na camada de apresentação o que é contrário ao objetivo do BO.
Para facilitar o processo de criar o objeto vc pode usar o padrão Bean e criar um objeto que preencha o bean via reflection.
Mesmo sem refelction ou Bean vc deve criar um objeto cuja unica responsabilidade é criar o objeto de negocio a partir do request ( estes objetos são normalmente chamados de Assemblers mas o padrão que seguem é na realidade o Builder)

Não viole o encapsulamento das suas camadas. Nunca! ou vai-se dar mal.