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

一、请求过程

大概的流程:

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操作