SpringBoot+NetBeans环境下JSP运行异常问题排查求助
问题根因
当前配置存在3个核心错误,直接对应你遇到的两个异常:
- 模板引擎配置错配:项目引入Thymeleaf依赖,却将Thymeleaf视图后缀配置为
.jsp,Thymeleaf既不识别JSP原生${}EL语法,项目也没有配置JSP专属视图解析器,两套模板规则混用导致视图无法正常渲染,直接把源码文本输出到页面。 - 请求参数规则配置不合理:
@RequestParam注解默认要求参数必传,不带name参数访问时接口直接抛出400参数缺失错误,项目未自定义错误页,就会触发SpringBoot默认的/error fallback提示。 - 视图路径匹配存疑:配置的Thymeleaf视图前缀为
classpath:/templates/mama/,需要确认视图文件实际存放路径是否和配置一致,路径不匹配也会导致视图解析失败。
分步解决方案
第一步:确定使用的模板技术,二选一,禁止混配
方案1:使用JSP(SpringBoot官方对JSP内嵌容器支持有限,不推荐)
- 删掉application.properties中所有Thymeleaf相关配置,即删除以下两行:
spring.thymeleaf.prefix=classpath:/templates/mama/ spring.thymeleaf.suffix=.jsp - 新增JSP视图解析配置:
spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp logging.level.org.springframework.web=DEBUG - 将
login.jsp从templates目录移动到src/main/webapp/WEB-INF/jsp/路径下,这是SpringBoot识别JSP文件的默认路径。 - 检查pom.xml依赖,补齐JSP运行必要的包:
<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> - 检查JSP文件头,若存在
<%@ page isELIgnored="true" %>配置直接删除,或显式添加<%@ page isELIgnored="false" %>启用EL表达式解析。
方案2:使用Thymeleaf(SpringBoot官方推荐,适配性更好)
- 将
login.jsp重命名为login.html,放到src/main/resources/templates/mama/目录下,和配置的视图前缀路径完全对应。 - 修改application.properties中Thymeleaf后缀配置,将
.jsp改为.html:spring.thymeleaf.prefix=classpath:/templates/mama/ spring.thymeleaf.suffix=.html logging.level.org.springframework.web=DEBUG - 调整页面变量写法,Thymeleaf不支持直接在文本中写原生
${name}的语法,需要通过th属性绑定,同时修正th命名空间地址:<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org/"> <head> <title>First web application</title> </head> <body> <h1 th:text="'Welcome ' + ${name} + '!'"></h1> </body> </html>
第二步:修复无参数访问报错问题
修改Controller层的@RequestParam注解配置,将参数设为非必填,同时配置默认值,修改后代码如下,没用的冗余import可以直接删掉:
import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @Controller public class LoginController { @RequestMapping("/login") public String loginMessage(@RequestParam(required = false, defaultValue = "guest") String name, ModelMap model){ model.put("name", name); return "login"; } }
修改后不带name参数访问时,会默认传递name=guest,不会再触发参数缺失错误。
第三步:清理缓存重启验证
在NetBeans中执行clean build命令,清空之前的target编译缓存,再重启项目,分别测试带参数、不带参数的访问地址即可。
内容的提问来源于stack exchange,提问作者Humphrey
相关产品推荐
相关产品推荐

