SpringMVC入门及原理

SpringMVC

1.SpringMVC概述

1.1Spring概念

SpringMVC也叫Spring web mvc 。是Spring 内置的一个MVC框架,在 Spring3.0 后发布。SpringMVC 框架解决了WEB开发中常见的问题(参数接收、文件上传、表单验证等等),而且使用简单,与Spring无 缝集成。支持 RESTful风格的URL请求。采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性 和灵活性。

1.2 SprinMVC原理

在没有使用SpringMVC之前我们都是使用Servlet在做Web开发。但是使用Servlet开发在接收请求参数, 数据共享,页面跳转等操作相对比较复杂。servlet是java进行web开发的标准,既然springMVC是对 servlet的封装,那么很显然SpringMVC底层就是Servlet,SpringMVC就是对Servlet进行深层次的封 装。

1.3 SpringMVC优势

1、基于 MVC 架构,功能分工明确。解决页面代码和后台代码的分离。

2、简单易用。SpringMVC 也是轻量级的,jar 很小。不依赖的特定的接口和类就可以开发一个注解的 SpringMVC 项目。

3、作 为 Spring 框 架 一 部 分 , 能 够 使 用Spring的IoC和AOP 。 方 便 整 合MyBatis,Hiberate,JPA等 其他框架。

4、springMVC的注解强大易用。

2.实现

2.1pom.xml的配置

 <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.13.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
</dependency>

2.2创建Spring和SpringMVC的配置文件

我们一般将除了 Controller 之外的所有 Bean 注册到 Spring 容器中,而将 Controller 注册到 SpringMVC 容器中。所以我们在 resources 目录下添加 applicationContext.xml 作为 spring 的配置, 添加springmvc.xml作为springmvc的配置文件。

2.2.1 创建Spring配置文件applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       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
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
">
    <context:component-scan base-package="pojo,service,dao,exception"/>

</beans>
2.2.2创建SpringMVC配置文件Springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       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
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
">
    <context:component-scan base-package="controller"/>
    <mvc:annotation-driven/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <property name="prefix" value="/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>


    <mvc:default-servlet-handler/>


<!--配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="interceptor.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
<!--    文件上传配置-->

    <bean id="multipartResolver"
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="5242880"/>
        <property name="defaultEncoding" value="utf-8"/>
    </bean>

</beans>
2.2.3 在web.xml中配置这两个文件
<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:application.xml</param-value>
    </context-param>


    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    spring
    ——————————————————————————————————————————————————————————————————————
    springMVC
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

3工作流程

在这里插入图片描述

(1)用户通过浏览器发送请求到前端控制器DispatcherServlet。

(2)前端控制器直接将请求转给处理器映射器HandleMapping。

(3)处理器映射器HandleMapping会根据请求,找到负责处理该请求的处理器,并将其封装为处理器 执行链HandlerExecutionChina后返回给前端控制器DispatcherServlet。

(4)前端控制器DispatcherServlet根据处理器执行链中的处理器,找到能够执行该处理器的处理器适 配器HandlerAdaptor。

(5)处理器适配器HandlerAdaptor调用执行处理器Controller。

(6)处理器Controller将处理结果及要跳转的视图封装到一个对象 ModelAndView 中,并将其返回给 处理器适配器HandlerAdaptor。 (7)处理器适配器直接将结果返回给前端控制器DispatcherServlet。

(8)前端控制器调用视图解析器,将 ModelAndView 中的视图名称封装为视图对象。

(9)视图解析器ViewResolver将封装了的视图View对象返回给前端控制器DispatcherServlet.

(10)前端控制器DispatcherServlet调用视图对象,让其自己进行渲染,即进行数据填充,形成响应对 象。

(11)前端控制器响应浏览器。

4SpringMVC组件

1.DispatcherServlet: 前端控制器,也称为中央控制器或者核心控制器

