Перенаправить приложение Vaadin

В настоящее время я размещаю свое приложение vaadin на openshift. Мой основной веб-сайт перенаправляется на приложение vaadin при нажатии кнопки входа. Первое, что видит пользователь — это страница авторизации.

У меня есть 2 кнопки на моем веб-сайте, кнопка бесплатной пробной версии и кнопка входа в систему, и у меня есть 2 разных класса в моем приложении vaadin: класс входа и бесплатный пробный класс.

Как сделать так, чтобы кнопка входа перенаправляла на класс входа в мое приложение vaadin, а кнопка бесплатной пробной версии перенаправляла на класс бесплатной пробной версии моего приложения vaadin?

Вот как это выглядит в настоящее время:

@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();
    }

person user3702643    schedule 15.11.2016    source источник
comment
Вместо этого я был бы склонен использовать навигатор. Однако вам нужно будет немного реорганизовать свой код.   -  person Chris M    schedule 15.11.2016
comment
@ Крис М Спасибо! Не могли бы вы понять, как реализовать это для моей ситуации? Я читал документы, но я действительно не понимаю это. Как я могу использовать это для перенаправления www.trial.mywebsite.com в класс TrialUI и перенаправления www.login.mywebsite.com в класс LoginUI?   -  person user3702643    schedule 16.11.2016


Ответы (3)


Вы можете использовать навигатор, как сказал Крис М, или вы можете попытаться реализовать архитектуру, управляемую событиями. Я реализовал такой проект, используя Vaadin и Google Guava.

Здесь вы можете найти несколько примеров того, как использовать Google Guava, если вам это интересно. http://codingjunkie.net/guava-eventbus/

Ниже вы можете найти некоторые фрагменты кода моей реализации:

// 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 {...}

Проверьте код демонстрационного приложения vaadin. В этом коде также есть пример того, как с этим справиться. Найдите его здесь: https://github.com/vaadin/dashboard-demo

person Fabri Pautasso    schedule 15.11.2016

Вы можете передать параметр в свой запрос и использовать поставщика пользовательского интерфейса для обслуживания пользовательского интерфейса в зависимости от этого параметра.

См. здесь.

Пример:

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;
        }
    }
}

веб.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>

А затем в html-коде вашего основного сайта:

<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>
person JDC    schedule 15.11.2016
comment
Кажется, это имеет смысл, но как я передам параметр моему запросу? - person user3702643; 16.11.2016
comment
Вы можете использовать форму на своем основном веб-сайте, которая передает параметр POST при отправке с помощью кнопки и нацеливает форму на URL-адрес вашего приложения vaadin. - person JDC; 16.11.2016
comment
Обновил ответ соответственно - person JDC; 16.11.2016
comment
Хорошо большое спасибо! Попробую это. Web.xml должен быть отредактирован так, как вы это сделали правильно? И я предполагаю, что это будет работать, даже если мой основной веб-сайт и приложение vaadin размещены в разных местах? - person user3702643; 17.11.2016
comment
Да, вам нужно будет включить настройку UIProvider в свой файл web.xml и удалить аннотацию. Это должно работать, если они размещены в разных местах, да. Я обновил код, чтобы правильно установить и проверить параметр. - person JDC; 17.11.2016

Теперь я понимаю, что ты собирался сделать. Вы можете сделать это довольно легко. Вам нужно преобразовать VaadinRequest в VaadinServletRequest. Причина, по которой он передает VaadinRequest, а не VaadinServletRequest, заключается в том, что вы также можете развернуть свое приложение как портлет. В этом случае вам нужно будет вместо этого привести его к VaadinPortletRequest. Затем вы можете использовать имя сервера, предоставленное пользователем.

 @Override
    protected void init(VaadinRequest vaadinRequest) {
        VaadinServletRequest req = (VaadinServletRequest) vaadinRequest;
        String serverName = req.getServerName();
        if (serverName.equals("www.login.mywebsite.com"))
        {
           login();
        }
        else
        {
            trial();
        }
    }
person Chris M    schedule 17.11.2016
comment
Это почти делает то, что я хочу, но я перенаправляю свое приложение с openshift на login.mywebsite.com. Код, который вы предоставили, дает мне URL для openshift, а не для login.mywebsite.com. У вас есть работа для этого? - person user3702643; 18.11.2016