一、域对象传值

1.1、Request域对象

给Request域传值有多种方式,具体如下:

    // Servlet原生Api方式@RequestMapping("/testRequestByServletApi")public String testRequestByServletApi(HttpServletRequest request) {request.setAttribute("testRequest", "hello, Servlet api");return "success";}@RequestMapping("/testModelAndView")public ModelAndView testModelAndView() {ModelAndView view = new ModelAndView();view.addObject("testRequest", "hello, ModelAndView");view.setViewName("success");return view;}@RequestMapping("/testModel")public String testModel(Model model) {model.addAttribute("testRequest", "hello, Model");return "success";}@RequestMapping("/testMap")public String testModel(Map<String, Object> map) {map.put("testRequest", "hello, Model");return "success";}@RequestMapping("/testModelMap")public String testModel(ModelMap modelMap) {modelMap.addAttribute("testRequest", "hello, ModelMap");return "success";}

1.2、Session域对象

对于session域对象,直接使用原生的ServletApi比较方便

    @RequestMapping("/testSession")public String testModel(HttpSession session) {session.setAttribute("testRequest", "hello, session");return "success";}

二、视图解析器

在Servlet中有两个概念需要区分一下:转发和重定向。

转发 重定向
是一次http request请求,发生在服务端 是两次请求,第一次服务端返回302,浏览器自动触发第二次
可以访问WEB-INF中资源 不可以访问WEB-INF中的资源

2.1、原生的Servlet接口

