2017-10-16 6 views
1

Vaadin (Vaadin Framework 8)을 통해 웹 앱을 만들려고합니다.동적 콘텐츠로 Vaadin 웹 앱 만들기

문서의 여러 페이지를 읽었지 만 여전히 Vaadin 앱의 구조와 관련하여 큰 문제가 있습니다. 내 문제는 내가 그 이론에 대한 무언가 부족하다는 것이다. 그리고 나는 문제의 코드를 첫 번째 시도로 드러내려고 노력할 것이다. Vaadin의 작동 방식을 이해하는 데 도움이되는 정보를 보내 주시면 감사하겠습니다.

사용자가 등록하고 로그인하고 로그 아웃 할 수있는 웹 사이트를 만들고 싶습니다.

웹 사이트의 GUI의 구조는 인 대신 의, 거기에 사용자가 로그인하지 않은 경우 로그인을 할 수있는 그런 버튼이나 뭐 같은이며, 사용자가 로그인하면 홈페이지 로그인 버튼 일 경우 로그 아웃 버튼으로 표시됩니다.

우선, 확장 클래스가 있습니다. UI; 그 클래스에서 서블릿과 init() 메소드를 설정했습니다. init() 방법에

, I는 VerticalLayout() 생성을 시작, 다음 MenuBarPanel은 (이 ContentPanel 불림). 그런 다음 Navigator을 만듭니다. 내가 처음 만나는 첫 번째 문제는 네비게이터가 다른 페이지를 탐색 할 가능성이 있다는 것을 이해한다는 것입니다. 네비게이터의 생성자는 SingleComponentContainer을 원하기 때문에 다른 웹 페이지를 탐색하는 방법을 모르겠습니다. 예를 들어, 생성자에서 Panel을 사용합니다 : new Navigator(this, contentPanel); 그러면 다른 패널에 View이 추가됩니다. 마지막으로 Welcome 페이지로 이동합니다.

MyUI 클래스 :

public class MyUI extends UI { 

    /** 
    * Class that checks if the user is in the database 
    * and the psw inserted is correct 
    */ 
    public static Authentication AUTH; 
    public static User user = null; 

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

    @Override 
    protected void init(VaadinRequest request) { 

     AUTH = new Authentication(); 

     VaadinSession.getCurrent().setAttribute("user", user); 

     final VerticalLayout layout = new VerticalLayout(); 
     layout.setMargin(true); 
     setContent(layout); 

     Panel contentPanel = new Panel("Main Panel"); 
     contentPanel.setSizeFull(); 

     new Navigator(this, contentPanel); 
     getNavigator().addView(LoginPage.NAME, LoginPage.class); 
     getNavigator().setErrorView(LoginPage.class); 
     getNavigator().addView(LogoutPage.NAME, LogoutPage.class); 
     getNavigator().addView(WelcomePage.NAME, WelcomePage.class); 

     MenuBar.Command welcome = new Command() { 
      @Override 
       public void menuSelected(MenuItem selectedItem) { 
        getNavigator().navigateTo(WelcomePage.NAME); 
       } 
     }; 

     MenuBar.Command login = new Command() { 
      @Override 
      public void menuSelected(MenuItem selectedItem) { 
       getNavigator().navigateTo(LoginPage.NAME); 
      } 
     }; 

     MenuBar.Command logout = new Command() { 
      @Override 
      public void menuSelected(MenuItem selectedItem) { 
       getNavigator().navigateTo(LogoutPage.NAME); 
      } 
     }; 

     MenuBar mainMenu = new MenuBar(); 
     mainMenu.addItem("Welcome", VaadinIcons.ARROW_CIRCLE_LEFT, welcome); 
     mainMenu.addItem("Login", VaadinIcons.ENTER, login); 
     mainMenu.addItem("Logout", VaadinIcons.EXIT, logout); 

     layout.addComponent(mainMenu); 
     layout.addComponent(contentPanel); 

     getNavigator().navigateTo(WelcomePage.NAME); 

    } 

} 

LoginPage 클래스 :

public class LoginPage extends VerticalLayout implements View { 

    private static final long serialVersionUID = 1L; 
    public static final String NAME = "loginpage"; 

    public LoginPage(){ 

     Panel panel = new Panel("Login"); 
     panel.setSizeUndefined(); 
     addComponent(panel); 

     FormLayout content = new FormLayout(); 
     TextField username = new TextField("Username"); 
     content.addComponent(username); 
     PasswordField password = new PasswordField("Password"); 
     content.addComponent(password); 

     Button send = new Button("Enter"); 

     send.addClickListener(new Button.ClickListener() { 
      private static final long serialVersionUID = 1L; 

      public void buttonClick(ClickEvent event) { 

       //The authenticate method will returns 
       //true if the credentials are correct 
       //false otherwise 
       if(MyUI.AUTH.authenticate(username.getValue(), password.getValue())){ 

        //In AUTH there is a User field called "user" 
        //User is a class that represents an user (so it has mail, psw, name etc) 
        VaadinSession.getCurrent().setAttribute("user", MyUI.AUTH.getUser()); 

       }else{ 
        Notification.show("Invalid credentials", Notification.Type.ERROR_MESSAGE); 
        } 

       } 
      }); 

     content.addComponent(send); 
     content.setSizeUndefined(); 
     content.setMargin(true); 
     panel.setContent(content); 
     setComponentAlignment(panel, Alignment.MIDDLE_CENTER); 

    } 

} 

