一、自己的项目改造
1.项目目录结构
2.serlvet注册
最主要的是在web.XML
中注册DispatcherServlet
,DispatcherServlet
是springMvc中唯一的Servlet
- 配置
DispatcherServlet
1.web.xml的配置
<web-app>
<display-name>Archetype Created Web Application</display-name>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:app-context.xml</param-value>
</context-param>
<!-- springmvc 主要用servlet
DispatcherServlet 是 spring 内置的servlet
路由实现mvc-->
<servlet>
<servlet-name>api</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:app-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>api</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
- app-servlet.xml的配置
<context:component-scan base-package="org.example.javaee.springmvc.controller"></context:component-scan>
3.IoC容器创建
- 将servlet注册为controller,我分为studentController和teacherController。
- 由原来的HttpServletRequest、HttpServletResponse 修改为@RequestBody 直接接收对象。
Spring IOC容器是框架的核心,IOC是控制反转的意思,可以用来降低程序代码之间的耦合度。
把强耦合的代码依赖从代码中移出去,放到统一的XML配置文件中,将程序对组件的主要控制权交给IOC,由IOC统一加载和管理。
重要的就是用来完成对对象的创建以及依赖注入的管理等。
以前我们需要对象就直接new,然后为对象和构造方法及方法等赋值,需要对象的创建对象,需要方法则调用方法,然后再去设置参数。
而spring为我们把这些事都省略了,简化了我们的操作,那么就都由spring来为我们管理,直接帮我们注入,所以这个就是所谓的依赖注入。
//由原来的
@WebServlet("/AddStudentHomeworkServlet");
//变为
@RequestMapping("/TeacherJSP/")
@Controller
根据xml文件创建IoC容器
//1
ApplicationContext context = new ClassPathXmlApplicationContext("app-context.xml");
//2
ApplicationContext context = new FileSystemXmlApplicationContext("JavaEE-SpringMVC/src/resources/app-context.xml");
根据注解创建ioc容器
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Beans.class);
StudentHomeworkJdbc studentHomeworkJdbc=(StudentHomeworkJdbc) context.getBean("studentHomeworkJdbc");
4. bean初始化
将StudentHomeworkJdbc 注册为Bean,为了直观就单独写了一个类出来。
@Configuration
public class Beans {
@Bean
public StudentHomeworkJdbc studentHomeworkJdbc(){
return new StudentHomeworkJdbc();
}
}
也可以在app-context.xml中配置
<!-- 配置注解方式扫描的包:在指定的包下进行扫描,如果发现类上面有注解,让其装配到容器中 -->
<context:component-scan base-package="org.example.javaee.springmvc.bean"/>
二、SpringMVC的流程
1、用户发送请求至前端控制器DispatcherServlet
。
- 请求会首先发送到
DispatchServlet
,这是spring的前置Servlet
,它会接收请求并转发给spring的MVCcontroller
,也就是业务controller
。DispatchServlet
负责请求分发,起到控制器的作用。 - 名如其义,它的本质上是一个
Servlet
。下层的子类不断的对HttpServlet
父类进行方法扩展。 - DispatcherServlet是SpringMVC前端控制器,作为整个SpringMVC的控制中心,,其相关UML如下所示:
2、 DispatchServlet
通过HandlerMapping
(处理器映射)确定将请求转发给哪个controller,HandlerMapping
主要通过请求中的URL确定映射关系的。
HandlerMapping
主要用来解析请求url
,解析出控制器,从而映射控制器。
3、处理器映射器找到具体的处理器(可以根据xml
配置、注解进行查找),生成处理器对象及处理器拦截器一并返回给DispatcherServlet
。
4、 DispatcherServlet
调用HandlerAdapter
处理器适配器。
- HandlerAdapter主要是调度Controller来处理业务逻辑等,想相关类有6个。
5、HandlerAdapter
经过适配调用具体的处理器(Controller
)。
6、Controller
执行完成返回ModelAndView
。
7、HandlerAdapter
将controller
执行结果ModelAndView
返回给DispatcherServlet
。
8、DispatcherServlet
将ModelAndView
传给ViewReslover
视图解析器。
9、ViewReslover
解析后返回具体View
.ViewResolver
接口主要作用是解析DispatcherServlet
传递的逻辑视图名,并将解析结果传回给DispatcherServlet
。
10、DispatcherServlet
根据View
进行渲染视图
11、DispatcherServlet
响应用户。