别再死记硬背了!用Tomcat 9 + IDEA 2023,5分钟搞懂Servlet和JSP到底怎么分工

别再死记硬背了!用Tomcat 9 + IDEA 2023,5分钟搞懂Servlet和JSP到底怎么分工 别再死记硬背了用Tomcat 9 IDEA 20235分钟搞懂Servlet和JSP到底怎么分工刚接触JavaWeb开发时面对Servlet和JSP这两个核心组件很多初学者都会陷入困惑它们看起来都能处理请求到底该用哪个为什么有时候代码写在Servlet里有时候又写在JSP里今天我们就用一个简单的用户信息展示案例带你彻底理清它们的分工逻辑。1. 为什么需要Servlet和JSP分工协作想象一下餐厅的后厨和前厅服务。Servlet就像后厨的厨师负责处理食材业务逻辑JSP则像前厅的服务员负责把做好的菜品数据美观地呈现给顾客用户。两者各司其职才能高效运转。传统开发中常见的误区包括全用Servlet输出HTML就像让厨师直接端菜上桌代码维护噩梦业务逻辑全塞JSP相当于让服务员去炒菜页面臃肿难调试混用不分没有明确边界后期扩展困难// 反面示例Servlet中硬编码HTML输出 protected void doGet(HttpServletRequest req, HttpServletResponse resp) { PrintWriter out resp.getWriter(); out.println(htmlbody); out.println(h1Hello World/h1); out.println(/body/html); }2. 实战用户信息展示案例我们通过一个具体场景来理解分工。假设要开发一个显示用户基本信息的页面数据从数据库获取。2.1 Servlet作为控制器创建UserInfoServlet处理核心逻辑WebServlet(/userInfo) public class UserInfoServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1. 获取请求参数 int userId Integer.parseInt(request.getParameter(id)); // 2. 调用Service层获取数据 UserService userService new UserService(); User user userService.getUserById(userId); // 3. 设置返回数据 request.setAttribute(user, user); // 4. 转发到JSP展示 request.getRequestDispatcher(/userInfo.jsp).forward(request, response); } }关键点解析WebServlet注解替代传统web.xml配置只处理业务逻辑不涉及任何HTML通过request.setAttribute()传递数据使用forward保持请求上下文2.2 JSP专注视图展示创建userInfo.jsp渲染页面% page contentTypetext/html;charsetUTF-8 % html head title用户信息/title style .user-card { border: 1px solid #ddd; padding: 15px; max-width: 300px; } /style /head body div classuser-card h2${user.name}的资料/h2 pID: ${user.id}/p p邮箱: ${user.email}/p p注册时间: fmt:formatDate value${user.registerTime} patternyyyy-MM-dd/ /p /div /body /html技术亮点使用EL表达式${}显示数据fmt:formatDate格式化日期纯前端技术(CSS)美化展示无Java业务逻辑代码3. 核心分工原则对比通过表格明确两者的职责边界维度ServletJSP主要职责请求处理、业务逻辑数据展示、页面渲染代码类型纯Java类HTMLJava标签混合最佳实践控制流程、参数校验、服务调用数据显示、简单循环、条件渲染性能特点执行效率高首次访问需编译修改频率相对稳定随UI需求频繁调整调试方式断点调试浏览器开发者工具经验提示当你在JSP中写了超过10行Java代码scriptlet就该考虑是否应该移到Servlet中处理。4. 现代开发的最佳实践随着技术发展现在更推荐的做法4.1 使用JSTL替代Scriptlet避免在JSP中直接写Java代码!-- 旧方式 -- % for(User user : userList) { % li% user.getName() %/li % } % !-- 新方式 -- c:forEach items${userList} varuser li${user.name}/li /c:forEach4.2 结合MVC框架以Spring MVC为例分工更明确Controller public class UserController { GetMapping(/users/{id}) public String getUser(PathVariable int id, Model model) { model.addAttribute(user, userService.getUser(id)); return userDetail; // 对应userDetail.jsp } }4.3 前后端分离趋势现代架构中JSP逐渐被以下方案替代RESTful API 前端框架(React/Vue)Thymeleaf等模板引擎静态HTML AJAX调用但在传统JavaWeb项目中理解Servlet/JSP的原始分工仍然至关重要。就像学开车要先理解离合器和变速箱的关系掌握这些基础原理未来学习任何Web框架都会事半功倍。5. 常见坑点与调试技巧新手常会遇到这些问题问题1JSP页面显示${user.name}原样输出不解析解决方案检查是否漏了% page isELIgnoredfalse %或web.xml版本是否支持EL问题2转发后URL不变导致资源路径错误修正方案!-- 错误写法 -- img srcimages/avatar.jpg !-- 正确写法 -- img src${pageContext.request.contextPath}/images/avatar.jpg问题3中文乱码问题一揽子解决方案// Servlet中设置 response.setContentType(text/html;charsetUTF-8); request.setCharacterEncoding(UTF-8); // JSP头部添加 % page pageEncodingUTF-8 %在IDEA 2023中调试的小技巧配置Tomcat时勾选After launch打开浏览器使用Update classes and resources热部署对JSP设置断点需要开启Tomcat的JPDA调试模式# 启动Tomcat调试模式 export JPDA_ADDRESS8000 bin/catalina.sh jpda start6. 从设计模式看本质Servlet/JSP的分工体现了多个经典设计思想MVC模式Servlet作为ControllerJavaBean作为ModelJSP作为View关注点分离(SoC)业务逻辑与展示逻辑解耦各自独立变化不影响对方模板方法模式JSP本质是Servlet的模板Tomcat会将JSP编译为Servlet类理解这些底层设计理念就能明白为什么要有这样的分工而不是机械记忆Servlet做AJSP做B。这种思维方式会让你在遇到新技术时能快速理解其设计初衷。