Spring MVC使用form标签报IllegalStateException异常求助
兄弟,我一眼就看出问题出在哪了——你用Spring form标签(<form:form>)的时候,忘记给请求域提前放一个employee的空对象了!
Spring的form标签和纯HTML表单不一样:普通HTML表单只是单纯提交参数,不需要依赖Spring的模型对象;但Spring form标签从渲染页面开始,就需要绑定一个同名的目标对象,用来做数据映射、表单回显、错误信息展示等工作。你的Controller里只写了处理POST提交的方法,没有处理GET请求的逻辑来把空的Employee对象存入请求域,所以打开表单页面时Spring找不到employee这个请求属性,直接抛出了异常。
最直接的修复方式是给EmployeeController添加一个处理GET请求的方法,专门用来返回表单页面,同时把空的Employee对象传入Model:
@Controller @RequestMapping("/employee") public class EmployeeController { // 新增:处理GET请求,返回表单页面并传入空的Employee对象 @RequestMapping(value="/showForm", method=RequestMethod.GET) public String showEmployeeForm(Model model) { // 存入的对象名称必须和form标签的modelAttribute属性值一致 model.addAttribute("employee", new Employee()); return "EmployeeForm"; // 返回你的表单JSP页面名称 } // 原有的POST处理方法保持不变 @RequestMapping(value="/submitForm", method=RequestMethod.POST) public String formSubmission(@ModelAttribute("employee") Employee employee,BindingResult bindingResult) { System.out.println("entered in @RequestMapping"); System.out.println("printing employee from modelattribute"); System.out.println(employee.getEmail()); System.out.println(employee.getFirstName()); System.out.println(employee.getLastName()); System.out.println(employee.getSalary()); return "EmployeeWelcome"; } }
然后调整JSP里的表单action路径,用相对路径更简洁:
<form:form action="submitForm" method="post" modelAttribute="employee">
如果你这个Controller下的所有方法都需要用到Employee对象,也可以用@ModelAttribute注解定义一个全局的对象初始化方法,每次请求Controller时都会自动把对象存入模型:
@ModelAttribute("employee") public Employee setUpEmployee() { return new Employee(); }
不过这种方式不如单独写GET方法清晰,也不符合REST风格的请求设计,更推荐第一种方案。
启动项目后,访问http://localhost:8080/你的项目名/employee/showForm,就能正常打开表单页面;填写提交后,数据会被正常封装到Employee对象中进入POST方法处理。
内容的提问来源于stack exchange,提问作者Shweta Priyadarshani

