Action-Methode soll Ausgabe auf der Responsepage steuern

Status
Nicht offen für weitere Antworten.

Andreas29

Bekanntes Mitglied
Hi Leute,

ich habe eine kurze Frage:
Kann ich in JSF irgendwie in einer Action-Methode steuern, was auf der Responsepage an Text ausgegeben wird? Sehr allgemein formuliert, ich weiß, daher ein paar mehr Details:
Ich habe mehrere action-Methoden, die unterschiedliche Tests ausführen. Im Moment habe ich für die Ergebnisausgabe eine statische Seite, die einfach aussagt, dass der Test erfolgreich war. Diese Seite würde ich jetzt gerne mit Infos anreichern, die mir die action-Methode des Tests liefern soll und das ganze, wenn es geht, schön sauber getrennt (sprich ich möchte nur ungern in der action-Methode direkt auf irgendwelche UI-Elemente zugreifen). Gibt es da eine Lösung?

Grüße und vielen Dank für jede Hilfe!
Andreas
 
S

schoeso

Gast
Hi,

deine Action Methode führt Tests durch und erzeugt Ergebnisstrings. Diese Strings legst du z.B. in den Attributen einer Managed-Bean ab. Die GUI Elemente deiner Ergebnisseite bindest du an die getter Methoden der entsprechenden Attribte des Managed-Bean.

War es das?

Gruß

Arndt

www.schoenberg-schoenberg.de
 

Andreas29

Bekanntes Mitglied
Hi Arndt,

erstmal danke für Deine Antwort.
So in der Art habe ich mir das vorgestellt, ja. Was mir nur noch nicht ganz klar ist, ist die Tatsache, wie die Managed Bean dann in meine JSF Seite kommt. Ich meine, wenn ich jetzt in meiner Action-Methode eine neue Instanz meiner Bean-Klasse erzeuge und mit Werten fülle, werde ich die ja noch irgendwohin "packen" müssen, damit die Werte bei der GUI ankommen. Und dieses irgendwohin ist mein Problem.

Beispiel (fiktiv, zeigt aber das Problem...):
Code:
public String actionMethod() {
    // meine Managed Bean
    MessageBean bean = new MessageBean();
    // ein Attribute setzen
    bean.setMessage("Test blah fasel blubb");
    // und nun? wenn ich jetzt weiter nichts mache, wird der GC die Instanz wegräumen, also muss sie noch irgendwo hin, nur wo?
}

Dank dir für Deine Hilfe.

Grüße,
Andreas
 

Andreas29

Bekanntes Mitglied
Hi,

ich habe jetzt festgestellt, das es funktioniert, wenn ich die neue Bean in der requestMap speichere. Nur weiß ich nicht, ob das so der richtige Weg ist, da mich der Name requestMap doch etwas verwirrt, denn schließlich geht es ja um die response und nicht um den request. Weißt jemand, ob das so gewollt und richtig ist? Sprich, ich meine die Map, auf die ich mittels folgenden Code zugreifen kann:

Code:
FacesContext.getCurrentInstance().getExternalContext().getRequestMap()

Grüße,
Andreas
 
G

Guest

Gast
Hallo,

lass dich nicht vom Namen irritieren, die Request-Map ist einfach eine Map, die sozusagen einen Request lang lebt, die Daten bleiben also erhalten, bis der Response fertig ist (genauer gesagt halt, bis der Servlet-Container per Callback sagt, dass der Request bearbeitet wurde). Der Request-Scope (um das jetzt mal von der Map zu abstrahieren) ist also schon genau der richtige Scope für derartige Nachrichten.

Was aber vielleicht nicht ganz so gut gelöst ist, ist, dass du die Bean selbst verwaltest. "Testfreundlicher" und somit besser wäre es, wenn du dir diese MessageBean von der Managed-Bean Facility injizieren lässt. Die MessageBean bekommt als Scope natürlich wieder request gesetzt, da das, wie wir bereits festgestellt haben, der beste Scope hierfür ist.

Code:
<managed-bean>
  

  <managed-bean-name>...</managed-bean-name>
  ...

  <!-- Achtung: Diese Bean darf nur im Request Scope liegen, das hängt damit zusammen, dass
      man Request-Scoped Beans nur in Request-Scoped Beans injizieren kann. Siehe JSF Tutorial
      deiner Wahl dazu. -->
  <managed-bean-scope>request</managed-bean-scope>
 
  <managed-property>
    <property-name>messageBean</property-name>
    <value>#{messageBean}</property-name>
  </managed-property>
</managed-bean>

<managed-bean>
  <managed-bean-name>messageBean</managed-bean-name>
  <managed-bean-class>dein.package.MessageBean</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
  
  <!-- Prinzipiell könntest du natürlich auch einen "größeren Scope" wie z.B. session verwenden,
         damit du diese Bean auch in Session-Scoped Beans injizieren kannst, aber ideal ist es halt
         nicht, wenn die Bean länger als nötig existiert. Wenn es wirklich nur darum geht, diese Bean
         in eine Session-Scoped Bean zu injizieren, gibt es bessere Alternativen, das zu implementieren. -->

