viernes, 8 de junio de 2012

Liferay 6.0 : Spring MVC Portlet

Una vez desarrollado el portlet simple con el IDE de desarrollo de Liferay [ver portlet simple] podemos usar varios frameworks java para desarrollar portets tales como Struts,Spring, JSF, IceFaces,etc.

Convertiremos el portlet simple creado anteriormente en un portlet Spring MVC usando ciertas configuraciones sobre archivos del portlet.



PASO 1: Agregamos las dependencias (jars) :
*Spring MVC (Versión 3.0.4)  [Descargar Jars] a la carpeta [tomcat-6.0.29\webapps\ROOT\WEB-INF\lib].

*JSTL (versión 1.2)[Descargar Jars] a la carpeta [tomcat-6.0.29\lib\ext]

Agregando jars de Spring
JSTL 1.2 dependencias
Agregaremos las dependencias de Spring al Portlet para ellos modificamos el archivo liferay-plugin-package.properties en la sección Portal Dependency Jars agregando lo referente a Spring 3.0.4.

Seleccionamos jars de Spring en el portlet
PASO 2 .-Configuración de Archivos:
En el archivo web.xml en primer lugar definimos el parámetro contextConfigLocation para establecer donde vamos a almacenar el fichero de configuración de Spring de nuestro proyecto, en este caso será dentro de la carpeta WEB-INF/context con el nombre applicationContext.xml. Luego tenemos que crear el listener y el servlet necesarios para trabajar con Spring MVC.

Reemplazamos el codigo:
<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

Por

<!-- Define la localizacion de los ficheros de configuracion de Spring -->  
     <context-param>  
         <param-name>contextConfigLocation</param-name>  
         <param-value>/WEB-INF/context/applicationContext.xml</param-value>  
     </context-param>  

<!-- Listener de Contexto -->  
     <listener>  
         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
     </listener>  
<!-- Servlet de Spring MVC Portlet -->  
     <servlet>  
         <servlet-name>ViewRendererServlet</servlet-name>  
         <servlet-class>org.springframework.web.servlet.ViewRendererServlet</servlet-class>  
         <load-on-startup>1</load-on-startup>  
     </servlet>  

     <servlet-mapping>  
         <servlet-name>ViewRendererServlet</servlet-name>  
         <url-pattern>/WEB-INF/servlet/view</url-pattern>  
     </servlet-mapping>
PASO 3: Debemos crear una carpeta que contendrá la configuración Spring del Portlet, la llamaremos context dentro de la carpeta WEB-INF:
Carpeta context
PASO 4: Dentro de la carpeta context crearemos un archivo llamado applicationContext.xml conteniendo la configuración spring del aplicativo a nivel web que contendrá:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"  
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd" default-autowire="byName">  
   
     <!-- Para que Spring sepa que vamos a usar anotaciones -->  
     <context:annotation-config />  
   
     <!-- Desde donde tiene que escanear -->  
    <context:component-scan base-package="com.ext.test.controllers " />  
   
 </beans>

PASO 5 : Luego creamos una carpeta llamada porlet dentro de la carpeta context que contendrá ciertas configuraciones spring para el Portlet:
Carpeta portlet  con configuraciones Spring para el portlet
PASO 6: Dentro de la carpeta recién creada crearemos un archivo xml con la configuración de spring relacionada al manejo de jsp y actions del Portlet el cual llamaremos demo.xml, el cual contendrá:

<?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"  
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  
      
        <bean id="portletModeHandlerMapping"  
            class="org.springframework.web.portlet.handler.PortletModeHandlerMapping">  
            <property name="portletModeMap">  
                <map>  
                    <entry key="view" value-ref="demoController" />  
               </map>  
           </property>  
       </bean>
<!-- Default View Resolver -->  
       <bean id="viewResolver"  
           class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
           <property name="cache" value="false" />  
           <property name="viewClass"  
               value="org.springframework.web.servlet.view.JstlView" />  
           <property name="prefix" value="/html/democontroller/" />  
           <property name="suffix" value=".jsp" />  
       </bean>  
   </beans>

PASO 7: Para la creación del controlador ya mapeado anteriormente utilizamos la convención frente a la configuración por lo que vamos a crear una clase controladora del mismo nombre (salvo empezando por mayúsculas) que el id del bean referenciado en la entrada key="view".
Por lo tanto vamos a crear la clase DemoController dentro de un paquete que este en el alcance del escaneado de Spring, por ejemplo, com.ext.test.controllers por ahora no pondremos nada en ello:

En este caso vamos a tener un controlador para todas las peticiones que se realicen en el estado de la vista (VIEW) del Portlet y vamos a mostrar el contenido a través de páginas JSP.
Estructura final de carpetas de configuración
PASO 8 :Configuramos el archivo portlet.xml para adaptarlo a Spring, en la línea 14 de la etiqueta portlet-class cambiamos :

<portlet-class>
   com.ext.test.controllers.DemoController
  </portlet-class>
Por
<portlet-class>
   org.springframework.web.portlet.DispatcherPortlet
  </portlet-class>

Cambiamos la línea 16 la etiqueta init-param:

<init-param>
   <name>view-jsp</name>
   <value>/html/democontroller/view.jsp</value>  
                     </init-param>
Por
<init-param>
   <name>contextConfigLocation</name>
   <value>/WEB-INF/context/portlet/demo.xml</value>
  </init-param>

PASO 9 : Configuraremos el controlador creador anteriormente para que acepte Spring:

package com.ext.test.controllers;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller  
@RequestMapping("VIEW")  
public class DemoController {  
  
    public DemoController() {  
    }  
  

    @RequestMapping  
    protected String defaultView() {  
        return "view";  
    }  
  
}

Este es el contenido mínimo que tiene que tener nuestro controlador. Con la anotación @Controller estamos definiendo que es un controlador manejado por Spring y por tanto implícitamente estamos creando el bean asociado dentro de nuestro fichero de configuración. Con la anotación @RequestMapping("VIEW") estamos estableciendo que este controlador se va a encargar de la vista del portlet y con la anotación @RequestMapping sin ningún parámetro adicional estamos estableciendo que ese método es el que se va a ejecutar por defecto.

En Spring MVC Portlet, tenemos que distinguir dos tipos de métodos: lo que devuelven String y los que no devuelven nada (void). Los del primer caso se corresponden con métodos Render donde el String que devuelven le indica a Spring que tiene que buscar un .jsp dentro de la carpeta establecida con ese nombre, para mostrarlo en la vista del portlet. Los del segundo caso se corresponden con métodos Action que reciben las peticiones del usuarios, ejecutan la lógica asociada y establecen que método Render va a ser el siguiente a ejecutar, en caso de no establecer ninguno, se ejecutaría el de por defecto, anotado con @RequesMapping sin parámetros adicionales.

Tal y como lo tenemos el Portlet funcionara solo faltaría desplegarlo al portal por medio del Ant para ello lo desplegamos, seleccionamos la pestaña Ant y ejecutamos el archivo con el nombre de nuestro Portlet.[Ver despliegue de un portlet con ANT]

No hay comentarios:

Publicar un comentario