资讯动态

Servlet与MVC模式解析及Spring MVC演进

发布时间:2026/9/13 9:39:18 来源:尧图企业网站定制
1. Servlet与MVC模式解析Servlet作为JavaWeb开发的核心技术本质上是一个运行在服务器端的Java程序用于处理客户端请求并生成动态响应。与传统的CGI技术相比Servlet采用线程池处理请求性能优势明显。在实际项目中一个典型的Servlet类需要继承HttpServlet并重写doGet()或doPost()方法public class UserServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 业务逻辑处理 String username request.getParameter(username); UserService service new UserService(); boolean result service.register(username); // 响应处理 if(result) { request.setAttribute(message, 注册成功); } else { request.setAttribute(message, 用户名已存在); } request.getRequestDispatcher(/result.jsp).forward(request, response); } }这种原始开发方式虽然直接但随着业务复杂度上升会面临几个典型问题单个Servlet处理多个功能导致代码臃肿如UserServlet同时处理登录、注册、修改密码业务逻辑与视图渲染强耦合不利于分工协作请求参数处理、数据验证等重复代码充斥在各个方法中经验之谈在实际项目中建议每个Servlet只处理单一业务功能。例如LoginServlet只处理登录相关请求RegisterServlet只处理注册请求。这样虽然类数量增加但维护性大幅提升。2. MVC架构的演进与实践MVCModel-View-Controller模式通过职责分离解决了上述痛点。在JavaWeb中其典型实现方式为Model模型业务逻辑与数据访问层通常包含Service类如UserService处理核心业务逻辑DAO类如UserDao负责数据库操作POJO类如User作为数据载体View视图展示层技术传统采用JSP现代项目更多使用Thymeleaf、FreeMarker等模板引擎% page contentTypetext/html;charsetUTF-8 languagejava % html head title操作结果/title /head body h1${message}/h1 a hrefindex.jsp返回首页/a /body /htmlController控制器接收请求并协调模型与视图早期使用Servlet现代框架中演化为Controller注解类实际项目中的调用流程通常为用户提交表单到ServletControllerServlet调用Service处理业务ModelService通过DAO操作数据库结果通过setAttribute()存入requestServlet转发到JSP页面ViewJSP通过EL表达式${}展示数据3. 从Servlet到Spring MVC的演进虽然原生Servlet可以实现MVC但存在配置繁琐、功能有限等问题。Spring MVC通过前端控制器模式进行了优化DispatcherServlet作为统一入口接收所有请求HandlerMapping将请求映射到具体ControllerController使用Controller注解的处理器类ModelAndView封装模型数据和视图信息ViewResolver解析逻辑视图名到具体视图技术对比示例// 传统Servlet方式 public class OldServlet extends HttpServlet { protected void doGet(...) { User user userService.getUser(id); request.setAttribute(user, user); request.getRequestDispatcher(/userDetail.jsp).forward(...); } } // Spring MVC方式 Controller public class NewController { GetMapping(/user/{id}) public String getUser(PathVariable int id, Model model) { model.addAttribute(user, userService.getUser(id)); return userDetail; // 对应模板文件userDetail.html } }避坑指南在迁移旧项目时建议逐步替换。可以先引入DispatcherServlet处理新功能旧功能保持Servlet实现通过URL映射区分新旧路由。4. 实战学生管理系统案例设计基于Servlet和JSP实现MVC的典型项目结构如下/project /src /main /java /com.example.controller # Servlet控制器 /com.example.service # 业务逻辑层 /com.example.dao # 数据访问层 /com.example.model # 实体类 /webapp /WEB-INF web.xml # 部署描述符 /views # JSP视图文件 /static /css # 静态资源 /js /target # 构建输出目录关键配置示例web.xmlservlet servlet-namestudentServlet/servlet-name servlet-classcom.example.controller.StudentServlet/servlet-class /servlet servlet-mapping servlet-namestudentServlet/servlet-name url-pattern/student/*/url-pattern /servlet-mapping分页查询的实现要点DAO层使用LIMIT语句public ListStudent findByPage(int pageNo, int pageSize) { String sql SELECT * FROM students LIMIT ?,?; return jdbcTemplate.query(sql, new BeanPropertyRowMapper(Student.class), (pageNo-1)*pageSize, pageSize); }Service层计算分页参数public PageInfoStudent getPage(int pageNo, int pageSize) { int total studentDao.count(); ListStudent list studentDao.findByPage(pageNo, pageSize); return new PageInfo(pageNo, pageSize, total, list); }JSP页面显示分页导航c:forEach begin1 end${pageInfo.totalPage} vari a hrefstudent?actionlistpageNo${i}${i}/a /c:forEach5. 常见问题排查与性能优化典型问题1中文乱码解决方案// Servlet中设置编码 request.setCharacterEncoding(UTF-8); response.setContentType(text/html;charsetUTF-8); // JSP页面头部添加 % page pageEncodingUTF-8% // 数据库连接字符串配置 jdbc:mysql://localhost:3306/db?useUnicodetruecharacterEncodingUTF-8典型问题2静态资源被拦截在web.xml中配置放行servlet-mapping servlet-namedefault/servlet-name url-pattern*.css/url-pattern /servlet-mapping性能优化建议使用连接池如HikariCP替代直连数据库对频繁访问的数据添加缓存如Redis静态资源启用浏览器缓存filter filter-nameexpiresFilter/filter-name filter-classorg.apache.catalina.filters.ExpiresFilter/filter-class init-param param-nameExpiresByType image/param-name param-valueaccess plus 1 month/param-value /init-param /filter开发效率提升使用JSTL标签库替代Scriptlet%-- 旧方式 --% % for(Student s : studentList) { out.print(lis.getName()/li); } % %-- 新方式 --% c:forEach items${studentList} vars li${s.name}/li /c:forEach采用三层架构明确职责边界Controller只负责参数接收和结果转发Service处理业务逻辑和事务管理DAO专注数据库操作在团队协作中这种分层可以让前端开发人员专注JSP/HTML开发后端开发人员处理业务逻辑数据库专家优化SQL语句各司其职提升整体效率。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价