아웃 클래스 로그인 클래스의 동일한 구조를 갖는다;

private void doLogout() { 

    MyUI.AUTH.setUser(null); 
    VaadinSession.getCurrent().setAttribute("user", MyUI.AUTH.getUser()); 
    getSession().close(); 

} 

또 다른 문제는 다음과 같습니다 : 나는 동적으로 사용자 상태 (? 로그인 여부)에 내놓고, 내 레이아웃에 구성 요소를 추가 할 수있는 방법

다음 문제가 : 로그 아웃 방법이 나는하지 않았다 효과적으로 로그 아웃하는 방법을 이해하십시오.

나는 모든 테스트를 용이하게하기 위해 완전한 코드를 추가 할 것입니다.

public class LogoutPage extends VerticalLayout implements View { 

    private static final long serialVersionUID = 1L; 
    public static final String NAME = "logoutpage"; 

    public LogoutPage(){ 

     Panel panel = new Panel("Logout"); 
     panel.setSizeUndefined(); 
     addComponent(panel); 

     Button logout = new Button("Logout"); 
     logout.addClickListener(e -> doLogout()); 
     addComponent(logout); 

    } 

    private void doLogout() { 

     MyUI.AUTH.setUser(null); 
     VaadinSession.getCurrent().setAttribute("user", MyUI.AUTH.getUser()); 
     getSession().close(); 

    } 

} 

______________________________________________________________________________ 

public class WelcomePage extends VerticalLayout implements View { 

    private static final long serialVersionUID = 1L; 
    public static final String NAME = "welcomepage"; 

    public WelcomePage() { 
     setMargin(true); 
     setSpacing(true); 
     Label welcome = new Label("Welcome"); 
     welcome.addStyleName("h1"); 
     addComponent(welcome); 

    } 

    @Override 
     public void enter(ViewChangeEvent event) { 
    } 

} 

______________________________________________________________________________ 

public class Authentication { 

    private static User user = null; 
    //those fields should be in user; this is just a test 
    private String userID = "ID"; 
    private String psw = "psw"; 

    public Authentication() { 
    } 

    public void setUser(User user) { 
     Authentication.user = user; 
    } 

    public User getUser(){ 
     return Authentication.user; 
    } 

    public Boolean authenticate(String userID, String psw){ 

     if(userID == this.userID && psw == this.psw) { 
      user = new User(); 
      return true; 
     } 

     return false; 

    } 

} 

답변

2

저는 많은 사용자가 vaadin 개념에 어려움을 겪고있는 것으로 나타났습니다.

즉, 각 마우스 클릭으로 새 페이지로 전환하는 페이지 기반 프레임 워크가 아닙니다.

대신 폼/poups/단추를 추가하고 사용자 상호 작용을 기준으로 폼/poups/단추를 수정하고 제거하는 단일 GUI 인스턴스가있는 Swing 응용 프로그램과 비슷합니다. 이를 Single-Page Application이라고합니다.

네비게이터는 주로 사용자가 웹 브라우저의 앞/뒤로 버튼을 사용하여 "이전"페이지로 이동하거나 특정 페이지를 북마크 할 수있게 해줍니다.

This link은이 개념에 대해 좀 더 자세한 정보를 제공합니다. 사용자가 올바르게위한 인증을 입력하면 팝업을 제거하고 수직 레이아웃의 주요 내용을 표시 - 로그인하지 않을 경우, 모달 로그인 팝업 을 보여 - 한 페이지/nvigation 사용 - 가 :

당신이 질문에 대답하려면 - 사용자가 로그 아웃 할 때, 당신의 간단한 사용 사례를 들어 수직 레이아웃

에서 콘텐츠를 제거 가지고 네비게이터 또는보기

1

내가 처음에 같은 문제로 실행, 작업을 할 필요가 없다 나 봄에 궁극적으로 Vaadin4Spring에 관심이있다. 을 사용하지 않아도 https://github.com/peholmst/vaadin4spring/tree/master/samples/security-sample-managed을 확인하십시오. 뷰 네비게이션에 대한 통찰력을 제공 할 것이며 Vaadin4Spring 사이드 바를 추가하면 뷰와 메뉴에 대한 액세스를 쉽게 제어 할 수 있습니다. 나는 곧 허가가 귀하의 초점이 될 것이라고 확신합니다.