Sie sind auf Seite 1von 9

Artculo Inicio Artculo Lenguajes orientados a objeto Java J2EE 6 votar! Catlogo de Patrones de Diseo J2EE. I.

- Capa de Presentacin Service to Worker Contexto Problema Causas Solucin Estructura Participantes y Responsabilidades Estrategias Consecuencias Cdigo de Ejemplo Patrones Relacionados Service to Worker . Contexto El sistema controla el flujo de ejecucin y accede a los datos de negocio, desde l os que crea el contenido de la presentacin. Nota: El patrn Service to Worker, igual que el patrn Dispatcher View, describe una combi nacin comn de otros patrones del catlogo. Estos dos macro-patrones describen las co mbinacin de un controlador y un dispatcher con vistas y helpers. Aunque describen esta estructura comn, cada uno enfatiza un uso diferentes de los patrones. . Problema El problema es una combinacin de los problemas resueltos por los patrones Front C ontroller y View Helper de la capa de presentacin. No hay un componente centraliz ado para manejar el control de acceso, la recuperacin de contenido, o el manejo d e la vista, y hay cdigo de control duplicado esparcido por varias vistas. Adems, l a lgica de negocio y la de formateo de la presentacin estn mezcladas en esas vistas , haciendo que el sistema sea menos flexible, menos reutilizables y generalmente menos resistente a los cambios. Mezclar lgica de negocio con el procesamiento de la vista tambin reduce la modular idad y proporciona una pobre separacin de roles entre los equipos de produccin Web y de desarrollo de software. . Causas Los chequeos de autentificacin y autorizacin se completan en cada peticin. El cdigo scriptlet dentro de las vistas se debera minimizar. La lgica de negocio se debera encapsular en componentes distintos a la vista. El control de flujo es relativamente complejo y se basa en valores del conte nido dinmico. La lgica de control de la vista es relativamente sofisticada, con varias vist as que potencialmente se mapean a la misma peticin. . Solucin Combinar un controlador y un dispacher con vistas y helper (ver Front Controller y View Helper) para manejar peticiones de clientes y preparar una presentacin di nmica como respuesta. Los controladores delegan la recuperacin de contenido en los helpers, que manejan el relleno del modelo intermedio para la vista. Un dispatc her es el responsable del control de la vista y la navegacin y puede encapsularse

dentro de un controlador o de un componente separado. Service to Worker describe la combinacin de los patrones Front Controller y View Helper con un componente dispatcher. Aunque este patrn y Dispatcher View describen una estructura similar, ambos sugie ren diferentes divisiones de la labor entre los componentes. En Service to Worke r, el controlador y el dispatcher tienen ms responsabilidades. Aunque los patrones Service to Worker y Dispatcher View representan una combinac in de otros patrones del catlogo, el primero garantiza con su nombre una comunicac in eficiente entre los desarrolladores. Mientras que el segundo sugiere una recup eracin de contenido relegada al momento de procesamiento de la vista. En el patrn Dispatcher View, el dispatcher normalmente juega un rol moderado en e l control de la vista. En el patrn Service to Worker, el dispatcher juega un rol algo ms elevado en el control de la vista. Un rol limitado para el dispatcher ocurre cuando no se utiliza recursos exterior es para poder elegir la vista. La informacin encapsulada en la peticin es suficien te para determinar la vista a la que despachar la peticin. Por ejemplo: http://some.server.com/servlet/Controller?next=login.jsp La nica responsabilidad del componente dispatcher en este caso es reenviar a la v ista login.jsp. Un ejemplo del dispatcher jugando un rol moderado es el caso donde el cliente en va una peticin directamente al controlador con un parmetro de consulta que describe una accin a realizar: http://some.server.com/servlet/Controller?action=login Aqu la responsabilidad del dispatcher es traducir el nombre lgico login en el nomb re del recurso de una vista apropiada, como login.jsp, y reenviar a esa vista. P ara conseguir esta traduccin, el dispatcher podra acceder a recursos como un fiche ro de configuracin XML que especifica las vistas apropiadas a mostrar. Por otro lado, en el patrn Service to Worker, el dispatcher podra invocar servicio s de negocio para determinar la vista apropiada que se debe mostrar. La estructrua compartida de Service to Worker y Dispatcher View consiste en un c ontrolador trabajanado con un dispatcher, vistas y helpers. . Estructura En la siguiente figura podemos ver el diagrama de clases que representa al patrn Service to Worker. . Participantes y Responsabilidades La siguiente figura muestra el diagrama de secuencia que representa al patrn Serv ice to Worker. Como hemos comentado, Service to Worker y Dispatcher View representan una estruc tura similar. La principal diferencia es que Service to Worker describe arquitec turas con un comportamiento ms up front (ms cercano) al controlador y al dispatche r, mientras que Dispatcher View describe arquitecturas donde se ha movido ms comp ortamiento al momento del procesamiento de la vista. As, los patrones sugieren un a continuidad, donde el comportamiento se ha encapsulado ms cerca de la vista o s e ha movido haca atrs en el flujo de proceso. . Controller

