2010-06-16 15 views
0

Salut tout ce que j'ai (tout comme le reste) a hérité de quelques struts 1 code. J'ai eu besoin d'ajouter quelques pages à ce projet.Struts 1 ActionForm - Récupérer une collection à partir de HTML pur

Ce que je n'arrive pas à comprendre est comment mapper plusieurs éléments d'entrée distincts mais de nature similaire à mon ActionForm.

Permettez-moi de préciser. Je crée un nouvel élément <Input> dynamiquement que l'utilisateur entre de plus en plus d'éléments (j'utilise l'élément YUI autocomplete forme et pour chaque entrée entrée je l'ajoute comme un élément d'entrée à mon formulaire et dessine un nouveau YUI autocomplete - sondage complexe, je sais)

Alors ... Ma forme ressemble un peu (... après quelques enjoliver et certains, ...):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
    <head> 
     <meta http-equiv="content-type" content="text/html; charset=utf-8"> 
     <title>My Cool App - Test Case Builder</title> 

     <link rel="stylesheet" type="text/css" href="../script/yui/fonts/fonts-min.css" /> 
     <link rel="stylesheet" type="text/css" href="../skins/myCoolApp/button/button.css" /> 
     <link rel="stylesheet" type="text/css" href="../script/yui/autocomplete/assets/skins/sam/autocomplete.css" /> 
     <link rel="stylesheet" type="text/css" media="screen" href="../skins/myCoolApp/testcase.css" /> 


     <!-- YUI JAVA SCRIPTS --> 
     <script type="text/javascript" src="../script/yui/yahoo-dom-event/yahoo-dom-event.js"></script> 
     <script type="text/javascript" src="../script/yui/element/element-min.js"></script> 
     <script type="text/javascript" src="../script/yui/button/button-min.js"></script> 
     <script type="text/javascript" src="../script/yui/datasource/datasource-min.js"></script> 
     <script type="text/javascript" src="../script/yui/autocomplete/autocomplete-min.js"></script> 


     <!-- APP JAVA SCRIPTS --> 
     <script type="text/javascript" src="../script/myCoolApp/myCoolApp.js" ></script> 
     <script type="text/javascript" src="../script/myCoolApp/stack.js" ></script> 
     <script type="text/javascript" src="../script/myCoolApp/testcase/testcase.js"></script> 
     <script type="text/javascript" src="../script/myCoolApp/testcase/default-data.js" ></script> 
     <script type="text/javascript" src="../script/myCoolApp/testcase/data-structs.js" ></script> 
     <script type="text/javascript" src="../script/myCoolApp/testcase/ui-elements.js" ></script> 


    </head> 
    <body class="cf010"> 
     <div id="wrap"> 
      <div id="header"> 
       <div id="main-header"> 
        COOL APP 
       </div>     
      </div> 
      <div id="main-body"> 
       <div id="content"> 
        <div class="col main"> 
         <div id="main"> 
          <form method="post" id="testcaseForm" class="typea" action=""> 
           <fieldset> 
            <legend>Test Case Builder</legend> 
            <div id="tk1" class="tabcontrol"> 
             <ul class="tabs"> 
              <li class="first active"> 
               <a href="#"> 
                <span>General</span> 
               </a> 
              </li> 
              <li class="last"> 
               <a href="#"> 
                <span>Parameters</span> 
               </a> 
              </li> 
             </ul> 
             <div id="tab0" class="tc-panel"> 
              <dl class="cls9"> 
               <dt> 
                <label for="scenario">Choose Scenario:</label> 
               </dt> 
               <dd> 
                <input type="text" id="scenario" name="scenario" class="text" /> 
                <span id="scenarioToggle"></span> 
                <div class="auto-complete" id="scenarioContainer"></div> 
               </dd> 
               <dt> 
                <label for="ruleID">Choose Rule ID:</label> 
               </dt> 
               <dd> 
                <input type="text" id="ruleID" name="ruleID" class="text" /> 
                <span id="ruleIDToggle"></span> 
                <div class="auto-complete" id="ruleIDContainer"></div> 
               </dd> 
               <dt> 
                <label for="Test Case Name" accesskey="t"><span class="accesskey">T</span>est Case Name:</label> 
               </dt> 
               <dd> 
                <input type="text" id="testCaseName" name="testCaseName" class="text" /> 
               </dd> 
              </dl> 
             </div> 
             <div id="tab1" class="tc-panel hidden"> 
              <div class="toolbar" id="action-bar"> 
               <ul> 
                <li class="first"> 
                 <a title="select all" href="#" id="btmSelectAll" class="button"> 
                  <span>select all</span> 
                 </a> 
                </li> 
                <li> 
                 <a title="remove row" href="#" id="btmRemove" class="button"> 
                  <span>remove row</span> 
                 </a> 
                </li> 
                <li> 
                 <a title="undo last" href="#" id="btmRollBack" class="button disabled"> 
                  <span>undo last</span> 
                 </a> 
                </li> 
                <li class="last"> 
                 <a title="accept row" href="#" id="btmAccept" class="button disabled"> 
                  <span>accept row</span> 
                 </a> 
                </li> 
               </ul> 
              </div> 
              <div id="param.list" class="gridclip"> 
               <table id='param.list.tbl' class='grid modela' > 
                <caption>Test Case Summary</caption> 
                <col/><col/><col/>   
                <thead> 
                 <tr> 
                  <th class='hl center first'> 
                   <input class='grid-select-all' type='checkbox' /> 
                  <th> 
                  <th scope='col'>Row</th> 
                  <th scope='col'>Parameter</th> 
                  <th scope='col' class='last'>Value</th> 
                 </tr> 
                </thead> 
                <tfoot> 
                 <tr> 
                  <th scope='row'>Total</th> 
                  <td colspan='3'>2 parameters as Test Case input</td> 
                 </tr> 
                </tfoot> 
                <tbody id='param.list.tbl.body'>    
                 <tr class='odd'> 
                  <td class='rowcheck center first'> 
                   <input value='param1###value1' id='cb1' name='SelectedRows' class='grid-select-row' type='checkbox'/> 
                  </td> 
                  <td class='id'>1</td> 
                  <td>param1</td> 
                  <td class='last'>value1</td> 
                 </tr> 
                 <tr class='even'> 
                  <td class='rowcheck center first'> 
                   <input value='param2###value2' id='cb2' name='SelectedRows' class='grid-select-row' type='checkbox'/> 
                  </td> 
                  <td class='id'>2</td> 
                  <td>param2</td> 
                  <td class='last'>value2</td> 
                 </tr> 
                 <tr class='odd'>    
                  <td class='rowcheck center first' /> 
                  <td class='id'><em>new</em></td> 
                  <td> 
                   <dl class='clsTable'> 
                    <dt> 
                     <input type='text' id='param' name='param' class='text paramInput' /> 
                    </dt> 
                    <dd> 
                     <span id='paramToggle' /> 
                    </dd> 
                    <div class='auto-complete' id='paramContainer' /> 
                   </dl> 
                  </td> 
                  <td class='last'> 
                   <dl class='clsTable'> 
                    <dt> 
                     <input type='text' id='value' name='value' class='text valueInput' /> 
                    </dt> 
                   </dl> 
                  </td> 
                 </tr> 
                </tbody> 
               </table> 
              </div> 
             </div> 
            </div> <!-- tabcontrol --> 
           </fieldset> 
           <div class="submit-box"> 
            <input type="submit" name="formRun" id="formRun" class="form-save" 
             value="Execute" accesskey="x" title="Run: Press Alt + [Shift] + x" /> 
            <input type="submit" name="formSave" id="formSave" 
             value="Save" accesskey="s" title="Save: Press Alt + [Shift] + s" /> 
            <input type="submit" name="formLoad" id="formLoad" 
             value="Load" accesskey="l" title="Load: Press Alt + [Shift] + l" /> 
            <input type="submit" name="formCancel" id="formCancel" class="form-cancel" 
             value="Cancel" accesskey="c" title="Cancel: Press Alt + [Shift] + c" /> 
           </div> 
          </form> 
         </div> 
        </div> 
       </div> 
      </div> 
     </div> 
    </body> 