</managed-bean>

// deine ActionBean.java
public class .... {

  private MessageBean messageBean
  
  public void setMessageBean(MessageBean messageBean) {
    this.messageBean = messageBean;
  }

  public String actionBean() {
    // Nachricht ganz normal setzen
    messageBean.setMessage("Test blah fasel blubb");
  }
}

So wie du siehst, kannst du auf diese Art Informationen speichern, ohne, dass du dich an die JSF API bindest. Dadurch werden z.B. Tests wesentlich vereinfacht (es ist zwar möglich einen FacesContext zu mocken, aber eben wesentlich aufwendiger als diese Variante). In anderen Fällen bleibt dir aber oft eh nichts anderes übrig, als die Variante über den programmatischen Zugriff auf die Bean zu verwenden, aber am besten lässt du in dem Fall dann einfach nochmal von dir hören. ;-)

Btw. es gäb auch das Konzept der FacesMessages, vielleicht wäre das auch was für dich, wobei du dich damit natürlich schon wieder an die JSF API binden würdest.

grüße,
unkreativ
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M <p:accordionPanel <ui:repeat <p:commandButton Action funktioniert teilweise Web Tier 3
V JSF oncomplete-Attribut nach action-Attribut auswerten Web Tier 3
aze JSF CommandButton:Action wird nicht ausgeführt Web Tier 2
M JSF Dialog nur nach erfolgreicher Action schließen Web Tier 4
B JSF HtmlCommandButton --- Action wird nicht aufgerufen Web Tier 2
H JSF JSF 2.0 (Primefaces) commandLinks mit action="mypage.xhtml" ohne die URL im Browser zu ändern Web Tier 8
M Struts 2 - "There is no Action mapped for namespace..." - globale Lösung? Web Tier 3
H Seiten-reload als Result einer Action Web Tier 3
ruutaiokwu action-attribut des jsf h:form-tag überschreiben Web Tier 7
7 Struts: bei action immer ein Result nötig? Web Tier 2
E Struts: Text in JSP aus Action heraus setzen Web Tier 4
2 Pro Action nur eine ActionForm? Web Tier 4
O struts - Gültigkeit einer Action an Session binden?! Web Tier 4
D MultiActionController von Spring ohne action und / aufrufen Web Tier 3
T Action mapping Frage (Struts) Web Tier 2
K [Struts2] autom. Action-Erkennung Web Tier 2
J JSF - CommandButton keine Action Web Tier 14
S Button klick soll Java methode aufrufen Web Tier 2
M JSF JSF: Methode bei versteckt aufrufen & Parameter übergeben Web Tier 6
R get-methode der Managed-Bean wird immer 3 mal ausgeführt Web Tier 4
Joew0815 Spring Handle All Requests Methode Web Tier 1
M rendered ruft eine Methode auf, andere aber nicht Web Tier 15
V Mittels JavaScript Methode aufrufen Web Tier 23
M JSF Button - Methode wird nicht aufgerufen Web Tier 4
K JSF Unified-EL- Methode mit Parameterübergabe Web Tier 9
F NullPointerException auf validator methode Teil2? Web Tier 2
B JSF NullPointerException auf validator methode Web Tier 7
P Mit EL Parameter an Methode übergeben Web Tier 5
I Im PhaseListener Service Methode aufrufen Web Tier 21
J JSF Datatable bestimmte Methode Web Tier 4
I Automatische Weiterleitung JSF mit Aufruf einer Methode Web Tier 2
M JSF: Bei Seitenaufruf eine Methode starten Web Tier 15
H JSF - Methode kann nicht aufgerufen werden Web Tier 5
M Body onUnload Java Methode aufrufen Web Tier 13
K bean methode von jslt aufrufen Web Tier 7
D <html:select> bzw. <html:option> - Methode auslösen ? Web Tier 2
D [JSF] Lifecycle Methode wird mehrfach aufgerufen Web Tier 4
F Problem mit der Methode request.getRemotePort() Web Tier 2
D Methode bei Server Startup ausführen Web Tier 2
E Methode einer Bean aus anderer Bean aufrufen Web Tier 10
S JSF: Methode mit Parametern aufrufen Web Tier 7
J Fehler Tomcat/JSP findet Methode nich Web Tier 3
G Mit JSTL Rückgabe von Bean Methode ausgeben Web Tier 3
G in validate methode auf form objekte zugreifen Web Tier 3
F Beim Aufruf von einer JSF Seite eine Methode ausführen Web Tier 9
S JSF CommandButton soll keine Request starten! Web Tier 2
T Seam-Komponenten oder Java Bean soll direkt nach Appserver-Start "leben" Web Tier 4
N JSF Youtube Tutorials, was soll ich euch zeigen? Web Tier 13
P JSF Menüauswahl soll andere Komponente aktualisieren Web Tier 3
J Servlet soll XML ausgeben und Javascript soll dieses einlesen Web Tier 3
Schandro JSP soll dynamische Anzahl an Parametern einer JavaScript-Function erzeugen Web Tier 8
T Servlet soll sich selbst aufrufen. Web Tier 7

Ähnliche Java Themen

Neue Themen


Oben