2009-06-30 7 views
0

Ich habe eine Seam-Anwendung, die ursprünglich von seam-gen mit einer Ansicht Search.xhtml generiert wurde.So konditionieren Sie die Navigation in der Naht eines Parameters

Search.xhtml hat eine Reihe von Eingabefeldern, von denen die Hälfte an die Office-Entität und die andere an die Entitäten Devices gebunden ist.

Wenn Sie beispielsweise einen Hostnamen eingeben, wird dieser an ein Feld in Geräte gebunden. Wenn Sie eine Stadt eingeben, ist sie an ein Feld in Office gebunden.

Die Zielseite wird standardmäßig OfficeResult.xhtml sein, oder, wenn eine "Geräte" -Eigenschaft eingegeben wurde, zu DeviceResult.xhtml.

Meine Frage hat zwei Teile:

  1. Welche Komponente sollte ich in Search.xhtml verwenden für den Absenden-Button? Ich nehme h: commandButton an, aber was nenne ich dann für die Aktion? Wenn ich eine Zielansicht verwende, wird diese durch die Navigationsregel in der Datei page.xml überschrieben?

  2. Wie richte ich meine Search.page.xml-Datei ein? Wie bediene ich die Navigation auf dem Parameter?

Hier ist Search.xhtml (Pseudocode):

<h:inputText value="#{devicesList.devices.devSerialNum}" /> 
<h:inputText id="state" value="#{officeList.office.state}" /> 

<h:commandButton id="search" action="/OfficeResult.xhtml" value="Search" /> 

Search.page.xml (Pseudocode):

<navigation> 
    <rule if devSerNum is set > 
<redirect view-id="/DeviceResult.xhtml"/> 
    </rule> 
    <rule if state is set > 
    <redirect view-id="/OfficeResult.xhtml"/> 
    </rule> 
</navigation> 
+0

Update: in der Ansicht: im page.xml: \t Ich kann immer noch keine Regel zum arbeiten bekommen. Ich habe sogar versucht: Dieses doesn führe mich nicht zu OfficeResult.xhtml. Ich kann keine Regel bekommen oder wenn ich an Bedingungen gebunden bin. ? –

Antwort

0

Wenn ich Ihre Frage richtig zu verstehen, und basierend auf dem aktuellen Design, ich glaube, Sie etwas ähnliches wie dies tun könnte:

Ihre Search.xhtml Datei:

<h:inputText value="#{devicesList.devices.devSerialNum}" /> 
<h:inputText id="state" value="#{officeList.office.state}" /> 

<h:commandButton id="search" action="#{devicesList.isDeviceSearch()}" value="Search" /> 

eine neue Methode, um Ihre DevicesList.java Datei hinzufügen

@Name("devicesList") 
public class DevicesListImpl implements DevicesList { 

    ...other properties and methods... 

    public boolean isDeviceSearch() { 

     boolean result; 

     ...logic to determine if the search value exists... 

     return result; 

    } 
} 

Und dann in Ihrer Search.page.xml Datei:

<navigation from-action="#{devicesList.isDeviceSearch()}"> 
    <rule if-outcome="true"> 
     <redirect view-id="/DeviceResult.xhtml" /> 
    </rule> 

    <redirect view-id="/OfficeResult.xhtml" /> 
</navigation> 
+0

Eigentlich habe ich so etwas gemacht. Aber anstatt die Navigation zur Datei page.xml hinzuzufügen, fand ich es viel einfacher, die View-ID einfach aus der Subroutine zurückzugeben. Mit anderen Worten, anstatt "Ergebnis zurückgeben"; Ich habe "/DeviceResult.xhtml" oder "/OfficeResult.xhtml" von isDeviceSearch() bedingt zurückgegeben. –

+0

Ja, das ist eine andere Art, wie Sie es tun können, obwohl einige argumentieren würden, dass Sie Ihre Navigationslogik dann mit Ihrer Geschäftslogik mischen, dh ob Ihre DevicesList-Klasse tatsächlich von den Seiten weiß und welche gerendert werden sollen? Aber das ist etwas für dich zu entscheiden. Froh, dass es funktioniert hat;) –

0

ich einige Schwierigkeiten gehabt haben, zu verstehen, wie die Navigation funktioniert auch. Ich schließlich habe ich bis zu einem gewissen Grad arbeite hier sind einige Ideen, die ich versuchen würde:

  1. Verwendung pages.xml zuerst mit einer überprüfen Sie Ihre Navigation arbeitet mit dem Standard, einfacher Regelsatz bekommen. /WEB-INF/pages.xml

  2. die Spur loglevel für Ihre Anwendung zu aktivieren, wenn Sie sich nicht sicher sind, was geschieht, kann die Chancen sein Seam eine Komponente nicht finden kann. 2.1 # {devicesList ...} wird möglicherweise nicht gefunden, wenn Sie es nicht in Ihre components.xml importieren, es sei denn, der Name dieser Komponente lautet devicesList. Meine Komponenten verwenden ihren voll qualifizierten Namen com.stackoverflow ... Der Vorteil ist, dass Sie Kollisionen vermeiden, aber um auf die Komponente zuzugreifen, müssen Sie den vollständigen Pfad schreiben oder einen Import durchführen, wie oben beschrieben.

  3. überprüfen Sie die Ansicht IDs existieren (/OfficeResult.xhtml und /DeviceResult.xhtml)

  4. jede Seite stellen Sie sicher, einmal

    nur erklärt
  5. Ihre command sollte eine tatsächliche Komponente aus meinem Verständnis. Wenn Sie eine searchAction haben, dann wäre es so etwas wie:

    # {searchAction.search}

prüfen die Naht Beispiele aus, sie funktionieren gut und zeigen Ihnen, wie viele verschiedene Dinge zu tun. Sie können sie im Quellcode der Quelle herunterladen, der etwa 130 MB einschließlich all dieser Beispiele enthält.

Walter

Verwandte Themen