第一章SpringMVC概述:url-pattern
SpringMVC 概述
①Spring 为展现层提供的基于 MVC 设计理念的优秀的 Web 框架,是目前最主流的 MVC 框架之一。
②Spring3.0 后全面超越 Struts2,成为最优秀的 MVC 框架。
③Spring MVC 通过一套 MVC 注解,让 POJO【Plain Old java】 成为处理请求的控制器,而无须实现任何接口。
④支持 REST 风格的 URL 请求。
⑤采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性。
⑥一种轻量级的、基于MVC的Web层应用框架。偏前端而不是基于业务逻辑层。
⑦是Spring框架的一个后续产品。
能干什么
- 天生与Spring框架集成,如:(IOC,AOP)
- 支持Restful风格
- 进行更简洁的Web层开发
- 支持灵活的URL到页面控制器的映射
- 非常容易与其他视图技术集成,如:Velocity、FreeMarker等等。
- 因为模型数据不存放在特定的API里,而是放在一个Model里(Map数据结构实现,因此很容易被其他框架使用)
- 非常灵活的数据验证、格式化和数据绑定机制、能使用任何对象进行数据绑定,不必实现特定框架的API
- 更加简单、强大的异常处理
- 对静态资源的支持
- 支持灵活的本地化、主题等解析
怎么玩
- 将Web层进行了职责解耦,也就和struts2一样,基于请求-响应模型
- 常用主要组件
- DispatcherServlet:前端控制器
- Controller:处理器/页面控制器,做的是MVC中的C的事情,但控制逻辑转移到前端控制器了,用于对请求进行处理
- HandlerMapping :请求映射到处理器,找谁来处理,如果映射成功返回一个HandlerExecutiongChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor***对象)
- ViewResolver : 视图解析器,找谁来处理返回的页面。把逻辑视图解析为具体的View,进行这种策略模式,很容易更换其他视图技术;
- 如InternalResourceViewResolver将逻辑视图名映射为JSP视图
- LocalResolver:本地化、国际化
- MultipartResolver:文件上传解析器
- HandlerExceptionResolver:异常处理器
HelloWorld
新建Web工程,加入 jar 包
在 web.xml 中配置 DispatcherServlet
<!-- 配置SpringMVC核心控制器:是由一个前端控制器能拦截所有请求 并智能派送 --> <!-- The front controller of this Spring Web application, responsible for handling all application requests servlet启动加载,servlet原本是第一次访问创建对象 load-on-startup:服务器启动的时候创建对象 值越小优先级越高,越先创建对象 --> <servlet> <servlet-name>springDispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <!-- contextConfigLocation 指定springMVC配置文件位置 --> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!-- Map all requests to the DispatcherServlet for handling --> <!-- /* 和/ 都是拦截所有请求;/:会拦截所有请求,但是不会拦截*.jsp 能保证jsp访问正常 /* 的范围更大,还会拦截到*.jsp这些请求,一旦拦截jsp页面就不能显示了 --> <servlet-mapping> <servlet-name>springDispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
扫描所有组件
<context:component-scan base-package="com.project"/>
创建出jsp文件
《%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 《!DOCTYPE html> 《html> 《head> 《meta charset="UTF-8"> 《title>Insert title here《/title> 《/head> 《body> 《h1>hello《/h1> 《/body> 《/html> ----------------------------------------------- 《html> 《body> 《h2>Hello World!《/h2> 《/body> 《a href="hello">hello,world《/a> 《/html>
controller类
@Controller public class MyController { @RequestMapping("/hello") public String myRequest() { System.out.println("hello"); return "/WEB-INF/jsp/hello.jsp"; } }
为 解决 return "/WEB-INF/jsp/hello.jsp";写了很多前缀后缀的问题 控制类就可以写return "hello"; 会自动拼接为"/WEB-INF/jsp/hello.jsp"
<context:component-scan base-package="com.project"/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"></property> <property name="suffix" value=".jsp"></property> </bean>
浏览器地址栏为hello 实际上是hello.jsp 地址栏为requestMapper的请求 这是一次转发操作
配置 url-pattern
url-pattern 学习视频
https://www.bilibili.com/video/av14548473?p=8
https://www.bilibili.com/video/av14548473?p=9
通过上面的视频可以得知 匹配到对应的设置/* / 等等 会拦截到DispatcherServlet进行执行
<url-pattern>*.action</url-pattern>所有配.action才拦截 拦截的范围更小 <url-pattern>*.do</url-pattern> /:拦截所有请求,不拦截jsp页面 直接请求图片不会显示出来 /*:会拦截所有请求,拦截jsp页面 *.jsp请求 动态静态资源都会被拦截 直接请求图片不会显示出来 .do 不会拦截 也就是直接请求图片会显示出来 不能混合使用 /xxx/.do会报错 处理*.jsp是tomcat做的事 所有项目的小web.xml 继承大web.xml 1)服务器的大web.xml中有一个DefaultServlet是url-pattern=/ 也就是请求/ 会请求调用DefaultServlet DefaultServlet是tomcat中处理静态资源的 除了jsp和servlet外剩下的都是静态资源; index.html 静态资源 tomcat就会再服务器下找到这个资源并返回 我们可以看到 子web.xml 中利用 / 覆盖原本的父web.xml的/ ,使得DefaultServlet的/失效了 我们前端控制器的/禁用了tomcat服务器的DefaultServlet 静态资源无效了 静态资源来到了DispatcherServlet(前端控制器)看那个方法的RequestMapping是这个index.html <servlet-mapping> <servlet-name>springDispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> 2)我们的配置中前端控制器url-pattern=/ 3)为什么jsp又能访问,因为我们还没有覆盖或者说禁用jspServlet的配置 一切*.jsp都会发给jspServlet来使用 4)/* 直接拦截覆盖所有的请求 我们写/ 也是为了迎合后来的Rest风格的URL地址
404 的罪魁祸首 说明请求给tomcat ,没在ispatcherServlet种执行
读取前端控制器DispatcherServlet配置文件细节
- 如果指定 就会按照web.xml的内容进行配置
- 如果不指定配置文件位置
会默认去找 /WEB-INF/springDispatcherServlet-servlet.xml文件 也就是我们的(springmvc.xml文件)
运行流程
- 客户端点击链接会发送http://localhost:8080/springmvc/hello
- 来到tomcat服务器
- springmvc的前端控制器接收所有请求
- 来看请求地址和@RequestMapping标注的哪个匹配 来找到到底使用哪个类的哪个方法
- 前端控制器找到了目标处理类和目标方法,直接利用反射执行目标方法
- 方法执行完成以后会有一个返回值 springmvc认为这个返回值就是要去的页面地址
- 拿到方法返回值以后,用视图解析器进行拼串得到完善的页面地址
- 拿到页面地址,前端控制器帮我们转发到页面
流程
- 客户端请求提交到DispatcherServlet
- 由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller
- DispatcherServlet将请求提交到Controller(也称为Handler)
- Controller调用业务逻辑处理后,返回ModelAndView
- DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图
视图负责将结果显示到客户端
多了前端控制器 再到控制器