bloggers bloggers

Marco Napolitano
Messaggi: 79
Stelle: 0
Data: 17/02/22
Jader Jed Francia
Messaggi: 63
Stelle: 0
Data: 18/02/21
Paolo Gambetti
Messaggi: 2
Stelle: 0
Data: 11/11/19
Katia Pazzi
Messaggi: 1
Stelle: 0
Data: 27/06/19
Ezio Lombardi
Messaggi: 11
Stelle: 0
Data: 10/04/18
Chiara Mambretti
Messaggi: 25
Stelle: 0
Data: 27/02/17
Serena Traversi
Messaggi: 3
Stelle: 0
Data: 21/07/16
Francesco Falanga
Messaggi: 8
Stelle: 0
Data: 14/06/16
Antonio Musarra
Messaggi: 2
Stelle: 0
Data: 18/11/13
Simone Celli Marchi
Messaggi: 6
Stelle: 0
Data: 09/07/13
Indietro

Aggiungere oggetti custom al contesto di Velocity

Stavo dando una mano ad una collega per realizzare un ADT con Velocity e mi sono reso conto che l'operazione era più complicata del previsto a causa del codice che avrei dovuto scrivere.

Così mi sono detto che sarebbe stato molto bello se avessi potuto iniettare nel contesto di Velocity una mia classe di utility che facesse quello che serviva a me. Ho fatto un pò di ricerche, un pò di prove e questa è la soluzione!

Innanzitutto dovete realizzare un plugin di tipo hook oppure aggiungere il suddetto hook all'interno di un plugin portlet già esistente, in modo da poter gestire il vostro file portal.properties.

A questo punto realizzate la vostra classe di utility contenente tutti i metodi (statici) che vi servono; supponiamo che l'abbiate chiamata it.dvel.velocity.util.MyVelocityUtil. Non sto qui a spiegarvi come implementare una classe di utility...

Dopodichè realizzate una classe che estenda com.liferay.portal.kernel.events.Action e che si occuperà materialmente di iniettare la vostra classe nel contesto di Velocity:

package it.dvel.velocity.action;

import com.liferay.portal.kernel.events.Action;
import com.liferay.portal.kernel.events.ActionException;
import com.liferay.portal.kernel.util.WebKeys;

import it.dvel.velocity.util.MyVelocityUtil;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CustomVelocityAction extends Action {
    @Override
    public void run(HttpServletRequest request, HttpServletResponse response) throws ActionException {
        Map<String, Object> variables = (Map<String, Object>) request.getAttribute(WebKeys.VM_VARIABLES);

        Map<String, Object> customVariables = new HashMap<String, Object>();
        // Qui vanno aggiunte tutte le classi da usare in Velocity
        customVariables.put("myVelocityUtil", new MyVelocityUtil());

        if (variables == null)
            variables = customVariables;
        else
            variables.putAll(customVariables);

        request.setAttribute(WebKeys.VM_VARIABLES, variables);
    }
}

A questo punto rimane da dire a Liferay di utilizzare questa classe e lo facciamo grazie al nostro hook, aggiungendo la seguente property nel file portal.properties del plugin:

servlet.service.events.pre=it.dvel.velocity.action.CustomVelocityAction

Abbiamo finito! Deployate il vostro hook, dopodiché potrete invocare la vostra classe di utility all'interno di un ADT usando il nome che avete specificato sopra:

$myVelocityUtil.metodo1(...)

#set ($variabile = $myVelocityUtil.metodo2(...))

 

Commenti
Nessun commento. Vuoi essere il primo.