El controlador normalmente es el punto de contacto inicial para manejar una peti cin. Funciona con un dispatcher para completar el control de la vista y la navega cin. El controlador maneja la autentificacin, la autorizacin, la recuperacin de cont enido, la validacin y otros aspectos del manejo de la peticin. Delega en los helpe rs para completar partes de este trabajo. . Dispatcher Un dispatcher es el responsable del control de la vista y la navegacin, controlan do la eleccin de la siguiente vista a mostrar y proporciona el mecanismo para dir igir el control a este recurso. Un dispatcher se puede encapsular dentro de un controlador (ver Front Controller ) o puede ser un componente independiente que trabaja en coordinacin con el contr olador. El dispatcher puede proporcionar reenvo esttico a la vista o podra proporci onar un mecanismo de reenvo dinmico ms sofisticado. El dispatcher utiliza el objeto RequestDispatcher (soportado en la especificacin Servlet), pero tambin encapsula alguna informacin de procesamiento adicional. Cuan tas ms responsabilidades encapsule este componente, ms se acercar al ideal del patrn Service to Worker. Y al controlario, cuando el diapatcher juega un papel ms limi tado, ms se acercar al ideal del patrn Dispatcher View. . View Una Vista representa una presentacin de informacin al cliente. La informacin utiliz ada en esta presentacin se recupera de un modelo. Los helpers soportan vistas enc apsulando y adaptando un modelo para utilizarlo en una presentacin. . Helper Un helper es el responsable de ayudar a la vista o al controlador a completar su procesamiento. As, los helpers tienen numerosas responsabilidades, incluyendo la obtencin de los datos requeridos por la vista y almacenndolos en el modelo interm edio, en cuyo caso el helper es conocido como un value bean. Adems, los helpers p odran adaptar este modelo de datos para que los utilice la vista. Los helpers pue den servir peticiones de datos desde la vista simplemente proporcionando acceso a los datos en bruto o formatendolos como contenido Web. Una vista podra trabajar con cualquier nmero de helpers, que normalmente estn imple mentados por componentes JavaBeans (JSP 1.0+) o componentes de etiquetas persona lidas (JSP 1.1+). Adems, un helper podra representar un objeto Command o delegate. . ValueBean Un value bean es otro nombre para un helper que es responsable de contener el es tado del modelo intermedio para que lo utilice una vista. . BusinessService Servicio de Negocio es un rol que cumple el servicio al que el cliente quiere ac ceder. Normalmente, se accede al servicio de negocio mediante un Business delega te. El rol del business delegate es proporcionar control y proteccin para el serv icio de negocio (puedes ver el patrn "Business Delegate" ms adelante). . Estrategias . Servlet Front Ver la estrategia "Servlet Front" en el patrn Front Controller. . JSP Front Ver la estrategia "JSP Front" en el patrn Front Controller. . JSP page View

