本篇博客主要记录request相关知识,也是开发当中经常遇到的,感兴趣的跟小编一起学习吧!

目录

  • 一、请求过程
  • 二、获取request的三种方式
    • 2.1、可以封装为静态方法
    • 2.2、controller的方法里面
    • 2.3、直接注入
  • 三、request常用API
    • 3.1、request路径相关
    • 3.2、Header相关
    • 3.3、获取请求体
    • 3.4、获取参数
    • 3.5、中文乱码
    • 3.6、转发
    • 3.7、共享数据
  • 四、response常用API
  • 五、常用工具类
    • 5.1、封装的
    • 5.2、Hutool工具类

一、请求过程

大概的流程:

1、通过请求,然后访问到服务器,像java常用的服务器就是tomcat。

2、服务器收到请求将请求参数、请求内容封装成一个request和response对象,以参数的形式传到我们的java程序。(这个在servlet最底层的接口当中就会看到的,本篇文章不过多说了,后续找时间出一篇sevlet的博客)

3、这时候java程序就有了request和response对象,request当中包含了请求参数、session、请求路径等一些列关于调用接口的相关内容。而response就是我们对于该请求做出的请求响应。响应内容可以是各种参数,或者页面等等,最终封装到response,响应给服务器。

4、服务器将response响应给客户端。

二、获取request的三种方式

2.1、可以封装为静态方法

