[SpringMVC 01] SpringMVC原理
SpringMVC
1. Servlet
导入的四个包:
servlet-api
jsp-api
spring-webmvc
jstl
2. SpringMVC
基于java实现的MVC轻量级web框架(可以把servlet等需要用到的bean注册到spring中,方便使用)
SpringMVC框架围绕一个DispatcherServlet的调度设计(做请求分发)
核心作用: 以前不同的业务有好多个servlet,在用户和servlet中间加一层,实现请求的转发
原理:
req进来的时候,先到Front controller, 相当于DispatcherServlet,用来分发请求;controller返回的结果是ModelandView, 然后Front controller发给View template来渲染,再返回Front controller然后return resp。
3. Hello,SpringMVC
1. 以前的MVC构架:
-
一个需求,写一个servlet(实现doGet);在web.xml中注册servlet和映射servlet-mapping
-
每一个需求都需要这么写(web.xml中注册很多个servlet)
2. SpringMVC构架:
- web.xml中注册DispatcherServlet(其中有
init-param
标签包括spring-servlet.xml的位置和load-on-startup
启动级别属性),并对其映射。老一套的 - resource下添加spring-servlet.xml配置文件(spring的头文件,用于注册servlet,而文件已经添加到了上一步的配置文件中);其中配置三个bean:
BeanNameUrlHandlerMapper
SimpleControllerHandlerAdapter
InternalResourceViewResolver
,分别是:处理映射器,处理器适配器,视图解析器 - HelloController类,实现Controller接口,和返回值为ModelAndView的handleRequest方法,其中new一个ModelAndView类,用mv.addObject方法放置键值对,mv.setViewName()设置视图名称,并返回视图
- spring-servlet.xml中配置HelloController类的bean,
- 写访问页面,并访问(${})来取键中的值。
(遇到的问题:当maven项目是后添加的web支持时,需要自己配置tomcat中的lib依赖包,否则tomcat中没有lib依赖包报错404)原因:WEB-INF的默认位置不同,后添加的支持在根目录下
4. SpringMVC的执行原理
流程:
- DispatcherServlet是整个SpringMVC的控制中心, 当用户发出请求:
- 把url拆分为三个部分:总体:请求位于服务器域名上的web站点的hello控制器
- 服务器域名
- springMVC部署在服务器上的web站点名(web.xml中注册的映射)
- 控制器的具体名称(spring中注册的控制器bean的id)
- HandlerMapping: 由DispatcherServlet自动调用, 根据请求url查找Handler;
- HandlerExecution 表示具体的Handler, 根据url查找控制器(其实就是HandlerMapping找sping中controller的id)
- HandlerExecution把解析后的学习传递给DispatcherServlet。
- HandlerAdapter表示处理器适配器,按照特定的规则执行Handler
- 具体的Controller执行(真正自己写的部分)
- Controller返回一个ModelAndView(带数据和视图:数据就是模型、实体类,视图就是页面)给HandlerAdapter
- HandlerAdapter把东西返回给DispatcherServlet;
- DispatcherServlet调用视图解析器(ViewResolver)来解析传递的逻辑视图名
- 将解析的结果返回给DispatcherServlet
- DispatcherServlet根据解析器解析的视图,调用具体的视图;
- 呈现给用户
其中,在web.xml中配置DispatcherServlet, 在spring-servlet.xml 中配置HandlerMapping, HandlerAdapter和ViewResolver。
主要分为三步:前端控制器接受用户的请求并拦截,根据对应的请求找到对应的Controller处理器,处理器调用业务层并返回信息给前端控制器,然后前端控制器调用视图解析器找到对应视图并将数据渲染
5. Hello again(原理版本)
- 首先在web.xml中配置DispatcherServlet
DispatcherServlet需要截取所有的请求,但不需要截取.jsp, 所以在配置url时,使用/
表示只截取请求,不截取jsp;
使用/*
表示截取请求和.jsp。
<?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">
<!--配置DispatcherServlet, 是SpringMVC的核心,请求分发器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 绑定Spring的配置-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!-- 设置启动级别为1-->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 在springMVC中,
/ 只会取匹配请求,不会匹配jsp页面
/* 会匹配所有的请求,包括jsp页面 -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
-
配置spring.xml, 包括Mapping、Adapter、ViewResolver(需要配置prefix和suffix)
最后再注册controller,id是用户要访问的地址
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
<!-- 获取到视图名之后来解析视图,添加前缀和后缀获得jsp页面的位置-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<bean id="/hello" class="com.roy.controller.HelloController"/>
</beans>
- 写Controller.java,实现Controller接口,返回ModelAndView类
public class HelloController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
// 写业务
mv.addObject("msg", "Hello,SpringMVC");
mv.setViewName("test");
return mv;
}
}
- 写test.jsp视图
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--获取数据--%>
${msg}
</body>
</html>