我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringMVC核心技术

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringMVC核心技术

请求重定向和转发

当处理器对请求处理完毕后,向其它资源进行跳转是,有两种跳转方式:请求转发与重定向。而根据索要跳转的资源类型,又可分为两类:跳转到页面与跳转到其他处理器。

注意:对于请求转发的页面,可以是WEB-INF中页面,而重定向的页面,是不能为WEB-INF中的,因为重定向相当于用户再次发出一次请求,而用户不能直接访问WEB-INF中的资源。

SpringMVC框架把原来Servlet中的请求转发和重定向操作进行了封装,现在可以使用简单的方式实现转发和重定向。

forward:表示转发,实现request.getRequestDispathcer("xx.jsp").forward();

redirect:表示重定向,实现response.sendRediect("xxx.jsp");

请求转发

处理器方法返回 ModelAndView 时,需在 setViewName()指定的视图前添加 forward:,且此时的视图不再与视图解析器一同工作,这样可以在配置了解析器时指定不同位置的视图。视图页面必须写出相对于项目根的路径。forward 操作不需要视图解析器。处理器方法返回 String,在视图路径前面加入 forward: 视图完整路径。


@RequestMapping(value = "/some",produces = "text/plain;charset=utf-8")
public ModelAndView testForward(String name,Integer age){
    ModelAndView mv = new ModelAndView();
    mv.addObject("name",name);
    mv.addObject("age",age);
    mv.setViewName("forward:/WEB-INF/view/show.jsp");
    return mv;
}

请求重定向

在处理器方法返回的视图字符串的前面添加 redirect:,则可实现重定向跳转。


@RequestMapping(value = "/other")
public ModelAndView testRedirect(String name,Integer age){
    ModelAndView mv = new ModelAndView();
    mv.addObject("name",name);
    mv.addObject("age",age);
    mv.setViewName("redirect:/other.jsp");
    return mv;
}

异常处理

使用注解@ExceptionHandler 可以将一个方法指定为异常处理方法。该注解只有一个可选属性 value,为一个 Class<?>数组,用于指定该注解的方法所要处理的异常类,即所要匹配的异常。而被注解的方法,其返回值可以是 ModelAndView、String,或 void,方法名随意,方法参数可以是 Exception 及其子类对象、HttpServletRequest、HttpServletResponse 等。系统会自动为这些方法参数赋值。对于异常处理注解的用法,也可以直接将异常处理方法注解于 Controller 之中。

代码演示

第一步:自定义两个异常类


public class MyException extends Exception {
    public MyException() {
        super();
    }
    public MyException(String message) {
        super(message);
    }
}

public class AgeException extends MyException {
    public AgeException() {
        super();
    }
    public AgeException(String message) {
        super(message);
    }
}
public class NameException extends MyException {
    public NameException() {
        super();
    }
    public NameException(String message) {
        super(message);
    }
}

第二步:在controller方法中抛出异常


@RequestMapping(value = "exception")
public ModelAndView askForException(String name,Integer age) throws MyException {
    ModelAndView mv = new ModelAndView();
    if(!"zs".equals(name)){
        throw new NameException("姓名不正确!!!");
    }
    if (age == null || age > 80){
        throw new AgeException("年龄太大了!!!");
    }
    mv.addObject("name",name);
    mv.addObject("age",age);
    mv.setViewName("show");
    return mv;

第三步:定义三个异常响应页面


nameError.jsp
<br/>
提示信息:${msg}
<br/>
系统信息:${ex.message}
ageError.jsp
<br/>
提示信息:${msg}
<br/>
系统信息:${ex.message}
otherError.jsp
<br/>
提示信息:${msg}
<br/>
系统信息:${ex.message}

第四步:定义全局异常处理类


@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(value = NameException.class)
    public ModelAndView nameException(Exception ex){
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","姓名不是zs");
        mv.addObject("ex",ex);
        mv.setViewName("nameError");
        return mv;
    }
    @ExceptionHandler(value = AgeException.class)
    public ModelAndView ageException(Exception ex){
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","年龄超过80岁啦");
        mv.addObject("ex",ex);
        mv.setViewName("ageError");
        return mv;
    }
    @ExceptionHandler
    public ModelAndView otherException(Exception ex){
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","未知异常");
        mv.addObject("ex",ex);
        mv.setViewName("otherError");
        return mv;
    }
}