通过原生的Servelt接口HttpServletRequest进行转发,HttpServletResponse进行重定向

    @RequestMapping("/hello")public void hello(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//通过request进行转发//request.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(request, response);//通过response进行重定向response.setStatus(HttpServletResponse.SC_FOUND);response.sendRedirect(request.getContextPath()+"/myhello.jsp");}

2.2、通过视图解析器

当我们引入Thymeleaf,默认使用的就是Thymeleaf视图解析器,但是如果有前缀forward和redirect则不是使用Thymeleaf视图解析器,具体如下:

InternalResourceView(用于转发):用于转发

RedirectView(用于重定向):用于重定向

@Controller
public class ViewController {@RequestMapping("/testThymeleafView")public String testThymeleafView() {return "success"; //使用Thymeleaf视图解析器}@RequestMapping("/testForward")public String testForward() {return "forward:/testThymeleafView"; //使用的InternalResourceView}@RequestMapping("/testRedirect")public String testRedirect() {return "redirect:/testThymeleafView"; //使用的RedirectView解析器
}

三、视图控制器

有些时候对于一个请求(如首页访问),并不需要通过代码做一些处理,这种情况下我们可以直接使用置视图控制器,进行简单配置,就可实现功能。

    <mvc:view-controller path="/" view-name="index"></mvc:view-controller><mvc:annotation-driven/>

其中path表示访问路径,view-name表示视图名称,即html页面

annotation-driven是注解驱动,此配置项必须存在,否则代码中基于注解的访问方式都会失效

四、SpringMvc支持PUT\DELETE方式

可参考我的博客:SpringMvc处理PUT\DELETE请求_程序员的世界-CSDN博客springmvc正确处理postman发来的put请求,delete请求https://blog.csdn.net/xxb249/article/details/122270886

五、静态资源访问

比如我们在webapp引入vue.js后,我们通过前端script标签是无法正常找到静态资源vue.js,主要原因是:我们在创建DispatcherServlet的时,指定的url-pattern是所有请求。也就是说静态资源访问也要经过DispatcherServlet进行处理,然而DispatcherServlet只能处理用@RequestMapping标注的请求,而静态资源并不能通过@RequestMapping标注。我们需要引入另外一个Servlet来辅助处理静态资源--DefaultServlet,这个Servlet是由tomcat实现的,可以处理静态资源请求,具体定义在tomcat home目录中conf/web.xml:

    <servlet><servlet-name>default</servlet-name><servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class><init-param><param-name>debug</param-name><param-value>0</param-value></init-param><init-param><param-name>listings</param-name><param-value>false</param-value></init-param><load-on-startup>1</load-on-startup></servlet>

在springmvc中开始静态资源处理只需要一个配置项即可:

<!-- 开启静态资源访问 -->
<mvc:default-servlet-handler/>
<!-- 开启注解驱动 否则DispatcherServlet不能处理请求 -->
<mvc:annotation-driven/>

springmvc处理这部分类是:DefaultServletHttpRequestHandler,该类实现比较简单

六、HttpMessageConverter 报文转换器

用于将http request转成java对象或者将java对象转成http response。springmvc提供两个注解和两个类

@RequestBody 将Request Body转换成String,用于标注在形参
@ResponseBody 将java bean转成http response返回给浏览器,通常是方法的返回值,用于标注在方法上(也可以用于类上)
RequestEntity 用于获取http报文,包括请求头和请求体。用于声明控制器形参类型
ResponseEntity 作为控制器方法的返回值,典型使用场景是文件上传与下载

6.1、导入依赖

springmvc默认使用jackson作为json转化

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.4</version>
</dependency><!-- 如果使用fastjson -->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.70</version>
</dependency>

6.2、开启注解驱动

<mvc:annotation-driven/>

如果使用fastjson作为转换器,则需要这样配置

<mvc:annotation-driven><mvc:message-converters><bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"/></mvc:message-converters>
</mvc:annotation-driven>

6.3、添加@ResponseBody注解

将java bean做为返回值,传给浏览器

    @RequestMapping(value = "/testResponseUser", method=RequestMethod.GET)@ResponseBodypublic User testUser() {System.out.println("testUser。。。。");return new User(1001, "ZHANGSAN", "1234", "男");}

七、文件上传与下载

7.1、下载

下载功能比较简单,代码如下:

    /* 下载 */@RequestMapping("/testDown")public ResponseEntity<byte[]> testDown(HttpSession session) throws IOException {ServletContext servletContext = session.getServletContext();String path = servletContext.getRealPath("/statics/b.png");InputStream inputStream = new FileInputStream(path);byte[] data = new byte[inputStream.available()];inputStream.read(data);MultiValueMap<String, String> headers = new HttpHeaders();headers.add("Content-Disposition", "attachment;filename=aa.png");HttpStatus status = HttpStatus.OK;ResponseEntity responseEntity = new ResponseEntity<byte[]>(data, headers, status);inputStream.close();return responseEntity;}

7.2、上传

上传需要导入依赖并且配置文件上传解析器,具体如下:

7.2.1、依赖

<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.3</version>
</dependency>

7.2.2、文件上传解析器

一定要指定id,否则springmvc不能获取到这个bean

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

7.2.3、代码

<form action="/testUp" method="post" enctype="multipart/form-data">用户名:<input type="text" name="username" value="1234">文件:<input type="file" name="upFile"><br/><input type="submit" name="up" value="up">
</form>
    /*** 文件上传* 1. commons-fileupload依赖* 2. 配置文件上传解析器* 3. 形参名字与表单中组件名称保持一致*/@RequestMapping(value = "/testUp", method = RequestMethod.POST)public String testUp(MultipartFile upFile, HttpSession session) throws IOException {String filename = upFile.getOriginalFilename();String updir = session.getServletContext().getRealPath("updir"); //获取服务器路径File dir = new File(updir);if (!dir.exists()) {//不存在目录则创建dir.mkdir();}File saveFile = new File(updir+File.separator+filename);upFile.transferTo(saveFile);return "success";}

八、拦截器

拦截器也是可以拦截各种请求(与过滤器功能类似),拦截器(接口)提供了三个方法,三个方法执行时机如下图所示:

多个拦截器执行顺序:

1)所有preHandle方法都返回true

preHandle方法,按照注册顺序执行。postHandle、afterCompletion方法,按照注册顺序反向执行

2)preHandle方法返回false

postHandle方法不会被执行,但是afterCompletion方法会执行

具体可以参考HandlerExecutionChain类中方法:applyPreHandle、applyPostHandle、triggerAfterCompletion

<!-- 配置拦截器 -->
<mvc:interceptors><!-- 拦截所有请求<bean class="com.atguigu.interceptors.MyInterceptor"></bean>--><mvc:interceptor><!-- 拦截首页之外的所有请求 --><mvc:mapping path="/**"/><mvc:exclude-mapping path="/"/><bean class="com.atguigu.interceptors.MyInterceptor"/></mvc:interceptor>
</mvc:interceptors>
public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("MyInterceptor---->preHandle");return true; //返回true代表放行}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("MyInterceptor---->postHandle");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("MyInterceptor---->afterCompletion");}
}

