【问题标题】:Have multiple submit buttons in a form and determine which was pressed in a controller在表单中有多个提交按钮并确定在控制器中按下了哪个按钮
【发布时间】:2010-01-08 03:23:02
【问题描述】:

在我的 Spring 应用程序中,我有一个 jsp,它有一个表单,我希望有多个提交按钮到同一个控制器。我需要能够确定在控制器中按下了哪个按钮。该表单向用户显示了许多项目,他们可以选择其中一项,唯一的区别是所选项目的 ID。

在 jsp 中,我正在创建这样的表单:

<form:form method="post" commandName="myCommand">

    <c:forEach items="${model.availableitems}" var="item">
      <span class="item">${item.description}</span> 
      <input type="hidden" name="id" value="${item.ID}"/>
      <input type="submit" name="SelectButton" value="Select" />
    </c:forEach>

  </div> 
</form:form>

但是,这会在日志中显示“数据绑定错误:1”消息,并且表单未提交给控制器。

我尝试将 myCommand.id 从 int 更改为 String,但提交时的值是 id1、id2、id3...(逗号分隔列表中的所有 ID),无法确定哪个按钮被按下。我不想为每个按钮指定不同的操作,因为项目的数量可能会增加,并且它们的操作都是相同的,只是使用不同的 ID。

我怎样才能在这个表单中有多个按钮并在控制器中获取值?

【问题讨论】:

    标签: java spring jsp jstl


    【解决方案1】:

    为什么不为每个项目使用单独的表单?

    <c:forEach items="${model.availableitems}" var="item">
      <form:form method="post" commandName="myCommand">
        <span class="item">${item.description}</span> 
        <input type="hidden" name="id" value="${item.ID}"/>
        <input type="submit" name="SelectButton" value="Select" />
      </form:form>        
    </c:forEach>
    

    【讨论】:

      【解决方案2】:

      您有 3 个选项 -
      1. 使用多个表单并在每个表单中都有一个提交按钮,如上所述。生成的代码看起来不是很漂亮,通常认为在一个页面中有多个表单是不好的做法。
      2. 按下提交按钮时,使用 Javascript hack 设置隐藏变量。
      3. 如果您必须处理回退(不使用 JavaScript),那么有一种迂回的方法可以找出单击了哪个按钮。这是一个例子-

      <form:form method="post" commandName="myCommand">            
          <c:forEach items="${model.availableitems}" var="item">            
              <span class="item">${item.description}</span>             
              <input type="submit" name="${item.ID}" value="Select" />            
          </c:forEach>
      </form:form>                    
      

      这为每个按钮设置了一个唯一的 ID。由于请求参数以键值对的形式出现,因此在这种情况下,我们必须进行反向查找,因为我们在键位置有值。这是它的java方面..不确定这是否是最有效的方法,但它有效。

      String searchButtonName(final HttpRequest request) { 
          String buttonName = ""; 
          Map<String, String[]> paramMap = request.getParameterMap(); 
          if (MapUtils.isNotEmpty(paramMap)) { 
                  for (Map.Entry<String, String[]> entry : paramMap.entrySet()) {
                          /* Search for the button name as given in 
                             the 'value' attribute for the input tag */
                          if ("Select".equals(entry.getValue()[0])) { 
                                  buttonName = entry.getKey(); 
                                  break; 
                          } 
                  } 
          } 
          return buttonName; 
      } 
      

      【讨论】:

        【解决方案3】:

        不要使用提交按钮,而是使用一个按钮来调用设置隐藏字段值的函数并调用form.submit()

        您可以使用循环生成按钮

        【讨论】:

        • 请不要为此使用 Javascript 黑客。这完全没有意义。
        【解决方案4】:

        您可以在控制器的参数列表中使用注解参数@RequestParam("SelectButton") String submit

        【讨论】:

        • 这不只是给你输入元素的value,每个按钮都是“选择”吗?
        猜你喜欢
        • 2014-02-25
        • 1970-01-01
        • 2010-12-05
        • 1970-01-01
        • 2010-10-02
        • 2012-03-01
        • 2013-03-12
        • 2017-12-17
        • 1970-01-01
        相关资源
        最近更新 更多