ServletRequestAttributes servletRequestAttributes =  (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequest request = servletRequestAttributes.getRequest();
HttpServletResponse response = servletRequestAttributes.getResponse();

2.2、controller的方法里面

@GetMapping(value = "")
public String doSomething(HttpServletRequest request,HttpServletResponse response) {//...
}

2.3、直接注入

@Autowired
private HttpServletRequest request;@Autowired
private HttpServletResponse response;

三、request常用API

3.1、request路径相关

// 获取请求方式: GET
String getMethod()// 获取虚拟目录(上下文目录):虚拟路径通过在application配置当中可以配置
// 配置:server.servlet.context-path=/aaa
String getContextPath()// 获取Servlet路径:就是获取的controller当中配置的路径
String getServletPath()/// 获取请求参数: id=3
// http://localhost:8080/aaa/test?id=3
String getQueryString()// 获取请求URI:/servletDemo/demo1
// 上下文路径+controller当中配置的路径
String getRequestURI()// 获取完整请求路径:http://localhost:8080/aaa/test
String getRequestURL()// 获取协议及版本:HTTP/1.1
String getProtocol()// 获取客户机的IP地址:192.168.0.0
String getRemoteAddr()

3.2、Header相关

// 获取请求头数据,通过请求头名称获取值
String getHeader(String name)
// 获取所有请求头信息
Enumeration<String> getHeaderNames()

3.3、获取请求体

// 获取流对象-获取字符输入流,只能操作字符数据
BufferedReader getReader()
// 获取流对象-获取字节输入流,既能操作字节也能操作字符
ServletInputStream getInputStream()

3.4、获取参数

// 获取请求参数通用方式(根据参数名称获取参数值) username=zhangsan
String getParameter(String name)
// 获取请求参数名称获取参数值的数组 hobby=xx&hobby=game
String[] getParameters(String name)
// 获取请求参数名称(与获取请求头方法类似)
Enumeration<String> getParameterNames()
// 获取所有参数的Map集合
Map<String,String> getParameterMap()

3.5、中文乱码

中文乱码问题,Tomcat8 已经将GET 请求方式的乱码问题 解决了,但是POST方式的中文乱码问题 依旧存在,需要自行配置
在获取参数之前配置

request.setCharacterEncoding("UTF-8");

3.6、转发

浏览器像服务器发起一次请求,服务器内部实现转发,相当于执行了两个资源之间的操作。

// 通过request对象获取请求转发服务器:
RequestDispatcher getRequestDispatcher(String path);
// 使用==RequestDispatcher对象来进行转发
forward(ServlertRequest request,ServletResponse response);

3.7、共享数据

域对象:一个有作用范围的对象,可以在范围内共享数据
request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据

// 存储数据
setAttribute(String name,Object obj)
// 通过键来获取值
Object getAttribute(String name);
// 通过键移除键对应的值
removeAttribute(String name)

四、response常用API

//设置状态码
response.setStatus(304);// 设置指定名称响应头的值,下面是导出的时候我们经常要设置的响应头,响应头当中还有文件的名称,也就是通过流下载文件的时候那个文件名称
response.setHeader("Content-Disposition", "attachment;filename=" + zipName);// 1.字符输出流
PrintWriter getWriter()
// 2.字节输出流(一般导出就是将文件写到字节流,然后响应response)
ServletOutputStream getOutputStream()
// 注意:在同一个Servlet,二种输出流不能同时使用,产生互斥// response提供了专门负责重定向的方法
response.sendRedirect("/项目地址/资源地址");// 指定服务器响应中文的编码方式
response.setCharacterEncoding("GBK");// 统一服务器和客户端的编码方式
response.setContentType("text/html;charset=utf-8");
// 导出的时候如果需要直接通过response流导出Excel,需要和前端设置上下文类型,如下:
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

五、常用工具类

5.1、封装的

import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;public class ServletUtils {/*** 获取request*/public static HttpServletRequest getRequest() {return getRequestAttributes().getRequest();}/*** 获取response*/public static HttpServletResponse getResponse() {return getRequestAttributes().getResponse();}/*** 获取session*/public static HttpSession getSession() {return getRequest().getSession();}/*** request和response在ServletRequestAttributes类当中** @return*/public static ServletRequestAttributes getRequestAttributes() {RequestAttributes attributes = RequestContextHolder.getRequestAttributes();return (ServletRequestAttributes) attributes;}/*** 将字符串渲染到客户端(前后端分离很少会用到)** @param response 渲染对象* @param string   待渲染的字符串* @return null*/public static String renderString(HttpServletResponse response, String string) {try {response.setStatus(200);response.setContentType("application/json");response.setCharacterEncoding("utf-8");response.getWriter().print(string);} catch (IOException e) {e.printStackTrace();}return null;}/*** 获取完整的请求路径,包括:域名,端口,上下文访问路径* 上传图片的时候需要:服务器路径+上下文访问路径(所以封装了该方法)** @return 服务地址*/public static String getUrl() {HttpServletRequest request = ServletUtils.getRequest();return getDomain(request);}public static String getDomain(HttpServletRequest request) {StringBuffer url = request.getRequestURL();String contextPath = request.getServletContext().getContextPath();return url.delete(url.length() - request.getRequestURI().length(), url.length()).append(contextPath).toString();}
}

5.2、Hutool工具类

Hutool工具类是目前最常用的工具类,他的官网写的非常好,并且API也非常好,并且全是中文的,这是重点哈哈。

ServletUtil在线API文档:https://apidoc.gitee.com/dromara/hutool/

API当中包含了:

  • cookie相关
  • 获取请求体
  • header相关
  • 获得MultiPart表单内容
  • 获得请求参数、将参数转换为Bean
  • 以及response相关write操作

Spring Boot当中获取request的三种方式相关推荐

  1. SpringBoot静态获取 bean的三种方式,你学会了吗?

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/showchi/article/details/97005720 注意:调用者要被spring管理 ...

  2. 【Spring杂烩】探讨Spring向容器注册Bean的三种方式

    探讨Spring向容器注册Bean的三种方式 重点了解@Import实现的三种子方式 前提概要 Spring向容器注册Bean的三种方式 通过@ComponentScan.@Componet 通过@B ...

  3. android获取自定义属性,android 自定义控件中获取属性的三种方式(转)

    第一种方法,直接设置属性值,通过attrs.getAttributeResourceValue拿到这个属性值. (1)在xml文件中设置属性值 android:layout_width="f ...

  4. java时间戳是什么类型_java 获取时间戳的三种方式

    java 获取时间戳的三种方式 CreationTime--2018年7月13日16点29分 Author:Marydon 1.实现方式 方式一:推荐使用 System.currentTimeMill ...

  5. java获取时间戳的三种方式比较

    文章目录 java获取时间戳的三种方式比较 java获取时间戳的三种方式比较 import java.util.Calendar; import java.util.Date; //不再推荐使用Dat ...

  6. idea yml文件不变成树叶_springboot获取配置文件的三种方式

    hello,大家好,有今天没有写文章了,因为呢,最近,公司有点事情,需要我呢,搭建一个demo,框架呢是springboot+Active实现消息的延时发送和定时发送功能,为了项目以后中使用到,所以呢 ...

  7. Spring学习总结3——配置datasource三种方式

    为什么80%的码农都做不了架构师?>>>    jdbc.properties文件信息 ##Oracle 11g jdbc.driverClassName=oracle.jdbc.O ...

  8. java 时间戳 对比_Java中获取时间戳的三种方式对比实现

    Java中获取时间戳 三种方式对比 最近项目开发过程中发现了项目中获取时间戳的业务.而获取时间戳有以下三种方式,首先先声明推荐使用System类来获取时间戳,下面一起看一看三种方式. 1.System ...

  9. Spring 使用@Import注入Bean的三种方式

    一.准备工作 1.导入spring-context依赖 <dependency><groupId>org.springframework</groupId>< ...

最新文章

  1. 让网管暴寒的网络故障(一笑了之)
  2. 匹兹堡计算机科学公司,2017美国匹兹堡大学计算机科学CS专业硕士录取
  3. 关于fragment backState的原理
  4. C#进阶系列——WebApi 异常处理解决方案
  5. postgresql学习_在PostgreSQL中学习这些快速技巧
  6. C# EntityFramework连接MySQL (DbFirst)
  7. UI设计实用素材|线框套件 WRFRM
  8. asp.net 页面数据导入word模板
  9. PHP连接pda,OTG接口是什么
  10. 更换S60第三版程序图标
  11. latex table 表格中 文字对齐
  12. 鸿蒙开发必备书籍整理【收藏系列】
  13. matlab求条件概率密度_你真的会用程序求多重积分吗?
  14. Hadoop1.0和2.0的主要区别
  15. PHP地图规划骑行路径,高德路径规划,自定义骑行路线(适用3D地图)
  16. Python条件语句(if、pass)
  17. 用js处理图片加载错误时加载默认图片的方法
  18. 怎样将优酷网站下载的视频KUX转MP4格式
  19. Mac 系统 Arduino IDE 找不到开发板端口的解决方法
  20. CTF--PWN必备技能--理解c程序从编译开始到运行结束的过程

热门文章

  1. C++实验一简单的C程序设计(一)
  2. 小伙伴们,线程生命周期、线程池生命周期别再傻傻分不清楚了!!!
  3. 程鑫峰:1.19伦敦金陷多空交织,长江金业后市行情解析
  4. Java SE基础知识详解第[12]期—集合(Set、Collections、Map、集合嵌套)
  5. 代码审计利器-RIPS实践
  6. 单端阻抗为什么是50欧姆-探究
  7. Elasticsearch模块——CRUD
  8. java计算机毕业设计京东仓库管理系统源码+mysql数据库+系统+lw文档+部署
  9. #2991. kiki君的护盾 (shield)
  10. win10打开凭据管理器提示0x800706BA