2013-05-11 20 views
6

Non ho molta familiarità con vaadin 7 e non riesco a capirlo. Ho provato a usare google ma nessun risultato utile.parametro 7 vaadin URL

La mia domanda è molto semplice. Come posso ottenere i parametri url della richiesta nella mia classe UI?

mio URL ha un parametro: host/myvaadinapp/?code=erefdvdfgftf...

Il parametro url viene da Facebook dopo che l'utente loggato (OAuth) e ho bisogno di gestire il valore del parametro codice URL nel mio codice.

Ho provato a fare questi:

@PreserveOnRefresh 
    public class AdminUi extends UI 
    { 
     @Override 
     protected void init(VaadinRequest request) 
     { 
      ... 
      System.out.println(request.getPathInfo()); 
      System.out.println(request.getRemoteHost()); 
      System.out.println(request.getParameterMap().size()); 
      System.out.println(request.getAttribute("code")); 
      System.out.println(request.getParameter("code")); 
      ... 
     } 
    } 

Risultato: request.getAttribute ("Codice"): null request.getParameter ("Codice"): null

ho capito che getParameterMap () ha un parametro "v-loc". Ma se lo uso variabile devo scrivere del codice per ottenere parametro URL da questa variabile:

v-loc: host/myvaadinapp/?code=erefdvdfgftf... tema: Renna v-rtzo: -600 v-dston: false ...

Penso, non è una soluzione troppo bella.

Potresti aiutarmi come posso ottenere i parametri dell'URL originale in vaadin?

Grazie.


Il mio commento è:

ho cercato di usare request.getParameter ("Codice"), ma non funzionava. Non so perché.

mio url originale era: host/demoVaadinApp/?name=zzz

Ho usato questo codice:

public class Xxxx extends UI 
    { 
     /** 
    * Main UI 
    */ 
    @Override 
    protected void init(VaadinRequest request) 
    { 
     String name = request.getParameter("name"); 
     if (name == null) 
      { 
      name = "Unknown"; 
     } 

     setContent(new Label("Hello " + name)); 
     } 
    } 

comincio la mia domanda Vaadin in modalità Embedding UI.

contenuto del mio file web.xml:

<!-- ******************************************************************* --> 
<!-- context parameters             --> 
<!-- ******************************************************************* --> 
<context-param> 
    <description>Vaadin production mode</description> 
    <param-name>productionMode</param-name> 
    <param-value>false</param-value> 
</context-param> 

<!-- ******************************************************************* --> 
<!-- servlet definition             --> 
<!-- ******************************************************************* --> 
<!-- +++++ Vaadin servlet +++++++++++++++++++++++++++++++++++++++++++++ --> 
<servlet> 
    <servlet-name>VaadinServlet</servlet-name> 
    <servlet-class>com.vaadin.server.VaadinServlet</servlet-class> 
    <init-param> 
     <description>Vaadin UI class</description> 
     <param-name>UI</param-name> 
     <param-value>com.coupoholics.ui.admin.AdminUi</param-value> 
    </init-param> 
</servlet> 
<servlet-mapping> 
    <servlet-name>VaadinServlet</servlet-name> 
    <url-pattern>/VAADIN/*</url-pattern> 
</servlet-mapping> 

<!-- ******************************************************************* --> 
<!-- welcome file list definition          --> 
<!-- ******************************************************************* --> 
<welcome-file-list> 
    <welcome-file>index.html</welcome-file> 
</welcome-file-list> 

index.html:

<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
</head> 

<body> 
    <script type="text/javascript" src="./VAADIN/vaadinBootstrap.js"></script> 
    <iframe tabindex="-1" id="__gwt_historyFrame" style="position: absolute; width: 0; height: 0; border: 0; overflow: hidden" src="javascript:false"></iframe> 

       <div id="content-body"> 
        <!-- Optional placeholder for the loading indicator --> 
        <div class=" v-app-loading"></div> 
        <!-- Alternative fallback text --> 
        <noscript>You have to enable javascript in your browser to use this application.</noscript> 
       </div> 

    <!-- Initializing the UI --> 
    <script type="text/javascript"> 
     //<![CDATA[ 
      if (!window.vaadin) 
       alert("Failed to load the bootstrap JavaScript:" + "VAADIN/vaadinBootstrap.js"); 

      /* The UI Configuration */ 
      vaadin.initApplication("content-body", { 
       "browserDetailsUrl": "VAADIN", 
       "serviceUrl": "VAADIN", 
       "widgetset": "com.vaadin.DefaultWidgetSet", 
       "theme": "reindeer", 
       "versionInfo": {"vaadinVersion": "7.0.5"}, 
       "vaadinDir": "VAADIN/", 
       "heartbeatInterval": 300, 
       "debug": true, 
       "standalone": false, 
       "authErrMsg": { 
        "message": "Take note of any unsaved data, "+ 
          "and <u>click here<\/u> to continue.", 
        "caption": "Authentication problem" 
       }, 
       "comErrMsg": { 
        "message": "Take note of any unsaved data, "+ 
          "and <u>click here<\/u> to continue.", 
        "caption": "Communication problem" 
       }, 
       "sessExpMsg": { 
        "message": "Take note of any unsaved data, "+ 
          "and <u>click here<\/u> to continue.", 
        "caption": "Session Expired" 
       } 
     });//]]> 
     </script> 

