Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

FormBean in Struts manuell erzeugen

0 views
Skip to first unread message

ketyboss

unread,
Aug 6, 2006, 1:23:30 PM8/6/06
to
Hallo!
Kann mann in Action ein FormBean manuell erzeugen, damit der Struts
weiter dieses Bean nutzen konnte? So in der Art:

MyForm lform = (MyForm)form;
if(lform == null){
lform = new MyForm();
request.getSession().setAttribute("myForm", lform);
}

dieser Codeabschnitt funktioniert nicht, da der Struts der FormBean
nicht wahrnimmt.

Juergen Wille

unread,
Aug 6, 2006, 2:42:20 PM8/6/06
to

was hast Du denn in Deiner struts-config für diese Action stehen?

Gruß Jürgen

ketyboss

unread,
Aug 6, 2006, 3:13:03 PM8/6/06
to
Zuerst vielen Dank für die Antwort.
In struts-config steht:

<form-bean name="meineForm" type="de.MeineForm" />

<action path="/meineAction" type="de.MeineAction" name="meineForm">
<forward name="success" path="/jsp/test.jsp" redirect="true"/>
</action>

ich gehe vom eine JSP (index.jsp) mit dem link auf diese Aktion um eine
weitere Seite anzuzeigen:

index.jsp:
<tr><td><html:link action="meineAction.do" target="main">Layout
1</html:link></td></tr>

Das Problemm ist, bevor die Seite angezeigt wird, muss ich
entsprechende Initialisierung vornehmen die auch Beans vom Spring
zugreifen muss. Da der FormBean kein Zugriff auf Spring hat, muss ich
wohl die JSP über ein Action aufrufen. Aber bei erstem Aufruf
existiert der FormBean nicht und ich muss ihn erst mal manuell
erstellen.

Gruss Eugen.

Juergen Wille schrieb:

Juergen Wille

unread,
Aug 7, 2006, 3:38:18 AM8/7/06
to
Am Sun, 06 Aug 2006 12:13:03 -0700 schrieb ketyboss:

> <form-bean name="meineForm" type="de.MeineForm" />
>
> <action path="/meineAction" type="de.MeineAction" name="meineForm">
> <forward name="success" path="/jsp/test.jsp" redirect="true"/>
> </action>
>
> ich gehe vom eine JSP (index.jsp) mit dem link auf diese Aktion um eine
> weitere Seite anzuzeigen:
>
> index.jsp:
> <tr><td><html:link action="meineAction.do" target="main">Layout
> 1</html:link></td></tr>
>
> Das Problemm ist, bevor die Seite angezeigt wird, muss ich
> entsprechende Initialisierung vornehmen die auch Beans vom Spring
> zugreifen muss. Da der FormBean kein Zugriff auf Spring hat, muss ich
> wohl die JSP über ein Action aufrufen. Aber bei erstem Aufruf
> existiert der FormBean nicht und ich muss ihn erst mal manuell
> erstellen.

Hallo,

Das stimmt so nicht. Struts erzeugt ein Formbean für die Action, wenn in
dem angegebenen Scope noch keins unter dem angegebenen Namen exisitiert.
In Deinem Fall hast Du für die Action "MeineAction" vereinbart, dass ein
Formbean vom Typ "de.MeineForm" unter dem Namen "meineForm" im Scope
"request" steht (das ist implizit; besser ist es, den Scope explizit
anzugeben - damit vermeidest Du unangenehme Überraschungen..)
Du solltest mal schauen, was in der Action ankommt. D.h. in der
execute-Methode mal einen Breakpoint setzen und kontrollieren, welchen
Wert die Form hat.
In Deinem Originalposting castest Du die Form auf "MyForm". Das ist was
anderes als "de.MeineForm". Hier müsstest Du eine Exception bekommen, wenn
MyForm nicht von de.MeineForm abstammt.
Ausserdem setzt Du die Form unter dem Namen "myForm" in die Session, hast
aber in der struts-config als scope implizit request angegeben und als
Namen "meineForm". D.h. das, was Du in der Action machst wirkt sich nicht
auf _das_ Formbean aus, welches in der JSP "/jsp/test.jsp" verwendet wird
- dort wird nämlich auf das Bean "meineForm" vom Typ "de.meineForm" aus
dem request zugegriffen (und dessen Properties haben die Werte, die sie
initial besitzen).

Gruß Jürgen


ketyboss

unread,
Aug 7, 2006, 4:10:28 AM8/7/06
to
Hallo,
sorry, meine ertes Post müsste folgendes aussehen:

MeineForm lform = (MeineForm)form;
if(lform == null){
lform = new MeineForm();
request.getSession().setAttribute("meineForm", lform);
}

ich habe aus Versehen aus anderem Projekt die Zeilen kopiert, da die
verblüffend identisch aussehen :)

In Action habe ich Breakpoint gestellt - die Form ist gleich NULL. Es
ist nun so, dass der ActionForm Bean wir instantiiert und in Session
gespeichert bei erstem Zugriff auf die JSP Seite. Und wenn auf die
Seite noch nicht zugegriefen worden war (wie es in meinem Fall ist)
dann ist bean auch nicht da.

Juergen Wille

unread,
Aug 7, 2006, 4:33:53 AM8/7/06
to
Am Mon, 07 Aug 2006 01:10:28 -0700 schrieb ketyboss:


