2011-01-15 3 views
4

Я новичок в GWT ... Я хотел бы реализовать сеансы в своем веб-приложении В принципе, я хочу, чтобы сеанс начинался одним нажатием кнопки (обрабатывать событие) и заканчивался нажатием кнопки другая кнопка (другое событие - событие). Возможно?HTTPSession с GWT

Как это сделать шаг за шагом?

Это хорошо этот код ?:

Main (на стороне клиента):

Button b1 = new Button("b1"); 
b1.addClickHandler(new ClickHandler) { 
     public voin onClick(){ 
       ... 
      rpc.setSession(callback); //rpc call the service... 

    } 
} 

Button b2 = new Button("b2"); 
b1.addClickHandler(new ClickHandler) { 
     public voin onClick(){ 
       ... 
      rpc.exitSession(callback); 

    } 
} 

// ----------------- -------------------------------------------------- -----------------

import com.google.gwt.user.client.rpc.RemoteService; 

public interface MySession extends RemoteService { 

    public void setSession(); 

    public void exitSession(); 
} 

// ------------------------ -------------------------------------------------- ----------

import com.google.gwt.user.client.rpc.AsyncCallback; 

public interface MySessionAsync { 

    void setSession(AsyncCallback<Void> callback); 

    void exitSession(AsyncCallback<Void> callback); 

} 

// ------------------------------------------ ------------------------------------------

import de.vogella.gwt.helloworld.client.MySession; 

public class MySessionImpl extends RemoteServiceServlet implements MySession { 

    HttpSession httpSession; 
    @Override 

    public void setSession() { 
     httpSession = getThreadLocalRequest().getSession(); 

     httpSession = this.getThreadLocalRequest().getSession(); 
     httpSession.setAttribute("b", "1"); 

    } 

    @Override 
    public void exitSession() { 
      httpSession = this.getThreadLocalRequest().getSession(); 
      httpSession.invalidate(); // kill session  
    } 

} 

Что Я делаю, я подключаюсь к своему веб-приложению на другую веб-страницу, если я нажму кнопку «Назад» браузера, которую я верну в свое веб-приложение с еще живым сеансом ... Как я могу это сделать?

Я надеюсь, что я хорошо объяснил, что моя проблема ...

***** NEW ПРОБЛЕМА *** **

Я пытался сделать это ...

--- стороне клиента .... MAIN:

 MyServiceAsync service = (MyServiceAsync) GWT.create(MyService.class); 
     ServiceDefTarget serviceDef = (ServiceDefTarget) service; 
     serviceDef.setServiceEntryPoint(GWT.getModuleBaseURL()+ "rpc"); 

     boolean b=false;; 

     b=service.checkSession(new AsyncCallback<Boolean>() { 

      @Override 
      public void onSuccess(Boolean result) { 
       // here is the result 
       if(result){ 
         // yes the attribute was setted 
        } 
      } 

      @Override 
      public void onFailure(Throwable caught) { 
       Window.alert(caught.getMessage()); 

      } 
     }); 

     if (b==false){ // se non esiste una sessione 
     RootPanel.get().add(verticalPanel); 
     RootPanel.get().add(etichetta); 
     RootPanel.get().add(nameField); 
     RootPanel.get().add(sendButton); 
     RootPanel.get().add(horizontalPanel); 

     } 

     else{ //esiste già una sessione attiva (pagina da loggato) 
      welcome.setText("Ciao "+userCorrect+"!!"); 
      RootPanel.get().add(verticalPanelLog); 
      RootPanel.get().add(etichetta); 
      RootPanel.get().add(nameField); 
      RootPanel.get().add(cercaLog); 
      RootPanel.get().add(horizontalPanel); 
     } 

////////////////////////////// //////////////////////////////////////////

public interface MyServiceAsync { 
... 

    void exitSession(AsyncCallback<Void> callback); 

    void setSession(AsyncCallback<Void> callback); 

    void checkSession(AsyncCallback<Boolean> callback); //error!! 

/////////////////////////////////////////// /////////////////////////////

public interface MyService extends RemoteService { 
    /..... 

    public void setSession(); 

    public void exitSession(); 

    public boolean checkSession(); 

////////////// ////////////////////////////////////////////////// ////////

стороне сервера:

public boolean checkSession() { 

     httpSession = this.getThreadLocalRequest().getSession(); 

     //se la sessione esiste già 
     if (httpSession.getAttribute("b")!= null){ 
      return true; 
     } 
     else{ . 
      return false; 
     } 

ответ

10

сеанса в GWT является s аналогично сеансу в сервлете. Разница заключается в сервлет вызове
HTTPSession session = request.getSession();

в GWT вы звоните

HttpServletRequest request = this.getThreadLocalRequest();, чтобы получить запрос, а затем снова request.getSession();

в вашей ситуации вы должны вызвать RPC, когда нажать на кнопку и управлять сессию сервер предыдущего кода и вызвать другой RPC при нажатии другой кнопки и аннулировать сеанс.Вот пример;

Button b1 = new Button("b1"); 
b1.addClickHandler(new ClickHandler) { 
    // call RPC and 
    // session = this.getThreadLocalRequest().getSession(); 
    // session.setAtribute("b", "1"); 
} 


Button b2 = new Button("b2"); 
b1.addClickHandler(new ClickHandler) { 
    // call RPC and 
    // session = this.getThreadLocalRequest().getSession(); 
    // session.invalidate(); // kill session 
} 

Эта ссылка может быть полезной для вас Using Servlet Sessions in GWT

Edit:

Если вы хотите проверить, является ли сессии isExist() или не попробовать это

добавить в интерфейс boolean test(String attr);
добавить в ваш .async добавить void test(String attr, AsyncCallback<Boolean> callback);
добавить в свой .impl

@Override 
public boolean test(String attr) { 
    return session.getAttribute(attr) != null; 
} 

и просто позвоните

Rpc.test(attribute, new AsyncCallback<Boolean>() { 

     @Override 
     public void onSuccess(Boolean result) { 
      // here is the result 
      if(result){ 
        // yes the attribute was setted 
       } 
     } 

     @Override 
     public void onFailure(Throwable caught) { 
      Window.alert(caught.getMessage()); 

     } 
    }); 
+0

Привет Хилал, спасибо за ответ ... но я не понимаю:. HttpSession HTTPSession = getThreadLocalRequest() getSession () должны быть включены в «impl» на стороне сервера справа? Если не слишком много проблем, не могли бы вы привести мне пример кнопок «RPC call» внутри? Спасибо – JackDaniels

+0

например ... У меня есть интерфейс «MySession», «MySessionAsync» на стороне клиента, и у меня есть «MySessionImpl» на серверной стороне. Что я должен положить в эти контейнеры? – JackDaniels

+0

Да, он должен быть включен в «impl». вы не можете сделать это на стороне клиента. Для каждого действия сервера вы должны позвонить rpc –

Смежные вопросы