一:springMVC
1.1 概念
底层:servlet,springMVC的工作能实现的,servlet都能实现但是非常的臃肿和繁琐。
java开源框架,Spring Framework的一个独立模块。
** MVC框架,在项目中开辟MVC层次架构**
对控制器中的功能 包装 简化 扩展践行工厂模式,功能架构在工厂之上
1.1.1 MVC架构 概念
名称 | 职责 |
---|---|
Model | 模型:即业务模型,负责完成业务中的数据通信处理,对应项目中的 service和dao |
View | 视图:渲染数据,生成页面。对应项目中的Jsp |
Controller | 控制器:直接对接请求,控制MVC流程,调度模型,选择视图。对应项目中的Servlet |
1.2 工作流程
https://blog.csdn.net/weixin_43189971/article/details/125555085?spm=1001.2014.3001.5502
1.3springMvc的项目搭建
1.31 带模板的Mvaen搭建
1.3.2 pom打war包
<!--写这个的目的,是为了让 idea 识别出我这个是一个 web 工程-->
<packaging>war</packaging>
1.3.3 改web模块
记得改位置
1.3.4 加依赖
<!--引入 SpringMVC 的依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.20</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
servlet上一代的最后一个版本是2.5,里面不支持注解。这一代的第一个版本是3.0,与tomcat 7配套。servlet 1.0当时不叫这个名字
1.3.5 WEB-INF (比spring工程多的)
1.3.5.1 概念:安全目录,其中的文件必须通过接口才能访问
1.3.5.2 配置WEB-INF下的web.xml
作为一个MVC框架,首先要解决的是:如何能够收到请求!
所以MVC框架大都会设计一款前端控制器,选型在 Servlet 或 Filter两者之一,在框架最前沿率先工作,接收所有请求。
此控制器在接收到请求后,还会负责springMVC的核心的调度管理,所以既是前端又是核心。
<servlet>
<servlet-name>springmvc</servlet-name>
<!--SpringMVC 的核心就是 DispatcherServlet-->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--指定 Servlet 的配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-servlet.xml</param-value>
</init-param>
</servlet>
<!--
将来,所有的请求都会被 DispatcherServlet 拦截下来,然后在 DispatcherServlet 完成对 HandlerMapping、HandlerAdapter 以及 ViewResolver 的调用
-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
- 默认情况下,这个 servlet 的名字+‘-servlet’ 共同组成配置文件名,此时如果配置刚好还处于 WEB-INF目录下,那么就可以不哦用写配置了 :
例如当前这个,如果此时在 WEB-INF 目录下,有一个 Spring 的配置文件,并且配置文件名还是 springmvc-servlet.xml,那么就不需要配置配置文件位置了
后端控制器,即servlet
@Controller //声明这是一个控制器
@RequestMapping("/hello") //访问路径 ,等价于url-pattern
public class HelloController {
@RequestMapping("/test1") //访问路径
public String hello1(){
System.out.println("hello world");
return "index"; // 跳转:/index.jsp
}
@RequestMapping("/test2") //访问路径
public String hello2(){
System.out.println("hello c9");
return "views/users";// 跳转:/views/user.jsp
}
}
1.3.6 resource目录下创建spring-servlet.xml
1.2.6.1 注入bean
<!--
1. 先注册接口
-->
<bean class="com.huang.demo.MyController" id="/hello"/>
<bean class="com.huang.demo.MyController2" id="/hello2"/>
<!--
1.3.6.2 处理器映射器HandlerMapping(是一个接口)
HandlerMapping根据URL地址,找到对应的处理器
例如这里: http://localhost:8080/mvc01/hello -> MyController
BeanNameUrlHandlerMapping 表示根据 bean 的名字去处理请求地址,例如请求地址是
http://localhost:8080/mvc01/hello,
在这个路径中,servletPath 是 /hello,
此时,系统会自动去查找一个名为 /hello 的 bean 来处理当前请求
- 其中提供了很多不同的实现类
- 即提供了很多种找到路径的方式
大家知道什么servletPath和ContextPath吗
- servletPath 是/hello,
+ 此时,系统会自动取查找一个名为/hello的bean来处理当前请求- ContextPath就是你工程的名字
具体配置
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
1.3.6.3 处理器适配器HandlerAdapter
- 处理器映射器找到了处理器(路径),适配器找方法去执行
- HandlerAdapter下面有很多实现类,我们那两个举例子
+ SinpleControllerHandlerAdapter,这个处理器适配器的作用,就是将你的处理器强转成一个Controller对象,然后调用里面的handlerRequest方法
+ 对于springMvc来说,拿到适配器之后直接调用HandlerAdapter的handle的方法。至于这个方法里面怎么实现与spingMvc无关,很像我们的充电器(电源适配器),故此命名
具体配置
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
1.3.6.4 配置试图解析器
4. 配置视图解析器
第三步,会返回一个 ModelAndView,接下来,需要解析这个 ModelAndView
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
13.7 Spring-servilet.xml 总配置界面
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--包扫描,扫描到刚刚写好的 Controller-->
<context:component-scan base-package="com.qfedu.demo"/>
<!--
配置了这个 HandlerMapping,将来就按照 @RequestMapping 注解上的值,去查找对应的处理器
-->
<!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>-->
<!--通过 @RequestMapping 注解标记的处理器,通过这个处理器适配器来执行-->
<!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>-->
<!--
这个注解,一个顶两个(HandlerMapping 和 HandlerAdapter)
下面这个并不是简单的代替上面两行配置,它不仅仅代替上面两行,还为上面的两个 Bean 做了很多其他相关的配置
-->
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>