Forums

Home » Liferay Portal » Italiano

Combination View Flat View Tree View
Threads [ Previous | Next ]
toggle
foxmolder5 foxmolder5
Richiesta file xml da portlet in modo asincrono
November 18, 2008 1:17 AM
Answer

foxmolder5 foxmolder5

Rank: New Member

Posts: 14

Join Date: October 29, 2008

Recent Posts

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:

 1
 2    var req = false;
 3    if (window.XMLHttpRequest) { // Mozilla, Safari,...
 4        req = new XMLHttpRequest();
 5        if (req.overrideMimeType) {
 6            req.overrideMimeType('text/xml');
 7        }
 8    }
 9    else if (window.ActiveXObject) { // IE
10        try {
11            req = new ActiveXObject("Msxml2.XMLHTTP");
12        }
13        catch (e) {
14            try {
15                req = new ActiveXObject("Microsoft.XMLHTTP");
16            }
17            catch (e) {
18                req = false;
19            }
20        }
21    }
22    if (req) {   
23        req.onreadystatechange = function() {
24         //.............   
25        };
26        var url = "test.xml";
27        req.open('GET', url, true);
28        req.send(null);      
29    }


Struts setting:

1
2        <action path="/ext/googlemapsvisual/view" type="com.ext.portlet.googlemapsvisual.action.FetchInformationAction">
3            <forward name="portlet.ext.googlemapsvisual.view" path="portlet.ext.googlemapsvisual.view" />
4        </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");
}

Adriano de Gironimo
RE: Richiesta file xml da portlet in modo asincrono
November 18, 2008 1:35 AM
Answer

Adriano de Gironimo

Rank: New Member

Posts: 14

Join Date: August 12, 2008

Recent Posts

Ciao, da quanto so dovresti implementare il metodo execute() invece di serveResource() cioè:
1
2public ActionForward execute(ActionMapping mapping,
3            ActionForm form,HttpServletRequest request,
4            HttpServletResponse response)
5    throws Exception {
6// ...
7}


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..
Adriano de Gironimo
RE: Richiesta file xml da portlet in modo asincrono
November 18, 2008 1:40 AM
Answer

Adriano de Gironimo

Rank: New Member

Posts: 14

Join Date: August 12, 2008

Recent Posts

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:

1
2    @Override
3    protected boolean isCheckMethodOnProcessAction() {
4          return _CHECK_METHOD_ON_PROCESS_ACTION;
5    }
6    private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;


Ciao!
foxmolder5 foxmolder5
RE: Richiesta file xml da portlet in modo asincrono
November 18, 2008 8:05 AM
Answer

foxmolder5 foxmolder5

Rank: New Member

Posts: 14

Join Date: October 29, 2008

Recent Posts

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:

 1
 2
 3public class FetchInformationAction extends PortletAction{
 4    public void processAction(ActionMapping mapping, ActionForm form,
 5        PortletConfig config,ActionRequest req, ActionResponse res)
 6        throws Exception {
 7
 8        //................
 9    }
10
11    public ActionForward render(ActionMapping mapping, ActionForm form,
12        PortletConfig config, RenderRequest req, RenderResponse res)
13        throws Exception {
14
15        //.....
16    }
17   
18    public void serveResource(
19            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
20            ResourceRequest resourceRequest, ResourceResponse resourceResponse)
21        throws Exception {
22               
23               //...
24    }
25   
26    public ActionForward execute(ActionMapping mapping, ActionForm form,
27            HttpServletRequest request, HttpServletResponse response)
28        throws Exception {
29       
30        // ...
31       
32        //... Stampa messaggio di log
33        return super.execute(mapping, form, request, response);
34    }
35}


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.
Adriano de Gironimo
RE: Richiesta file xml da portlet in modo asincrono
November 20, 2008 3:19 AM
Answer

Adriano de Gironimo

Rank: New Member

Posts: 14

Join Date: August 12, 2008

Recent Posts

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):
 1
 2    var url = "<portlet:actionURL windowState="<%= LiferayWindowState.EXCLUSIVE.toString() %>">
 3       <portlet:param name="struts_action" value="/mia_applicazione/mia_portlet/azione" />
 4       </portlet:actionURL>";
 5    var inputParam = {'param1':'0', 'param2':'1'};
 6      
 7    jQuery.get(url, inputParam,
 8                function(data){
 9                    // callback per gestire i dati ricevuti contenuti nella var. "data"
10    });


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)
foxmolder5 foxmolder5
RE: Richiesta file xml da portlet in modo asincrono
April 18, 2009 1:50 AM
Answer

foxmolder5 foxmolder5

Rank: New Member

Posts: 14

Join Date: October 29, 2008

Recent Posts

Mi sono accorto dell'errore ed ho risolto al volo.
E' importante creare il URL di richiesta

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


da utilizzare all'interno del codice javascript per la richiesta

1
2request.open("GET", "<%= locationsURL %>" , true);


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