SpringMVC - 基础

  • SpringMVC - 入门
    • web.xml 配置 DispatcherServlet
    • appliactionContext.xml
    • 新建 Controller
  • SpringMVC - 基础
    • 请求参数 - @RequestParam、@RequestBody
    • 请求路径变量 - @PathVariable
    • 利用反射获取参数名
    • 乱码处理 - GET、POST 请求参数乱码
    • 乱码处理 - 响应数据乱码
    • Servlet 的 url 匹配 - 3 种
      • Tomcat 中默认的 Servlet
      • 静态资源被拦截的解决方案 - 2种

Java 从 0 到架构师目录:【Java从0到架构师】学习记录

Gitee 代码:https://gitee.com/szluyu99/mj_java_frame/tree/master/03_SpringMVC


SpringMVC 的正式名称是 Spring Web MVC

  • 属于 Spring 框架的一部分
  • 基于 Servlet API 的 Web 框架

SpringMVC 的核心功能是:拦截和处理客户端的请求

官方参考文档

SpringMVC - 入门

spring-webmvc 依赖于:

  • spring-aop
  • spring-beans
  • spring-context
  • spring-core
  • spring-expression
  • spring-web
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.8.RELEASE</version>
</dependency>

web.xml 配置 DispatcherServlet

<!-- 配置SpringMVC自带的DispatcherServlet -->
<servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 默认会去加载/WEB-INF/${servlet-name}-servlet.xml --><!-- Spring的配置文件位置 --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></init-param><!-- 项目一旦部署到服务器,就会创建Servlet --><load-on-startup>0</load-on-startup>
</servlet><servlet-mapping><servlet-name>springmvc</servlet-name><!-- 拦截JSP以外的所有请求 --><url-pattern>/</url-pattern>
</servlet-mapping>

appliactionContext.xml

<?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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd><context:component-scan base-package="com.mj"/></beans>

新建 Controller

@Controller
public class TestController() {@GetMapping("/test")@ResponseBodypublic String test() {return "Hello World";}
}

当 GET 请求 context_path/test 的时候,就会调用 TestController 的 test 方法

  • 并且将 “Hello World” 输出给客户端

SpringMVC - 基础

请求参数 - @RequestParam、@RequestBody

默认情况下,SpringMVC 会主动传递一些参数给请求方法:

  • WebRequest、HttpServletRequest、HttpServletResponse、HttpSession 等
  • 参考:官方文档

默认情况下,请求参数会传递给同名的方法参数

  • 可以通过 @RequestParam 指定方法参数对应的请求参数名
    require 属性为 false:请求参数是可选的,客户端可以不传
    require 属性为 true:请求参数是必传的,客户端必须传,否则出现 404 错误
  • 可以通过 Model 对象去接收请求参数
    Model 对象的属性名需要和请求参数保持一致

请求参数注解补充:

  • @RequestParam:普通的请求参数
  • @RequestBody:请求体,接收 Content-Type 为 application/json 数据

前端发送了 json 格式的数据,后端接收时必须用 @RequestBody 接收

  • @RequestHeader("header-name"):请求头

请求路径变量 - @PathVariable

如果请求路径中的内容是变化的,可以定义成 {变量名},然后通过 @PathVariable 去获取值

@GetMapping("/user/{id}")
@ResponseBody
public String testId(@PathVariable("id") String id) {return "your id is " + id;
}

利用反射获取参数名

从 JDK8 开始,可以通过 java.lang.reflect.Parameter 类获取参数名

  • 前提:在编译 *.java 的时候保留参数名信息到 *.class

    javac -parameters hello.java
    
  • 可以通过以下指令查看 class 文件的参数名信息
    javap -v hello.class
    

Java 代码获取方法的参数名:

public class TestParam {public void test(String name, int age) {}public static void main(String[] args) throws Exception {Method method = TestParam.class.getMethod("test", String.class, int.class);for(Parameter paramter : method.getParameters()) {System.out.println(parameter.getName());}}
}

SpringMVC 内部通过 ParameterNameDiscoverer 类获取参数名

乱码处理 - GET、POST 请求参数乱码

从 Tomcat8 开始,GET 请求已经没有乱码问题了

