【发布时间】:2018-05-12 03:09:36
【问题描述】:
我正在编写允许用户更改密码的表单。我没有将User 对象传递给form,而是传递了3 个空字符串。一切都很好,但是当我通过 Submit 时,字符串返回为空。有没有什么方法可以从 Spring 中的表单中获取字符串,而无需将它们打包成带有 3 个字符串字段的 changePasswordForm 之类的对象?
我的代码:
更改密码视图:
<!DOCTYPE html>
<html lang="en"
xmlns:th="http://www.thymeleaf.org">
<head th:replace="/fragments/head"></head>
<body>
<div class="container">
<div th:replace="/fragments/header"> </div>
<div class="jumbotron">
<h1 class="display-4">Changing password</h1>
<form action="#" th:action="@{/user/changePassword/} + ${user.id}" method="post">
<div class="form-group">
<label>Current password</label>
<input type="password" th:field="${currentPassword}" class="form-control" placeholder="Your current password"/>
</div>
<div class="form-group">
<label>New password</label>
<input type="password" th:field="${newPassword}" class="form-control" placeholder="Your new password"/>
</div>
<div class="form-group">
<label>New password confirmation</label>
<input type="password" th:field="${newPasswordConfirmation}" class="form-control" placeholder="Confirm your new password"/>
</div>
<button class="btn btn-primary">Submit</button>
<button class="btn btn-secondary">Reset</button>
</form>
</div>
<div th:replace="/fragments/footer"> </div>
</div>
</body>
</html>
用户控制器:
package io.gromo13.personalBlog.controller;
import io.gromo13.personalBlog.service.RoleService;
import io.gromo13.personalBlog.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import io.gromo13.personalBlog.model.User;
import javax.validation.Valid;
@Controller
@RequestMapping("/user")
@SessionAttributes("user")
public class UserController {
@Autowired
UserService userService;
@Autowired
RoleService roleService;
public void setUserService(UserService userService) {
this.userService = userService;
}
public void setRoleService(RoleService roleService) {
this.roleService = roleService;
}
@GetMapping("/{id}")
public String profile(@PathVariable Long id, Model model) {
User user = userService.get(id);
model.addAttribute("user", user);
return "/user/profile";
}
@GetMapping("/register")
public String register(Model model) {
model.addAttribute("roles", roleService.getAll());
model.addAttribute("user", new User());
return "/user/register";
}
@PostMapping("/register")
public String registerSubmit(@Valid User user, BindingResult bindingResult) {
if (bindingResult.hasErrors())
return "/user/register";
userService.add(user);
return "redirect:/admin/users";
}
@GetMapping("/edit/{id}")
public String edit(@PathVariable Long id, Model model) {
User user = userService.get(id);
model.addAttribute("user", user);
model.addAttribute("password", "");
return "/user/edit";
}
@PostMapping("/edit/{id}")
public String editSubmit(@ModelAttribute("user") @Valid User user, BindingResult bindingResult) {
if (bindingResult.hasErrors())
return "/user/edit";
userService.edit(user);
return "redirect:/admin/users";
}
@GetMapping("/changePassword/{id}")
public String changePasword(Model model) {
model.addAttribute("currentPassword", "");
model.addAttribute("newPassword", "");
model.addAttribute("newPasswordConfirmation", "");
return "/user/changePassword";
}
@PostMapping("/changePassword/{id}")
public String changePasswordSubmit(@PathVariable Long id,
@ModelAttribute("currentPassword") String currentPassword,
@ModelAttribute("newPassword") String newPassword,
@ModelAttribute("newPasswordConfirmation") String newPasswordConfirmation,
BindingResult bindingResult) {
if (bindingResult.hasErrors())
return "/user/changePassword";
User user = userService.get(id);
if (newPassword.equals(newPasswordConfirmation) && user.getPassword().equals(currentPassword)) {
user.setPassword(newPassword);
userService.edit(user);
}
return "redirect:/admin/users";
}
@GetMapping("/delete/{id}")
public String delete(@PathVariable Long id) {
userService.delete(id);
return "redirect:/admin/users";
}
}
实际上我的整个页面工作正常,我只是无法读取传递给表单的单个字符串而不包装到对象。
我发现的每个关于 Spring 表单的教程都在传递像 xForm 或 User 这样的对象来查看和阅读它们。它也适用于我,但我认为只为单一形式创建特殊对象没有意义。
【问题讨论】:
-
您可以将字符串作为
request.getParameter("paramName")并在控制器方法中添加参数HttpServletRequest request
标签: java html spring spring-mvc thymeleaf