You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 14:39:08