九、异常处理器

springmvc提供两种方式用于定制化异常处理:一种是配置方式,一种是基于注解方式。

9.1、配置方式

在springmvc配置文件中增加异常处理器

<!-- 异常解析器 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><property name="exceptionMappings"><props><!-- key=异常全路径名称 算数异常  value=视图名字, 此处实际执行errors.html --><prop key="java.lang.ArithmeticException">errors</prop></props></property><!-- 将错误详细信息exceptionAttribute 放到请求域中,请求域key是exinfo --><property name="exceptionAttribute" value="exinfo"/>
</bean>
<!-- errors.html --><!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>Errors</h1>
<p th:text="${exinfo}"></p>
</body>
</html>
    @RequestMapping(value = "/testException", method = RequestMethod.GET)public String testException() {int a = 1;int b = 0;int c = a / b;return "success";}

9.2、基于注解方式异常处理

@ControllerAdvice
public class ExceptionController {@ExceptionHandler(value = {ArithmeticException.class, NullPointerException.class})public String errors(Model model, Exception ex) {model.addAttribute("exinfo", ex);return "errors";}
}

十、SpringMvc常用配置

webapp\WEB-INF\web.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!-- 编码过滤器 必须放在第一位否则会出现乱码不生效问题 --><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceResponseEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- HiddenHttpMethodFilter --><filter><filter-name>HiddenHttpMethodFilter</filter-name><filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class></filter><filter-mapping><filter-name>HiddenHttpMethodFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- servlet --><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:springmvc04.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>
</web-app>

