目录
Spring MVC
MVC模式
核心组件
工作流程
Spring JDBC
Spring JDBC功能和优势
Spring JDBC的关键组件
Spring MVC
Spring MVC(Model-View-Controller)是Spring框架的一个模块,用于构建Web应用程序。它的主要目标是将Web应用程序的不同部分分离开,以提高可维护性、扩展性和测试性。
MVC模式
MVC模式的主要特点就是:分离了模型、视图、控制器三种角色,将业务处理从UI设计中独立出来,封装到模型和控制器设计中去,使得它们相互之间解耦,可以独立扩展而不需要彼此依赖。
-
模型(Model): 模型表示应用程序的数据和业务逻辑。它负责管理数据的状态和操作,以及处理与数据相关的任务。模型通常是独立于用户界面的,它与数据存储、检索和操作相关,同时也包括应用程序的核心业务逻辑。
-
视图(View): 视图表示用户界面,它负责将模型的数据呈现给用户。视图是与用户界面相关的部分,包括用户界面元素、布局、样式和交互。视图通常是被动的,它从模型中获取数据并将其显示给用户。
-
控制器(Controller): 控制器充当模型和视图之间的中介,负责协调用户界面的输入和模型的操作。控制器接收来自用户的请求,调用适当的模型操作来满足请求,然后选择合适的视图来呈现结果。控制器可以处理用户输入、执行业务逻辑和更新模型。
核心组件
Spring MVC遵循经典的MVC模式,以下是Spring MVC的核心组件:
-
DispatcherServlet(前端控制器): DispatcherServlet是Spring MVC的前端控制器,接收所有的客户端请求,并将请求分发给适当的处理程序(控制器)。它是整个请求处理流程的入口点。
-
Controller(控制器): 控制器是处理HTTP请求的组件,它接收来自DispatcherServlet的请求,并执行相应的业务逻辑。控制器通常是一个POJO(普通的Java对象)类,可以用注解标记或实现特定接口。
-
HandlerMapping(处理程序映射): HandlerMapping用于将请求映射到具体的处理程序(控制器)。它根据请求的URL或其他条件,将请求路由到合适的控制器。
-
Model(模型): 模型表示应用程序的数据和业务逻辑。它通常是一个JavaBean对象,包含应用程序的状态信息。模型是与数据相关的,它负责管理应用程序的状态。
-
View(视图): 视图表示用户界面,负责渲染模型的数据并将其呈现给用户。视图通常是HTML页面、JSP页面、Thymeleaf模板、FreeMarker模板或其他UI组件。
-
ViewResolver(视图解析器): ViewResolver用于解析视图名称并找到相应的视图对象。它将视图名称映射到实际的视图组件,以便将模型数据呈现给用户。
-
ModelAndView: ModelAndView是一个包含模型数据和视图名称的对象。它将模型数据传递给视图,以便视图呈现数据。通常,控制器返回一个ModelAndView对象。
-
Interceptors(拦截器): 拦截器是一种机制,允许您在请求到达处理程序之前或之后执行一些预处理或后处理操作。拦截器可以用于日志记录、权限检查、国际化等。
-
Model数据绑定: Spring MVC提供了强大的数据绑定机制,可以将HTTP请求参数映射到Java对象,以及将Java对象的属性绑定到表单字段。这简化了请求和响应数据的处理。
-
Validation(数据验证): Spring MVC支持数据验证,您可以使用注解或验证器来验证模型数据的有效性。
-
REST支持: Spring MVC支持RESTful Web服务的构建,包括支持HTTP方法(GET、POST、PUT、DELETE)和资源标识符(URI)的映射。
-
异常处理: Spring MVC提供了异常处理机制,允许您自定义异常处理程序来处理应用程序中的异常。
-
国际化和本地化: Spring MVC支持国际化和本地化,允许您轻松地构建多语言的应用程序。
工作流程
-
请求从客户端(通常是浏览器)发出,该请求被发送到应用程序的前端控制器,即DispatcherServlet。
-
DispatcherServlet接收请求后会调用HandlerMapping处理器映射器。由此得知该哪个Controller处理请求(并未调用Controller)。
-
DispatcherServlet将请求交给一个或多个HandlerMapping组件,它们根据请求的URL或其他条件,将请求映射到具体的处理程序(Controller控制器)。
-
执行具体的处理程序(Controller控制器)获取ModelAndView,并层层返回给DispatherServlet。
-
DispatcherServlet将ModelAndView交给ViewResolver解析,然后ViewResolver返回真正的视图。
-
DispatcherServlet将模型数据填充到视图中。
-
DispatcherServlet将结果响应到客户端。
前后端分离设计的大环境下,我们不再使用ModelAndView。流程上会使用SpringMVC Restful ⻛格的接⼝,返回json格式的对象数据供前端解析。后端就会用到一个常用的注解:@ResponseBody
@GetMapping("/user") @ResponseBody public User user(){ return new User(1,"张三"); }
-
请求从客户端(通常是浏览器)发出,该请求被发送到应用程序的前端控制器,即DispatcherServlet。
-
DispatcherServlet接收请求后会调用HandlerMapping处理器映射器。由此得知该哪个Controller处理请求(并未调用Controller)。
-
DispatcherServlet将请求交给一个或多个HandlerMapping组件,它们根据请求的URL或其他条件,将请求映射到具体的处理程序(Controller控制器)。
-
Controller 被封装成了 ServletInvocableHandlerMethod,HandlerAdapter 处理器适配器去执⾏ invokeAndHandle ⽅法,完成对 Controller 的请求处理
-
HandlerAdapter 执⾏完对 Controller 的请求,会调⽤ HandlerMethodReturnValueHandler 去处理返回 值,主要的过程:
-
调⽤ RequestResponseBodyMethodProcessor,创建 ServletServerHttpResponse(Spring 对原⽣ ServerHttpResponse 的封装)实例
-
使⽤ HttpMessageConverter 的 write ⽅法,将返回值写⼊ ServletServerHttpResponse 的 OutputStream 输出流中
-
在写⼊的过程中,会使⽤ JsonGenerator(默认使⽤ Jackson 框架)对返回值进⾏ Json 序列化
-
-
执⾏完请求后,返回的 ModealAndView 为 null,ServletServerHttpResponse ⾥也已经写⼊了响应,所以不⽤关⼼ View 的处理
Spring JDBC
Spring JDBC是Spring框架的一个模块,用于简化和改进Java应用程序与关系型数据库的交互。
Spring JDBC功能和优势
-
简化数据库访问: Spring JDBC封装了传统JDBC的复杂性,通过提供模板类(如
JdbcTemplate
)和异常处理机制,使数据库访问更加简单。 -
连接管理: Spring JDBC提供了连接池管理,确保数据库连接的高效复用,从而提高性能和资源利用率。
-
异常处理: Spring JDBC提供了一致的异常处理机制,将数据库操作中的各种异常转换为Spring自定义的DataAccessException,使错误处理更加一致和容易。
-
批处理: Spring JDBC支持批处理操作,可以一次性执行多个SQL语句,提高数据插入、更新和删除的效率。
-
参数设置: Spring JDBC支持参数设置和命名参数,使SQL语句的构建和执行更加方便。
-
ORM整合: Spring JDBC可以与各种ORM框架(如Hibernate、JPA)集成,提供一致的事务管理和数据访问体验。
-
声明式事务管理: Spring JDBC支持声明式事务管理,允许通过注解或XML配置来管理事务,从而简化事务管理代码。
Spring JDBC的关键组件
-
JdbcTemplate:
JdbcTemplate
是Spring JDBC的核心类,它封装了JDBC的许多操作,如执行SQL查询、更新、批处理等。它提供了一种模板方法,用于执行数据库操作,同时处理连接的获取和释放,以及异常的处理。开发人员只需关注SQL语句和参数设置,不必担心连接管理和异常处理。 -
数据源(DataSource): 数据源是数据库连接池的接口,Spring JDBC支持各种数据源,包括连接池数据源(如Apache DBCP、C3P0)和应用服务器数据源(如Tomcat JDBC池、WebSphere数据源)。
-
事务管理: Spring JDBC允许您使用声明式事务管理,通过
@Transactional
注解或XML配置来定义事务的范围。它支持本地事务和全局事务,可以与不同的事务管理器集成。 -
异常处理: Spring JDBC将数据库操作中的异常转换为Spring的
DataAccessException
,这些异常更具表达性,而且不需要捕获所有可能的数据库异常。 -
命名参数: Spring JDBC支持命名参数,可以使用命名参数替代占位符(
?
)来设置SQL语句的参数值。 -
批处理: Spring JDBC提供了
BatchPreparedStatementSetter
接口和JdbcTemplate
的batchUpdate
方法,用于执行批处理操作。
总的来说,Spring JDBC的设计和实现旨在提供更简单、更高效、更可维护的数据库访问方式,并与Spring框架的其他模块(如Spring事务管理、Spring AOP)无缝集成,为企业级Java应用程序的数据库操作提供了便捷的解决方案。