</body> 

Il mio risultato è: Ciao sconosciuta.

Se non utilizzo la modalità di incorporamento dell'interfaccia utente, tutto funziona perfettamente.

Dov'è il problema?


La soluzione (grazie per Leif Åstrand):

var = urlParts window.location.href.split ("?");

var queryString = (urlParts.length == 1)? "": "?" + urlParts [1];

queryString = (urlParts.length == 0)? "": queryString.split ("#") [0];

e

"browserDetailsUrl": "Vaadin" + queryString,

Il codice sorgente completo:

<!-- Initializing the UI --> 
    <script type="text/javascript"> 
     var urlParts = window.location.href.split("?"); 
     var queryString = (urlParts.length == 1) ? "" : "?" + urlParts[1]; 
     queryString = (urlParts.length == 0) ? "" : queryString.split("#")[0]; 

     //<![CDATA[ 
      if (!window.vaadin) 
       alert("Failed to load the bootstrap JavaScript:" + "VAADIN/vaadinBootstrap.js"); 

      /* The UI Configuration */ 
      vaadin.initApplication("content-body", { 
       "browserDetailsUrl": "VAADIN" + queryString, 
       "serviceUrl": "VAADIN", 
          ... 

risposta

10

Il motivo di questo comportamento è che UI.init viene richiamato da una richiesta che non viene sempre apportata allo stesso URL utilizzato per caricare l'applicazione. Questo è particolarmente vero quando si incorpora l'interfaccia utente invece di servirla come applicazione standalone.

La richiesta di inizializzazione dell'interfaccia utente (denominata "richiesta dettagli browser" in alcune parti del codice) viene inviata per impostazione predefinita allo stesso URL utilizzato per caricare la pagina. Questo ovviamente non funziona quando si incorpora poiché non esiste un servlet Vaadin mappato a quell'URL, quindi è necessario definire un browserDetailsUrl per indicare dove deve essere inviata la richiesta.

v-loc che si osserva internamente utilizzato per inizializzare il valore restituito da Page.getLocation().

per risolvere il tuo problema particolare, vorrei suggerire una di queste opzioni:

  1. Dyncamically generare browserDetailsUrl per includere il parametro desiderato come parametro di query, ad esempio, "browserDetailsUrl": "VAADIN?code=erefdvdfgftf".
  2. Estrarre il valore da Page.getLocation().getQuery(). Questo è leggermente meno brutto rispetto all'utilizzo dello v-loc scoperto in quanto non si basa su dettagli di implementazione.
+0

Grazie per la risposta! Ho risolto e ho condiviso la mia soluzione sopra. – zappee

4

Dovrebbe funzionare con: request.getParameter ("Codice") .

+0

Grazie per la risposta. Sì, questo codice dovrebbe funzionare. Questa pagina wiki descrive tutto molto bene: https://vaadin.com/wiki/-/wiki/Main/Using%20URI%20or%20parameters%20or%20screen%20size%20when%20initializing%20an%20application I ho passato molte ore a risolvere il mio problema e ho capito qual è il mio problema. Ma non posso ancora risolverlo. Sto usando la modalità di incorporamento dell'interfaccia utente e penso che questo sia il problema. Se non utilizzo la modalità di incorporamento dell'interfaccia utente di request.getParameter ("codice") funziona. Si prega di leggere i miei commenti sopra. Grazie. – zappee