我有一个动态创建的表,其中包含多行电影。 它有一个标题栏, 媒体类型列, 评级栏, 以及包含"视图"的列按钮。 单击其中一个视图按钮时, 我想通过将标题发送到控制器来转到包含该电影的所有细节的页面,以便我可以在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?
答案 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 强>
<强>注释强>
控制器方法