req, ServletResponse res) throws IOException, ServletException { //Do core processing here }}No servlet controlador, nos delegamos a um metodo chamado processRequest para lidar com as solicitacoes de entrada, como mostrado no Exemplo 6.3.Exemplo 6.3 o tratamento dos pedidospublic void processRequest(ServletRequest req, ServletResponse res) throws IOException, ServletException { Processor processors = new DebuggingFilter( new AuthenticationFilter(new CoreProcessor())); processors.execute(req, res); //Then dispatch to next resource, which is probably // the View to display dispatcher.dispatch(req, res);}Para fins de exemplo apenas, imagine que cada componente de processamento escreve na saida padrao quando ele e executado. Exemplo 7.4 mostra a saida de execucao possivel.Exemplo 6.4 Mensagens escrito na saida padraoDepuracao de pre-processamento filtro concluida ...Autenticacao de processamento do filtro concluida ...processamento Core concluida ...Depuracao filtro de pos-processamento foi concluido ...Uma cadeia de processadores e executado em ordem. Cada processador, exceto para o ultimo na cadeia, e considerado um filtro. O componente final do processador e onde nos encapsular o processamento central que queremos preencher, para cada pedido. Dado este projeto, vamos ter de alterar o codigo na classe CoreProfessor, bem como em quaisquer classes de filtro, quando queremos modificar a forma como lidamos com as solicitacoes. Figura 6.3 e um diagrama de sequencia que descreve o fluxo de controle quando, utilizando o codigo do filtro do Exemplo 6.1, Exemplo 6.2 e Exemplo 6.3.Observe que quando usamos uma aplicacao decorador, cada filtro chama na proxima filtro diretamente, embora utilizando uma interface generica. Alternativamente, esta estrategia pode ser implementada usando um FilterManager e FilterChain. Neste caso, esses dois componentes coordenar e gerenciar o processamento do filtro e os filtros individuais nao se comunicam uns com os outros diretamente. Este projeto se aproxima de uma aplicacao servlet 2.3-compativel, embora ainda seja uma estrategia personalizada. Exemplo 6.5 e o anuncio de um tal FilterManager uma classe que cria um FilterChain, que e mostrado no Exemplo 6.6. O FilterChain adiciona filtros para a cadeia na ordem apropriada (para efeitos de concisao, isso e feito no construtor FilterChain, mas seria feito normalmente no lugar do comentario), os processos dos filtros e, finalmente, processa o recurso de destino. Figura 6.4 e um diagrama de sequencia para esse codigo.Exemplo 6.5 FilterManager Estrategia Filtro personalizadopublic class FilterManager { public void processFilter(Filter target, javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException { FilterChain filterChain = new FilterChain(); // The filter manager builds the filter chain here // if necessary // Pipe request through Filter Chain filterChain.processFilter(request, response); //process target resource target.execute(request, response); }}FilterChain Exemplo 6.6 - Estrategia Filtro personalizadopublic class FilterChain { // filter chain private Vector myFilters = new Vector(); // Creates new FilterChain public FilterChain() { // plug-in default filter services for example // only. This would typically be done in the // FilterManager, but is done here for example // purposes addFilter(new DebugFilter()); addFilter(new LoginFilter()); addFilter(new AuditFilter()); } public void processFilter( javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException { Filter filter; // apply filters Iterator filters = myFilters.iterator(); while (filters.hasNext()) { filter = (Filter)filters.next(); // pass request & response through various // filters filter.execute(request, response); } } public void addFilter(Filter filter) { myFilters.add(filter); }}Esta estrategia nao