La portlet in JSP con supporto JSF può essere creata facilmente partendo dalla portlet base JSP scaricabile qui oppure seguendo la relativa guida.
Occorre fare diversi cambiamenti nel file di configurazione; dato che il numero di righe è nettamente superiore , vi mostrerò per intero i file già modificati. Per semplicità si può creare un nuovo progetto chiamandolo ad esempio jsp_jsf_liferay_portlet in modo tale da non dover sovrascrivere l’esempio precedente.
WEB.XML
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <display-name>jsp_jsf_liferay_portlet</display-name> <context-param> <param-name>javax.faces.STATE_SAVING_METHOD</param-name> <param-value>client</param-value> </context-param> <context-param> <param-name>javax.faces.application.CONFIG_FILES</param-name> <param-value>/WEB-INF/faces-config.xml</param-value> </context-param> <context-param> <param-name>com.sun.faces.validateXml</param-name> <param-value>false</param-value> </context-param> <filter> <filter-name>Cache Filter - Resource</filter-name> <filter-class>com.liferay.portal.kernel.servlet.PortalClassLoaderFilter</filter-class> <init-param> <param-name>filter-class</param-name> <param-value>com.liferay.portal.servlet.filters.cache.CacheFilter</param-value> </init-param> <init-param> <param-name>pattern</param-name> <param-value>2</param-value> </init-param> </filter> <filter> <filter-name>Cache Filter - Resource CSS JSP</filter-name> <filter-class>com.liferay.portal.kernel.servlet.PortalClassLoaderFilter</filter-class> <init-param> <param-name>filter-class</param-name> <param-value>com.liferay.portal.servlet.filters.cache.CacheFilter</param-value> </init-param> <init-param> <param-name>url-regex-pattern</param-name> <param-value>.+/css\.jsp</param-value> </init-param> <init-param> <param-name>pattern</param-name> <param-value>2</param-value> </init-param> </filter> <filter> <filter-name>Header Filter</filter-name> <filter-class>com.liferay.portal.kernel.servlet.PortalClassLoaderFilter</filter-class> <init-param> <param-name>filter-class</param-name> <param-value>com.liferay.portal.servlet.filters.header.HeaderFilter</param-value> </init-param> <init-param> <param-name>Cache-Control</param-name> <param-value>max-age=315360000, public</param-value> </init-param> <init-param> <param-name>Expires</param-name> <param-value>315360000</param-value> </init-param> </filter> <filter> <filter-name>Header Filter - CSS JSP</filter-name> <filter-class>com.liferay.portal.kernel.servlet.PortalClassLoaderFilter</filter-class> <init-param> <param-name>filter-class</param-name> <param-value>com.liferay.portal.servlet.filters.header.HeaderFilter</param-value> </init-param> <init-param> <param-name>url-regex-pattern</param-name> <param-value>.+/css\.jsp</param-value> </init-param> <init-param> <param-name>Cache-Control</param-name> <param-value>max-age=315360000, public</param-value> </init-param> <init-param> <param-name>Expires</param-name> <param-value>315360000</param-value> </init-param> </filter> <filter> <filter-name>GZip Filter</filter-name> <filter-class>com.liferay.portal.kernel.servlet.PortalClassLoaderFilter</filter-class> <init-param> <param-name>filter-class</param-name> <param-value>com.liferay.portal.servlet.filters.gzip.GZipFilter</param-value> </init-param> </filter> <filter> <filter-name>Minifier Filter</filter-name> <filter-class>com.liferay.portal.kernel.servlet.PortalClassLoaderFilter</filter-class> <init-param> <param-name>filter-class</param-name> <param-value>com.liferay.portal.servlet.filters.minifier.MinifierFilter</param-value> </init-param> </filter> <filter> <filter-name>Minifier Filter - CSS JSP</filter-name> <filter-class>com.liferay.portal.kernel.servlet.PortalClassLoaderFilter</filter-class> <init-param> <param-name>filter-class</param-name> <param-value>com.liferay.portal.servlet.filters.minifier.MinifierFilter</param-value> </init-param> <init-param> <param-name>url-regex-pattern</param-name> <param-value>.+/css\.jsp</param-value> </init-param> </filter> <filter-mapping> <filter-name>Cache Filter - Resource</filter-name> <url-pattern>*.css</url-pattern> </filter-mapping> <filter-mapping> <filter-name>Cache Filter - Resource</filter-name> <url-pattern>*.html</url-pattern> </filter-mapping> <filter-mapping> <filter-name>Cache Filter - Resource</filter-name> <url-pattern>*.js</url-pattern> </filter-mapping> <filter-mapping> <filter-name>Cache Filter - Resource CSS JSP</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <filter-mapping> <filter-name>Header Filter</filter-name> <url-pattern>*.css</url-pattern> </filter-mapping> <filter-mapping> <filter-name>Header Filter</filter-name> <url-pattern>*.gif</url-pattern> </filter-mapping> <filter-mapping> <filter-name>Header Filter</filter-name> <url-pattern>*.html</url-pattern> </filter-mapping> <filter-mapping> <filter-name>Header Filter</filter-name> <url-pattern>*.ico</url-pattern> </filter-mapping> <filter-mapping> <filter-name>Header Filter</filter-name> <url-pattern>*.jpg</url-pattern> </filter-mapping> <filter-mapping> <filter-name>Header Filter</filter-name> <url-pattern>*.js</url-pattern> </filter-mapping> <filter-mapping> <filter-name>Header Filter</filter-name> <url-pattern>*.png</url-pattern> </filter-mapping> <filter-mapping> <filter-name>Header Filter - CSS JSP</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <filter-mapping> <filter-name>GZip Filter</filter-name> <url-pattern>*.css</url-pattern> </filter-mapping> <filter-mapping> <filter-name>GZip Filter</filter-name> <url-pattern>*.html</url-pattern> </filter-mapping> <filter-mapping> <filter-name>GZip Filter</filter-name> <url-pattern>*.js</url-pattern> </filter-mapping> <filter-mapping> <filter-name>GZip Filter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <filter-mapping> <filter-name>Minifier Filter</filter-name> <url-pattern>*.css</url-pattern> </filter-mapping> <filter-mapping> <filter-name>Minifier Filter</filter-name> <url-pattern>*.js</url-pattern> </filter-mapping> <filter-mapping> <filter-name>Minifier Filter - CSS JSP</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <listener> <listener-class>com.liferay.util.bridges.jsf.sun.LiferayConfigureListener</listener-class> </listener> <listener> <listener-class>com.liferay.portal.kernel.servlet.PortletContextListener</listener-class> </listener> <servlet> <servlet-name>FacesServlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> </servlet> <servlet> <servlet-name>1</servlet-name> <servlet-class>com.liferay.portal.kernel.servlet.PortletServlet</servlet-class> <init-param> <param-name>portlet-class</param-name> <param-value>com.sun.faces.portlet.FacesPortlet</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>FacesServlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>1</servlet-name> <url-pattern>/1/*</url-pattern> </servlet-mapping> <jsp-config> <taglib> <taglib-uri>http://java.sun.com/portlet_2_0</taglib-uri> <taglib-location>/WEB-INF/tld/liferay-portlet.tld</taglib-location> </taglib> <taglib> <taglib-uri>http://liferay.com/tld/portlet</taglib-uri> <taglib-location>/WEB-INF/tld/liferay-portlet-ext.tld</taglib-location> </taglib> <taglib> <taglib-uri>http://liferay.com/tld/security</taglib-uri> <taglib-location>/WEB-INF/tld/liferay-security.tld</taglib-location> </taglib> <taglib> <taglib-uri>http://liferay.com/tld/theme</taglib-uri> <taglib-location>/WEB-INF/tld/liferay-theme.tld</taglib-location> </taglib> <taglib> <taglib-uri>http://liferay.com/tld/ui</taglib-uri> <taglib-location>/WEB-INF/tld/liferay-ui.tld</taglib-location> </taglib> <taglib> <taglib-uri>http://liferay.com/tld/util</taglib-uri> <taglib-location>/WEB-INF/tld/liferay-util.tld</taglib-location> </taglib> </jsp-config> <security-constraint> <web-resource-collection> <web-resource-name>Page Sources</web-resource-name> <url-pattern>*.jsp</url-pattern> <url-pattern>*.jspx</url-pattern> <url-pattern>*.xhtml</url-pattern> </web-resource-collection> <auth-constraint> <role-name>nobody</role-name> </auth-constraint> </security-constraint> <security-role> <role-name>nobody</role-name> </security-role> </web-app>
PORTLET.XML
<?xml version="1.0" encoding="UTF-8"?> <portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd"> <portlet> <portlet-name>1</portlet-name> <display-name>Sample JSF 1.2 Sun JSP</display-name> <portlet-class>com.sun.faces.portlet.FacesPortlet</portlet-class> <init-param> <name>com.sun.faces.portlet.INIT_VIEW</name> <value>/index.jsp</value> </init-param> <supports> <mime-type>text/html</mime-type> </supports> <portlet-info> <title>Sample JSF 1.2 Sun JSP</title> <short-title>Sample 1.2 JSF Sun JSP</short-title> <keywords>Sample JSF 1.2 Sun JSP</keywords> </portlet-info> <security-role-ref> <role-name>administrator</role-name> </security-role-ref> <security-role-ref> <role-name>guest</role-name> </security-role-ref> <security-role-ref> <role-name>power-user</role-name> </security-role-ref> <security-role-ref> <role-name>user</role-name> </security-role-ref> </portlet> </portlet-app>
LIFERAY-PORTLET.XML
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE liferay-portlet-app PUBLIC "-//Liferay//DTD Portlet Application 4.3.1//EN" "http://www.liferay.com/dtd/liferay-portlet-app_4_3_1.dtd"> <liferay-portlet-app> <portlet> <portlet-name>1</portlet-name> <instanceable>true</instanceable> <ajaxable>false</ajaxable> </portlet> <role-mapper> <role-name>administrator</role-name> <role-link>Administrator</role-link> </role-mapper> <role-mapper> <role-name>guest</role-name> <role-link>Guest</role-link> </role-mapper> <role-mapper> <role-name>power-user</role-name> <role-link>Power User</role-link> </role-mapper> <role-mapper> <role-name>user</role-name> <role-link>User</role-link> </role-mapper> </liferay-portlet-app>
LIFERAY-PLUGIN-PACKAGE.XML
<?xml version="1.0"?> <!DOCTYPE plugin-package PUBLIC "-//Liferay//DTD Plugin Package 5.2.0//EN" "http://www.liferay.com/dtd/liferay-plugin-package_5_2_0.dtd"> <plugin-package> <name>Sample JSF 1.2 Sun JSP Portlet</name> <module-id>liferay/sample-jsf-1.2-sun-jsp-portlet/5.2.0.1/war</module-id> <types> <type>portlet</type> </types> <tags> <tag>sample</tag> </tags> <short-description>This plugin leverages the Sun OpenPortal JSF Portlet Bridge and shows how to use the JSF 1.2 Sun RI and the JSP view-handler within Liferay.</short-description> <long-description></long-description> <change-log></change-log> <page-url>http://www.liferay.com</page-url> <author>Liferay, Inc.</author> <licenses> <license osi-approved="true">MIT</license> </licenses> <liferay-versions> <liferay-version>5.2.3+</liferay-version> </liferay-versions> </plugin-package>
LIFERAY-PLUGIN-PACKAGE.PROPERTIES
name=Sample JSF 1.2 Sun JSP
module-group-id=liferay
module-incremental-version=1
tags=sample
short-description=This plugin leverages the Sun OpenPortal JSF Portlet Bridge and shows how to use the JSF 1.2 Sun RI and the JSP view-handler within Liferay.
change-log=
page-url=http://www.liferay.com
author=Liferay, Inc.
licenses=MIT
portal-dependency-jars=\
commons-beanutils.jar,\
commons-collections.jar,\
commons-digester.jar,\
jstl.jar,\
jstl-impl.jar
Nota: l’ultima variabile contiene la lista dei jar di dipendenza necessari per liferay.
LIFERAY-DISPLAY.XML
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE display PUBLIC "-//Liferay//DTD Display 5.2.0//EN" "http://www.liferay.com/dtd/liferay-display_5_2_0.dtd"> <display> <category name="category.sample"> <portlet id="1"></portlet> </category> </display>
FACES-CONFIG.XML
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd"> <faces-config xmlns="http://java.sun.com/JSF/Configuration"> <managed-bean> <managed-bean-name>user</managed-bean-name> <managed-bean-class>com.liferay.samplejsfsun.bean.UserBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> <navigation-rule> <from-view-id>/index.jsp</from-view-id> <navigation-case> <from-outcome>submit</from-outcome> <to-view-id>/welcome.jsp</to-view-id> </navigation-case> </navigation-rule> <navigation-rule> <from-view-id>/welcome.jsp</from-view-id> <navigation-case> <from-outcome>back</from-outcome> <to-view-id>/index.jsp</to-view-id> </navigation-case> </navigation-rule> </faces-config>
Occorre creare una cartella sotto WebContent\WEB-INF\tld contenente i file *.tld di definizione per liferay. Per semplicità non elenco il contenuto di ognuno poiché data la lunghezza, renderebbero illeggibile la guida. Potete prenderli dal link XXX che contiene l’archivio ZIP del progetto completo.
Occorrere aggiungere le seguenti librerie nella cartella WebContent\WEB-INF\lib:
- util-bridgse-6.0.2.jar
- util-java-6.0.2.jar
- util-taglib-6.0.2.jar
- commons-beanutils.jar
- commons-collections.jar
- commons-digester.jar
- commons-logging.jar
- el-api.jar
- el-ri.jar
- jsf-api.jar
- jsf-impl.jar
- jsf-portlet.jar
- jstl.jar
- jstl-impl.jar
- log4j.jar
Le librerie sono scaricabili da qui
Ora dobbiamo creare una semplice classe java, ovvero un bean, che si occuperà di fare alcune operazioni, nel nostro esempio memorizza e visualizza un messaggio.
Quindi creare la classe UserBean.java nel package com.liferay.samplejsfsun.bean (si può scegliere liberamente!!)
package com.liferay.samplejsfsun.bean;
public class UserBean {
public String getName() {
return _name;
}
public void setName(String name) {
_name = name;
}
private String _name;
}
Successivamente occorre registrare il bean nel file faces-config.xml di cui riporto solo l’estratto in questione:
<managed-bean>
<managed-bean-name>user</managed-bean-name>
<managed-bean-class>com.liferay.samplejsfsun.bean.UserBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
Infine occorre creare due file index.jsp e welcome.jsp che si occuperanno rispettivamente di far inserire il nome utente e di mostrare il messaggio di benvenuto. Ecco il contenuto:
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<f:view>
<h:form>
<table>
<tr>
<td>
<font class="portlet-font" style="font-size: x-small;">
<h:outputText value="please_enter_your_name" />
</font>
</td>
<td>
<h:inputText id="name" required="true" value="#{user.name}" />
</td>
</tr>
<tr>
<td align="center" colspan="2">
<font class="portlet-font" style="font-size: x-small;">
<h:message for="name" />
</font>
</td>
</tr>
<tr>
<td align="center" colspan="2">
<h:commandButton action="submit" value="Submit" />
</td>
</tr>
</table>
</h:form>
</f:view>
WELCOME.JSP
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<f:view>
<h:form>
<table>
<tr>
<td align="center">
<font class="portlet-font" style="font-size: x-small;">
<h:outputText value="welcome_to_liferay_portal" />, <h:outputText value="#{user.name}" />.
</font>
</td>
</tr>
<tr>
<td align="center">
<h:commandButton action="back" value="Back" />
</td>
</tr>
</table>
</h:form>
</f:view>
Come per i bean, anche i file jsp vanno registrati nel file faces-config.xml, non il componente in se ma quanto l’interazione tra le pagine; ecco l’estratto:
<navigation-rule> <from-view-id>/index.jsp</from-view-id> <navigation-case> <from-outcome>submit</from-outcome> <to-view-id>/welcome.jsp</to-view-id> </navigation-case> </navigation-rule> <navigation-rule> <from-view-id>/welcome.jsp</from-view-id> <navigation-case> <from-outcome>back</from-outcome> <to-view-id>/index.jsp</to-view-id> </navigation-case> </navigation-rule>
L’alberatura del progetto finale sarà dunque:
Potete scaricare il progetto da qui. NOTA: Settare il build path dopo l’importazione in Eclipse.









