Pessoal, estou dando meus primeiros passos com o desenvolvimento web em Java. Estou utilizando o SpringMVC, tenho algumas dúvidas e gostaria de saber se estou no caminho correto. vamos considerar a seguinte situação:
Interface ClienteDAO
package br.com.xxx.sistema.dao;
import java.util.List;
import br.com.xxx.sistema.model.Cliente;
public interface ClienteDao {
public Cliente findById(Integer id);
public List findAll();
}
ClienteDaoHibernate: Implementação da interface
package br.com.xxx.sistema.dao.hibernate;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import br.com.xxx.sistema.dao.ClienteDao;
import br.com.xxx.sistema.model.Cliente;
public class ClienteDaoHibernate extends HibernateDaoSupport implements ClienteDao {
public Cliente findById(Integer id) {
return null;
}
public List findAll() throws DataAccessException {
Session session = getSession(true);
try{
List result = session.createQuery("from Cliente").list();
if(result == null){
throw new RuntimeException("ResultSet inválido.") {};
}
return result;
} catch ( HibernateException ex){
throw convertHibernateAccessException(ex);
}
}
}
Controller
package br.com.xxx.sistema.web.controllers.spring;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import br.com.xxx.sistema.dao.ClienteDao;
public class ListClientesController implements Controller {
private ClienteDao clienteDao;
public void setClienteDao(ClienteDao clienteDao){
this.clienteDao = clienteDao;
}
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
Map model = new HashMap();
model.put("listaClientes",clienteDao.findAll());
return new ModelAndView("listarClientes",model);
}
}
applicationContext.xml
[...]
<bean id="ClienteDAO" class="br.com.xxx.sistema.dao.hibernate.ClienteDaoHibernate">
<property name="sessionFactory" ref="mySessionFactory"/>
</bean>
[...]
action-servlet.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<bean id="defaultHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<bean name="/index.html" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
<property name="viewName" value="index" />
</bean>
<bean name="ListClientesController" class="br.com.xxx.sistema.web.controllers.spring.ListClientesController">
<property name="clienteDao" ref="ClienteDAO" />
</bean>
<bean name="EditClienteController" class="br.com.xxx.sistema.web.controllers.spring.EditClienteController">
</bean>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<value>
/content/clientes/list.html=ListClientesController
/content/clientes/edit.html=EditClienteController
</value>
</property>
</bean>
</beans>
Funcionando está, mas gostaria de saber:
Está correto?
O que pode ser melhorado?
Já li várias vezes que o controller tendo acesso direto ao DAO não está correto, no meu caso, como eu poderia fazer com que o controller nao tenha acesso direto ao ClienteDao?
Obrigado pessoal.
PS.: Estava no forum desenvolvimento web, peço a um moderador que encerre aquele tópico, pois lá não obtive respostas.