用户请求的入口控制器,它就相当于 mvc 模式中的c,DispatcherServlet 是整个流程控制的中心,相当 于是 SpringMVC 的大脑,由它调用其它组件处理用户的请求,DispatcherServlet 的存在降低了组件之 间的耦合性。SpringMVC框架提供的该核心控制器需要我们在web.xml文件中配置。

  1. HandlerMapping:处理映射器

    HandlerMapping也是控制器,派发请求的控制器。我们不需要自己控制该类,但是他是springmvc运 转历程中的重要的一个控制器。 HandlerMapping负责根据用户请求找到 Handler 即处理器(也就是我 们所说的 Controller),SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式, 实现接口方式,注解方式等,在实际开发中,我们常用的方式是注解方式。

3.Handler:处理器

Handler是继DispatheServlet前端控制器的后端控制器,在DispatherServlet的控制下Handler对具体的用户请求进行处理。由于 Handler 涉及到具体的用户业务请求,所以一般情况需要程序员根据业 务需求开发 Handler。(这里所说的 Handler 就是指我们的 Controller)

4.HandlerAdapter:处理适配器

通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展处理器适配器,支持更多 类型的处理器,调用处理器传递参数等工作。

5.ViewResolver: 试图解析器

ViewResolver 负责将处理结果生成 View 视图,ViewResolver 首先根据逻辑视图名解析成物理视图名 称,即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用 户。 SpringMVC 框架提供了很多的 View 视图类型,包括:jstlView、freemarkerView、pdfView 等。 一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务 需求开发具体的页面

5.RequestMapping 注解

5.1ResquestMapping出现的位置

@RequestMapping 注解定义了处理器对于请求的映射规则。该注解可以定义在类上,也可以定义在 方法上,但是含义不同

一个@Controller 所注解的类中,可以定义多个处理器方法。当然,不同的处理器方法所匹配的 URI 是 不同的。这些不同的 URI 被指定在注解于方法之上的@RequestMapping 的value 属性中。但若这些请 求具有相同的 URI 部分,则这些相同的 URI,可以被抽取到注解在类之上的RequestMapping 的 value 属性中。此时的这个 URI 表示模块的名称。URI 的请求是相对于 Web 的根目录。在类的级别上的注解 会将一个特定请求或者请求模式映射到一个控制器之上。之后你还可以另外添加方法级别的注解来进一 步指定到处理方法的映射关系。

5.2 指定请求方式

@RequsetMapping(value="url",method= RequestMethod.GET)

5.3 url-pattren 解析

1、*.do
在没有特殊要求的情况下,SpringMVC 的前端控制器 DispatcherServlet 的常使用后辍匹配方
式,可以写为*.do 或者 *.action, *.mvc 等。
2、/
可以写为/,但是 DispatcherServlet 会将向静态内容--例如.css、.js、图片等资源的获取请求
时,也会当作是一个普通的 Controller 请求。前端控制器会调用处理器映射器为其查找相应的处理器。肯
定找不到啊,所以所有的静态资源获取请求也均会报 404 错误。

可以添加

<mvc:default-servlet-handler/>
<!--声 明 了 <mvc:default-servlet-handler /> 后 ,springmvc框架会在容器中创建
DefaultServletHttpRequestHandler处理器对象。该对象会对所有进入 DispatcherServlet的URL
进行检查。如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet 处理。
一般的服务器都有默认的 Servlet。例如咱们使用的Tomcat服务器中,有一个专门用于处理静态资源
访问的 Servlet 名叫 DefaultServlet。其<servlet-name/>为default。可以处理各种静态资源访问
请求。该Servlet注册在 Tomcat 服务器的 web.xml 中。在 Tomcat安装目录/conf/web.xml。-->

