1.SpringMVC简介
SpringMVC:是基于spring的一个框架,实际上就是spring的一个模块,专门做web开发的。理解是servlet的一个升级
web开发底层是servlet,框架是在servlet基础上面加一些功能,让你做web开发方便。
springMVC就是一个Spring。Spring是一个容器,ioc能够管理对象,使用,@Component、@Respository、@Service、@Controller。因此,SpringMVC也能够创建对象,放入到(SpringMVC)容器中,它存放的是控制器对象(@Controller)
我们要做的是,使用@Controller创建控制器对象,把对象放入到springmvc容器中,把创建的对象作为控制器使用。
这个控制器对象能接收用户的请求,显示处理结果,就当做是一个servlet使用。
要注意的是,使用@Controller创建的实际上只是一个普通类的对象,不是Servlet。但是springmvc赋予了控制器对象一些额外的功能。
因为web开发的底层是servlet,springmvc中有一个对象是Servlet:DispatherServlet(中央调度器也叫前端控制器)
DispatherServlet:负责接收用户的所有请求,用户把请求给了DispatherServlet,之后DispatherServlet把请求转发给了Controller对象,最后是Controller对象处理请求。请求的传递如下:
index.jsp----->DispatherServlet(Servlet)—转发,分配给–>Controller对象(@Controller注解的对象)
所以,当我们使用springmvc框架时,所需要一个中央调度器和一个Controller对象
2.SpringMVC框架的使用
1.加入依赖
spring-webmvc依赖,简介把spring的依赖都加入到项目
jsp、servlet依赖
<!--servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
</dependency>
<!--SpringMVC依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
2.在web.xml中注册springmvc框架的核心对象DispatcherServlet,以及静态资源冲突的问题
<!--声明SpringMVC的核心对象,DispatcherServlet-->
<!--
需要在tomcat服务器启动后就创建DispatcherServlet对象的实例
为什么要创建DispatcherServlet的实例呢?
因为DispatcherServlet在他的创建过程中,会同时创建springmvc容器对象,读取springmvc的配置文件,把这个配置文件中的对象也创建好,
当用户发起请求时就可以直接使用对象了。
servlet的初始化会执行init()方法。DispatcherServlet在init()中会执行{
//创建容器,读取配置文件
WebApplicationContext wac=new ClassPathXmlApplicationContext("springmvc.xml");
//把容器放入到ServletContext全局作用域中
getServletContext().setAttribute(key,wac);
}
-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--自定义springmvc读取的配置文件的位置-->
<init-param>
<!--springmvc配置文件的位置-->
<param-name>contextConfigLocation</param-name>
<!--指定自定义文件的位置-->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--
在tomcat启动后,创建servlet对象
load-on-startup:表示tomcat启动后创建对象的顺序。他的值是整数,数值越小,tomcat创建对象的时间越早。数值大于等于0
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--
使用框架的时候,url-pattern可以用两种值
1.使用扩展名方法,语法:*.xxxx,xxx是自定义的扩展名。常用的方式*.do,*.action,*.mvc等等
http://localhost:8080/myweb/some.do
2.使用斜杠"/"
-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
如果使用“/”会出现哪些问题?
客户端请求的静态数据如html、js、图片等资源一般都会交给tomcat来进行处理
<!--tomcat的web.xml-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
如果加了"/",那么因为我们的web.xml比tocmat的优先级更高,会导致静态资源将优先交给我们的DispatcherServlet中央调度器来进行处理,进而使得静态资源404
<!--我们自己的web.xml-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--
当你的项目中使用"/",它会替代tomcat中的default。
导致所有的静态资源都给DispatcherServlet处理,默认情况下DispatcherServlet没有处理静态资源的能力。
没有控制器对象处理静态资源的访问。所以静态资源(html、js、图片、css)都是404
我们自己的动态资源some.do还是能够继续访问的,因为我们的程序中有相关的控制器对其进行处理。
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
如何解决静态资源的冲突?
1)使用<mvc:default-servlet-handler>
<!--
第一种处理静态资源的方式:
需要在SpringMVC的配置文件中加入<mvc:default-servlet-handler>
原理:加入这个标签后,框架会创建控制器对象DefaultServletHttpRequestHandler(类似于我们自己的控制器)
DefaultServletHttpRequestHandler这个对象可以接收的请求转发给tomcat的default这个servlet。
-->