Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    39

    [JSP-SERVLET] comunicazione tra applicazioni differenti

    Ciao a tutti,
    vi espongo il problema.
    Ho un'applicazione indipendente interamente in jsp/SAS, senza classi java/bean/servlet (1).
    Ho un'altra applicazione che contiene una servlet (2).

    Ora, vorrei che una jsp dell'applicazione 1 chiamasse la servlet dell'applicazione 2.
    La jsp deve passare un attributo in request e un parametro in url.

    La jsp chiamante è del tipo:
    String variabile1= request.getParameter("parametro"); //da un'altra jsp
    RequestDispatcher rd = request.getRequestDispatcher("http://sasportal/app2/servletDownLoad?parametro="+variabile1);

    Object object = new Object();
    request.setAttribute("auth", "SCHFIL");
    rd.forward(request, response);


    L'errore che viene dato è:
    Error 404: SRVE0190E: File not found: /http:/sasportal/servletDownLoad

    Dove sta il problema?

    Grazie in anticipo

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JSP-SERVLET] comunicazione tra applicazioni differenti

    Originariamente inviato da zeccaman
    Ora, vorrei che una jsp dell'applicazione 1 chiamasse la servlet dell'applicazione 2.
    La jsp deve passare un attributo in request e un parametro in url.
    A getRequestDispatcher() non puoi passare un URL qualunque!!! (non certo un http://blabla)

    Se vuoi fare un "forward" (quindi un giro "interno"), usa getContext() di ServletContext per ottenere il ServletContext dell'altra applicazione. Quindi su quel ServletContext invochi getRequestDispatcher().

    E nota che getContext() potrebbe anche fallire (ritorna null) se il container è stato configurato per vietare l'accesso ad altri contesti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    39
    Grazie andbin.
    Come vedi non sono un granchè esperto nel far comunicare 2 applicazioni distinte.
    Cmq come mi hai indicato funziona.
    Avrei anche la necessità di passare due variabili all'applicazione 2. Ovviamente non posso usare la sessione, quindi ho utilizzato la request, inserendo nella jsp chiamante dell'applicazione 1 :
    request.setAttribute("Auth", val)
    Recuperando questo valore dalla servlet chiamata ha sempre valore null.
    Domanda: come posso passare un parametro al chiamato, senza dover mettere tale parametro nell'url in chiaro?


    Grazie

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da zeccaman
    request.setAttribute("Auth", val)
    Recuperando questo valore dalla servlet chiamata ha sempre valore null.
    Mi pare strano che nella servlet dell'altra applicazione getAttribute("Auth") ritorni null. Dopotutto la request (intendo proprio l'oggetto HttpServletRequest) .... dovrebbe essere la stessa, no?

    Comunque non mi è mai capitato di dover invocare da una webapp qualcosa su un altro contesto. Ma posso eventualmente provare (giusto per curiosità/cultura personale).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Ho fatto una prova con il mio Tomcat locale di test. Ho dovuto configurarlo per consentire l'accesso ad altri contesti ma a parte questo funziona tutto benissimo. Nel senso che da una servlet "chiamante" della webapp A uso request.setAttribute("...", ....) e poi nella servlet "chiamata" della webapp B uso request.getAttribute("...") e mi ritrovo perfettamente quell'oggetto che avevo messo in request.

    Quindi non vedo problemi.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Originariamente inviato da andbin
    Ho fatto una prova con il mio Tomcat locale di test. Ho dovuto configurarlo per consentire l'accesso ad altri contesti ma a parte questo funziona tutto benissimo. Nel senso che da una servlet "chiamante" della webapp A uso request.setAttribute("...", ....) e poi nella servlet "chiamata" della webapp B uso request.getAttribute("...") e mi ritrovo perfettamente quell'oggetto che avevo messo in request.

    Quindi non vedo problemi.
    Scusate se mi intrometto nella discussione...
    Come si fa a configurare il Tom tale da "consentire l'accesso ad altri contesti"?
    Quali parametri bisogna settare?

    Grazie mille.

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da aironeangelo77
    Come si fa a configurare il Tom tale da "consentire l'accesso ad altri contesti"?
    Quali parametri bisogna settare?
    In context.xml nella directory 'conf' del Tomcat si mette l'attributo crossContext per il <Context>:

    <Context ...eventualmente altro... crossContext="true">
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Io ho due webapp di esempio sotto tomcat: App1 e App2.
    Ognuna di queste App ha una piccolissima servlet: Serv1 e Serv2.
    Ho la necessità che Serv1 richiami Serv2 di modo che la sessione rimane identica.
    Ho provato a fare così da Serv1:

    codice:
    ServletContext sc = this.getServletContext().getContext("/App2");
    sc.getRequestDispatcher("Serv2").forward(request, response);
    Ma l'istanza sc risulta sempre uguale a null...ho impostato anche il crossContext come da te suggerito (e riavviato Tomcat), ma il risultato è sempre null.

    Questo è il context.xml:
    codice:
    <?xml version="1.0" encoding="utf-8" ?> 
    <Context crossContext="true">
         <WatchedResource>WEB-INF/web.xml</WatchedResource> 
    </Context>
    Ma il codice che ho scritto è corretto?
    Ho avuto dubbi sul path ma sembra corretto...infatti se mi faccio restituire il context path da Serv2 in App2 attraverso il getContextPath ottengo proprio /App2.

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da aironeangelo77
    codice:
    ServletContext sc = this.getServletContext().getContext("/App2");
    sc.getRequestDispatcher("Serv2").forward(request, response);
    Se usi getRequestDispatcher() devi specificare un path (context-relative) che possa "matchare" con il mapping della servlet! Altrimenti è ovvio che non riuscirebbe ad invocarla.

    Se usassi getNamedDispatcher() allora potresti specificare il nome "logico" della servlet (di <servlet-name>)
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Grazie...
    sei sempre molto utile!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.