springmvc配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 组件扫描 --><context:component-scan base-package="com.atguigu.controller"/><!-- 视图解析器 --><bean class="org.thymeleaf.spring5.view.ThymeleafViewResolver"><property name="order" value="1"/><property name="characterEncoding" value="UTF-8"/><property name="templateEngine"><bean class="org.thymeleaf.spring5.SpringTemplateEngine"><property name="templateResolver"><bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"><property name="prefix" value="/WEB-INF/templates/"/><property name="suffix" value=".html"/><property name="characterEncoding" value="UTF-8"/><property name="templateMode" value="HTML5"/></bean></property></bean></property></bean><!-- 开启静态资源访问 --><mvc:default-servlet-handler/><!-- 视图控制器 --><mvc:view-controller path="/" view-name="index"/><mvc:view-controller path="/file" view-name="file"/><!-- 开启注解驱动 --><mvc:annotation-driven><mvc:message-converters> <!-- 处理响应中文乱码问题 --><bean class="org.springframework.http.converter.StringHttpMessageConverter"><property name="defaultCharset" value="UTF-8"/><property name="supportedMediaTypes"><list><value>text/html</value><value>application/json</value></list></property></bean></mvc:message-converters></mvc:annotation-driven><!-- 文件上传解析器 --><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><property name="defaultEncoding" value="utf-8"></property><property name="maxUploadSize" value="10485760000"></property><property name="maxInMemorySize" value="40960"></property></bean><!-- 配置拦截器 --><mvc:interceptors><!-- 拦截所有请求<bean class="com.atguigu.interceptors.MyInterceptor"></bean>--><mvc:interceptor><!-- 拦截首页之外的所有请求 --><mvc:mapping path="/**"/><mvc:exclude-mapping path="/"/><bean class="com.atguigu.interceptors.MyInterceptor"/></mvc:interceptor></mvc:interceptors><!-- 异常解析器 --><bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><property name="exceptionMappings"><props><!-- key=异常全路径名称  value=视图名字, 此处实际执行errors.html --><prop key="java.lang.ArithmeticException">errors</prop></props></property><!-- 将错误详细信息exceptionAttribute 放到请求域中,请求域key是exinfo --><property name="exceptionAttribute" value="exinfo"/></bean></beans>

以上是最近学习springmvc总结,作为一个备份吧。

SpringMvc学习日记-基础知识相关推荐

  1. python语言的单行注释以井号开头_推荐|零基础学习Python基础知识

    原标题:推荐|零基础学习Python基础知识 Python是一种面向对象.解释型计算机程序设计语言.语法简洁清晰,强制用空白符作为语句缩进. Python具有丰富和强大的库,又被称为胶水语言.能把其他 ...

  2. SpringMVC学习日记 1.Spring框架

    SpringMVC学习日记 1.Spring框架 Spring简介 Spring框架是一个开源框架,由Rod Johnson组织和开发,生产目的在于简化企业级应用的开发. 主要特性 非侵入(no-in ...

  3. Hadoop学习笔记—15.HBase框架学习(基础知识篇)

    Hadoop学习笔记-15.HBase框架学习(基础知识篇) HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问.HBase的目标是存储并处理大型的数据.HBase ...

  4. 关于图计算图学习的基础知识概览:前置知识点学习(PGL)[系列一]

    关于图计算&图学习的基础知识概览:前置知识点学习(Paddle Graph Learning (PGL)) 0.1图计算基本概念 首先看到百度百科定义: 图计算(Graph Processin ...

  5. 快速学习mysql_快速学习MySQL基础知识

    这篇文章主要梳理了 SQL 的基础用法,会涉及到以下方面内容: SQL大小写的规范 数据库的类型以及适用场景 SELECT 的执行过程 WHERE 使用规范 MySQL 中常见函数 子查询分类 如何选 ...

  6. 三 计算机知识的重要性分析,学习计算机基础知识对中专学生的重要性分析

    学习计算机基础知识对中专学生的重要性分析 [摘 要]本文主要介绍了计算机基础知识的内容,阐述了学习计算机基础知识对中专学生的作用,并且通过对计算机基础操作的学习,提高中专学生的计算机应用水平.希望本文 ...

  7. 谈计算机知识对学生的作用,浅谈学习计算机基础知识对中专学生的重要性

    [摘 要]本文主要介绍了计算机基础知识的内容,阐述了学习计算机基础知识对中专学生的作用,并且通过对计算机基础操作的学习,提高中专学生的计算机应用水平.希望本文可以让中专学生认识到学习计算机基础知识的重 ...

  8. 《机器学习》理论——速读学习1 基础知识

    <机器学习>理论--速读学习1 基础知识 该系列文章系个人读书笔记及总结性内容,任何组织和个人不得转载进行商业活动! Time: 2021-12-05 学习目标:我需要了解神经网络除了工程 ...

  9. A.关于图计算图学习的基础知识概览:前置知识点学习(Paddle Graph L)【一】

    图学习图神经网络算法专栏简介:主要实现图游走模型(DeepWalk.node2vec):图神经网络算法(GCN.GAT.GraphSage),部分进阶 GNN 模型(UniMP标签传播.ERNIESa ...

最新文章

  1. JQuery Smart UI 简介(五) — 框架设计【前篇】(前台UI层架构)
  2. 国产操作系统UOS —— 你开始使用了吗?这个新年假期我已安装好了!
  3. 综述 | 深度学习弱目标检测定位
  4. 深度学习之卷积、全连接、反卷积等
  5. 查看和修改mysql数据库编码
  6. ios弧形进度条_iOS实现一个颜色渐变的弧形进度条
  7. Spring框架入门程序:获取Bean的三种方式
  8. 【死磕DDD】聊聊领域建模方法论
  9. MOSFET器件手册关键参数解读
  10. 96114198交易失败_通过工行网银向境外汇款提示“96111444,系统错误”,如何处理?...
  11. layabox 文本 html,LayaBox:富文本HtmlDivElement常用设置
  12. 苹果手机页面不兼容问题——mui
  13. RationalDMIS 2020 网络报表/网络编程连接设置
  14. mac系统连接服务器教程视频教程,mac os教程视频
  15. Vue template挂载中el和mouted的使用和区别
  16. 【说透区块链系列】一文读懂什么是Web 3.0
  17. 一个程序员的十年程序人生感悟
  18. 函数相乘和相除的导数及证明
  19. Android开发经验
  20. c语言开头的作用是什么,C语言为什么开头都加;#includestdio.h有什么作用?

热门文章

  1. perl实现根据序列ID从提取fasta文件序列
  2. 打造现代应用的利器,VMware Tanzu显露王者风范 (1)
  3. 生产计划排程APS系统整体结构
  4. 彻底删除win7无线临时网络
  5. 配色神器ColorCube
  6. 区块链基本概念和名词解释
  7. 【技巧】vistual studio 2017 communty 版本许可证过期解决办法
  8. 算法导论 之 红黑树 - 添加[C语言]
  9. UE4 Decal 贴花不在静态光照下绘制
  10. 公司企业邮箱怎么注册开通?