6处理器方法参数

  1. 直接使用方法的参数逐个接受(需要和前端转过来的值的“name"同名)

  2. 使用对象接受多个参数(要求要有和前端的传值的”name"属性,否则接受不到)

  3. 请求参数和方法名称的参数不一致(使用@ResquestParam矫正)

  4. 使用HttpServletRequest对象获取参数(老生常谈了)

  5. 直接使用URL地址传参

    @RequestMapping("test05/{id}/{name}/{loc}")
    public ModelAndView test05(@PathVariable("id") Integer teamId,
    @PathVariable("name") String teamName,
    @PathVariable("loc") String teamLocation){
    	System.out.println("test05-----------------");
    	System.out.println(teamId);
    	System.out.println(teamName);
    	System.out.println(teamLocation);
    	return new ModelAndView("ok");
    }
    
  6. .获取日期类型的参数

    @DateTimeFormat(pattern = "yyyy-MM-dd")  //加上格式转化
    private Date createTime;
    
  7. 获取数据类型的参数

    @RequestMapping("test07")
    public ModelAndView test07(String[] teamName,HttpServletRequest request){
    System.out.println("test07-----------------");
    //方式1:
    for (String s : teamName) {
    System.out.println(s);
    }
    System.out.println("---------------");
    //方式2:
    String[] teamNames = request.getParameterValues("teamName");
    for (String name : teamNames) {
    System.out.println(name);
    }
    return new ModelAndView("ok");
    }
    

8.获取集合类型的参数(与数组同理)

7处理器方法的返回值

使用@Controller注解的处理器的处理器方法,其返回值常用的有四种类型:

1.ModelAndView;(通过serViewName设置跳转的名字通过前后缀拼接跳转)

2.String(通过前后缀拼接直接跳转)

3.返回自定义类型的对象(json)

4.无返回值void

8页面导航方式

1.返回字符串

2.使用ModelAndView

在SpringMVC中两种导航进行页面导航的时候使用不同的前缀指定转发还是重定向 前缀: 转发: forward:url 默认 重定向: redirect:url

可以重定向或者转发到控制器

9 异常处理

@ExcepionHandler 可以将一个方法指定为异常处理方法

被注解的方法,其返回值可以是 ModelAndView、String,或 void,方法名随意,方法参数可以是 Exception 及其子类对象、HttpServletRequest、HttpServletResponse 等。系统会自动为这些方法参 数赋值。 对于异常处理注解的用法,也可以直接将异常处理方法注解于 Controller 之中.

@ExceptionHandler(value =
{TeamIdException.class,TeamNameException.class,Exception.class})
public ModelAndView exHandler(Exception ex){
	ModelAndView mv=new ModelAndView();
	mv.addObject("msg",ex.getMessage());
	if(ex instanceof TeamIdException)
	mv.setViewName("idError");
	else if(ex instanceof TeamNameException)
	mv.setViewName("nameError");
	else
	mv.setViewName("error");
	return mv;
}

9.1优化

使用@ControllerAdvice对异常处理类的进项封装。

10拦截器

SpringMVC 中的 拦截器( Interceptor)是非常重要的,它的主要作用是拦截指定的用户请求,并进行 相应的预处理与后处理。

拦截的时间点在“处理器映射器HandlerMapping根据用户提交的请求映射出了所要执行的处理器类,并 且也找到了要执行该处理器类的处理器适配器,在处理器适配器HandlerAdaptor执行处理器之前”。 在处理器映射器映射出所要执行的处理器类时,已经将拦截器与处理器组合为了一个处理器执行链 HandlerExecutionChain,并返回给了前端控制器。

自定义拦截器,需要实现 HandlerInterceptor 接口。而该接口中含有三个方法:

preHandle(request,response, Object handler):
该方法在处理器方法执行之前执行。其返回值为boolean,若为true,则紧接着会执行处理器方法,且
会将afterCompletion()方法放入到一个专门的方法栈中等待执行。
postHandle(request,response, Object handler,modelAndView):
该方法在处理器方法执行之后执行。处理器方法若最终未被执行,则该方法不会执行。由于该方法是在处
理器方法执行完后执行,且该方法参数中包含 ModelAndView,所以该方法可以修改处理器方法的处理结果
数据,且可以修改跳转方向。
afterCompletion(request,response, Object handler, Exception ex):
当 preHandle()方法返回true时,会将该方法放到专门的方法栈中,等到对请求进行响应的所工作完
成之后才执行该方法。即该方法是在前端控制器渲染(数据填充)了响应页面之后执行的,此时对
ModelAndView再操作也对响应无济于事。
afterCompletion是最后执行的方法,清除资源,例如在Controller方法中加入数据

10.1 配置拦截器

<!--配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="interceptor.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

/* 是拦截所有的文件夹,不包含子文件夹
/** 是拦截所有的文件夹及里面的子文件夹

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值