第五步:在spring配置controller和handler的注解扫描


<!--开启Controller注解扫描-->
<context:component-scan base-package="school.xauat.controller"></context:component-scan>
<!--配置视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/view/"></property>
    <property name="suffix" value=".jsp"></property>
</bean>
<!--开启注解驱动-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--开启ControllerAdvice注解扫描-->
<context:component-scan base-package="school.xauat.handler"></context:component-scan>

SpringMVC拦截器

SpringMVC 中的 Interceptor 拦截器是非常重要和相当有用的,它的主要作用是拦截指定的用户请求,并进行相应的预处理与后处理。其拦截的时间点在“处理器映射器根据用户提交的请求映射出了所要执行的处理器类,并且也找到了要执行该处理器类的处理器适配器,在处理器适配器执行处理器之前”。当然,在处理器映射器映射出所要执行的处理器类时,已经将拦截器与处理器组合为了一个处理器执行链,并返回给了中央调度器。

定义拦截器类


public class myInterceptor implements HandlerInterceptor {
    private Long beginTime;
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle方法执行");
        beginTime = System.currentTimeMillis();
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle方法执行");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion方法执行");
        Long endTime = System.currentTimeMillis();
        System.out.println("程序执行时间" + (endTime - beginTime) + "ms");
    }
}

在springMVC配置文件注册拦截器


<mvc:interceptors>
     <mvc:interceptor>
          <mvc:mapping path="/**"/>
          <bean class="school.xauat.handler.MyInterceptor"></bean>
     </mvc:interceptor>
</mvc:interceptors>

自定义拦截器,需要实现 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 方法中加入数据

拦截器中方法和处理器方法的执行顺序如下图

当有多个拦截器时

拦截器过滤器的区别

拦截器和过滤器的区别

1、过滤器是Servlet中的对象。拦截器是框架中的对象

2、过滤器是实现Filter接口的对象。拦截器是实现HandlerInterceptor接口

3、过滤器用来设置request和response的参数、属性。

4、过滤器是在拦截器之前先执行的

5、过滤器是Tomcat服务器中创建的对象,拦截器是springmvc容器中创建的对象

6、过滤器是一个执行时间点,拦截器有三个执行时间点

7、过滤器可以处理jsp、js、html等,拦截器是侧重拦截对controller的对象,如果你的请求不能被中央调度器接受,这个请求就不会执行拦截内容

SpringMVC执行流程理解

SpringMVC执行流程分析

(1)浏览器提交请求到中央调度器

(2)中央调度器直接将请求转给处理器映射器。

(3)处理器映射器会根据请求,找到处理该请求的处理器,并将其封装为处理器执行链后返回给中央调度器。

(4)中央调度器根据处理器执行链中的处理器,找到能够执行该处理器的处理器适配器。

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

(6)处理器将处理结果及要跳转的视图封装到一个对象 ModelAndView 中,并将其返回给处理器适配器。

(7)处理器适配器直接将结果返回给中央调度器。

(8)中央调度器调用视图解析器,将 ModelAndView 中的视图名称封装为视图对象。

(9)视图解析器将封装了的视图对象返回给中央调度器

(10)中央调度器调用视图对象,让其自己进行渲染,即进行数据填充,形成响应对象。

(11)中央调度器响应浏览器。

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注编程网的更多内容!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SpringMVC核心技术

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java 核心技术包含哪些内容?(java核心技术有哪些)

