PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Struts: dynamische Forms


mhaller
30.06.2005, 11:18
Moin,

ich möchte einen Wizard schreiben, mit Struts. Ich kenn mich im J2EE Umfeld nicht sonderlich gut aus, und JSP, Struts & Co. sind mir relativ neu.

Ziel:
- Anwender wählt aus einer Radiobutton-Liste eine "Vorlagendatei" aus.
- Mit einem Klick auf "Weiter" soll er nun zu einem Formular gelangen, welches auf der Vorlagendatei basiert. Dort stehen key=value Paare drin, die ausgefüllt werden müssen, damit die Vorlagendatei bestückt werden kann.
- Mit einem Klick auf "Fertig" werden nun die vom Anwender eingegebenen Werte in die Vorlagendatei geschrieben.

Bisher:
- ich habe in der struts-config.xml eine form-bean "vorlagenBean" angelegt. Die dazugehörige Klasse "meinpackage.VorlagenBean" enthält zwei Maps (templates, replacements) und einen String, der die Auswahl der Vorlagendatei speichern soll.

- ich habe eine Action angelegt, die ich imt "<html:form action="/neueVorlage"> aufrufen kann. Dort ist als als Bean das o.g. vorlagenBean zugewiesen (name="vorlagenBean") und scope="session"

- Meine Action wird auch brav ausgeführt. Ich bekomme von Struts bereits die ActionForm übergeben und caste diese in meine eigene meinpackage.VorlagenBean mit dem Namen "bean". Die Action prüft, ob das Bean gefüllt ist, und je nachdem forwarded es dann zu einer jsp Seite weiter, die als View dient: return mapping.findForward("showTemplates.jsp"); Davor speichere ich aber das bean nochmals mit request.getSession().setAttribute("bean",bean);

- in meiner showTemplates.jsp hole ich mir die (Hash)-Map und zeige Sie als Liste an:

<html:form action="/neueVorlage">
<%
VorlagenBean bean = (VorlagenBean) session.getAttribute("bean");
Map map = bean.getTemplates();
for(Iterator iter = map.keySet().iterator();iter.hasNext();) {
String strKey = (String) iter.next();
String strLabel = (String) map.get(strKey);
%>
<input type="radio" key="selectedTemplateKey" value="<%=strKey%>"><%=strLabel%></input>
<%
}
%>
<html:submit />
</html:form>


Meine Fragen:
1) Warum muss ich die VorlagenBean in der struts-config definieren, und dann doch wieder mit session.getAttribute("bean") aus der Session holen? Ist doch doppelt gemoppelt. Irgendetwas mache ich also falsch, nur weiss ich nicht was.

2) Auf der zweiten Seite soll dann, in Abhängigkeit der ausgewählten Vorlagendatei, eine Tabelle angezeigt werden, in der der Anwender zu jedem Key einen Wert eingeben kann. Ich habe es bereits geschafft, dass diese zwar angezeigt wird, jedoch habe ich keine (funktionierende) Möglichkeit gefunden, alle Werte wieder "zurück" zu schreiben. Also jsp->Servlet hat nicht richtig funktioniert.

3) Die Unterscheidung der Attribute von Struts-Tags und JSTL-Tags macht mir Problem. Wenn mir das mal jemand erklären könnte, was z.B. beim <logic:iterate> Tag die einzelnen Attribute sind, und welche Namen ich da eintragen muss, wäre ich sehr dankbar. (name, property, value, id etc... da scheint es keine durchgängige Logik zu geben. Einmal steht irgendwo dass unter property immer die Bean-Name zu stehen hat, so wie er in der struts-config.xml definiert ist, andererseits wird dann der property-Wert als Feldname für das Formularfeld benutzt -> Bahnhof)


Blue Cobold
30.06.2005, 15:50
zu:
1) Beans definiert man in der struts-config.xml
3) Schau dazu am besten auf die seite struts.apache.org, da werden alle tags mit ihren attributen perfekt beschrieben. Damit habe ich auch gelernt. Sample-Codes gibt's ja leider kaum. Unter "property" ist allerdings IMMER eine Get- bzw. eine Set-Methode des Beans zu verstehen, dass bei "name" namentlich angegeben wurde. Niemals anders. "type" bei iterate ist eine Angabe des Klassen-Typs, den dein Collection-Getter ausspuckt, bzw. in der Collection vom Collection-Getter enthalten ist. Mit "id" bei iterate deklarierst du ein den namen eines neuen Beans, was vom Typ "type" ist, den du angegeben hast und den das Collection.next() zurückliefert. Also das aktuelle Element (Bean) der Iteration.

Struts war dazu gedacht, Java-Code komplett von den HTML-Seiten zu trennen und in die ActionForm und Action-Klassen zu verlagern, damit das MVC-Konzept perfekt durchgezogen werden kann und die HTML-Seiten auch nur durch einen Web-Designer erstellt werden können, der keine Ahnung von deinem jsp-Code hat.