</html> 

comme vous pouvez le voir ce qui suit est à peu près un double:

<tr class='odd'> 
    <td class='rowcheck center first'> 
     <input value='param1###value1' id='cb1' name='SelectedRows' class='grid-select-row' type='checkbox'/> 
    </td> 
    <td class='id'>1</td> 
    <td>param1</td> 
    <td class='last'>value1</td> 
</tr> 
<tr class='even'> 
    <td class='rowcheck center first'> 
     <input value='param2###value2' id='cb2' name='SelectedRows' class='grid-select-row' type='checkbox'/> 
    </td> 
    <td class='id'>2</td> 
    <td>param2</td> 
    <td class='last'>value2</td> 
</tr> 

La partie pertinente de mon fichier stuts-config. fichier xml est:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"> 
<struts-config> 
    <data-sources /> 
    <form-beans> 
     <form-bean name="TestCaseForm" type="com.blahblah.mycoolapp.forms.TestCaseForm" /> 
    </form-beans> 
    <action-mappings> 
     <action path="/pages/SaveTestCase" name="TestCaseForm" 
      type="org.springframework.web.struts.DelegatingActionProxy" scope="request"> 
     </action> 
    </action-mappings> 
    <message-resources parameter="MessageResources" /> 
</struts-config> 

J'utilise aussi le printemps 2,56 (La partie pertinente étant):

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> 

    <bean name="/pages/SaveTestCase" class="com.blahblah.mycoolapp.actions.TestCaseBuilderSaveAction" /> 

