O DAO persiste objetos em algum lugar, arquivos CSV, tabelas relacionais… onde quer que seja. Sua responsabilidade seria converter objetos para o registros (ou seja lá como eles ficam na sua persistência) e trazê-los de volta.
O DTO é usado para diminuir transações muito pequenas, quando você precisa enviar pela rede um objeto muito pequeno cujo custo de transporte é maior que o benefício que aquele objeto traz. Aí você faz uma gambiarra juntando esse objetinho com outras coisinhas que você precisa transmitir na rede naquele momento num objetão e manda. Isso é um problema de coesão enorme, coesão concidental, creio (o pior tipo!), mas tudo bem, ‘funciona’… 
Boa
“Rafael Nunes”:
Aqui estamos usando session bean, mas não acho tanto sofrimento, pois para cada ‘processo’ criamos um session bean, na minha opinião o único empecilho nisso é a porrada de métodos que se implementa em cada um, ficando completamente confusa a classe.
Quanto ao Spring eu não conheço, mas eu estava cogitando o uso do Struts no controller. Vou dar uma olhada no Spring também.
Um Session Bean por ‘operação’ é o fim da picada, eu tenho um sistema com 220 session beans do tipo AddSubscriberBean, DeleteSubscriberBean… estude arquitetura de componentes, se puder comrpe o livro do Cheesman (é baratinho, pelo menos pra um livro improtado, e tem em qualquer livraria mcdonald’s) e siga a metodologia que ele propõe (pessoal do Rio, sugiro curso do CCE/PUC com Prof. Rodrigues).
O Spring é porreta, mesmo se não for usar agora, leia sobre ele.
[]s