spring mvc启动流程
本文主要介绍Spring mvc的启动流程:包括servlet注册、loc容器创建、bean的初始化,以及MVC流程spring mvc与servletspringmvc的本质就是一个servlet,并对其进行了扩展。其扩展内容主要为这三个类:HttpServletBean,FrameworkServlet,DispatcherServletHttpServletBean将web....
本文主要介绍Spring mvc的启动流程:
包括servlet注册、loc容器创建、bean的初始化,以及MVC流程
spring mvc与servlet
springmvc的本质就是一个servlet,并对其进行了扩展。
其扩展内容主要为这三个类:HttpServletBean,FrameworkServlet,DispatcherServlet
-
HttpServletBean
将web.xml中配置的参数设置到Servlet中 -
FrameworkServlet
将Servlet与Spring容器上下文关联 -
DispatcherServlet
初始化各个功能的实现类。
一、注册servlet
web.xml :
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
配置contextConfigLocation:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
配置ContextLoaderListener:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
配置DispatcherServlet:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
二、IOC容器创建
IOC 就是由 Spring IOC 容器来负责对象的生命周期和对象之间的关系
- 谁控制谁:
在传统的开发模式下,我们都是采用直接 new 一个对象的方式来创建对象,也就是说你依赖的对象直接由你自己控制,但是有了 IOC 容器后,则直接由 IoC 容器来控制。所以“谁控制谁”,当然是 IoC 容器控制对象。 - 控制什么:
控制对象。 - 为何是反转:
没有 IoC 的时候我们都是在自己对象中主动去创建被依赖的对象,这是正转。但是有了 IoC 后,所依赖的对象直接由 IoC 容器创建后注入到被注入的对象中,依赖的对象由原来的主动获取变成被动接受,所以是反转。 - 哪些方面反转了:
所依赖对象的获取被反转了。
Ioc容器的创建需要通过ApplicationContext接口的相关实现类进行
有三种创建IOC容器的方式。
ClassPathXmlApplicationContext:从项目的根目录下加载配置文件
FileSystemXmlApplicationContext:从磁盘中的加载配置文件
AnnotationConfigApplicationContext:当使用注解配置容器对象时使用此类进行注解读取,创建容器。
代码中IOC容器创建
在Java代码中,通过以下方式进行配置文件读取
//基于注解的springIOC容器
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AopBeanConfig.class);
//基于配置文件的springIOC容器
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/spring-beans.xml");
web中IOC容器创建
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
三、bean初始化
Spring Bean是被实例的,组装的及被Spring 容器管理的Java对象。Spring 容器会自动完成@bean对象的实例化。创建应用对象之间的协作关系的行为称为:装配(wiring),这就是依赖注入的本质。
bean初始化方法:
applicationContext.xml文件配置:
<bean id="assignDao" class="com.daoImpl.AssignDaoImpl"/>
bean类注册
package com.daoImpl;
import com.dao.AssignDao;
import com.util.JDBCUtil;
import org.springframework.stereotype.Component;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
@Component
public class AssignDaoImpl implements AssignDao {
private Connection connection = JDBCUtil.getConnection();
@Override
public void assign(int tid, int hid) {
String sql = "INSERT INTO assign (tid, hid) VALUES (?, ?)";
try {
PreparedStatement pst = connection.prepareStatement(sql);
pst.setInt(1, tid);
pst.setInt(2, hid);
pst.execute();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
示例:
@Autowired
AssignDao assignDao;
@RequestMapping("/assign")
public String assign(int hid, String students){
String[] studentIDs = students.split(";");
submitDao = new SubmitDaoImpl();
for(String studentId:studentIDs){
int sid = Integer.parseInt(studentId);
submitDao.addSubmit(sid, hid);
}
return "successful";
}
四、MVC的流程
MVC(model view controller),一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
- 用户发送请求至前端控制器DispatcherServlet。
- DispatcherServlet收到请求调用HandlerMapping处理器映射器。
- 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
- DispatcherServlet调用HandlerAdapter处理器适配器。
- HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
- Controller执行完成返回ModelAndView。
- HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
- DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
- ViewReslover解析后返回具体View.
- DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
- DispatcherServlet响应用户。
更多推荐
所有评论(0)