</beans> 

classe My Java ActionForm (de ce que j'avais appris sur le net) est:

package com.blahblah.mycoolapp.forms; 

import java.util.ArrayList; 
import java.util.List; 

import org.apache.struts.action.ActionForm; 

public class TestCaseForm extends ActionForm { 

    private static final long serialVersionUID = 2352146257739099766L; 

    private String scenario; 
    private String ruleID; 
    private String testCaseName; 
    private List<String> SelectedRows = new ArrayList<String>() ; 

    public String getScenario() { 
     return scenario; 
    } 

    public void setScenario(String scenario) { 
     this.scenario = scenario; 
    } 

    public String getRuleID() { 
     return ruleID; 
    } 

    public void setRuleID(String ruleID) { 
     this.ruleID = ruleID; 
    } 

    public String getTestCaseName() { 
     return testCaseName; 
    } 

    public void setTestCaseName(String testCaseName) { 
     this.testCaseName = testCaseName; 
    } 

    public List<String> getSelectedRows() { 
     return SelectedRows; 
    } 

    public void setSelectedRows(int index, String value) { 
     this.SelectedRows.add(value); 
    } 
} 

La question est Pourquoi ai-je un SelectedRows vide dans mon Action TestCaseBuilderSave?

Merci à tous ceux qui ont la patience de lire une telle question longtemps ...

et (espérons) grâce à vous tous sauveurs potentiels :)

EDIT 1:

Due à la demande de @ ahiru je poste mon cours d'action qui - pour l'instant est juste un dépouillé. presque rien, classe:

public class TestCaseBuilderSaveAction extends Action { 


    @Override 
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, 
      HttpServletResponse response) throws Exception { 

     response.setContentType("application/octet-stream"); 
     response.setHeader("Content-Disposition","attachment;filename=superfish.xml"); 

     try 
     { 
      ServletOutputStream out = response.getOutputStream(); 

      String contentStr = "<Yaneeve>Has been here...</Yaneeve>"; 
      byte[] bytes = contentStr.getBytes(); 
      out.write(bytes, 0, bytes.length); 
      out.flush(); 
      out.close(); 

     }catch(Exception e){ 
      e.printStackTrace(); 
     } 

     return null; 
    } 
} 

Répondre

1

Je ne suis pas un maître de struts ou quoi que ce soit mais peut struts gérer la construction d'une liste sur les entrées? Serait-il préférable d'utiliser un tableau de chaînes? Avez-vous essayé d'ajouter une méthode dans votre formulaire?

public void setSelectedRows(List<String> list) { SelectedRows = list;}

je pense qu'il existe un moyen pour définir une entrée indexée dans la configuration des entretoises.

--update

Pouvez-vous poster éventuellement votre classe d'action où vous essayez d'obtenir ces valeurs?

Je sais que vous avez dit que la méthode ci-dessus ne fonctionne pas mais voici ce qui fonctionne pour moi dans une situation similaire (je pense).Désolé, je ne trouve pas le code exact, mais voici ce que je me souviens:

-ActionForm

private String[] strings; 

public void setStrings(String[] strings) { this.strings = strings;} 
public String[] getStrings() { return strings; } 

jsp/html/whatever

<input type="text" value="x" name="strings[]"> 
<input type="text" value="y" name="strings[]"> 
<input type="text" value="z" name="strings[]"> 

Je suis aussi curieux de savoir si le printemps et entretoises jouer ensemble bien (je n'ai fait aucune recherche sur ceci)

+0

Merci, j'ai essayé les deux choses ... ni les méthodes que vous suggérez, ni le tableau fonctionnait. En ce qui me concerne il pourrait être une liste, un tableau, une carte, un graphique, peu importe ... tant que je reçois les données sur le serveur en utilisant le ActionForm – Yaneeve

+0

donnera un autre essai à votre exemple de tableau ... – Yaneeve

+0

@ahiru: "Je suis aussi curieux de savoir si le printemps et les entretoises jouent bien ensemble (je n'ai fait aucune recherche à ce sujet)" J'ai seulement des entretoises 1 avec ressort, pas des entretoises 2 mais de ma courte expérience, la configuration initiale est un peu compliqué mais à partir de ce moment-là c'est (en général) une navigation douce – Yaneeve

1

Il semble que le problème ait été que les cases à cocher n'avaient pas été 'vérifiées'.

Seulement cases « checked » obtiennent leur valeur transférée au serveur ...

Une chose que je tiens à souligner est que j'avais converti mon code pour ressembler à ce que @ahiru suggéré:

private String[] strings; 

public void setStrings(String[] strings) { this.strings = strings;} 
public String[] getStrings() { return strings; }