Struts! 1 Action, 2 Formen..Problem!

tikemyson

Mitglied
Struts! 2 Actions,1 Form..Problem!

Hallo,..oder besser Hallo Thomas :suspekt:

ich habe folgendes Problem.

ich habe in einer Form einen auflistung mit radiobuttons (alle logischerweise mit verschiedenen Values)

Zum auslesen dieser Value benutze ich eine Action, welche über den onclick event angestossen wird!


Folgendes Codefragment befindet sich in dieser Action:

Code:
 stridFahrzeugDaten=(String)PropertyUtils.getSimpleProperty(form,"FahrzeugDaten");

die Stringvariable stridFahrzeugDaten ist immer ein Leerstring, obwohl im Quelltext der Jsp Seite (welche die form beinhaltet) die values gesetzt sind.

Ich vermute, dass es daran liegt, das die DynaActionFormBean nicht initialisiert ist!
Deshalb hier auch mal einen auszug aus meiner struts-config.xml

Code:
<action path="/FahrzeugdatenRadiobutton"
             type="xxxxxxActionnamexxxxx" 
             name="StammdatenFahrzeugeForm"
             scope="request"
             input="/pages/xxxxxjsp-seitexxxxx"
             validate="false">
      <forward name="Success" path="/pages/xxxxnächste jsp seitexxxxx.jsp"/>
  </action>


Noch eine weitere information.

Diue Form auf die ich mit der Action des Radiobutton drauf zugreife, wurde im vorfeld noch nicht submittet. Es wurden lediglich sessionelemente gesetzt und dann zu der view (zu einer jsp seite mit der form) geforwarded!

Bitte um Hilfe!
Vielen dank!
 
Zuletzt bearbeitet:
Hallo!

ich konnte dein Beispiel leider nicht ganz nachvollziehen, deshalb hab ich dazu mal ein Beispiel gebaut:

- Eingabe Formular mit den Radio Buttons
- Ergebnis Formular
- Action Klasse
- ActionForm Klasse
- Simple Bean Klasse

Das ganze sieht dann wie folgt aus:

Das Formular mit den Radio Buttons:
Code:
<%@page contentType="text/html" %>
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html:html>

<head>
	<title>JSP Page</title>
</head>

<body bgcolor="#FFFFFF">
<html:form method="POST" action="radioInput.do">
  <p><html:radio property="myBean.abc" value="V1"/>Auswahl 1 </p>
  <p><html:radio property="myBean.abc" value="V2"/>Auswahl 2</p>
  <p><html:radio property="myBean.abc" value="V3"/>Auswahl 3</p>
  <p><html:submit value="Abschicken"/>
  <html:reset value="Zurücksetzen"/></p>
</html:form>

</body>

</html:html>

Das Ergebnis Formular:
Code:
<%@page contentType="text/html" %>
<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic"%>
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html"%>
<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>

<head>
	<title>JSP Page</title>
</head>

<body bgcolor="#FFFFFF">
Result!<br/>
<logic:present name="myInputFormBean" scope="request">
Selected Value: <bean:write name="myInputFormBean" property="abc"/><br/>
</logic:present>
<html:link page="/pages/forms/tutor/radioInputForm.jsp">Back to input form</html:link>
</body>

</html>

Die Aktion Klasse:
Code:
/*
 * ASW Berufsakademie
 * 
 * Created on 26.12.2004 / 13:29:57
 * 
 */
package de.asw.tutorial;

import java.util.Arrays;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

/**
 * @author Administrator
 *
 * TODO Explain what I do
 * 
 * @struts.action input = "/pages/forms/tutor/radioInputForm.jsp"
 * 					name = "radioInput"
 * 					path = "/radioInput"
 * 					
 * @struts.action-forward name = "SUCCESS" path = "/pages/forms/tutor/inputFormResult.jsp"
 */
public class RadioTestAction extends Action {

    /* (non-Javadoc)
     * @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
     */
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        // TODO Auto-generated method stub

        RadioTestForm frm = (RadioTestForm)form;
        InputFormBean bean = frm.getMyBean(); 
        String str = bean.getAbc();

        System.out.println(str);
        
        request.setAttribute("myInputFormBean",bean);
        return mapping.findForward("SUCCESS");
    }
}

Die ActionForm Klasse:
Code:
/*
 * ASW Berufsakademie
 * 
 * Created on 26.12.2004 / 13:46:57
 * 
 */
package de.asw.tutorial;

import org.apache.struts.action.ActionForm;

/**
 * @author Administrator
 *
 * TODO Explain what I do
 * @struts.form name="radioInput"
 */
public class RadioTestForm extends ActionForm{
    private InputFormBean myBean = new InputFormBean();
    
    
    /**
     * @return Returns the myBean.
     */
    public InputFormBean getMyBean() {
        return myBean;
    }
    /**
     * @param myBean The myBean to set.
     */
    public void setMyBean(InputFormBean myBean) {
        this.myBean = myBean;
    }
}

Die Bean Klasse:
Code:
package de.asw.tutorial;
import java.io.Serializable;

/*
 * ASW Berufsakademie
 * 
 * Created on 26.12.2004 / 14:07:23
 * 
 */

/**
 * @author Administrator
 *
 * TODO Explain what I do
 */
public class InputFormBean implements Serializable{
    
    private String abc = "V1";
    
    public InputFormBean(){
    }
    
    

    /**
     * @return Returns the abc.
     */
    public String getAbc() {
        return abc;
    }
    /**
     * @param abc The abc to set.
     */
    public void setAbc(String abc) {
        this.abc = abc;
    }
}

