Get it on Google Play

Sobrescribiendo JSPs en Liferay 7 y Liferay DXP

20-09-2016
 
Liferay Hook

Liferay Hook

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’.

Interesado en formación Liferay?

 

Comments

2 Responses to “Sobrescribiendo JSPs en Liferay 7 y Liferay DXP”
  1. Jorge Ferrer says:

    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.

  2. Hola Jorge,

    Muchas gracias por comentar. Supongo que nos veremos en el Symposium el mes que viene no?

    Un abrazo,

Leave a Reply