Fórumok

Richiesta file xml da portlet in modo asincrono

foxmolder5 foxmolder5, módosítva 15 év-val korábban

Richiesta file xml da portlet in modo asincrono

New Member Bejegyzések: 14 Csatlakozás dátuma: 2008.10.29. Legújabb bejegyzések
Ciao a tutti

sto implementando una portlet nell'ambiente EXT che include una mappa di google con associate diverse informazioni richieste in modo asincrono al server sottoforma di file xml (vista la loro elevata dimensione). Ho visto alcuni esempi e volendo seguire le specifiche JSR286 relative alle "Portlet 2.0" ho pensato di utilizzare il metodo serveResource (all'interno della relativa Action") e lato client la tecnologia javascript. Il problema risiede nel fatto che non riesco ad attivare il metodo serveResource e quindi a ricevere la richiesta del file inviata tramite XMLHttpRequest dalla portlet. Qualcuno può aiutarmi?
Vi ringrazio


Codice Javascript contenuto nel file JSP:


    var req = false;
    if (window.XMLHttpRequest) { // Mozilla, Safari,...
        req = new XMLHttpRequest();
        if (req.overrideMimeType) { 
        	req.overrideMimeType('text/xml'); 
        }
    }
    else if (window.ActiveXObject) { // IE
        try { 
        	req = new ActiveXObject("Msxml2.XMLHTTP");
        } 
        catch (e) {
        	try { 
        		req = new ActiveXObject("Microsoft.XMLHTTP"); 
        	} 
        	catch (e) { 
        		req = false; 
        	}
        }
    }
    if (req) {   
        req.onreadystatechange = function() { 
         //.............	
        };
        var url = "test.xml";
        req.open('GET', url, true);
        req.send(null);      
    }


Struts setting:


		<action path="/ext/googlemapsvisual/view" type="com.ext.portlet.googlemapsvisual.action.FetchInformationAction">
			<forward name="portlet.ext.googlemapsvisual.view" path="portlet.ext.googlemapsvisual.view" />
		</action>


E quindi il metodo serveResource contenuto in FetchInformationAction (da me creato):



public void serveResource(
ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
ResourceRequest resourceRequest, ResourceResponse resourceResponse)
throws Exception {

// Other code

System.out.println("FetchLocationAction: serveResource");
}

thumbnail
Adriano de Gironimo, módosítva 15 év-val korábban

RE: Richiesta file xml da portlet in modo asincrono

New Member Bejegyzések: 14 Csatlakozás dátuma: 2008.08.12. Legújabb bejegyzések
Ciao, da quanto so dovresti implementare il metodo execute() invece di serveResource() cioè:
 
public ActionForward execute(ActionMapping mapping,
    		ActionForm form,HttpServletRequest request,
    		HttpServletResponse response)
    throws Exception {
// ...
}


Fammi sapere se funziona.

Un'altra nota: quando tu ritorni un oggetto XML alla jsp, l'header dovrebbe avere il content-type impostato ad application/xml o text/xml.
Ma anche se lo imposti manualmente, liferay se lo cambia sempre in text/html... quindi il jsp non riesce a crearsi l'oggetto con cui accedere ai tag xml.
Prima postai sul forum questo quesito ma nessuno mi ha mai risposto... se trovi una soluzione fammela sapere magari, anche se ho risolto già usando JSON è sempre bene conoscere la risposta emoticon
Ajax mi funziona perfettamente, ma ovviamente non impostando nessun forward, nella console di Tomcat esce ad ogni chiamata: ERROR: Forward does not exist che è fastidioso... se qualcuno sa come evitare questo..
foxmolder5 foxmolder5, módosítva 15 év-val korábban

RE: Richiesta file xml da portlet in modo asincrono

