SpringMVC概述
SpringMVC是基于Spring的一个框架,实际上就是Spring 的一个模块,专门做WEB开发,SpringMVC可以理解为servlet的一个升级
SpringMVC就是一个Spring。Spring是一个容器,使用IOC管理对象,使用@Component @Controller @Service @Repository注解往容器中注入对象
使用@Controller创建处理器对象,@Service创建业务对象,@Repository创建持久层对象,@Autowried或者@Resource在控制器类中注入Service,Service类中注入Dao
SpringMVC容器中放入的是控制器对象,我们要做的是使用@Controller创建控制器对象,把对象放入到SpringMVC容器中,把创建的对象作为控制器对象使用,这个控制器对象能接收请求,显示处理结果,就当作是一个servlet使用
使用@Controller注解创建的是一个普通类的对象,不是servlet,是SpringMVC赋予了控制器对象一些额外功能
web开发底层是servlet,SpringMVC中有一个对象是Servlet:DispatcherServlet
(中央调度器)
DispatcherServlet:负责接收所有请求,用户把请求给了DispatcherServlet之后DispatcherServlet把请求转发给Controller对象,最后是Controller对象处理请求
简要流程
index.jsp---->DispatcherServlet
(中央调度器)---->转发,分配给Controller对象(@Controller注解创建的对象)
Hello Spring MVC
需求:发起请求,交给springMVC控制器对象,并显示请求的处理结果(结果页面显示Hello Spring MVC)
创建WEB Application
补全java文件路径资源路径
引入依赖
<dependencies>
<!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--spring mvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
</dependencies>
创建SpringMVC的配置文件
- 声明注解扫描器,指定@Controller注解所在的包名
- 声明视图解析器,帮助处理试图
<?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"
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">
<!--声明组件扫描器-->
<context:component-scan base-package="com.edu.springmvc"/>
</beans>
在web.xml中注册springMVC框架的核心对象DispatcherServlet(中央调度器)
- DispatcherServlet(中央调度器),是一个servlet,它的父类是继承HttpServlet
- DispatcherServlet页叫做前端控制器(Front Controller)
- DispatcherServlet负责接收前端提交的请求,调用其他的控制器对象,并把请求的处理结果显示给前端
<?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">
<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>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--路径匹配规则-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
创建控制器类
在类上加入@Controller注解,创建对象,并放入SpringMVC容器中
在类中的方法上面加入@RequestMapping注解
@RequestMapping:请求映射,把一个请求地址和一个方法绑定在一起。
- 属性值:value是一个String类型,表示请求的uri地址,value值是唯一的,不能重复
ModelAndView:表示本次请求的处理结果
- model:数据,请求处理完后,要显示给用户的数据
- view:视图,比如jsp等
@Controller // 创建处理器对象,对象放在springmvc容器中
public class MyController {
@RequestMapping(value = "/some.do")
public ModelAndView doSome() {
//处理some.do请求,相当于service调用处理完成了
ModelAndView mv = new ModelAndView();
//添加数据,框架在请求的最后把数据放入到request作用域
mv.addObject("msg", "hello spring mvc");
mv.addObject("fun", "执行的是doSome方法");
//指定视图,指定视图的完整路径
mv.setViewName("/show.jsp");
return mv;
}
}
搭建tomcat服务器
配置页面跳转
index.jsp->show.jsp
<p><a href="some.do">发起some.do请求</a></p>
-------------------------------------------
<body>
<h3>show.jsp从request作用域获取数据</h3><br/>
<h3>msg数据:${msg}</h3>
<h3>fun数据:${fun}</h3>
</body>
配置试图解析器
需求:webapp目录下的资源是有权公开目录,可以通过路径直接请求,如何保证安全只能跳转请求
直接访问不安全
WEB-INF是保护目录,不对用户进行开放的,将页面放入WEB-INF下,页面会收到保护不能直接访问
通过请求访问,有效保护了页面的安全
mv.setViewName("/WEB-INF/view/show.jsp");
配置视图解析器
在 springmvc 配置文件中声明视图解析器,帮助开发人员设置视图文件的路径
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="WEB-INF/view/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
使用逻辑名称指定视图
// 自动拼接 前缀+逻辑名称+后缀
// WEB-INF/view/show.jsp
mv.setViewName("show");
Spring MVC请求处理流程
- 发起一个请求
- 请求通过web.xml配置的
url-pattern
根据请求规则转发给不同的DispatcherServlet中央调度器 - 中央调度器DispatcherServlet会读取
init-param
自定义的配置文件 - 根据配置文件,得到项目中的所有处理器对象@Controller
- 根据不同的@Controller映射规则,转发给处理器对象进行处理
DispatcherServlet之init方法
tomcat启动,创建容器的过程
通过load-on-startup标签指定的1,创建DispatcherServlet对象
DispatcherServlet的父类继承了HttpServlet,它是一个Servlet,在被创建时,会执行init方法
//init方法
{
//创建容器,读取配置文件
webApplicationContext ctx = new ClassPathXmlApplicationContext("springmvc.xml");
//把容器对象放入到ServletContext中
getServletContext().setAttribute(key,ctx);
}
创建容器的作用:创建@Controller注解所在的类的对象
请求的处理过程
service->doService->doDispatch