[Struts] Checkboxen uitvinken

Pagina: 1
Acties:

  • turkosh
  • Registratie: December 2003
  • Laatst online: 26-04-2025
Hoi allemaal,

Ik heb een probleem waar ik nog geen antwoord op heb kunnen vinden:

In mijn form zet ik vink 2 checkboxen aan (waardes op true of "on", type maakt niet uit). Nou kan de gebruiker natuurlijk die checkboxen uitvinken als die wil. Het probleem is natuurlijk dat de uitgevinkte checkboxen niet worden doorgegeven naar de form. Dus maak niet uit wat de situatie is, ik krijg altijd de waardes true of "on" terug tijdens het uitlezen van de form.
Hoe los ik dit probleem op?

Verwijderd

Mogen we een klein beetje spieken onder de motorkap?

  • Salandur
  • Registratie: Mei 2003
  • Laatst online: 14:19

Salandur

Software Engineer

controleer eerst of de waarde aanwezig is, zo ja: is hij on of true?

Assumptions are the mother of all fuck ups | iRacing Profiel


  • turkosh
  • Registratie: December 2003
  • Laatst online: 26-04-2025
Motorkap?
Natuurlijk daar gaat die dan:

Form Bean:
Java:
1
2
3
4
5
6
7
8
9
boolean showDetails = true;

public boolean getShowDetails() {
    return showDetails;
}

public void setShowDetails(boolean showDetails) {
    this.showDetails = showDetails;
}


JSP:
Java Server Page:
1
<html:checkbox property="showDetails" styleClass="checkbox" />


Action:
Java:
1
2
ActionForm form = (ActionForm) form; // haalt de form uit de sessie op
activityForm.getShowDetails(); // deze methode haalt dan de checkbox waarde op

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 26-04 17:29

Janoz

Moderator Devschuur®

!litemod

Wat je zou kunnen doen is de default waarden van een form niet te definieren in het form zelf, maar in de actie die wordt gebruikt bij het aanroepen van het formulier.

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


  • turkosh
  • Registratie: December 2003
  • Laatst online: 26-04-2025
Ik weet wat je bedoelt. Heb het net ook geprobeerd.
Tijdens het laden van de pagina zet ik in de action de waardes op true. Maar als ik submit doe met uitgevinkte boxen, dan is de waarde nog steeds niet veranderd, omdat de uitgevinkte boxen niet worden meegestuurd.
Ik gebruik 1 from voor 3 pagina's (3 registratie stappen). De checkboxen zitten op de 1ste pagina. Bij de action methode die een forward doet naar pagina 2 heb ik gekeken of de form veranderd was, maar dat is niet gebeurd.

Ik zal maar wat meer details geven:
Action:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//Laden van pagina 1
public ActionForward init(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws java.io.IOException, javax.servlet.ServletException {

logger.debug("HostInvitationDispatchAction - init hostaccount");
HostInvitationForm actionForm = new HostInvitationForm();
        
actionForm.setShowDetails(true);
return mapping.findForward("step1");
}

// Transfer naar pagina 2
 public ActionForward step1(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws java.io.IOException, javax.servlet.ServletException {

        logger.debug("HostInvitationDispatchAction - step1 hostaccount");
        
        // location name should be unique for this host
        HostInvitationForm actionForm = (HostInvitationForm) form;
        if (actionForm.getShowDetails() == false) {
            logger.debug("Show Details set to false");
        }
        return mapping.findForward("step2");
}

[ Voor 54% gewijzigd door turkosh op 26-10-2005 16:35 ]


  • bartware
  • Registratie: Juni 2001
  • Laatst online: 25-03-2023

bartware

@jabber.org

Kun je niet de default waarde van je property op false zetten? Als de checkbox dan wordt uitgevinkt, wordt die property dus niet meegestuurd en zal de default waarde (false) worden gebruikt. Als ie wel is aangevinkt wordt de property op true gezet.

Heb ik me begrepen?
Cycle Vision 2020: 17-20 juli Sportpark Sloten & Wheelerplanet Spaarnwoude


Verwijderd

code:
1
2
<html:checkbox name="formName" property="persistentPropertie" value="<%= Boolean.TRUE.toString() %>" />
<input type="hidden" name="persistentPropertie" value="false" checked" />


Als de checkbox niet aangevinkt is wordt die false genomen als waarde (eerste uit de array), anders staat de echte checkbox als eerste en wordt die waarde genomen....

  • momania
  • Registratie: Mei 2000
  • Nu online

momania

iPhone 30! Bam!

bartware schreef op woensdag 26 oktober 2005 @ 17:16:
Kun je niet de default waarde van je property op false zetten? Als de checkbox dan wordt uitgevinkt, wordt die property dus niet meegestuurd en zal de default waarde (false) worden gebruikt. Als ie wel is aangevinkt wordt de property op true gezet.
Je showDetails moet je idd standaard op false zetten in je ActionForm, maar je moet ook de reset method implementeren.

De setShowDetails wordt dan alleen aangeroepen als je checkbox aangevinkt is. Zet jij hem dus in je actie op true, en op het scherm vink je hem uit, wordt hij nooit op false gezet aangezien een niet gecheckte checkbox niet gesubmit wordt en dus ook niet de setShowDetails wordt aangeroepen. ;)

in je ActionForm dus nog even het volgende toevoegen:
Java:
1
2
3
public void reset(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
  showDetails = false;
}

Na je submit van de pagina wordt als het goed is voor dat je form ge-populate wordt, de reset van dat form aangeroepen. Die zou dan in jou geval de showDetails weer op false moeten zetten en als de checkbox toch gechecked is, zorgt de polulate wel weer dat deze op true komt te staan. :)

Neem je whisky mee, is het te weinig... *zucht*


Verwijderd

