2008-09-03 5 views
4

Ich werde etwas ausarbeiten. Jsf ist irgendwie extrem schmerzhaft, wenn man aus der Perspektive eines Designers arbeitet, etwas in der Auswahl, ein Bild zu zeichnen, während man Hände an den Rücken gebunden hat, aber es ist gut, Formulare zu kauen und viele Daten aufzulisten. Also Websites, die ich in meiner Firma mache, sind jsf admin pages und jsp user pages. Problem tritt auf, wenn Benutzerseiten einige komplizierte Formen und Sachen haben und jsf beginnt herein zu treten.Mixing Jsp und JSF

Ist hier die Frage: Ich bin auf reiner jsp Seite. Ich muss auf eine jsf-Seite zugreifen, die Session-Bean verwendet. Wie kann ich diese Bean initialisieren? Wenn ich auf der jsf-Seite wäre, könnte ich einen commandLink haben, der Daten vorbereiten würde. Einzige Sache, die ich mir vorstellen kann, ist eine Dummy-JSF-Seite, die die Arbeit erledigt und mich auf die benötigte JSF-Seite umleitet, aber das ist irgendwie hässlich, und ich möchte nicht mit 50 Dummy-Seiten enden. Ich würde lieber einen Mechanismus finden, um Bean, der bereits mit einigen gewünschten Parametern arbeitet, neu zu initialisieren.

Edit: einige weitere Details. In dieser speziellen Situation habe ich einen Test, der entweder voll oder gefiltert ist. Es ist ein gleicher Test mit der gleichen Logik und allem, außer wenn der Test gefiltert ist, sollte er einige Fragen in Abhängigkeit von den Antworten eliminieren. Nach einem Klick auf einen Link sollte ein angeforderter Test in einem der beiden Modi gestartet werden. Links sind Teile des Hauptmenübaums und sind auf vielen gleichgeordneten jsp-Seiten sichtbar. Meine Aufgabe ist es, 4 Links zu haben: testA full, testA filtered, testB full, testB filtered, dass alle auf derselben jsf-Seite führen und TestFormBean entsprechend neu initialisiert werden sollte.

Edit: Ich habe Facelets ein wenig recherchiert, und während es mir jetzt nicht helfen wird, werde ich das auf jeden Fall für das nächste Projekt behalten.

Antwort

1

Um dies zu lösen, würde ich wahrscheinlich ein JSF-Fragment erstellen, das nur Ihr Formular enthält, und dann ein Tag verwenden, um es in meine JSF-Seite aufzunehmen.

Diese Lösung ist wahrscheinlich ein wenig anfällig, abhängig von Ihrer Umgebung.

BEARBEITEN: Siehe Chris Halls Antwort, FacesContext ist außerhalb des FacesServlet nicht verfügbar.

4

Haben Sie sich mit Facelets befasst? Sie können die ganzen JSF/JSP-Unterschiede loswerden (es ist ein alternativer und besserer View-Controller).

Es unterstützt auch große Design-Time-Semantik mit dem jsfc Tag ...

<input type="text" jsfc="#{SomeBean.property}" class="foo" /> 

wird intern auf die richtigen JSF Sachen übersetzt, so dass Sie mit Ihren vorhandenen Werkzeugen arbeiten können.

0

Erstellen Sie einen benutzerdefinierten JSP-Tag-Handler. Sie können die Bean dann aus dem Sitzungsbereich abrufen und anschließend im laufenden Betrieb initialisieren. Siehe hierzu tutorial für weitere Details.

0

Eigentlich habe ich dies gelöst, indem Bean aus der Sitzung entfernt, so dass es erneut generiert werden muss, wenn JSF-Seite aufgerufen wird. Dann hole ich Parameter aus einer Anfrage im Konstruktor ab.

3

Sie können innerhalb eines Tag-Bibliothek mit so etwas wie dies eine Managed Bean abrufen:

FacesContext context = FacesContext.getCurrentInstance(); 
Object myBean = context.getELContext().getELResolver().getValue(context.getELContext(), null, "myBeanName"); 

jedoch Sie die Tag-Bibliothek von einem Ihrer JSF-Seiten verwenden müssten. FacesContext.getCurrentInstance() gibt null zurück, wenn es außerhalb des FacesServlet aufgerufen wird.