18. @ Resource public class ProcessoController { private ProcessoDAO dao; private Result result; public ProcessoController(ProcessoDAO dao, Result result) { this.dao = dao; this.result = result; } @ Get @ Path (" /processo/index ") public List<Processo> index() { return dao.buscarTodos(); } }
19. @ Post @ Path (" /processo ") public void cadastro(Processo processo) { dao.salvar(processo); result.use(Results. json() ). from (processo) . serialize (); } @ Get @ Path (" /processo/{processo.id} ") public void buscar(Processo processo) { processo = dao.buscar(processo.getId()); if (processo != null) { result.use(Results. xml() ). from (processo) . serialize (); } else { result.use( Status .class). notFound (); } }
20. MockResult result = new MockResult(); ClienteController controller = new ClienteController(..., result); controller. list (); List<Client> clients = result. included ("clients"); //cast automático Assert.assertNotNull(clients);
21. /articles/archive? date =08/01/08& page =2 public static void archive(Date date , Integer page ){ List<Article> articles = Articles.fromArchive( date , page ); render(articles); } public static void show (Long id) { Article article = Article.findById(id); render(article); } public static void edit (Long id, String title) { Article article = Article.findById(id); article.title = title; article.save(); show (id); // redirect to show }
22. // Templates Article article = Article.findById(id); User user = User.getConnected(); render( article , user ); // JPA public void messages(int page) { User connectedUser = User.find("byEmail", connected()); List<Message> messages = Message. find ( "user = ? and read = false order by date desc", connectedUser). from (page * 10). fetch (10); render (connectedUser, messages); }
- CGIs invocavam aplicações dentro da máquina, passando valores através de variáveis de ambiente - Servlets inovaram ao passar a usar threads p/ request em vez de criar novos processos
DRY CoC Frameworks de persistência integrados REST Linguagens de tipagem dinâmica Foco no código
- Web server embutido - Scaffold - Gerador de CRUD c/ Ajax - CoC - É a opção com mais sucesso comercial - Forte comunidade no Brasil e no mundo - Excelentes ferramentas para TDD/BDD - Tem feito excelente uso da plataforma Java, reduzindo drasticamente as questões de escalabilidade
- Semelhante a RoR em muitos aspectos. - Framework for perfectionists with deadlines - Criado para atender com qualidade aos prazos curtos de um ambiente editorial muito dinâmico - Geração de um Admin de conteúdo muito poderoso, que poupa muito tempo de desenvolvimento - Framework Python - Enorme comunidade, muito ativa
- Mto semelhante a RoR, mas ideal para devs que vieram de Java e querem aproveitar skills - Feito em Groovy, sobre Spring, Hibernate e Sitemesh. - Oferece os enormes benefícios de Spring/Hibernate de forma bem menos complexa, mas sem tirar o poder. - É a opção de mais fácil integração com Java - Gera WAR padrão Java - Comunidade bem menor do que Django e Rails - Será que tem futuro dentro da VMWare?
Threads em vez de processos Enorme evolução da JVM NIO: IO não bloqueante C10k Comets
Attribute-oriented programming Annotations + generics CoC IoC POJOs x Herança + Interfaces ↑ Código ↓ Ferramentas
Testes fora do container IoC TDD, BDD Containers cada vez mais leves Testes de controllers do VRaptor
CB são adequados p/ aplicações RIA, não sites AB cada vez mais RESTFul Stateless x Stateful Nível diferente de controle de JS O futuro é RESTFul!
- Linguagem com características OO e funcionais - Vista como sucessora natural de Java, embora provavelmente não vejamos uma opção com a adoção de Java - Estaticamente tipada - 2 a 3x menos código comparando com Java - Lift roda em qualquer servlet container 2.4+ Java. Podemos usar qualquer lib Java. - Comets, XML, JSON, JPA