如何在Spring中处理具有相同值但名称不同的按钮

时间:2014-04-30 19:01:15

标签: java jsp spring-mvc

我有一个动态创建的表,其中包含多行电影。 它有一个标题栏, 媒体类型列, 评级栏, 以及包含"视图"的列按钮。 单击其中一个视图按钮时, 我想通过将标题发送到控制器来转到包含该电影的所有细节的页面,以便我可以在mySql中查询它。 问题是,对于所有这些按钮, 价值永远是"查看"。 所以我的解决方案是使按钮的名称不同,如下面的代码所示(这是从jsp生成的原始html):

<html>
<body>
    <form action="someAction">
        <table>
            <tr>
                <th>title</th>
                <th>type</th>
                <th>rating</th>
            </tr>
            <tr>
                <td>title1</td>
                <td>DVD</td>
                <td>R</td>
                <td><input type="submit" name="mediaType.title1" value="view"></td>
            </tr>
            <tr>
                <td>title2</td>
                <td>DVD</td>
                <td>R</td>
                <td><input type="submit" name="mediaType.title2" value="view"></td>
                </tr>
            <tr>
                <td>title3</td>
                <td>BLU-RAY</td>
                <td>PG-13</td>
                <td><input type="submit" name="mediaType.title3" value="view"></td>
            </tr>
        </table>
    </form>
    </body>
</html>

然后我可以使用parameterMap来确定按下了哪个视图。 这很麻烦,Spring必须有一些能够做到这一点的方法。 我认为这样的东西可以在控制器中起作用:

@RequestMapping("someAction", params = "mediaType.{title}=view")
public ModelAndView loadPage(String title) {
    // use title to query mysql
    // build Model
    // return ModelAndView
}

然而,这不起作用。 我可以在Spring中使用哪些内容比上面更简单,更清晰,而不是从请求中获取参数Map?

3 个答案:

答案 0 :(得分:0)

您可以将多个表单放在表格中,而不是将表格放在一个表格中:

<tr>
  <form action="someAction">
  <td>title1<input type='hidden' name='title' value='title1' /></td>
  <td>DVD</td>
  <td>R</td>
  <td><input type="submit" value="view"></td>
  </form>
</tr>

然后每个标题都有自己的表单,并从隐藏的输入中发送标题(始终使用参数名称title)。

答案 1 :(得分:0)

解决方案在于此声明: “我有一个动态创建的表,其中包含多行电影。”

据推测, 你循环遍历电影列表并在jsp文件中生成表格,每一行都有一些唯一的标识符。 添加隐藏以标识所选行。 从提交按钮设置onclick处理程序中隐藏值的值。 以下是一些示例:

<form ...>
<c:forEach blah var="row">
    <tr>
      ...
        <td><input type="submit" value="View" onclick="setSelectedRow('${row.id}')"/></td>
</c:forEach>
<input type="hidden" id="blammy" name="blammy" value=""/>
</form>

<script type="text/javascript">
    function setSelectedRow(rowId)
    {
        ... set blammy.value equal to rowId.
    }
</script>

// the id is used by JavaScript to find the object in the DOM.
// the name is what appears in the request.

@RequestMapping("someAction")
public ModelAndView loadPage(
    @RequestParameter("blammy") final String blammy)
{
    ...
}

答案 2 :(得分:0)

如果我正确理解了这一点,您就会将各行信息组织到一个表格中。你正在循环某种类型的集合,其副作用是使每个输入字段具有相似的“名称”属性。因此,很难确定您真正关心的输入字段。然后,您已选择使用该按钮作为标识符(可能是因为只有您实际点击的一个按钮被添加到请求中 - 所有其他人都没有被提交)以确定哪个“行”和后续输入字段

我认为这可能归结为您使用的“按钮”。如果你使用文字输入标签(type =“submit”或“button”),那么'value'属性就是用户看到的按钮上的文字 - 所以,你被迫用'名字来玩恶作剧'属性(可能是通过向名称添加索引,将字符串从请求中删除后拆分字符串,并使用该标识符从请求中获取其他参数,这些参数也具有附加到其'name'属性的相同标识符)。

JSP

<input type="submit" name="view${varStatus.index}" value="View" />

HTML来源

<input type="submit" name="view3" value="View">

您应该使用按钮标记。它允许用户看到的文本与请求中提交的值不同。

JSP

<button type="submit" name="view" value="${varStatus.index}" >View</button>

HTML来源

<button type="submit" name="view" value="3">View</button>

这为您提供了该行的“标识符”。

Spring如何适应这一点: 我使用了@RequestMapping和@RequestParam注释,并且无法让Spring直接将值提供给控制器。但是,我能够通过编写自定义HandlerMethodArgumentResolver和自定义注释来实现。

注意:我正在使用注释和java配置而不是xml配置,而且可能更重要的是 - 这是一个快速而肮脏的例子,让它工作。根据您的情况调整它。

<强> HandlerMethodArgumentResolver

DynamicRequestParamArgumentResolver

<强>注释

DynamicRequestParam

控制器方法

Controller method