... und last but not least hier noch die entsprechenden Ausschnitte aus der struts-config.xml:
Code:
...
<form-beans>
...
    <form-bean
      name="radioInput"
      type="de.asw.tutorial.RadioTestForm"
    />
...
</form-beans>
...

<action-mappings>
....
<action
      path="/radioInput"
      type="de.asw.tutorial.RadioTestAction"
      name="radioInput"
      scope="request"
      input="/pages/forms/tutor/radioInputForm.jsp"
      unknown="false"
      validate="true"
    >
      <forward
        name="SUCCESS"
        path="/pages/forms/tutor/inputFormResult.jsp"
        redirect="false"
      />
    </action>
</action-mappings>

HTH,

Gruß Tom
 
Hey Tom, Danke für die extrem detaillierte Antwort und sorry für meine späte Rückmeldung!

Code:
 <form-bean name="StammdatenFahrzeugeBearbeiteEintragForm" type="org.apache.struts.validator.DynaValidatorForm" dynamic="true">
             
 <!--Radiobutton -->
             <form-property name="StammdatenFahrzeuge" type="java.lang.String"/>  

             <form-property name="Zeit" type="java.lang.String"/>  
             <form-property name="Anzahl" type="java.lang.String"/>  

             <form-property name="hiddenRemote" type="java.lang.String"/>  
         
     </form-bean>

Dadurch, da meine Form Bean vom Typ: "org.apache.struts.validator.DynaValidatorForm" ist, lässt sich dein Vorschlag für mich schwer nachvollziehen. In meinem Projekt ist jede (ca 30 Formen) von diesem Typ. Was hälst du generell davon? Wie fülle ich diese Formbean mit inhalten, ohne die Form im Vorfeld zu submitten?

Der JSP Seiten Qualltext sieht folgendermaßen aus:
Code:
<xxxxxx/StammdatenFahrzeugeBearbeiteEintragForm.do">
  <table width="550"  border="0" cellpadding="1" cellspacing="1" bgcolor="#000000" class="Stil5">
  
  <tr bgcolor="#CCCCCC"> 
      <th width="3">
              <div align="left">
                &nbsp;
              </div>
      </th>
      <th width="346"><div align="left">
              Anzahl
      </div></th>
      <th width="191"> 
        <div align="left">
            Datum  
        </div>
      </th>
  </tr>
	  
  
            <tr bgcolor="#FFFFFF"> 
                 <td width="3" bgcolor="#cccccc">
                   <div align="center">
                   <input type="radio" name="StammdatenFahrzeuge" value="21" onclick="javascript:radioonclick()">
                </div>
                </td>
				         <td>
                   12
                    
                     Fahrzeuge  
                    
                </td>
                <td>
                 23.11.2100</td>
             </tr>
        
            <tr bgcolor="#FFFFFF"> 
                 <td width="3" bgcolor="#cccccc">
                   <div align="center">
                   <input type="radio" name="StammdatenFahrzeuge" value="23" onclick="javascript:radioonclick()">
                </div>
                </td>
				         <td>
                   12
                    
                     Fahrzeuge  
                    
                </td>
                <td>
                 22.12.2099</td>
             </tr>
        
            <tr bgcolor="#FFFFFF"> 
                 <td width="3" bgcolor="#cccccc">
                   <div align="center">
                   <input type="radio" name="StammdatenFahrzeuge" value="22"  onclick="javascript:radioonclick()">
                </div>
                </td>
     <td>121 Fahrzeuge </td>
                <td> 11.11.2099</td>
             </tr>
.
.
..
.

javascript:radioonclick():
Code:
function radioonclick(){
    //Läuft über die betsehende Action: "SatmmdatenFahrzeugeEingabeAction"
    //top.frames[1].frames[1].StammdatenFahrzeugeBearbeiteEintragForm.hiddenRemote.value="r";
   // top.frames[1].frames[1].StammdatenFahrzeugeBearbeiteEintragForm.submit();
    
    //läuft über neue Action: "StammdatenFahrzeugRadioAction"
    //Problem, Form Bean ist leer,.. nicht mit werten initialisiert !
    top.frames[1].frames[1].location.href="<html:rewrite page="/StammdatenFahrzeugeRadiobutton.do"/>";
   }

Sobald die Funktion radioonclick durchlaufe, gehts über eine neue Action, in der ich das Formelement (den Rediobutton) auslese. Allerdings ist dies immer ein leerstring!

Wenn ich in der Action die Form ausgebe mit
system.out.println (form):-->DynaActionForm[dynaClass=StammdatenFahrzeugeBearbeiteEintragForm,hiddenRemote=,StammdatenFahrzeuge=,Anzahl=,Zeit=]

Jetzt noch die Action in meiner struts-config:

Code:
<!-- wird durchlaufen beim onchangeevent des RadioButtons! -->   
  <action path="/StammdatenFahrzeugeRadiobutton"
             type="de.siemens.ffm6.rms.StammdatenFahrzeugeRadiobuttonAction" 
             name="StammdatenFahrzeugeBearbeiteEintragForm"
             scope="request"
             input="/pages/StammdatenParamFahrzeugeBearbeiteEintrag.jsp"
             validate="false">
             
      <forward name="Success" path="/pages/StammdatenParamFahrzeugeBearbeiteEintrag.jsp"/>
  </action>


Btw:Es geht bei mir im Allgemeinen um ein Validierungsproblem, deshalb der Weg über diese ganzen böhmischen Dörfer!
 
Zurück