Tomcat 8 以前处理乱码的解决方案:

  • 在 TOMCAT_HOME/conf/server.xml 中给 Connector 标签增加属性

    URIEncoding="UTF-8"
    
<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443"URIEncoding="UTF-8"/>

POST 请求乱码问题仍然存在,解决方案:

通过 Filter 拦截请求,调用 request.setCharacterEncoding('UTF-8)

  • SpringMVC 已经内置了这样的 Filter,直接在 web.xml 中配置即可使用
<!-- 解决POST请求参数乱码问题 -->
<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>
</filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

乱码处理 - 响应数据乱码

方法1:设置 @RequestMapping 的 produces 属性

@RequestMapping(value="/coding",produces="text/html; charset=UTF-8"
)
@ResponseBody
public String test() {return "<h1>哈哈哈</h1>";
}

方法2:在 <mvc:annotation-driven> 中添加 <mvc:message-converters>

<mvc:annotation-driven><mvc:message-converters><bean class="org.springframework.http.converter.StringHttpMessageConverter"><property name="defaultCharset" value="UTF-8"/></bean></mvc:message-converters>
</mvc:annotation-driven>

<mvc:annotation-driven> 还有别的作用,可以保证 controller 正常使用,后面有写到

Servlet 的 url 匹配 - 3 种

*.do:不会拦截动态资源(比如 *.jsp)、静态资源(*.html、*.js)

/:会拦截静态资源(比如 *.html、*.js),不会拦截动态资源(比如 *.jsp)

/*:会拦截动态资源(比如 *.jsp)、静态资源(比如 *.html、*.js)

  • 一般用于 Filter 中

Tomcat 中默认的 Servlet

Tomcat 中有两个默认的 Servlet,可以在 TOMCAT_HOME/conf/web.xml 中找到

  1. org.apache.catalina.servlets.DefaultServlet
    url-pattern 是 /,即可以处理静态资源
    2. org.apache.jasper.servlet.JspServlet
    url-pattern 是 *.jsp,作用是拦截 .jsp 文件并将其转成 Servlet(jsp 的本质是 Servlet)

静态资源被拦截的解决方案 - 2种

如果 SpringMVC 的 DispatcherServlet 的 url-pattern 设置为 /,会导致静态资源被拦截

解决方案1:将静态资源交回给 Tomcat 的 DefaultServlet 去处理

<!-- 在applicationContext.xml中配置 -->
<mvc:default-servlet-handler/>

<mvc:default-servlet-handler/> 的原理:

  • 通过 DefaultServletHttpRequestHandler 对象将静态资源转发给 Tomcat 的 DefaultServlet

注:使用了 <mvc:default-servlet-handler/> 后,会导致 controller 无法处理请求

  • 加上 <mvc:annotation-driven/> 即可保证 controller 正常使用
<!-- 在applicationContext.xml中配置 -->
<!-- 保证@Controller能够正常使用 -->
<mvc:annotation-driven/>

解决方案2:由 SpringMVC 框架内部来处理静态资源

  • 框架内部是通过 ResourceHttpRequestHandler 对象来处理
<!-- **代表所有子路径 -->
<!-- mapping是请求路径 -->
<!-- location是静态资源的位置 -->
<mvc:resources mapping="/asset/**" location="/asset/"/>

注:同样需要加上 <mvc:default-servlet-handler/> 来保证 controller 正常使用

<!-- 在applicationContext.xml中配置 -->
<!-- 保证@Controller能够正常使用 -->
<mvc:annotation-driven/>

【Java从0到架构师】SpringMVC - 基础相关推荐

  1. 【Java从0到架构师】SpringBoot - SpringMVC

    SpringBoot - SpringMVC SpringMVC 的配置 文件上传功能 文件下载 - 以附件形式下载 静态资源访问 静态资源访问 - 映射 静态资源访问 - webjars Java ...

  2. 【Java从0到架构师】RocketMQ 基础 - 应用、核心组件、安装

    RocketMQ 消息中间件 基础知识 消息中间件的应用 异步解耦 削峰填谷 消息分发 RocketMQ 核心组件 RocketMQ 安装 源码安装 修改配置参数 启动 管理控制台安装 测试项目 Ja ...

  3. 【Java从0到架构师】Dubbo 基础 - 设置启动时检查、直接提供者、线程模型、负载均衡、集群容错、服务降级

    Dubbo 分布式 RPC 分布式核心基础 分布式概述 RPC Dubbo Dubbo 入门程序 - XML.注解 部署管理控制台 Dubbo Admin 修改绑定的注册 IP 地址 设置启动时检查 ...

  4. 【Java从0到架构师】分布式框架通信核心基础 - 序列化(JDK、Protobuf)、远程过程调用 RMI

    分布式框架通信核心基础 序列化 JDK 的序列化 JDK 序列化的一些细节 Protobuf 序列化 Protobuf 环境搭建与操作 Protobuf 原理分析 实际数据传输 序列化技术选型 远程过 ...

  5. 【Java从0到架构师】Redis 基础 - 数据类型

    Redis 原理与实战 Redis 基础 为什么 Redis 这么快? Redis 安装.启动 Redis 常用配置 Redis 数据类型 通用命令 String - value 可以是字符串.数值. ...

  6. 【Java从0到架构师】Linux 基础知识、常用命令

    Linux 基础知识.常用命令 Linux 基础知识 内核和发行版 常见的 Linux 发行版 Linux 的应用领域 Linux 与 Windows 的区别 Linux 常用命令 *系统目录结构 s ...

  7. 【Java从0到架构师】SpringMVC - 异常处理_拦截器

    异常处理_拦截器 异常处理 简单的异常与页面映射 - SimpleMappingExceptionResolver √自定义异常处理类 - 实现 HandlerExceptionResolver 接口 ...

  8. 【Java从0到架构师】SpringMVC - 特殊的请求参数

    SpringMVC - 特殊的请求参数 集合类型 - Map.List.Set.String[] Multipart 参数 - multipartResolver 文件参数 - MultipartFi ...

  9. 【Java从0到架构师】SpringMVC - 返回值

    SpringMVC - 返回值 controller 中的返回值 无返回值 - 使用原始的 Servlet 的方法 普通文本.HTML - 设置响应头 Content-Type XML - 推荐使用 ...

最新文章

  1. 一招解决迅雷5不更新无法继续使用原创
  2. Privoxy shadowscocks代理
  3. Linux 高可用(HA)集群之Pacemaker详解
  4. 为Qt Designer创建自定义Widgets小部件
  5. java 以太坊 智能合约_web3j教程:java使用web3j开发以太坊智能合约交易
  6. debian8.7.1安装zabbix3.2
  7. Java16-java语法基础——异常
  8. linux中安装,编译时调用,运行时调用,更新共享库
  9. 计算机网络—物理层的传输介质以及物理层设备
  10. 第10章 代理的使用
  11. UT斯达康首家手机网上专卖店落户淘宝网
  12. 解决udhcpc命令无法自动获取并设置网卡IP和系统DNS
  13. Wincc RT Professional第一讲-组态
  14. 大数据可视化分析,主要有哪些大数据可视化工具?
  15. android仿饿了么购物车效果,仿饿了么购物车跳动
  16. [个人小记]U盘文件超过4g怎么办?
  17. aspose转pdf不显示中文_Word转PDF后有空白页是怎么回事?
  18. Linux下CGroup进行CPU内存等资源控制
  19. 模块*.ocx已加载,但对DllRegisterServer的调用失败,错误代码0x8002801c问题解决
  20. win10 dpc_watchdog_violation 蓝屏

热门文章

  1. 想成为有钱人,你要逼自己戒掉这5个坏习惯
  2. 经常有职场上的朋友问我,要怎么去轻资产创业?
  3. Java集合Collection接口中的常用方法演示
  4. linux下文件时间戳
  5. sql server新增列_SQL Server 2016安装中的新增功能?
  6. 利用T-SQL处理SQL Server数据库表中的重复行
  7. 在Azure Data StudioSQL笔记本中使用Python脚本加密密码
  8. 周记 2019.3.25~2019.3.31
  9. 修改MongoDB密码
  10. FileProvider N 7.0 升级 安装APK 选择文件 拍照 临时权限 MD