Las páginas JSPs ya van a la baja en Liferay 7, con las versiones irán desapareciendo pero todavía quedan muchos JSPs en el core de Liferay. En este articulo vamos a ver como podemos sobrescribir el JSP que pinta los foros de discusión de la librería de tags ‘ui’.
Recordemos que esto en versiones anteriores a Liferay 7 se hacia mediante un ‘Hook’ que ahora ya no son necesarios. Ahora lo haremos de la manera siguiente:
Incluimos las dependencias
Lo primero será asegurarnos que tenemos las siguientes dependencias en nuestro fichero ‘build.gradle’:
compile 'com.liferay.portal:com.liferay.portal.impl:2.0.0' compile 'com.liferay.portal:com.liferay.portal.kernel:2.0.0' compile 'org.osgi:org.osgi.core:6.0.0' compile 'org.osgi:org.osgi.service.component.annotations:1.3.0'
Sin ellas no podríamos compilar nuestro componente.
Componente OSGI para cargar los JSPs
Deberemos de crear este componente para que nos cargue las JSPs. Básicamente, lo único a tener en cuenta es que le decimos donde debe encontrar los JSPs, en es caso en ‘META-INF/jsps/’:
@Component( immediate = true, property = { "context.id=CoreJSPHook", "context.name=Custom JSP Bag", "service.ranking:Integer=100" } ) public class CoreJSPHook implements CustomJspBag { @Override public String getCustomJspDir() { return "META-INF/jsps/"; } @Override public List<String> getCustomJsps() { return _customJsps; } @Override public URLContainer getURLContainer() { return _urlContainer; } @Override public boolean isCustomJspGlobal() { return true; } @Activate protected void activate(BundleContext bundleContext) { bundle = bundleContext.getBundle(); _customJsps = new ArrayList<>(); Enumeration<URL> entries = bundle.findEntries( getCustomJspDir(), "*.jsp", true); while (entries.hasMoreElements()) { URL url = entries.nextElement(); _customJsps.add(url.getPath()); } } private List<String> _customJsps; private final URLContainer _urlContainer = new URLContainer() { @Override public Set<String> getResources(String path) { Set<String> paths = new HashSet<>(); for (String entry : _customJsps) { if (entry.startsWith(path)) { paths.add(entry); } } return paths; } @Override public URL getResource(String name) { return bundle.getEntry(name); } }; private Bundle bundle; }
Copiamos los JSPs
Finalmente ya solamente nos queda copiar los nuevos ficheros JSPs a la carpeta ‘/WEB-INF/jsps’. Liferay sobrescribirá estos JSPs por los que el tiene en el core ‘<LIFERAY_HOME>/<TOMCAT>/webapps/ROOT’.
Hola Albert,
Gracias por difundir información sobre Liferay 7.
Me gustaría añadir algunos puntos que considero importantes sobre este post:
1) Este tutorial aplica sólo a los JSPs que hay en el kernel de Liferay. En Liferay 7 hay muy muy pocos y es muy poco habitual que se necesiten sobreescribir.
2) La interfaz de usuario de todos los portlets está ahora en módulos y sobreescribirlos es mucho más sencillo como se explica en https://dev.liferay.com/develop/tutorials/-/knowledge_base/7-0/overriding-a-modules-jsps
3) Para los JSPs del core es posible seguir usando Hooks. El método descrito en este artículo (cuya doc oficial es https://dev.liferay.com/develop/tutorials/-/knowledge_base/7-0/overriding-core-jsps) es más complejo a cambio de no realizar ninguna modificación de ficheros en el servidor de aplicaciones, lo que es preferido en instalaciones en producción.
Hola Jorge,
Muchas gracias por comentar. Supongo que nos veremos en el Symposium el mes que viene no?
Un abrazo,