Академический Документы
Профессиональный Документы
Культура Документы
Inicio
Artculo
18
votar!
Java
J2EE
Front Controller
Contexto
Problema
Causas
Solucin
Estructura
Participantes y Responsabilidades
Estrategias
Consecuencias
Patrones Relacionados
Front Controller
Contexto
El mecanismo de manejo de peticiones de la capa de presentacin debe controlar y coordinar el
procesamiento de todos los usuarios a travs de varias peticiones. Dichos mecanismos de control
se pueden manejar de una forma centralizada o descentralizada.
Problema
El sistema requiere un punto de acceso centralizado para que el manejo de peticiones de la capa
de presentacin soporte la integracin de los servicios del sistema, recuperacin de contenidos,
control de vistas, y navegacin. Cuando el usuario accede a la vista directamente sin pasar un
mecanismo centralizado, podran ocurrir dos problemas:
Se requiere que cada vista proporcione sus propios servicios del sistema, lo que
normalmente resulta en duplicacin de cdigo.
La vista de navegacin se deja a los visores. Esto podra resultar en una mezcla de
contenidos y navegacin.
Adems, el control distribuido es ms difcil de mantener, ya que los cambios se tienen que
realizar en numerosos lugares.
Causas
El procesamiento de servicios del sistema comunes se completa por cada peticin. Por
ejemplo, el servicio de seguridad completa los chequeos de autentificacin y autorizacin.
La lgica se maneja mejor en una localizacin central en lugar de estar replicada dentro
de varias vistas.
Existen puntos de decisin con respecto a la recuperacin y manipulacin de los datos.
Se utilizan varias vistas para responder a peticiones de negocio similares.
Puede ser muy til un punto de contacto centralizado para manejar una peticin, por
ejemplo, para controlar y grabar el camino de un usuario por la site.
Los servicios del sistema y la lgica de control de vistas son relativamente sofisticados.
Solucin
Usar un controlador como el punto inicial de contacto para manejar las peticiones. El
controlador maneja el control de peticiones, incluyendo la invocacin de los servicios
de seguridad como la autentificacin y autorizacin, delegar el procesamiento de
negocio, controlar la eleccin de una vista apropiada, el manejo de errores, y el
control de la seleccin de estrategias de creacin de contenido.
El controlador proporciona un punto de entrada centralizado que controla y maneja las
peticiones Web. Centralizando los puntos de decisin y control, el controlador tambin ayuda a
reducir la cantidad de cdigo Java, llamadas a scriptles, embebidos en la pgina JavaServer
Pages (JSP).
Participantes y Responsabilidades
La siguiente figura representa el diagrama de la secuencia del patrn Front Controller. Muestra
como el controlador maneja una peticin:
Controller
El controlador es el punto de contacto inicial para manejar todas las peticiones en el sistema. El
controlador podra delegar a un helper para completar la autentificacin y la autorizacin de un
usuario o para iniciar la recuperacin de un contacto.
Dispatcher
Una Vista representa y muestra informacin al cliente. La vista recupera informacin desde el
modelo. Los helpers soportan las diferentes vistas encapsulando y adaptanto el modelo de datos
subyacente para usarlo en el display.
Estrategias
Hay varias estrategias para implementar un controlador.
Servlet Front
}
catch (Exception e) {
LogManager.logMessage(
"EmployeeController:exception : " +
e.getMessage());
request.setAttribute(resource.getMessageAttr(),
"Exception occurred : " + e.getMessage());
page = resource.getErrorPage(e);
}
// dispatch control to view
dispatch(request, response, page);
JSP Front
La estrategia de JSP Frontal sugiere la implementacin del controlador como una pgina JSP.
Aunque semnticamente equivalente, es mejor utilizar la Estrategia de Servlet Frontal. Como el
controlador maneja el procesamiento que no est especificamente relacionado con el formateo
de la salida, no tiene sentido implementar este componente como una pgina JSP.
La implementacin del controlador como una pgina JSP tiene otra razn para no ser la
preferida: Requiere que un desarrollador de software trabaje con una pgina de etiquetas para
poder modificar la lgica del control de peticiones. El siguiente listado es un ejemplo de esta
estrategia:
<%@page contentType="text/html"%>
<%@ page import="corepatterns.util.*" %>
<html>
<head><title>JSP Front Controller</title></head>
<body>
<h3><center> Employee Profile </h3>
<%
/**Control logic goes here...
At some point in this code block we retrieve
employee information, encapsulate it within a value
object and place this bean in request scope with the
key "employee". This code has been omitted.
We either dispatch to another JSP at this point or
simply allow the remaining portions of scriptlet
code to execute**/
%>
<jsp:useBean id="employee" scope="request"
class="corepatterns.util.EmployeeTO"/>
<FORM method=POST >
<table width="60%">
<tr>
<td> First Name : </td>
<td> <input type="text"
name="<%=Constants.FLD_FIRSTNAME%>"
value="<jsp:getProperty name="employee"
property="firstName"/>"> </td>
</tr>
<tr>
<td> Last Name : </td>
<td>
<input type="text"
name="<%=Constants.FLD_LASTNAME%>"
value="<jsp:getProperty name="employee"
property="lastName"/>"></td>
</tr>
<tr>
<td> Employee ID : </td>
<td>
<input type="text"
name="<%=Constants.FLD_EMPID%>"
value="<jsp:getProperty name="employee"
property="id"/>"> </td>
</tr>
<tr>
<td>
<input type="submit"
name="employee_profile"> </td>
<td> </td>
</tr>
</table>
</FORM>
</body>
</html>
Command and Controller
}
catch (Exception e) {
LogManager.logMessage("EmployeeController",
e.getMessage() );
resultPage = ApplicationResources.getInstance().
getErrorPage(e);
}
}
En la estrategia de Mapeo Fsico de Recursos todas las peticiones se hacen sobre nombres de
recursos fsicos especificos en lugar de sobre nombres lgicos. Un ejemplo es la siguiente
URL:http://some.server.com/resource1.jsp. En el caso de un controlador, un ejemplo de
URL podra ser: http://some.server.com/servlet/Controller. Es preferible utilizar la
estrategia de Mapeo Lgico de Recursos porque proporciona una mayor flexibilidad, porque nos
permite mapear los recuros de una forma declarativa.
Logical Resource Mapping
En la estrategia de Mapeo de Recurso Lgico todas las peticiones se hacen sobre nombres de
recursos lgicos en vez de sobre nombres fsicos especficos. Los recursos fsicos a los que se
refieren estos nombres lgicos podran modificarse de una forma declarativa.
Por ejemplo, la URL http://some.server.com/process podra mapearse como:
process=resource1.jsp
o como:
process=resource2.jsp
o como:
process=servletController
Multiplexed Resource Mapping
Peticin>
Mapeo
Peticin>
http://some.server.com/profile.ctrl?usecase=
create
Mapeo
*.ctrl =
servletController
Cuando la funcionalidad del dispatcher es mnima, se puede plegar junto al controlador, como se
muestra en la siguiente figura:
Base Front
La estrategia Base Front utilizada en combinacin con la estrategia Servlet Front, sugiere la
implementacin de una clase base controladora, cuya implementacin deben extender otros
controladoes. La clase Base Front podra contener implementaciones comunes y por defecto,
aunque las subclases puedan sobreescribir estas implementaciones. El inconviente de esta
estrategia es el hecho de que un superclase compartida, aunque promueve la reutilizacin y la
comparticin, tiene el problema de crear un herencia frgil, donde los cambios necesarios para
una subclase afectan a todas las dems subclases.
Filter Controller
Los filtros proporcionan un soporte similar para la centralizacin de manejo de peticiones. As,
algunos aspectos de un controlador se pueden implementar de forma razonable como un filtro.
Al mismo tiempo, los filtros se enfocan principalmente en la intercepcin y decoracin de
peticiones, no en el procesamiento y en la generacin de respuestas. Aunque hay un
solapamietno de responsabilidades, como en el manejo del log y la depuracin, cada
componente complementa a los otros cuando se utilizan de la forma apropiada.
Consecuencias
Centraliza el Control
Un controlador proporciona un lugar central para manejar los servicios del sistema y la
lgica de negocios entre varias peticiones. Un controlador maneja el procesamiento de la
lgica de negocio y el manejo de peticiones. El acceso centralizado a una aplicacin
significa que las peticiones se pueden seguir y guardar muy fcilmente. Debemos tener en
mente, que como controles centralizados, es posible presentar un slo punto de fallo. En
la prctica, esto rramente es un problema, ya que tpicamente existe mltiples
controladores, bien dentro de un slo servidor o en un cluster.
Mejora la Manejabilidad de la Seguridad
Un controlador centraliza el control, propocionando un punto de choque para intentos de
accesos ilcitos en la aplicacin Web. Adems, auditar una sola entrada en la aplicacin
requiere menos recursos que distribuir los chequeos de seguridad entre todas las pginas.
Mejora la Reutilizabilidad
Un controlador promueve el particionamiento limpio de la aplicacin y aconseja la
reutilizacin, ya que el cdigo que es comn entre los componentes se mueve dentro de
un controlador o es manejado por un controlador.
Patrones Relacionados
View Helper
El patrn Front Controller, en conjuncin con el patrn View Helper, describe la
creacin de lgica de negocio de la vista y proporciona un punto central de control y
reenvio. El flujo lgico se construye dentro del controlador y el cdigo de manejo de
datos se mueve hacia los helpers.
Intercepting Filter
Tanto Intercepting Filter como Front Controller describen formas de centralizar el
control de ciertos tipos de procesamiento de peticiones, sugiriendo diferentes
aproximaciones a este problema.
Dispatcher View y Service to Worker
Los patrones Dispatcher View y Service to Worker son otras forma de nombrar la
combinacin entre el patrn View Helper con un dispatcher, y un patrn Front
Controller. Dispatcher View y Service to Worker, aunque estructuralmente son
iguales, describen diferentes divisiones de labores entre los componentes.
Publicado por:
Ricard Lou Torrijos