2010-08-09 9 views
5

Ich verwende RichFaces-Komponentenbibliothek und möchte den Verlauf der Ajax-Navigation verwalten, damit der Endbenutzer die Vor- und Zurück-Schaltflächen des Browsers verwenden kann.Verwalten in Richfaces

Gibt es einen sauberen Weg, es zu tun, Muster, Bibliothek, etc?

+1

Ajax Navigation für welche Komponente? –

+0

Ein Mechanismus zum Abrufen des alten Zustands für Komponenten durch diese navigieren. – imrabti

Antwort

4

können Sie RSH verwenden Ajax Geschichte

Für das Beispiel zu handhaben lässt vermuten, dass Sie eine Seite, wo der Benutzer eine Farbe auswählen sollten. Dann wird die ausgewählte Farbe mit XmlHttpRequest auf dem Server veröffentlicht.

Jetzt möchten wir die vorherige Auswahl wiederherstellen, wenn die Navigationstasten vorwärts und rückwärts gedrückt werden.

Codebeispiel

Bean:

public class Bean { 

    private static final String DAFAULT_COLOR = "green"; 

    private Map<String, Color> colors; 
    private Color selectedColor; 
    private String restoredColor; 

    @PostConstruct 
    public void init() { 
     this.colors = new HashMap<String, Color>(); 
     this.colors.put("green", new Color("Green", "008000")); 
     this.colors.put("blue", new Color("Blue", "0000FF")); 
     this.colors.put("red", new Color("Red", "FF0000")); 
     this.colors.put("purple", new Color("Purple", "FF0000")); 
     this.colors.put("purple", new Color("Purple", "800080")); 
     this.colors.put("yellow", new Color("Yellow", "FFFF00")); 
     this.colors.put("silver", new Color("Silver", "C0C0C0")); 
     this.colors.put("black", new Color("Black", "000000")); 
     this.colors.put("white", new Color("White", "FFFFFF")); 

     this.selectedColor = this.colors.get(DAFAULT_COLOR); 
    } 

    public void setSelectedColor(ActionEvent event) { 
     UIComponent component = event.getComponent(); 
     String color = ((String)component.getAttributes().get("color")).toLowerCase(); 
     this.selectedColor = this.colors.get(color); 
    } 

    public void restoreColor() { 
     if(restoredColor.equals("") || restoredColor.equals("null")) { 
      restoredColor = DAFAULT_COLOR; 
     } 

     this.selectedColor = this.colors.get(restoredColor); 
    } 

    public List<Color> getColors() { 
     return Arrays.asList(colors.values().toArray(new Color[0])); 
    } 

    public Color getSelectedColor() { 
     return selectedColor; 
    } 

    public String getRestoredColor() { 
     return restoredColor; 
    } 

    public void setRestoredColor(String restoredColor) { 
     this.restoredColor = restoredColor.toLowerCase(); 
    } 

} 

Ausblick:

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:t="http://myfaces.apache.org/tomahawk" 
    xmlns:c="http://java.sun.com/jstl/core" 
    xmlns:a4j="http://richfaces.org/a4j" 
    xmlns:rich="http://richfaces.org/rich" 
    template="/WEB-INF/template/default.xhtml"> 

<ui:define name="head"> 
    <script type="text/javascript" src="#{request.contextPath}/js/rsh/rsh.js"></script> 
    <script type="text/javascript"> 
     window.dhtmlHistory.create({ 
      toJSON: function(o) { 
       return Object.toJSON(o); 
      }, 
      fromJSON: function(s) { 
       return s.evalJSON(); 
      } 
     }); 

     Event.observe(window, 'load', function() { 
      dhtmlHistory.initialize(); 
      dhtmlHistory.addListener(handleHistoryChange); 
     }); 

     var registerHistoryPoint = function(newLocation, historyData) { 
      dhtmlHistory.add(newLocation, historyData); 
     }; 
    </script> 
</ui:define>  

<ui:define name="content"> 
    <a4j:form id="frmColor"> 
     <div class="colors"> 
      <ul> 
       <a4j:repeat value="#{bean.colors}" var="color"> 
        <li style="background:##{color.hex};"> 
         <a4j:commandLink value="&#160;" 
          actionListener="#{bean.setSelectedColor}" 
          reRender="frmColor" 
          oncomplete="registerHistoryPoint('#{color.name}', '#{color.name}');"> 
          <f:attribute name="color" value="#{color.name}"/> 
         </a4j:commandLink> 
        </li> 
       </a4j:repeat> 
      </ul> 
     </div> 
     <div class="selection" style="background:##{bean.selectedColor.hex};"> 
      <div class="selected-color" 
       style="color: ##{bean.selectedColor.name eq 'White' or 
         bean.selectedColor.name eq 'Yellow' ? '000000' : 'ffffff'}"> 
       <h:outputText value="#{bean.selectedColor.name}"/> 
      </div> 
     </div> 
     <a4j:jsFunction name="handleHistoryChange" reRender="frmColor" 
      action="#{bean.restoreColor}"> 
      <a4j:actionparam name="historyData" assignTo="#{bean.restoredColor}" /> 
     </a4j:jsFunction> 
    </a4j:form> 
</ui:define> 
</ui:composition> 

Nun, wenn der Benutzer klicken Sie auf eine Farbe der registerHistoryPoint aufgerufen wird. Dadurch wird historyData registriert, das an die Bean übergeben wird, wenn die Zurück- und Vorwärts-Taste gedrückt wird.

z.B.

  • Benutzer wählen Gelb.
  • Gelb ist registriert.
  • Benutzer wählen Blau.
  • Blau ist registriert.
  • Benutzer klicken auf zurück.
  • Gelb ist wiederhergestellt.
  • Benutzer klicken vorwärts.
  • Blau ist wiederhergestellt.
+0

Danke, ich werde es versuchen und sehen, ob es funktioniert. – imrabti

+0

historyData wo es verwendet wird? – imrabti

+0

Es wird von RSH als ein Argument für die Funktion, z.B. wenn die Zurück-Taste gedrückt wird. Sie sollten dies auf der Serverseite behandeln. –