Ver la estrategia "JSP page View" en el patrn View Helper. . Servlet View Ver la estrategia "Servlet View" en el patrn View Helper. . JavaBean Helper Ver la estrategia "JavaBean Helper" en el patrn View Helper. . Custom Tag Helper Ver la estrategia "Custom Tag Helper" en el patrn View Helper. . Dispatcher in Controller Ver la estrategia "Dispatcher in Controller" en el patrn Front Controller. Como hemos visto, los patrones Service to Worker y Dispatcher View sugieren una continuidad, donde el comportamiento se ha encapsulado ms cerca de la vista o se ha movido haca atrs en el flujo de proceso. La siguiente figura describe un escena rio en el que se ha cargado al controlador con mucho trabajo, pero la funcionali dad del dispatcher es mnima. . Transformer Helper Ver la estrategia "Transformer Helper" en el patrn View Helper. . Consecuencias Centraliza el Control y Mejora la Modularidad y la Reutilizacin Este patrn sugiere proporcionar un lugar central para manejar los servicios d el sistema y la lgica de negocio entre varias peticiones. El contolador maneja el procesamiento de la lgica de negocio y el manejo de peticiones. Hay que tener en cuenta, que como control centralizado, es posible introducir un slo unto de fall o. El patrn tambin promueve el particionamiento de la aplicacin y aconseja la reut ilizacin. El cdigo comn se mueve dentro de un controlador y es reutilizado por las peticiones y movido dentro de componentes helpers, en los que delegan los contro ladores y las vistas. La mejora de modularidad y de reutilizacin significa menos duplicacin de cdigo, que normalmente significa en entorno ms libre de bugs. Mejora el Particionamiento de la Aplicacin La utilizacin de helpers resulta en una separacin clara entre la vista y el pr ocesamiento de negocio en una aplicacin. Los helpers, en la forma de JavaBeans (J SP 1.0+) o etiquetas personalizadas (JSP 1.1+), proporcionan un lugar donde cons truir la lgica de negocio fuera de la pgina JSP. Si la lgica de negocio se deja den tro de la pgina JSP, los grandes proyectos resultan embrollados. Mejora la Separacin de Roles Al separar la lgica de formateo de la lgica de negocio de la aplicacin tambin se reducen las dependencias de los mismos recursos entre individuos que cumplen di ferentes roles. Sin esta separacin, por ejemplo, un desarrollador de sofware pose era cdigo que est embebido dentro de marcas HTML, mientras que un miembro del equip o de produccin Web necesitara modificar la distribucin de una pgina y disear componen tes que estn mezclados con lgica de negocio. Como ningn individuo que cumple estos roles est familiarizado con las implementaciones especficas del trabajo del otro i ndividuo, se puede llegar a un punto de confusin en que las modificaciones accide ntales introduzcan errores el sistema. . Cdigo de Ejemplo Los siguientes fragmentos de cdigos muestran una implementacin del patrn Service to Worker, utilizando un servlet controlador, un helper command, un componente dis patcher y una vista. La implementacin incluye las estrategias Servlet Front, Comm and and Controller, JSP View y JavaBean Helper. Tambin se utiliza una vista compu

