【Java从0到架构师】SpringMVC - 基础
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 中找到
- 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 - 基础相关推荐
- 【Java从0到架构师】SpringBoot - SpringMVC
SpringBoot - SpringMVC SpringMVC 的配置 文件上传功能 文件下载 - 以附件形式下载 静态资源访问 静态资源访问 - 映射 静态资源访问 - webjars Java ...
- 【Java从0到架构师】RocketMQ 基础 - 应用、核心组件、安装
RocketMQ 消息中间件 基础知识 消息中间件的应用 异步解耦 削峰填谷 消息分发 RocketMQ 核心组件 RocketMQ 安装 源码安装 修改配置参数 启动 管理控制台安装 测试项目 Ja ...
- 【Java从0到架构师】Dubbo 基础 - 设置启动时检查、直接提供者、线程模型、负载均衡、集群容错、服务降级
Dubbo 分布式 RPC 分布式核心基础 分布式概述 RPC Dubbo Dubbo 入门程序 - XML.注解 部署管理控制台 Dubbo Admin 修改绑定的注册 IP 地址 设置启动时检查 ...
- 【Java从0到架构师】分布式框架通信核心基础 - 序列化(JDK、Protobuf)、远程过程调用 RMI
分布式框架通信核心基础 序列化 JDK 的序列化 JDK 序列化的一些细节 Protobuf 序列化 Protobuf 环境搭建与操作 Protobuf 原理分析 实际数据传输 序列化技术选型 远程过 ...
- 【Java从0到架构师】Redis 基础 - 数据类型
Redis 原理与实战 Redis 基础 为什么 Redis 这么快? Redis 安装.启动 Redis 常用配置 Redis 数据类型 通用命令 String - value 可以是字符串.数值. ...
- 【Java从0到架构师】Linux 基础知识、常用命令
Linux 基础知识.常用命令 Linux 基础知识 内核和发行版 常见的 Linux 发行版 Linux 的应用领域 Linux 与 Windows 的区别 Linux 常用命令 *系统目录结构 s ...
- 【Java从0到架构师】SpringMVC - 异常处理_拦截器
异常处理_拦截器 异常处理 简单的异常与页面映射 - SimpleMappingExceptionResolver √自定义异常处理类 - 实现 HandlerExceptionResolver 接口 ...
- 【Java从0到架构师】SpringMVC - 特殊的请求参数
SpringMVC - 特殊的请求参数 集合类型 - Map.List.Set.String[] Multipart 参数 - multipartResolver 文件参数 - MultipartFi ...
- 【Java从0到架构师】SpringMVC - 返回值
SpringMVC - 返回值 controller 中的返回值 无返回值 - 使用原始的 Servlet 的方法 普通文本.HTML - 设置响应头 Content-Type XML - 推荐使用 ...
最新文章
- 一招解决迅雷5不更新无法继续使用原创
- Privoxy shadowscocks代理
- Linux 高可用(HA)集群之Pacemaker详解
- 为Qt Designer创建自定义Widgets小部件
- java 以太坊 智能合约_web3j教程:java使用web3j开发以太坊智能合约交易
- debian8.7.1安装zabbix3.2
- Java16-java语法基础——异常
- linux中安装,编译时调用,运行时调用,更新共享库
- 计算机网络—物理层的传输介质以及物理层设备
- 第10章 代理的使用
- UT斯达康首家手机网上专卖店落户淘宝网
- 解决udhcpc命令无法自动获取并设置网卡IP和系统DNS
- Wincc RT Professional第一讲-组态
- 大数据可视化分析,主要有哪些大数据可视化工具?
- android仿饿了么购物车效果,仿饿了么购物车跳动
- [个人小记]U盘文件超过4g怎么办?
- aspose转pdf不显示中文_Word转PDF后有空白页是怎么回事?
- Linux下CGroup进行CPU内存等资源控制
- 模块*.ocx已加载,但对DllRegisterServer的调用失败,错误代码0x8002801c问题解决
- win10 dpc_watchdog_violation 蓝屏
热门文章
- 想成为有钱人,你要逼自己戒掉这5个坏习惯
- 经常有职场上的朋友问我,要怎么去轻资产创业?
- Java集合Collection接口中的常用方法演示
- linux下文件时间戳
- sql server新增列_SQL Server 2016安装中的新增功能?
- 利用T-SQL处理SQL Server数据库表中的重复行
- 在Azure Data StudioSQL笔记本中使用Python脚本加密密码
- 周记 2019.3.25~2019.3.31
- 修改MongoDB密码
- FileProvider N 7.0 升级 安装APK 选择文件 拍照 临时权限 MD