Struts mehrdimensionale properties

dajos

Mitglied
Hallo,
ich habe eine Klasse Userrights als Bean mit den Properties und den Entsprechenden Getter und Setter Methoden:

Code:
	private int     scenarioId             = -1;
	private String  scenarioName           = null;
	private boolean administration         = false;
	private boolean probenEinlagerung      = false;
	private boolean probenAuslagerung      = false;
	private boolean auftraggeberVerwaltung = false;
	private boolean spenderVerwaltung      = false;



ich habe eine Formbean:

Code:
public class BenutzerAnlegenForm extends ActionForm {

	private ArrayList<UserRights> userrights = null;


public void reset(ActionMapping mapping, HttpServletRequest request) {

		this.userrights      = new ArrayList<UserRights>();
		this.userrights.add(new UserRights(1,"test",true,false,false,false,false));
	}

	public void setUserrights(ArrayList<UserRights> userrights) {
		System.out.println("Userrights gesetzt");
		this.userrights = userrights;
	}

	public ArrayList<UserRights> getUserrights() {
		System.out.println("Userrights gelesen");
		return userrights;
	}

}

ich habe weiterhin eine jsp zur eingabe:

Code:
...
		<logic:iterate id="userrightIt" type="UserRights" name="benutzerAnlegenForm" property="userrights">
		
		<table style="{ width: 500px }">
			<tr>
			<td>
				<html:img srcKey="images.delete" titleKey="images.delete.alt" />
				<bean:write name="userrightIt" property="scenarioName"/>
			</td>
			<td style="{width: 50px; text-align: center;}">
			<html:checkbox name="userrightIt" property="administration" indexed="true"/>
			<html:hidden name="userrightIt" property="administration" indexed="true" />
			</td>
			<td style="{width: 50px; text-align: center;}">
			<html:checkbox name="userrightIt" property="probenEinlagerung" indexed="true"/>
			<html:hidden name="userrightIt" property="probenEinlagerung" indexed="true" />
			</td>
			<td style="{width: 50px; text-align: center;}">
			<html:checkbox name="userrightIt" property="probenAuslagerung" indexed="true"/>
			<html:hidden name="userrightIt" property="probenAuslagerung" indexed="true" />
			</td>
			<td style="{width: 50px; text-align: center;}">
			<html:checkbox name="userrightIt" property="auftraggeberVerwaltung" indexed="true"/>
			<html:hidden name="userrightIt" property="auftraggeberVerwaltung" indexed="true" />
			</td>
			<td style="{width: 50px; text-align: center;}">
			<html:checkbox name="userrightIt" property="spenderVerwaltung" indexed="true"/>
			<html:hidden name="userrightIt" property="spenderVerwaltung" indexed="true" />
			</td>
			</tr>
		</table>
		</logic:iterate>
...

Ich habe auch noch eine Action

Code:
	@Override
	public ActionForward execute(ActionMapping mapping,
			ActionForm form, HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		
		BenutzerAnlegenForm baform = (BenutzerAnlegenForm)form;
		
		for (int i = 0; i < baform.getUserrights().size(); i++) {
			System.out.println(i+" -- "+baform.getUserrights().get(i).getScenarioId());
			System.out.println(i+" -- "+baform.getUserrights().get(i).getScenarioName());
			System.out.println("##################");
			System.out.println(i+" -- "+baform.getUserrights().get(i).getAdministration());
			System.out.println(i+" -- "+baform.getUserrights().get(i).getAuftraggeberVerwaltung());
			System.out.println(i+" -- "+baform.getUserrights().get(i).getProbenAuslagerung());
			System.out.println(i+" -- "+baform.getUserrights().get(i).getProbenEinlagerung());
			System.out.println(i+" -- "+baform.getUserrights().get(i).getSpenderVerwaltung());
		}
		
		return mapping.findForward("DBSuccess");
	}

Ich bekomme beim Aufrufen der JSP die gesetzten Userrights in der JSP richtig angezeigt. Ändere ich nun aber die checkboxen in der Eingabe und sende das ganze an die Action, dann bekomme ich die alten Werte. Nicht aber diejenigen, die ich in der Eingabe gesetzt hatte. Kann mir jmd sagen was ich hier beachten muss, um hier die Werte in der Action angezeigt zu bekommen, die ich vor dem absenden geändert habe ?

Schonmal vielen Dank!
 
Zuletzt bearbeitet:
Hallo,

hm also niemand der mir da helfen könnte :( Ich habe rausgefunden, dass getUserrights() in der FormBean zwar aufgerufen wird, aber setUserrights() nicht. Das erklärt wohl, warum dann die Werte immernoch die alten sind. Aber wie kann ich die werte ändern ? Muss ich da eine spezielle Form beachten? bzw. andere setter Methoden implementieren ?

Jeder Hinweis wäre wirklich toll.

Danke.
 
Moin, moin,

schnell aus der Hüfte geschossen würde ich sagen, implementiere public/protected getter/setter Methode in Deiner Userrightsbean. Immerhin sind in der Bean die Variablen als private deklariert und sollten (imho) somit Aussenstehenden nicht zur Verfügung stehen.


Gruß

Luxor
 
Hallo,

ja das war jetzt nur weggelassen, weil ich nciht noch mehr Quellcode hier reinschreiben wollte, wäre recht viel und dann bläht es sich auf.

Da sind schon getter und setter methoden entsprechend den private Variablen, und ich habe auch die schreibweise Kontrolliert, also struts verwendet nur einfach setUserrights() nicht :)
 
Hallo, so ich glaub ich habs ...

Es ist wohl ein generelles checkbox problem, da der Browser nur dann ein submit der checkbox macht, wenn diese auf true steht. Auf gut deutsch heisst das nun ich kann wohl nie meine Checkboxen mit vorinitialisierenten Werten befüllen, da muss man sich anders behelfen ... :(

Why are my checkboxes not being set from ON to OFF?

A problem with a checkbox is that the browser will only include it in the request when it is checked. If it is not checked, the HTML specification suggests that it not be sent (i.e. omitted from the request). If the value of the checkbox is being persisted, either in a session bean or in the model, a checked box can never unchecked by a HTML form -- because the form can never send a signal to uncheck the box. The application must somehow ascertain that since the element was not sent that the corresponding value is unchecked.

The recommended approach for framework applications is to use the reset method in the ActionForm to set all properties represented by checkboxes to null or false. The checked boxes submitted by the form will then set those properties to true. The omitted properties will remain false. Another solution is to use radio buttons instead, which always submit a value.

It is important to note that the HTML specification recommends this same behavior whenever a control is not "successful". Any blank element in a HTML form is not guaranteed to submitted. It is therefor very important to set the default values for an ActionForm correctly, and to implement the reset method when the ActionForm might kept in session scope.
 
Zurück