2016-11-15 4 views
0

Ich hostet derzeit meine Vaadin App auf openshift. Meine Hauptwebseite verweist auf die vaadin App, wenn auf die Login-Schaltfläche geklickt wird. Das erste, was der Benutzer sieht, ist die Login-SeiteRedirect Vaadin App

Ich habe 2 Tasten auf meiner Website, eine kostenlose Probe-Taste und eine Login-Taste, und ich habe 2 verschiedene Klassen in meiner vaadin App, eine Login-Klasse und eine kostenlose Test-Klasse .

Wie kann ich den Login-Button in die Login-Klasse meiner vaadin-App umleiten und den kostenlosen Probe-Button in die kostenlose Test-Klasse meiner vaadin-App umleiten? Diese

ist, was es sieht derzeit wie:

@Theme("mytheme") 
@Widgetset("com.example.myapp.MyAppWidgetset") 
@PreserveOnRefresh 
public class MyUI extends UI { 

    @WebServlet(urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true) 
    @VaadinServletConfiguration(ui = MyUI.class, productionMode = false) 
    public static class MyUIServlet extends VaadinServlet { 
    } 

    @Override 
    protected void init(VaadinRequest vaadinRequest) { 
     login(); 
    } 
+0

Ich wäre geneigt, stattdessen einen Navigator zu verwenden. Sie müssten Ihren Code ein wenig umgestalten. –

+0

@Chris M Danke! Würdest du wissen, wie ich das für meine Situation umsetzen kann? Ich lese die Dokumente durch, aber ich verstehe es nicht wirklich. Wie kann ich dies verwenden, um www.trial.mywebsite.com in die trialUI-Klasse umzuleiten und www.login.mywebsite.com in die LoginUI-Klasse umzuleiten? – user3702643

Antwort

0

Sie in einem Parameter in der Anfrage übergeben konnten und einen UI-Provider verwenden, um die UI zu dienen auf diesem Parameter abhängig.

Siehe here.

Beispiel:

public class DifferentFeaturesForDifferentClients extends UIProvider { 

    @Override 
    public Class<? extends UI> getUIClass(UIClassSelectionEvent event) { 
     if ("trial".equalsIgnoreCase(event.getRequest().getParameter("app-type"))) { 
      return TrialUI.class; 
     } else { 
      return LognUI.class; 
     } 
    } 
} 

web.xml:

<servlet> 
    <servlet-name>My Vaadin App</servlet-name> 
    <servlet-class>com.vaadin.server.VaadinServlet</servlet-class> 
    <init-param> 
     <description>Vaadin UI</description> 
     <param-name>UIProvider</param-name> 
     <param-value>com.example.myexampleproject.DifferentFeaturesForDifferentClients</param-value> 
    </init-param> 
</servlet> 

Und dann in der Haupt HTML-Webseiten:

<form> 
    <input type="submit" name="app-type" value="Trial" formaction="/your/vaadin/url" formmethod="post"> 
    <input type="submit" name="app-type" value="Login" formaction="/your/vaadin/url" formmethod="post"> 

    <!-- Alternative using button tag (better for customization, but no IE < 9) --> 
    <button name="app-type" value="trial" type="submit">Trial</button> 
    <button name="app-type" value="login" type="submit">Login</button> 
</form> 
+0

Dies scheint sinnvoll zu sein, aber wie werde ich einen Parameter an meine Anfrage übergeben? – user3702643

+0

Sie könnten ein Formular in Ihrer Hauptwebsite verwenden, das einen POST-Parameter übergibt, wenn Sie es über die Schaltfläche senden, und das Formular auf die URL Ihrer vaadin-Anwendung ausrichten. – JDC

+0

Die Antwort wurde entsprechend aktualisiert. – JDC

0

Sie den Navigator verwenden können, wie Chris M sagte, oder Sie können versuchen, eine ereignisgesteuerte Architektur zu implementieren. Ich habe ein solches Projekt mit Vaadin auch mit Google Guava umgesetzt.

Hier finden Sie einige Beispiele für die Verwendung von Google Guava, wenn Sie interessiert sind. http://codingjunkie.net/guava-eventbus/

Im Folgenden finden Sie einige Code-Fragmente meiner Implementierung finden:

// Using guava 
final Button signin = new Button(
        Lang.getMessage("login.signin"), 
        eventClick -> {BarsEventBus.post(new UserLoginRequestedEvent(
          username.getValue(), password.getValue()));}); 


//Using Navigator, I also used spring here, so the registration view is a Spring View 
final Button register = new Button(
        Lang.getMessage("login.registration"), 
        clickEvent -> {getUI().getNavigator().navigateTo(ViewToken.REGISTRO);} 
        ); 


@UIScope 
@SpringView(name = ViewToken.REGISTRO) 
public class RegistrationView extends VerticalLayout implements View {...} 

Überprüfen Sie bitte den Code für die Vaadin Demo-Anwendung. Dieser Code hat ein Beispiel dafür, wie man damit umgehen soll. Finden Sie es hier: https://github.com/vaadin/dashboard-demo

0

Ich verstehe jetzt, was Sie tun sollten. Du kannst das ganz leicht machen. Sie müssen den VaadinRequest in einen VaadinServletRequest umwandeln. Der Grund dafür, dass ein VaadinRequest und nicht ein VaadinServletRequest übergeben wird, besteht darin, dass Sie Ihre Anwendung auch als Portlet bereitstellen können. In diesem Fall müssten Sie ihn stattdessen in VaadinPortletRequest umwandeln. Dann können Sie den vom Benutzer bereitgestellten Servernamen verwenden.

@Override 
    protected void init(VaadinRequest vaadinRequest) { 
     VaadinServletRequest req = (VaadinServletRequest) vaadinRequest; 
     String serverName = req.getServerName(); 
     if (serverName.equals("www.login.mywebsite.com")) 
     { 
      login(); 
     } 
     else 
     { 
      trial(); 
     } 
    } 
+0

Das macht fast das, was ich will, aber ich leite meine App von openshift auf login.mywebsite.com um. Der von Ihnen angegebene Code gibt mir die URL für openshift und nicht für login.mywebsite.com. Hast du eine Arbeit dafür? – user3702643