第一章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指定的视图
视图负责将结果显示到客户端
多了前端控制器 再到控制器
三奇智元机器人科技有限公司公司福利 86人发布
