第一章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文件)

运行流程

  1. 客户端点击链接会发送http://localhost:8080/springmvc/hello
  2. 来到tomcat服务器
  3. springmvc的前端控制器接收所有请求
  4. 来看请求地址和@RequestMapping标注的哪个匹配 来找到到底使用哪个类的哪个方法
  5. 前端控制器找到了目标处理类和目标方法,直接利用反射执行目标方法
  6. 方法执行完成以后会有一个返回值 springmvc认为这个返回值就是要去的页面地址
  7. 拿到方法返回值以后,用视图解析器进行拼串得到完善的页面地址
  8. 拿到页面地址,前端控制器帮我们转发到页面

流程

  1. 客户端请求提交到DispatcherServlet
  2. 由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller
  3. DispatcherServlet将请求提交到Controller(也称为Handler)
  4. Controller调用业务逻辑处理后,返回ModelAndView
  5. DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图
    视图负责将结果显示到客户端
    图片说明
    多了前端控制器 再到控制器
    图片说明
全部评论

相关推荐

牛客868257804号:九个中铁八个中建
点赞 评论 收藏
分享
斑驳不同:还为啥暴躁 假的不骂你骂谁啊
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务