Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[Struts] Indexed properties met array

Pagina: 1
Acties:

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
Ik heb al even geen project meer met Struts gerealiseerd, en loop nu tegen een probleem met indexed properties.

In mijn formbean (scope=request) heb ik een array gedefinieerd, met bijhorende getters/setters
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private Integer[] selectedPersons;
// ...
public Integer[] getSelectedPersons() {
    return selectedPersons;
}
public void setSelectedPersons(Integer[] selectedPersons) {
    this.selectedPersons= selectedPersons;
}
public Integer getSelectedPersonsIndexed(int index) { 
    return selectedPersons[index]; 
}
public void setSelectedPersonsIndexed(int index, Integer value) {
    selectedPersons[index] = value; 
}


In mijn JSP cache ik de geselecteerde waarden uit het vorige scherm:
XML:
1
2
3
<logic:iterate id="persons" name="insuranceForm" property="selectedPersons" indexId="i">
    <html:hidden property="selectedPersonsIndexed[${i}]"/>
</logic:iterate>


Als ik op deze JSP een submit uitvoer, dan krijg ik een NullPointerException voor m'n neus omdat de array niet correct geïnitialiseerd wordt door Struts. Dit is toch de verantwoordelijkheid van Struts?

Als ik de array hard initialiseer bij declaratie op 100, dan gaat het uiteraard wel goed; maar dit wil je niet echt in je code hebben zitten :)

Iemand een idee hoe ik dit kan oplossen?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 08:25

Janoz

Moderator Devschuur®

!litemod

Voor mij is het ook al even terug, maar volgens mij is het wel je eigen verantwoordelijkheid. Als ik even terug graaf in mijn geheugen dan kan ik mij herinneren dat ik zelf een List gebruikte en dat ik deze, afhankelijk van de gevraagde index, zelf met null opvulde tot hij groot genoeg was.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
Dan komt het er dus op neer dat je enkel met statische arrays kan werken, en anders voor een List moet kiezen. Niet geheel onlogisch, maar bij het verzenden van de data, kan struts in principe wel zien hoeveel elementen er gesubmit worden en deze array dan even voor je initialiseren.
Janoz schreef op dinsdag 02 september 2008 @ 11:06:
Als ik even terug graaf in mijn geheugen dan kan ik mij herinneren dat ik zelf een List gebruikte en dat ik deze, afhankelijk van de gevraagde index, zelf met null opvulde tot hij groot genoeg was.
Hoe bedoel je dit precies?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 08:25

Janoz

Moderator Devschuur®

!litemod

Dat bedoel ik zo:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public Integer getSelectedPersonsIndexed(int index) { 
    checkSize(selectedPersons, index);
    return selectedPersons.get(index); 
}
public void setSelectedPersonsIndexed(int index, Integer value) {
    checkSize(selectedPersons, index);
    selectedPersons.set(index, value); 
}

private void checkSize(List lijst, int index){
    while (lijst.size() < index) {
      lijst.add(null);
    }
}

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
Dat had ik inderdaad al eens geprobeerd, maar het probleem waar ik dan op stuit is de initiele selectie:
XML:
1
2
3
<html:multibox property="selectedPersons">
    <bean:write name="person" property="id" />
</html:multibox>


Ik kan als property uiteraard geen selectedPersons gebruiken, omdat deze een List is en er dan een IllegalArgumentException optreedt. Ik kan deze waarden ook wel tijdelijk cachen in een array, en deze dan bij de setter inserteren in de lijst; bij de getter de lijst weer converteren naar een array. Op zich geen probleem natuurlijk, maar misschien dat het mooier kan?

In je while loop moet het trouwens <= zijn ipv <, anders kunnen er geen elementen in de positie 0. En bij een array start het tellen natuurlijk op 0. Ik geef het maar even mee voor de volledigheid.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 08:25

Janoz

Moderator Devschuur®

!litemod

Wat misschien handiger is, is om de view en je form code ietsjes los te trekken. De value is immers helemaal niet van belang. Je hoeft enkel te weten welke wel, en welke niet geselecteerd is. Wat dacht je van de volgende code:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Set selectedPersonIds;

public Integer getSelectedPersonsIndexed(int index) { 
  if (selectedPersonIds.contains(index)) {
    return 1;
  } else {
    return 0;
  }
}

public void setSelectedPersonsIndexed(int index, Integer value) {
  if (value.equals(1)) {
    selectedPersonIds.put(index);
  } else {
    selectedPersonIds.remove(index);
  }
} 


Mooier is natuurlijk om met booleans te werken. Maakt de code ook weer wat mooier.

[ Voor 6% gewijzigd door Janoz op 02-09-2008 14:14 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
Hmm, nee; mooi oplossing wel, maar ik heb er niks aan. Bij mij zijn de values wel van belang, aangezien het om geselecteerde ID's gaan uit een subset van een hele grote lijst van ID's.

Struts, a real Love/Hate relationship :)

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 08:25

Janoz

Moderator Devschuur®

!litemod

Maar bij mijn oplossing kun je juist de index als value gebruiken. Jij zegt dat de value wel van belang is, maar ik zeg dat de index niet belangrijk is.

Ideaal bij checkboxen en voor je hidden fields gebruik je gewoon niet de ${i}, maar de value uit de set.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1