New Member Bejegyzések: 14 Csatlakozás dátuma: 2008.10.29. Legújabb bejegyzések
Per ora mi sto concentrando sul far funzionare la "comunicazione" tra client e server in modo asincrono ed in fatti non riesco ancora a "ricevere" la richiesta XMLHttprequest prodotta dalla portlet.
Infatti stavolta, come mi avevi consigliato, ho inserito all'interno dei FetchInformationAction il metodo Execute nel seguente modo:



public class FetchInformationAction extends PortletAction{
	public void processAction(ActionMapping mapping, ActionForm form, 
		PortletConfig config,ActionRequest req, ActionResponse res) 
		throws Exception {

		//................
	}

	public ActionForward render(ActionMapping mapping, ActionForm form,
		PortletConfig config, RenderRequest req, RenderResponse res)
		throws Exception {

		//.....
	}
	
	public void serveResource(
			ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
			ResourceRequest resourceRequest, ResourceResponse resourceResponse)
		throws Exception {
                
               //... 
	}
	
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
		throws Exception {
		
		// ...
		
		//... Stampa messaggio di log 
		return super.execute(mapping, form, request, response);
	}
}



Andando ad eseguire il tutto ho notato che la execute mi viene eseguita durante il render della pagina ma poi non mi viene eseguita quando invio la richiesta Http tramite javascript (dal momento che non mi viene mostrato nessun messaggio nel log.
Io mi sto basando sulle specifiche JSR286 in cui si parla di Portlet 2.0 e in cui si menziona solamente il metodo serveResource piuttosto che execute.
thumbnail
Adriano de Gironimo, módosítva 15 év-val korábban

RE: Richiesta file xml da portlet in modo asincrono

New Member Bejegyzések: 14 Csatlakozás dátuma: 2008.08.12. Legújabb bejegyzések
Non capisco come faccia ad essere eseguito il metodo execute() nel rendering della pagina, se l'azione viene chiamata solo sul javascript, come dovrebbe essere.
Nel codice javascript della jsp l'azione può essere chiamata (usando jQuery):

	var url = "<portlet:actionurl windowstate="<%= LiferayWindowState.EXCLUSIVE.toString() %>">
	   <portlet:param name="struts_action" value="/mia_applicazione/mia_portlet/azione" />
	   </portlet:actionurl>";
	var inputParam = {'param1':'0', 'param2':'1'};
	   
	jQuery.get(url, inputParam, 
		        function(data){
	    			// callback per gestire i dati ricevuti contenuti nella var. "data"
    });


A quel punto dovrebbe entrare in azione il metodo execute(). All'interno di questo metodo i dati da restituire alla jsp possono essere passati tramite:
response.getWriter().write(dati_da_restituire)
thumbnail
Adriano de Gironimo, módosítva 15 év-val korábban

RE: Richiesta file xml da portlet in modo asincrono

New Member Bejegyzések: 14 Csatlakozás dátuma: 2008.08.12. Legújabb bejegyzések
Ah, un'altra cosa, siccome stai usando GET e non POST, Liferay potrebbe darti una eccezione di sicurezza.
Se questo ti dovesse accadere e vuoi usare GET dovresti fare un'override, semplicemente inserire nel codice della classe java:


    @Override
    protected boolean isCheckMethodOnProcessAction() {
          return _CHECK_METHOD_ON_PROCESS_ACTION;
    }
    private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;


Ciao!
foxmolder5 foxmolder5, módosítva 14 év-val korábban

RE: Richiesta file xml da portlet in modo asincrono

New Member Bejegyzések: 14 Csatlakozás dátuma: 2008.10.29. Legújabb bejegyzések
Mi sono accorto dell'errore ed ho risolto al volo.
E' importante creare il URL di richiesta


// prepare request link
ResourceURL locationsURL = null;
String portletId = portletDisplay.getId();
locationsURL = new PortletURLImpl(request,portletId, plid, PortletRequest.RESOURCE_PHASE);


da utilizzare all'interno del codice javascript per la richiesta


request.open("GET", "&lt;%= locationsURL %&gt;" , true);


poichè in questo modo liferay può smistare la richiesta XML al relativo serveResource di appartenenza.