Announcement

Collapse
No announcement yet.

Stateful und stateless vertauscht??

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Stateful und stateless vertauscht??

    Hallo, ich habe eben angefangen mich mit EJB 3.0 zu beschäftigen und hab da mal eine kleine Web Applikation geschrieben um die Unterschiede zwischen @Stateful und @Stateless zu verdeutlichen. Dabei addiere ich einfach zwei Zahlen und gebe diese auf der nächsten Seite aus. Zusätzlich wird ein Counter hochgezählt. Und nun zu meinem Problem: Der counter des @Stateless EJB verhält sich richtig und zählt immer schön weiter hoch. Der counter des @Stateful EJB zeigt immer 1 an. Sollte das nicht eigentlich genau umgekehrt sein? Ich habe eigentlich gelesen, das @Stateless Objekte immer nur für die Dauer des Methodenaufrufes existieren... Bitte um Aufklärung...

    Code entfernt -> siehe Beitrag 3 (Christian)

    Bedanke mich im Voraus, mit den besten Grüßen

    Che
    Zuletzt editiert von Christian Marquardt; 31.08.2010, 16:45.

  • #2
    Es gibt hier eine Codeformatierung, dann ist das lesbar
    Christian

    Comment


    • #3
      ===========stateful==================
      Code:
      package ejbs;
      
      import javax.ejb.Stateful;
      
      @Stateful(name="StatefulSessionBean")
      public class StatefulSessionBean {
      
      public int addition(int a, int b){
      
      return a+b;
      }
      private int actionCount = 0;
      
      public int getActionCount() {
      return this.actionCount;
      }
      
      public void increment() {
      actionCount++;
      }
      }
      ==============stateless===============
      Code:
      package ejbs;
      
      import javax.ejb.Stateless;
      
      @Stateless(name="StatelessSessionBean")
      public class StatelessSessionBean {
      
      public int addition(int a, int b){
      
      return a+b;
      }
      private int actionCount = 0;
      
      public int getActionCount() {
      return this.actionCount;
      }
      
      public void increment() {
      actionCount++;
      }
      
      }
      =============Methodenaufruf aus JSF Managed Bean===============
      Code:
      @ManagedBean(name = "BeanManager")
      @SessionScoped
      public class BeanManager {
      
      @EJB
      private StatelessSessionBean statelessSessionBean;
      @EJB
      private StatefulSessionBean statefulSessionBean;
      protected String greeting;
      protected int firstValue;
      protected int secondValue;
      protected int resultAdd;
      protected int resultAdd2;
      
      protected int counterLes;
      protected int counterFul;
      
      ... getter und setter...
      
      public BeanManager() {
      greeting = "Hello earthling";
      firstValue = 0;
      secondValue = 0;
      resultAdd = 0;
      resultAdd2 = 0;
      }
      
      public String addStateless() {
      resultAdd = statelessSessionBean.addition(firstValue, secondValue);
      statelessSessionBean.increment();
      counterLes = statelessSessionBean.getActionCount();
      resultAdd2 = statefulSessionBean.addition(firstValue, secondValue);
      statefulSessionBean.increment();
      counterFul = statefulSessionBean.getActionCount();
      return "success";
      }
      }
      ===================index.xhtml==================== ==
      HTML Code:
      <?xml version='1.0' encoding='UTF-8' ?>
      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      <html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
      <h:head>
      <title>Facelet Title</title>
      </h:head>
      <h:body>
      <h:form>
      
      <h1><h:outputText value="Some calculations" /></h1>
      <h2><h:outputLabel value="addition, stateless "/></h2>
      <h:panelGrid columns="2">
      <h:outputLabel value="greeting: "/>
      <h:inputText value="#{BeanManager.greeting}"/>
      <h:outputLabel value="input first value: "/>
      <h:inputText value="#{BeanManager.firstValue}"/>
      <h:outputLabel value="input second value: "/>
      <h:inputText value="#{BeanManager.secondValue}"/>
      </h:panelGrid>
      <br/>
      <h:commandButton action="#{BeanManager.addStateless}" value="submit"/>
      
      </h:form>
      </h:body>
      </html>
      ====================result.xhtml================== ====
      HTML Code:
      <?xml version='1.0' encoding='UTF-8' ?>
      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      <html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
      <h:head>
      <title>Facelet Title</title>
      </h:head>
      <h:body>
      <h:form>
      <h:outputText value="#{BeanManager.greeting}"/>
      <br/>
      <h:outputText value="stateless result: #{BeanManager.result}"/>
      <br/>
      <h:outputText value="stateful result: #{BeanManager.resultAdd2}"/>
      <br/>
      <h:outputText value="You used this tool: #{BeanManager.counterLes} times(stateless)"/>
      <br/>
      <h:outputText value="You used this tool: #{BeanManager.counterFul} times(stateful)"/>
      <br/>
      <h:commandButton action="return" value="return"/>
      </h:form>
      </h:body>
      </html>
      Danke für den Hinweis, ist das jetzt besser so??

      Comment


      • #4
        Könnte an

        @SessionScoped

        der Bean liegen
        Christian

        Comment


        • #5
          Hallo Christian, danke erstmal für die schnelle Antwort,

          hab das eben in @RequestScoped geändert, hat aber keine Wirkung gezeigt. In was sollte ich das ändern deiner Meinung nach ändern?

          Hier noch ein kleinerHinweis, das der Counter nicht hochzählt liegt daran, dass jedes mal ein neues Objekt vom @Stateful EJB erzeugt wird. Beim @Stateless ist es genau umgekehrt, da wird die Session über immer das gleiche Objekt verwendet...

          Comment


          • #6
            Update

            Wen es interessiert:

            Wenn ich das Stateful bean weiter verwenden möchte, muss ich seine id abspeichern, weil der Container ansonsten für jede neue Anfrage ein neues Statefulbean erzeugt...

            Comment

            Working...
            X