momania schreef op woensdag 26 oktober 2005 @ 23:22:
[...]

Je showDetails moet je idd standaard op false zetten in je ActionForm, maar je moet ook de reset method implementeren.

De setShowDetails wordt dan alleen aangeroepen als je checkbox aangevinkt is. Zet jij hem dus in je actie op true, en op het scherm vink je hem uit, wordt hij nooit op false gezet aangezien een niet gecheckte checkbox niet gesubmit wordt en dus ook niet de setShowDetails wordt aangeroepen. ;)

in je ActionForm dus nog even het volgende toevoegen:
Java:
1
2
3
public void reset(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
  showDetails = false;
}

Na je submit van de pagina wordt als het goed is voor dat je form ge-populate wordt, de reset van dat form aangeroepen. Die zou dan in jou geval de showDetails weer op false moeten zetten en als de checkbox toch gechecked is, zorgt de polulate wel weer dat deze op true komt te staan. :)
Dan heb je nog een klein probleem als je je form de session scope geeft, dan wordt die reset dacht'k niet aangeroepen...

En dat is hier blijkbaar de bedoeling:
Action:
Java:
1
2
ActionForm form = (ActionForm) form; // haalt de form uit de sessie op
activityForm.getShowDetails(); // deze methode haalt dan de checkbox waarde op

[ Voor 10% gewijzigd door Verwijderd op 27-10-2005 08:11 ]


  • momania
  • Registratie: Mei 2000
  • Nu online

momania

iPhone 30! Bam!

Verwijderd schreef op donderdag 27 oktober 2005 @ 08:10:
[...]


Dan heb je nog een klein probleem als je je form de session scope geeft, dan wordt die reset dacht'k niet aangeroepen...

En dat is hier blijkbaar de bedoeling:

[...]
Uit de javadocs:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
     * <p>Reset bean properties to their default state, as needed.  This method is
     * called before the properties are repopulated by the controller.</p>
     *
     * <p>The default implementation does nothing. In practice, the only properties
     * that need to be reset are those which represent checkboxes on a session-scoped
     * form. Otherwise, properties can be given initial values where the field is
     * declared. </p>
     *
     * <p>If the form is stored in session-scope so that values can be collected
     * over multiple requests (a "wizard"), you must be very careful of which
     * properties, if any, are reset. As mentioned, session-scope checkboxes
     * must be reset to false for any page where this property is set. This is
     * because the client does not submit a checkbox value when it is clear (false).
     * If a session-scoped checkbox is not proactively reset, it can never be set
     * to false.</p>
     *
     * <p>This method is <strong>not</strong> the appropriate place to initialize
     * form value for an "update" type page (this should be done in a setup Action).
     * You mainly need to worry about setting checkbox values to false; most of the
     * time you can leave this method unimplemented.
     * </p>
     *
     * @param mapping The mapping used to select this instance
     * @param request The servlet request we are processing
     */


Let vooral op de 2e alinea ;)

Neem je whisky mee, is het te weinig... *zucht*


  • turkosh
  • Registratie: December 2003
  • Laatst online: 26-04-2025
Hoi allemaal,

bedankt voor jullie reacties. _/-\o_
Ik heb het opgelost met de resest methode. In de form heb ik een extra vlaggetje opgenomen om controle over de reset te krijgen (aangezien die elke keer opgeroepen wordt). Het was namelijk de bedoeling dat de form alleen tijdens eerste action zou worden gereset en daar na niet meer (betreft een registratie form bestaande uit 3 paginas, dus 3 actions die uitgevoerd worden).
Het werkt allemaal nu zoals het moet.
Het zou handiger zijn als de Struts development team in de html:checkbox tag een checked property zouden zetten. Bespaart veel ellende...

  • momania
  • Registratie: Mei 2000
  • Nu online

momania

iPhone 30! Bam!

Trouwens, het je volgende code:
Java:
1
2
3
4
5
6
7
8
9
10
11
//Laden van pagina 1
public ActionForward init(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws java.io.IOException, javax.servlet.ServletException {

logger.debug("HostInvitationDispatchAction - init hostaccount");
HostInvitationForm actionForm = new HostInvitationForm();
        
actionForm.setShowDetails(true);
return mapping.findForward("step1");
} 

Het aanmaken van je ActionForm is daar natuurlijk niet nodig en heeft ook geen nut, omdat die instantie van je ActionForm gewoon verloren gaat als de action klaar is.
Struts heeft die ActionForm al aangemaakt, aangezien je die als het goed is bij je actionmapping hebt gedefinieerd ;)

Je ActionForm krijg je als param mee, dus je zou het volgende moeten doen:
Java:
1
2
3
4
5
6
7
8
9
10
11
//Laden van pagina 1
public ActionForward init(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws java.io.IOException, javax.servlet.ServletException {

logger.debug("HostInvitationDispatchAction - init hostaccount");
HostInvitationForm actionForm = (HostInvitationForm)form; // <- casten ipv new instance :)
        
actionForm.setShowDetails(true);
return mapping.findForward("step1");
} 

[ Voor 12% gewijzigd door momania op 27-10-2005 10:58 ]

Neem je whisky mee, is het te weinig... *zucht*


  • turkosh
  • Registratie: December 2003
  • Laatst online: 26-04-2025
Dat heb ik ook (in init_2 methode) ;)

  • momania
  • Registratie: Mei 2000
  • Nu online

momania

iPhone 30! Bam!

turkosh schreef op donderdag 27 oktober 2005 @ 11:01:
Dat heb ik ook (in init_2 methode) ;)
Ok :)

Bedoelde maar te zeggen dat het aanmaken van een ActionForm in je Action geen nut heeft :)

Neem je whisky mee, is het te weinig... *zucht*

Pagina: 1