【问题标题】:How to pass a variable from html select as a PathVariable?如何将 html select 中的变量作为 PathVariable 传递?
【发布时间】:2019-04-24 08:48:41
【问题描述】:

我有这样的表格:

<form action="/list/${tableName}" method="post">
<p>
<select name="tableName">
<option value="employees">Employees</option>
<option value="contracts">Contracts</option>
</select>
</p>
<input type="submit" value="Submit" />
</form>

在控制器端:

    @RequestMapping(value = "/list/{tableName}", method = { RequestMethod.POST, RequestMethod.GET })
    public String getTables(Model m, @PathVariable("tableName") String tableName) {
...
//findAll here
...
return "home";
}

它写“未找到” P.S.:现在@PathVariable 曾经是@RequestParam,因为我也在正文中使用它。 如何将选项作为变量传递给控制器​​,以便在使用 findAll 列出表数据时获得列表/员工和列表/合同?

【问题讨论】:

  • 如果您需要额外的数据或澄清一些问题,请随时询问!
  • 我认为@RequestParam 应该在这种情况下工作。您能否解释一下“我也在体内使用它”是什么意思?
  • 看来,当您提交表单时,url '/list/${tableName}' 并没有解析 'tableName' 变量。尝试将 ${tableName} 替换为任何硬编码值,以检查控制器是否正常工作。
  • 感谢您的回答!完整的 getTables 是:&lt;code&gt;@RequestMapping(value = "/list/{tableName}", method = { RequestMethod.POST, RequestMethod.GET }) public String getTables(Model m, @PathVariable("tableName") String tableName ) { 整数 idPrepend = spravochnikService.getIdAtSpravName(tableName); List spravList = spravochnikService.findAll(tableName); m.addAttribute("spravList", spravList); m.addAttribute("tableName", tableName); m.addAttribute("idPrepend", idPrepend);回家”; }&lt;/code&gt;

标签: java spring spring-mvc jsp jstl


【解决方案1】:

@RequestParam 用于查询参数(静态值),例如:http://localhost:8080/calculation/pow?base=2&ext=4

@PathVariable 用于动态值,例如:http://localhost:8080/calculation/sqrt/8

@RequestMapping(value="/pow", method=RequestMethod.GET)
public int pow(@RequestParam(value="base") int base1, @RequestParam(value="ext") int ext1){
    int pow = (int) Math.pow(base1, ext1);
    return pow;
}

@RequestMapping("/sqrt/{num}")
public double sqrt(@PathVariable(value="num") int num1){
    double sqrtnum=Math.sqrt(num1);
    return sqrtnum;
}

这里是更多关于@PathVariable vs @RequestParam的链接

要解决您的问题,您需要查看(例如在调试模式下)您的方法 findAll 是否实际上返回了一些数据,以及您如何将这些数据发送到视图。

【讨论】:

  • 谢谢!如果我不添加 ${} 和 {} 东西,它会返回我需要的所有东西,只是 url 只是 /list
  • 另外我建议不要使用 method = { RequestMethod.POST, RequestMethod.GET }。只需使用注释 GetMapping 和 PostMapping 制作 2 个方法。
  • 那么如何让表单选择选项出现在列表的url中呢?也许不是代码,只是提示或建议
  • {tableName} 将是 PathVariable ,因为它将是动态值,取决于您在表单中选择的内容,然后在 findAll 方法中使用此值从 {tableName} 获取数据列表并将其返回以查看。
  • 是的,我用它作为路径变量,如果我手动输入uri,即/list/employees,它可以工作,但是如何从表单中传递表名?我的jsp好像错了
【解决方案2】:

只需使用 @RequestParam 注释即可。

如文档中所述:

您可以使用@RequestParam 注解将Servlet 请求参数(即查询参数或表单数据)绑定到控制器中的方法参数。 https://docs.spring.io/spring/docs/5.2.0.M1/spring-framework-reference/web.html#mvc-ann-requestparam

形式:

<form action="/list">
  <select name="tableName">
    <option value="employees">Employees</option>
    <option value="contracts">Contracts</option>
  </select>
  <input type="submit" value="Submit" />
</form>

控制器:

@RequestMapping(value = "/list", method = RequestMethod.GET)
public String getTables(Model m, @RequestParam("tableName") String tableName) {
  //findAll here
  return "home";
}

如果您的请求对服务器没有任何副作用(是只读请求),最好的做法是使用 GET 方法。

【讨论】:

  • 谢谢!我也试图让选择的选项出现在映射中,比如 /list/employees
猜你喜欢
  • 2021-02-26
  • 1970-01-01
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多