【问题标题】:Spring Boot : Getting Null inputs from Form SubmissionSpring Boot:从表单提交中获取空输入
【发布时间】:2018-03-20 15:14:07
【问题描述】:

我有一个基本的表单提交 Spring Boot 应用程序。 我的问题是当我提交表单时我得到空结果。

这是我的表单代码:

<form method="post" action="#" th:action="@{/save}" th:object="${info}" commandName ="info">

              <div class="form-group row">
                <label for="firstname">First Name</label>
                <input type="text" th:field="*{_FirstName}" class="form-control" placeholder="Enter First Name">
              </div>
              <div class="form-group row">
                <label for="lastname">Last Name</label>
                <input type="text" th:field="*{_LastName}" class="form-control" placeholder="Enter Last Name">
              </div>

                <div class="form-group">
                    <label>Select Country</label><br>
                    <select class="form-control" th:field="*{_Country}">
                      <option value="United State">United State</option>
                      <option value="Bangladesh">Bangladesh</option>
                      <option value="Hungary">Hungary</option>
                      <option value="Malaysia">Malaysia</option>
                      <option value="India">India</option>
                    </select>
                </div>

              <div class="form-group row">
                 <label for="date">Date</label>
                 <input th:field="*{_Date}" class="form-control" type="date" value="2011-08-19" />
              </div>
              <div class="pull-right">
                <button type="submit" class="btn btn-primary">Submit</button>
              </div>

            </form>

在我的控制器中,我有 url /form 用于 get 方法和 /save 用于 post 方法 得到结果后,我试图记录输入。 我不确定我是否通过这些输入来填充模型?如果是这样,为什么输入显示为空。 我的控制器代码:

@RequestMapping(value = "/form", method = RequestMethod.GET)
public String index(Info info) {
    //model.addAttribute("info", new Info());
    return "form";
}

@RequestMapping(value = "/save", method = RequestMethod.POST)
public String save(@Valid Info info, BindingResult bindingResult, Model model) {
    if (bindingResult.hasErrors()) {
        return "form";
    }
    model.addAttribute("_FirstName", info.get_FirstName());
    model.addAttribute("_LastName", info.get_LastName());
    model.addAttribute("_Country", info.get_Country());
    model.addAttribute("_Date", info.get_Date());


    String submitted = String.format("User Submission: firstname = %s, lastname = %s, country = %s, date = %s", 
            info.get_FirstName(), info.get_LastName(), info.get_Country(), info.get_Date());
    log.info(submitted);

    return "cv";
}

还有我的模型代码:

public class Info {

private String _FirstName;
private String _LastName;
private String _Country;
private Date _Date;

public Info() {

}

public Info(String _FirstName, String _LastName, String _Country, Date _Date) {
    super();
    this._FirstName = _FirstName;
    this._LastName = _LastName;
    this._Country = _Country;
    this._Date = _Date;
}

public String get_FirstName() {
    return _FirstName;
}
public void set_FirstName(String _FirstName) {
    this._FirstName = _FirstName;
}
public String get_LastName() {
    return _LastName;
}
public void set_LastName(String _LastName) {
    this._LastName = _LastName;
}
public String get_Country() {
    return _Country;
}
public void set_Country(String _Country) {
    this._Country = _Country;
}
public Date get_Date() {
    return _Date;
}
public void set_Date(Date _Date) {
    this._Date = _Date;
}


}

谁能检查我缺少什么? 我进入控制台:

User Submission: firstname = null, lastname = null, country = null, date = null

提前致谢!

【问题讨论】:

  • 您是否测试过在@Valid 注释之前添加@ModelAttribute:? public String save(@ModelAttribute @Valid Info info, BindingResult bindingResult, Model model) {
  • @Melardev 是的,不工作!
  • 当我从 _FirstName 更改为 firstName 时,它​​对我有用,显然你也必须更改设置器以及表单 html 文件
  • 你能详细说明一下吗? th:field="*{_LastName}"
  • 我在下面写了一个答案,如果它有效,请告诉我,我有你的代码有效,如果你需要它,我会完全写出来......

标签: java spring spring-mvc spring-boot web


【解决方案1】:

这是在我的环境中运行的代码,我将向您展示我所做的更改:

@RequestMapping(value = "/form", method = RequestMethod.GET)
    public String index(Info info, Model model) {
        model.addAttribute("info", info);
        return "myform";
    }

@RequestMapping(value = "/save", method = RequestMethod.POST)
    public String save(@ModelAttribute("info") Info info, HttpServletRequest request, BindingResult bindingResult, Model model) {
        if (bindingResult.hasErrors()) {
            return "myform";
        }

请注意 HttpServletRequest 不是必需的,我添加了它以便我可以查看 Spring 是否能够使用 request.getParameterNames() 获取参数,这向我证明确实如此,这是你的代码有问题不是与绑定...

private String firstName;
    private String _LastName;
    private String _Country;
    private Date _Date;
public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String set_LastName() {
        return _LastName;
    }

有趣的是,唯一调用的 setter 是 setFirstName(),名称不变的其他 setter 没有工作......所以问题在于命名。

html文件

    <div class="form-group row">

        <input type="text" th:field="*{firstName}" class="form-control" placeholder="Enter First Name">

【讨论】:

  • 现在可以使用了!但我很困惑,命名有什么问题?
  • @RayD'vard 我不太清楚,但作为一般的经验法则,至少我尽量不让变量/字段以下划线开头,你可能会遇到很多问题编程语言或框架。如果我没记错的话也不算太远,如果您使用以下划线开头的字段,Spring Data 也会出现异常。请参阅docs.spring.io/spring-data/jpa/docs/current/reference/html/… 下面的几个段落,您可以阅读“由于我们将下划线视为保留字符,我们......”
  • 感谢您的信息!我会牢记这一点,并将其列入进一步研究的清单。
【解决方案2】:

将您的 GET 请求方法更新为:

@RequestMapping(value = "/form", method = RequestMethod.GET)
public String index(Info info, Model model) {
    model.addAttribute("info", new Info());
    return "form";
}

您需要向表单提供 Info 对象才能将其取回。还要在@Valid 之前/之后将@ModelAttribute 放在您的POST 方法中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    相关资源
    最近更新 更多