• No se han encontrado resultados

Mapeo del controlador

In document Evaluación de Spring MVC (página 181-184)

4.3 Simplificación del JDBC

5. Mapeo del controlador

El uso del mapeo del controlador permite asignar las solicitudes de portlets entrantes a los controladores apropiados. La funcionalidad básica de un HandlerMapping ofrece un HandlerExecutionChain, que debe contener al controlador que coincide con la petición de entrada, y también puede contener una lista de interceptores del controlador que se aplican a la solicitud. Cuando llega una petición, el DispatcherPortlet lo entregará al mapa del controlador para inspeccionar la solicitud y llegar a un HandlerExecutionChain adecuado. Entonces el DispatcherPortlet ejecutará el controlador y los interceptores.

En Spring Web MVC, el mapeo del controlador se basa comúnmente en URLs. Dado que en realidad no hay tal cosa como una URL dentro de un portlet, debemos usar otros mecanismos para controlar los mapeos. Los dos más comunes son el modo portlet y un parámetro de petición, pero ninguno se puede utilizar con un controlador personalizado.

En el resto de esta sección se describen tres de los mapeos más utilizados. Todos ellos heredan de AbstractHandlerMapping y comparten las siguientes propiedades:

 interceptors: La lista de los interceptores que se utilizan.

 DefaultHandler: El controlador predeterminado cuando esta asignación de controlador no da lugar a un controlador coincidente.

 order: Basado en el valor de la propiedad de order, Spring clasificará todas las asignaciones de controlador disponibles en el contexto y aplicará el primer controlador coincidente.

 lazyInitHandlers: Permite la inicialización de los manipuladores simples. El valor predeterminado es falso. Esta propiedad se implementa directamente en los tres manipuladores concretos.

5.1. PortletModeHandlerMapping

Se trata de un simple mapeo de controlador que asigna las peticiones entrantes en función de la modalidad actual del portlet. Un ejemplo:

<bean

class="org.springframework.web.portlet.handler.PortletModeHandlerMappi ng">

<property name="portletModeMap">

<map>

178

<entry key="edit" value-ref="editHandler"/>

<entry key="help" value-ref="helpHandler"/>

</map>

</property> </bean>

5.2. ParameterHandlerMapping

Si se tiene que navegar alrededor de varios controladores sin necesidad de cambiar el modo de portlet, la forma más sencilla de hacerlo es con un parámetro de la petición que se utiliza como la clave para el control del mapeo.

ParameterHandlerMapping utiliza el valor de un parámetro específico de la petición para controlar el mapeo. El nombre por defecto del parámetro es 'action', pero se puede cambiar con la propiedad 'parameterName'.

La configuración del bean para este mapeo será algo como esto:

<bean

class="org.springframework.web.portlet.handler.ParameterHandlerMapping ">

<property name="parameterMap">

<map>

<entry key="add" value-ref="addItemHandler"/>

<entry key="edit" value-ref="editItemHandler"/>

<entry key="delete" value-ref="deleteItemHandler"/>

</map>

</property> </bean>

5.3. PortletModeParameterHandlerMapping

La capacidad más potente de PortletModeParameterHandlerMapping combina las capacidades de los dos anteriores para permitir una navegación diferente dentro de cada modo portlet. Una vez más el nombre por defecto del parámetro es "action", pero se puede cambiar con la propiedad ‘parameterName’.

Por defecto, el valor del parámetro no se puede utilizar en dos modos de portlets diferentes. Esto es para que si el propio portal cambia el modo, la solicitud ya no será válida en el mapeo. Este comportamiento se puede cambiar estableciendo la propiedad allowDupParameters como true. Sin embargo, no es recomendable.

179

<bean

class="org.springframework.web.portlet.handler.PortletModeParameterHan dlerMapping">

<property name="portletModeParameterMap">

<map>

<entry key="view"> <!-- view portlet mode --> <map>

<entry key="add" value-ref="addItemHandler"/>

<entry key="edit" value-ref="editItemHandler"/>

<entry key="delete" value- ref="deleteItemHandler"/>

</map>

</entry>

<entry key="edit"> <!-- edit portlet mode --> <map>

<entry key="prefs" value-ref="prefsHandler"/>

<entry key="resetPrefs" value- ref="resetPrefsHandler"/> </map> </entry> </map> </property> </bean>

5.4. Añadiendo HandlerInterceptors

Los mecanismos de mapeo de controladores de Spring tienen nociones de interceptores de controlador, lo que resulta muy útil cuando se desea aplicar una funcionalidad específica a ciertas peticiones. Una vez más Spring Portlet MVC implementa estos conceptos de la misma manera que Spring Web MVC.

Los interceptores ubicados en el mapeo del controlador deben implementar HandlerInterceptor del paquete org.springframework.web.portlet. Al igual que la versión de servlet, esta interfaz define tres métodos: uno que se llamará antes de que se ejecute el controlador actual (preHandle), uno que se llamará después de que se ejecute el controlador (postHandle), y uno que se llama después que la solicitud haya terminado (afterCompletion). Estos tres métodos deben proporcionar la flexibilidad suficiente para hacer todo tipo de pre-y post-procesamiento.

El método preHandle devuelve un valor booleano. Se puede utilizar este método para detener o continuar con el procesamiento de la cadena de ejecución. Cuando este método devuelve true, continuará la cadena de ejecución del gestor. Cuando devuelve false, el DispatcherPortlet asume que el interceptor se ha encargado de las peticiones y detiene la ejecución de los otros interceptores y del controlador de la cadena de ejecución.

El método postHandle sólo se llama en un RenderRequest. Los métodos preHandle y afterCompletion son llamados a la vez mediante un ActionRequest y un RenderRequest.

180

In document Evaluación de Spring MVC (página 181-184)