jsp+servlet组合虽仍被维护但不推荐用于新项目,因分层不清、难测试、模板逻辑混杂且tomcat10+默认禁用el和scriptlet;servlet是继承httpservlet的java类,需正确配置映射并重写doget/dopost,显式设置utf-8编码,避免拼html;jsp通过el从request等作用域取值,需注意空值判断与上下文路径匹配。

Java Web 应用中,JSP 和 Servlet 是早期但仍在维护场景中广泛使用的组合;不过现在直接用 JSP + Servlet 开发新项目已不推荐——它缺乏清晰分层、易写难测、模板与逻辑混杂,且 JSP 在现代容器(如 Tomcat 10+)中默认禁用 EL 表达式和 Scriptlet,兼容性问题频出。
Servlet 是什么,为什么必须写 doGet 和 doPost
Servlet 是一个 Java 类,继承 HttpServlet,负责接收 HTTP 请求并生成响应。容器(如 Tomcat)在收到请求后,根据 URL 映射调用对应 Servlet 实例的 doGet 或 doPost 方法。
常见错误:只重写 service 方法,或漏写 @Override 导致方法未被调用;更隐蔽的是没在 web.xml 中配置 <servlet-mapping></servlet-mapping>,或用了注解但忘了加 @WebServlet("/xxx")。
- Tomcat 9+ 默认不扫描
@WebServlet注解,需确认web.xml的<web-app></web-app>根标签 version ≥ 3.0,且没有metadata-complete="true" -
doGet和doPost中必须显式设置响应编码:response.setCharacterEncoding("UTF-8"),否则中文乱码 - 不要在 Servlet 中拼 HTML 字符串返回,那是 JSP / 模板引擎该干的事
JSP 页面里怎么安全取 Servlet 传来的数据
JSP 不是 Java 类,而是被容器编译为 Servlet 的模板文件。它能访问四种作用域对象:pageContext、request、session、application。最常用的是 request,对应 Servlet 中 request.setAttribute("key", value) 后,在 JSP 用 ${key} 取值。
立即学习“Java免费学习笔记(深入)”;
容易踩的坑:
- 启用了 JSP Scriptlet(
),但 Tomcat 10 默认禁用,需在conf/web.xml中取消注释<init-param></init-param>下的scripting-invalid并设为false(不建议) - EL 表达式失效:检查是否写了
,或 web.xml 声明的 servlet 版本过低 - 从
request取值时没判空,JSP 报NullPointerException;应改用${empty key ? 'default' : key}
如何让表单提交到 Servlet 而不是跳转到 404
表单的 action 属性必须与 Servlet 的映射路径严格一致,且注意上下文路径(context path)。例如应用部署为 /myapp,Servlet 映射为 @WebServlet("/login"),则表单应写:<form action="%24%7BpageContext.request.contextPath%7D/login" method="post"></form>。
常见失败原因:
- Servlet 类没加
@WebServlet,也没在web.xml配置,导致容器根本不知道这个路径对应谁 - 路径写成绝对路径
/login,忽略 context path,结果请求发到了根应用下 - Servlet 编译失败(比如缺少
javax.servlet依赖),Tomcat 启动时报ClassNotFoundException,但页面仍显示 404,日志里才见真章 - POST 提交后浏览器地址栏仍是 GET 路径,误以为没进 Servlet —— 其实进了,只是你没做跳转或输出,响应体为空而已
真正麻烦的不是写不出登录页,而是当业务变复杂后,request.setAttribute 塞十几个变量、JSP 里嵌套三层 <foreach></foreach>、再混几个 ,调试时连断点都打不到逻辑哪一步。这时候你就知道,为什么 Spring MVC 的 @Controller + Thymeleaf 会成为事实标准了。