在Java编程领域,核心技术是构建高效、可靠应用程序的基础。那么,Java核心技术到底有哪些呢?一、面向对象编程(Object-OrientedProgramming,OOP)面向对象编程是Java的基石,它将程序设计的重点从过程
Java 核心技术包含哪些内容?(java核心技术有哪些)
Java2024-12-17

Java核心技术有哪些

本篇内容介绍了“Java核心技术有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、 >>>***位用0填充,>>***位用符号位填充
2023-06-17

JavaEE的核心技术有哪些

本篇内容介绍了“JavaEE的核心技术有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  JavaEE平台由一整套服务、应用程序接口和协
2023-06-02

Go语言核心技术解析

go中并发编程利用goroutine(轻量级线程)和channel(通信管道)实现。goroutine通过go关键字创建,非常轻量,可创建大量goroutine,且不会影响性能。channel用于goroutine间通信,是类型化的管道。本
Go语言核心技术解析
2024-04-03

物联网核心技术简介

物联网技术的重要基础和核心仍旧是互联网,通过各种有线和无线网络与互联网融合,将物体的信息实时准确地传递出去。
物联网2024-12-02

Java的核心技术有哪些

本篇内容主要讲解“Java的核心技术有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java的核心技术有哪些”吧!1. JVM相关对于刚刚接触Java的人来说,JVM相关的知识不一定需要理解
2023-06-15

服务网关:SpringCloud Gateway核心技术

SpringCloud Gateway能够实现多种网关功能,比如路由转发、断言、过滤器、熔断、限流、降级、自定义谓词配置、自定义过滤器等等多种功能。今天,我们就一起来聊聊SpringCloud Gateway中的断言、过滤器与熔断机制。

Kubernetes核心技术Pod详解、实例

Pod 是 Kubernetes 的最重要概念,每一个 Pod 都有一个特殊的被称为”根容器“的 Pause 容器。Pause 容器对应的镜 像属于 Kubernetes 平台的一部分,除了 Pause 容器,每个 Pod 还包含一个或多个
PodKubernetes2024-11-30

阿里云ECS核心技术解析

阿里云ECS(ElasticComputeService)是阿里云提供的一种弹性计算服务,它可以帮助用户快速构建和管理虚拟服务器,提供高性能、高可靠性的计算资源。本文将介绍阿里云ECS的核心技术,包括计算、存储和网络等方面的原理和特点。1.弹性计算能力阿里云ECS提供了强大的弹性计算能力,可以根据用户的需求自动调整计算
阿里云ECS核心技术解析
2023-12-28

如何掌握C#的核心技术

C#是由伟大的程序员之神Anders Hejlsberg为体现.NET技术的优势而创造出来的一种优秀语言。说起Anders Hejlsberg虽然可能有的读者不太熟悉,但说起他创造的几种语言或编译器,大家估计就并不陌生了。
C#.NET设计2024-12-03

如何高效掌握javase 和 java 的核心技术?(如何掌握javase和java的核心技术)

在当今的软件开发领域,Java语言无疑是最为广泛使用的编程语言之一。而JavaSE(JavaPlatform,StandardEdition)作为Java平台的基础版本,掌握其核心技术对于成为一名优秀的Java开发者至关重要。本文将为你详细介绍如何掌握JavaSE和
如何高效掌握javase 和 java 的核心技术?(如何掌握javase和java的核心技术)
Java2024-12-16

人工智能的核心技术剖析

欢迎各位阅读本篇,人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。本篇文章讲述了人工智能的核心技术剖析,编程学习网教育平台提醒各位:本篇文章纯干货~因此大家一定要认真阅读本篇文章哦!
人工智能的核心技术剖析
2024-04-23

JavaWeb核心技术中Session与Cookie浅析

session的工作原理和cookie非常类似,在cookie中存放一个sessionID,真实的数据存放在服务器端,客户端每次发送请求的时候带上sessionID,服务端根据sessionID进行数据的响应
2023-02-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录