esta muy bsica, como se puede ver en la siguiente imagen: El siguiente ejemplo muestra el controlador servlet, que delega en un objeto Com mand para completar el procesamiento del control. El objeto Command se recupera mediante una llamada a la factora, que devuelve un Command de tipo genrico, como v eremos ms adelante. El ejemplo utiliza un LogManager para guardar mensajes. public class Controller extends HttpServlet { /** Processes requests for both HTTP * <code>GET</code> and <code>POST</code> methods. * @param request servlet request * @param response servlet response */ protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { String next; try { // Log pattern info LogManager.recordStrategy(request, "Service To Worker", " ServletFront Strategy;" + " JSPView Strategy; JavaBean helper Strategy"); LogManager.logMessage(request, getSignature(), "Process incoming request. "); // Use a helper object to gather parameter // specific information. RequestHelper helper = new RequestHelper(request, response); LogManager.logMessage(request, getSignature(), "Getting command object helper"); // Get command object helper Command command = helper.getCommand(); // delegate processing to the command object, // passing request and response objects along next = command.execute(helper); /** * * * * * * * If the above command returns a value, we will dispatch from the controller. In this example, though, the command will use a separate dispatcher component to choose a view and dispatch to that view. The command object delegates to this dispatcher component in its execute method, above, and control should not return to this point **/

} catch (Exception e) { LogManager.logMessage( "EmployeeController(CommandStrategy)", e.getMessage() ); /** ApplicationResources provides a simple API * for retrieving constants and other * preconfigured values**/ next = ApplicationResources.getInstance().

getErrorPage(e); } dispatch(request, response, next); } /** Handles the HTTP <code>GET</code> method. * @param request servlet request * @param response servlet response */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { processRequest(request, response); } /** Handles the HTTP <code>POST</code> method. * @param request servlet request * @param response servlet response */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { processRequest(request, response); } /** Returns a short description of the servlet. */ public String getServletInfo() { return getSignature(); } /** dispatcher method */ protected void dispatch(HttpServletRequest request, HttpServletResponse response, String page) throws javax.servlet.ServletException, java.io.IOException { RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(page); dispatcher.forward(request, response); } public void init(ServletConfig config) throws ServletException { super.init(config); } public void destroy() { } private String getSignature() { return "ServiceToWorker-Controller"; } } En el siguiente fragmento tenemos el interface Command: public interface Command {

public String execute(RequestHelper helper) throws javax.servlet.ServletException, java.io.IOException; } Todo objeto command implementa este interface genrico, que es un ejemplo del patrn Command de GoF. El objeto command es un ejemplar de la clase ViewAccountDetails , que podemos ver abajo. El ejemplar de command delega en un AccountingAdapter p ara hacer una llamada a la capa de negocio mediante Business Delegate. public class ViewAccountDetailsCommand implements Command { public ViewAccountDetailsCommand() { } // view account details operation public String execute(RequestHelper helper) throws javax.servlet.ServletException, java.io.IOException { /** This will tell the user that a system error * has occured and will typically not be seen. It * should be stored in a resource file **/ String systemerror = "/jspdefaultprocessingerror.jsp"; LogManager.logMessage(helper.getRequest(), "ViewAccountDetailsCommand", "Get Account Details from an adapter object"); /** Use an adapter to retrieve data from business * service, and store it in a request attribute. * Note: Object creation could be avoided via * factory, but for example purposes object * instantiation is shown **/ AccountingAdapter adapter = new AccountingAdapter(); adapter.setAccountInfo(helper); LogManager.logMessage(helper.getRequest(), "ViewAccountDetailsCommand", "processing complete"); /** Note: Object creation could be avoided via * factory, but for example purposes object * instantiation is shown**/ Dispatcher dispatcher = new Dispatcher(); dispatcher.dispatch(helper); /** This return string will not be sent in a * normal execution of this scenario, because * control is forwarded to another resource * before reaching this point. Some commands do * return a String, though, so the return value * is included for correctness. **/ return systemerror; } } La clase adaptador, mostrada en el siguiente ejemplo, utiliza una componente dis patcher independiente para determinar la siguiente vista a la que se debera reenv iar el control y para reenviar realmente el control a esa vista.

public class AccountingAdapter { public void setAccountInfo( RequestHelper requestHelper) { LogManager.logMessage( requestHelper.getRequest(), "Retrieving data from business tier"); // retrieve data from business tier via // delegate. Omit try/catch block for brevity. AccountDelegate delegate = new AccountDelegate(); AccountTO account = delegate.getAccount( requestHelper.getCustomerId(), requestHelper.getAccountKey()); LogManager.logMessage( requestHelper.getRequest(), "Store account Transfer Object in request attribute"); // transport data using request object requestHelper.getRequest().setAttribute( "account", account); } } La invocacin del servicio de negocio mediante el delegado tiene que ver con un ob jeto Account Transfer, que el adaptador almacena en un atributo de la peticin par a utilizarlo en la vista. El siguiente ejemplo muestra accountdetails.jsp, la pgi na JSP que despachar la peticin. El objeto Transfer Object se importa mediante la etiqueta estndar <jsp:useBean> y se accede a sus propiedades utilizando la etique ta estndar <jsp:getProperty>. La vista tambin utiliza una estrategia Composite muy simple, haciendo la inclusin de la subvista trace.jsp durante la traduccin, est su bvista es la responsable de guardar informacin de la presentacin slo para propsitos de ejemplo. <html> <head><title>AccountDetails</title></head> <body> <jsp:useBean id="account" scope="request" class="corepatterns.util.AccountTO" /> <h2><center> Account Detail for <jsp:getProperty name="account" property="owner" /> </h2> <br><br> <table border=3> <tr> <td> Account Number : </td> <td> <jsp:getProperty name "account" property="number" /> </td> </tr> <tr> <td>

Account Type: </td> <td> <jsp:getProperty name="account" property="type" /> </td> </tr> <tr> <td> Account Balance: </td> <td> <jsp:getProperty name="account" property="balance" /> </td> </tr> <tr> <td> OverDraft Limit: </td> <td> <jsp:getProperty name="account" property="overdraftLimit" /> </td> </tr> </table> <br> <br> </center> <%@ include file="/jsp/trace.jsp" %> </body> </html> . Patrones Relacionados Front Controller y View Helper El patrn Service to Worker es el resultado de combinar el patrn View Helper co n un dispatcher, en coordinacin con el patrn Front Controller. Dispatcher View El patrn Dispatcher View es otro nombre para la combinacin del patrn Front Cont roller con un dispatcher, y el patrn View Helper. Los patrones Service to Worker y Dispatcher View son idnticos con respecto a los componentes implicados, pero so n diferentes en la divisin de labores entre esos componentes. El patrn Dispatcher View siguiere relegar la recuperacin de contenido al momento en que se procesa la vista. Adems, el dispatcher juega un rol ms limitado en el control de la vista, y a que la eleccin de le vista normalmente ya est incluida en la peticin.

Das könnte Ihnen auch gefallen