> ich habe aus Versehen aus anderem Projekt die Zeilen kopiert, da die
> verblüffend identisch aussehen :)
>
> In Action habe ich Breakpoint gestellt - die Form ist gleich NULL. Es
> ist nun so, dass der ActionForm Bean wir instantiiert und in Session
> gespeichert bei erstem Zugriff auf die JSP Seite. Und wenn auf die
> Seite noch nicht zugegriefen worden war (wie es in meinem Fall ist)
> dann ist bean auch nicht da.

Ok. hast Du den scope mal explizit gesetzt in der struts-config?

Ausserdem: Reden wir von der gleichen JSP? Poste mal ein Stück aus Deiner
test.jsp (um die sollte es ja gehen) und welche Fehlermeldung Du bekommst.


Gruß Jürgen

ketyboss

unread,
Aug 7, 2006, 2:46:12 PM8/7/06
to
Die Aufrufreihnfolge ist folgendes. Aus menu.jsp mit einem Link

<tr><td><html:link action="meineAction.do" target="main">Layout
1</html:link></td></tr>

wird Action MeineAction aufgerufen:

public ActionForward execute(...) {


MeineForm lform = (MeineForm)form;
if(lform == null){
lform = new MeineForm();
request.getSession().setAttribute("meineForm", lform);
}

// Aufruf von Spring Beans spBean
List groups = spBean.getGroups();

lform.setGroups(groups);
return mapping.findForward("success");
}


die Action ruft dann weiter test.jsp

<html:form action=" meineAction.do">
<logic:iterate id="id" name="groups">
next element
</logic:iterate>
<input type="submit">
</html:form>

struts-config.xml


<form-bean name="meineForm" type="de.MeineForm" />
<action path="/meineAction" type="de.MeineAction" name="meineForm">
<forward name="success" path="/jsp/test.jsp" redirect="true"/>
</action>


So dass bei erstem Aufruf noch kein MeineForm existiert, wir diese Form
Bean von mir ,,manuell" erstellt und ins Session gespeichert.

Jetzt zu dem Fehler:
Gleich nach dem klick auf dem Link ,,Layout 1" kriege ich Exception:

ERROR [RequestUtils] Error creating form bean of class de.MeineForm
java.lang.NullPointerException at
org.apache.struts.config.FormBeanConfig.createActionForm(FormBeanConfig.java:212)
at
org.apache.struts.util.RequestUtils.createActionForm(RequestUtils.java:292)
........

Diese Exception wird in "Hintergrund" ausgeworfen und schadet weiter
nicht. Dann komme ich in MeineAction, erstelle der MeineForm und packe
die Liste rein. Wenn ich auf test.jsp weiter lande, wird auch die Liste
korrekt angezeigt. Was mich aber sehr wundert, wenn ich auf Submit
drücke (test.jsp), komme ich wieder MeineAction und angekommene
FormBean ist wieder NULL.

ketyboss

unread,
Aug 7, 2006, 2:50:44 PM8/7/06
to
P.S. Ich habe jetzt in scope="session"

<action path="/meineAction" type="de.MeineAction" name="meineForm"

scope="session">


<forward name="success" path="/jsp/test.jsp" redirect="true"/>
</action>

hinzugefügt. hat aber leider nichts gebracht.

Juergen Wille

unread,
Aug 10, 2006, 7:24:45 AM8/10/06
to
hallo,

> Die Aufrufreihnfolge ist folgendes. Aus menu.jsp mit einem Link

[..]


> So dass bei erstem Aufruf noch kein MeineForm existiert, wir diese Form
> Bean von mir ,,manuell" erstellt und ins Session gespeichert.

wie ich schon schrieb, erzeugt struts (genauer: der Requestprozessor) das
Formbean, wenn noch keins existiert..

> Jetzt zu dem Fehler:
> Gleich nach dem klick auf dem Link ,,Layout 1" kriege ich Exception:
>
> ERROR [RequestUtils] Error creating form bean of class de.MeineForm
> java.lang.NullPointerException at
> org.apache.struts.config.FormBeanConfig.createActionForm(FormBeanConfig.java:212)
> at
> org.apache.struts.util.RequestUtils.createActionForm(RequestUtils.java:292)
> ........

.. und genau dabei knallt es bei Dir. D.h. beim ersten Aufruf Deiner
Action geht das Erzeugen des Formbeans schief. Du hast also entweder in
Deinem Formbean eine Methode aufgerufen, die Probleme macht, oder
(wahrscheinlicher!) stimmt die Angabe zum Formbean in Deiner struts-config
nicht.


> Diese Exception wird in "Hintergrund" ausgeworfen und schadet
> weiter nicht.

doch, s.o.

>Dann komme ich in MeineAction, erstelle der MeineForm und packe
> die Liste rein.

Damit versuchst Du, die Symptome zu heilen. Das bringt nichts.


>Wenn ich auf test.jsp weiter lande, wird auch die Liste
> korrekt angezeigt. Was mich aber sehr wundert, wenn ich auf Submit
> drücke (test.jsp), komme ich wieder MeineAction und angekommene FormBean
> ist wieder NULL.

Wenn Du NULL bekommst, ist was faul :-)

Gruß Jürgen

ketyboss

unread,
Aug 14, 2006, 5:54:12 PM8/14/06
to
Ich danke Dir für Deine Mühe mir meine Fragen zu beantworten. Woran
lag es, weiß ich bis zurzeit nicht, aber es funktioniert auf ein Mal
alles. Ich habe schon diese Tendenz bemerkt, 100 Mal kompilieren, auf
101 wird alles funktionieren :) Und noch ein mal vielen Dank!

0 new messages