2010-06-16 17 views
0

大家好(就像其他人一樣)繼承了一些struts 1代碼。我需要爲此項目添加更多頁面。Struts 1 ActionForm - 從純HTML中檢索集合

我無法弄清楚的是如何映射幾個不同但類似性質的輸入元素到我的ActionForm中。

讓我詳細說明。我在用戶輸入越來越多的項目時動態地創建了一個新的<Input>元素(我使用YUI自動完成表單元素,並且對於每個輸入的輸入,我將它作爲輸入元素添加到我的表單並繪製新的YUI自動完成 - 複雜的聲音,我知道)

所以......我的形式看起來有點像(...一些美化後一些這樣的...):

<!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> 

正如你可以看到下面是一個很值得重複:

<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> 

我的stuts-config的相關部分。 xml文件是:

<?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> 

我也用彈簧2.56(相關部分是):

<?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> 

我的Java ActionForm類(從我所學過的淨值)爲:

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); 
    } 
} 

問題是爲什麼我在我的TestCaseBuilderSave Action中獲得一個空的SelectedRows?

感謝所有誰有耐心看完這麼長的問題...

和(希望)感謝你的潛在救星:)

編輯1:

由於爲了@ ahiru的請求我發佈了我的行動課程 - 暫時只是一個簡單的過程。幾乎什麼都不做,類:

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; 
    } 
} 

回答

1

我不是一個struts的主人或任何東西,但可以struts處理建立一個列表的輸入?使用一串字符串會更好嗎?你有沒有嘗試在你的表單中添加一個方法?

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

我覺得有一種方法來定義支柱配置一個索引輸入。

--update

你能不能發表您的動作類,你正在試圖獲得這些價值?

我知道你說過上述方法不起作用,但在類似的情況下(我認爲),這對我來說很有用。對不起,我不能找到確切的代碼,但這裏是我記得:

-ActionForm

private String[] strings; 

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

JSP/HTML /不管

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

我也很好奇,如果彈簧支柱一起玩好(我沒有做過這方面的研究)

+0

謝謝,我已經嘗試了兩件事......既沒有你提出的方法,也沒有陣列的工作。就我而言,它可能是一個List,一個數組,一個Map,一個圖,不管...只要我使用ActionForm獲取數據到服務器 – Yaneeve 2010-06-16 12:51:50

+0

將給你的數組示例另一個嘗試...... – Yaneeve 2010-06-16 13:18:05

+0

@ahiru:至於「我也很好奇,如果春天和struts一起玩很好(我沒有做過這方面的研究)」我只有整合了struts 1與春天,而不是struts 2,但從我短暫的經驗,初始設置是有點棘手,但從那時起(大部分)是平穩的航行 – Yaneeve 2010-06-16 13:19:47

1

似乎問題是,複選框沒有被'檢查'。

只有「檢查」複選框得到他們的價值轉移到服務器...

有一件事我想強調的是,我已經將我的代碼是像什麼@ahiru建議:

private String[] strings; 

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