Spring MVC概述
Spring MVC是Spring的一个子框架,由Spring进行整合,基于MVC设计模式,把Model、View、Controller分离,把较为复杂的Web应用分成逻辑清晰的几部分,简化了开发,也减少了出错的概率,适用于大型项目系统的开发,可以将项目分层给不同人员完成。它也逐渐取代了老版SSH框架中的Struts框架,Hibernate也逐渐被MyBatis所代替,出现了较为流行的SSM框架。
一、Spring MVC的处理流程
组件说明:
- DispatcherServlet:核心处理器(也叫前端控制器、中央处理器),它是整个请求响应的控制中心,组件的调用由它统一调度。
- HandlerMapping:处理器映射器,它根据用户访问的 URL 映射到对应的后端处理器 Handler。也就是说它知道处理用户请求的后端处理器,但是它并不执行后端处理器,而是将处理器告诉给中央处理器。
- HandlerAdapter:处理器适配器,它调用后端处理器中的方法,返回逻辑视图 ModelAndView 对象。
- ViewResolver:视图解析器,将 ModelAndView 逻辑视图解析为具体的视图(如JSP)。
- Handler:处理器,对用户具体请求进行处理,也就是我们编写的Controller类。
处理流程:
-
Spring MVC遵循MVC设计模式,客户端不能直接访问视图文件,应该访问Controller控制器,所有的请求都由核心处理器DispatcherServlet接收。借鉴Spring官网的一张图:
mvc context hierarchyCotroller控制器、视图解析器、执行器映射器都应该在一个DispatcherServlet核心控制器的配置下,即为核心控制器配置映射器指定映射规则,并添加全局配置的spring容器,在spring容器中配置Controller和视图解析器:
<!-- 配置核心控制器 --> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 添加全局配置,spring容器 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:springmvc.xml</param-value> </init-param> </servlet> <!-- 配置映射器 --> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
核心处理器调用HandlerMapping处理器映射器。
HandlerMapping根据配置获取Handler(具体的Controller),生成Handler处理器对象及HandlerInterceptor处理器拦截器,并返回给核心处理器。
核心处理器调用HandlerAdapter处理器适配器去执行具体的Handler功能方法。
Handler执行完毕后返回ModelAndView对象。
核心处理器调用ViewResolver视图解析器,将视图解析为真正的物理视图:前缀 + 逻辑视图 + 后缀,解析完成后返回。
核心处理器根据View渲染视图(即将模型数据填充至视图中)。
核心处理器将结果响应给客户端。
-
至于业务层和数据访问层组件则应由另一个Spring容器来配置:
<!-- 配置需要读取的Spring容器配置文件的位置 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:springcore.xml</param-value> </context-param> <!-- 配置监听器 --> <!-- 作用:在服务器启动时,加载Spring容器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
其实总的来说原理大致为:核心处理器负责中央调度,第一步通过HandlerMapping去找控制器,第二步通过HandlerAdapter去执行控制器,然后返回视图对象,第三步把视图对象交给视图解析器处理并返回,第四步处理器渲染视图,响应给客户端。
二、Spring JDBC
概述:Spring JDBC为Spring中的一个模块,负责数据库的访问和操作,它将传统JDBC繁琐的操作(加载驱动类、获取连接、获取操作类对象、结果集的处理)进行封装,大大简化了开发人员对数据库的操作,使得开发人员可以从繁琐的数据库操作中解脱出来,从而将更多的精力投入到编写业务逻辑当中。
使用流程:
核心类:JdbcTemplate模板类
在数据访问层注入JdbcTemplate,而JdbcTemplate又依赖于DataSource数据源,这里以XML的方式进行配置:
<!-- 数据源,使用Druid,需要相关依赖 -->
<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://47.105.130.14/web_epidemic_prevention_materials_record_system?useSSL=false&serverTimezone=GMT%2B8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!-- 注入JDBCTemplate -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 注入数据源 -->
<property name="dataSource" ref="druidDataSource"/>
</bean>
<!-- 数据访问层组件 -->
<bean id="materialDAO" class="com.apesource.dao.MaterialDAO">
<!-- 注入JDBCTemplate -->
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
接下来在数据访问层即可使用JdbcTemplate,一般地,执行具体方法时需传入RowMapper(对数据行的处理逻辑进行封装)接口的实现类对象:
public class MaterialDAO {
// JDBC操作模板对象
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
// 查询所有防疫物资
public List<MaterialInfo> listMaterial(){
String sql = "select * from material_info";
List<MaterialInfo> materialInfoList = jdbcTemplate.query(sql,new MaterialRowMapper());
return materialInfoList;
}
}
// 对数据行的处理逻辑
class MaterialRowMapper implements RowMapper<MaterialInfo> {
@Override
public MaterialInfo mapRow(ResultSet resultSet, int i) throws SQLException {
MaterialInfo materialInfo = new MaterialInfo();
materialInfo.setMaterialId(resultSet.getInt("material_id"));
materialInfo.setMaterialName(resultSet.getString("material_name"));
materialInfo.setMaterialCount(resultSet.getInt("material_count"));
materialInfo.setMaterialUnit(resultSet.getString("material_unit"));
return materialInfo;
}
}