文章内容
一、网络请求过程
大概的流程:
- 1、通过请求,然后访问到服务器,像java常用的服务器就是tomcat。
- 2、服务器收到请求将请求参数、请求内容封装成一个request和response对象,以参数的形式传到我们的java程序。(这个在servlet最底层的接口当中就会看到的,本篇文章不过多说了,后续找时间出一篇sevlet的博客)
- 3、这时候java程序就有了request和response对象,request当中包含了请求参数、session、请求路径等一些列关于调用接口的相关内容。而response就是我们对于该请求做出的请求响应。响应内容可以是各种参数,或者页面等等,最终封装到response,响应给服务器。
- 4、服务器将response响应给客户端。
二、获取request的三种方式
1、可以封装为静态方法
1 2 3 | ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes(); HttpServletRequest request = servletRequestAttributes.getRequest(); HttpServletResponse response = servletRequestAttributes.getResponse(); |
2、Controller的方法参数
1 2 3 4 | @GetMapping (value = "" ) public String doSomething(HttpServletRequest request,HttpServletResponse response) { //... } |
3、直接注入
1 2 3 4 5 | @Autowired private HttpServletRequest request; @Autowired private HttpServletResponse response; |
三、Request常用的API
1、Request路径相关
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | // 获取请求方式: GET String getMethod() // 获取虚拟目录(上下文目录):虚拟路径通过在application配置当中可以配置 // 配置:server.servlet.context-path=/aaa String getContextPath() // 获取Servlet路径:就是获取的controller当中配置的路径 String getServletPath() /// 获取请求参数: 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() |
2、Header相关
1 2 3 4 5 | // 获取请求头数据,通过请求头名称获取值 String getHeader(String name) // 获取所有请求头信息 Enumeration<String> getHeaderNames() |
3、获取请求体
1 2 3 4 5 | // 获取流对象-获取字符输入流,只能操作字符数据 BufferedReader getReader() // 获取流对象-获取字节输入流,既能操作字节也能操作字符 ServletInputStream getInputStream() |
4、获取参数
01 02 03 04 05 06 07 08 09 10 11 | // 获取请求参数通用方式(根据参数名称获取参数值) username=zhangsan String getParameter(String name) // 获取请求参数名称获取参数值的数组 hobby=xx&hobby=game String[] getParameters(String name) // 获取请求参数名称(与获取请求头方法类似) Enumeration<String> getParameterNames() // 获取所有参数的Map集合 Map<String,String> getParameterMap() |
5、中文乱码
中文乱码问题,Tomcat8 已经将GET 请求方式的乱码问题 解决了,但是POST方式的中文乱码问题 依旧存在,需要自行配置。在获取参数之前配置:
1 | request.setCharacterEncoding( "UTF-8" ); |
6、转发
浏览器像服务器发起一次请求,服务器内部实现转发,相当于执行了两个资源之间的操作。
1 2 3 4 5 | // 通过request对象获取请求转发服务器: RequestDispatcher getRequestDispatcher(String path); // 使用==RequestDispatcher对象来进行转发 forward(ServlertRequest request,ServletResponse response); |
7、共享数据
- 域对象:一个有作用范围的对象,可以在范围内共享数据
- request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
1 2 3 4 5 6 7 8 | // 存储数据 setAttribute(String name,Object obj) // 通过键来获取值 Object getAttribute(String name) // 通过键移除键对应的值 removeAttribute(String name) |
四、Response常用的API
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | //设置状态码 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" ); |
五、常用工具类
1、封装工具类
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | 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(); } } |
2、Hutool工具类
Hutool工具类是目前最常用的工具类,他的官网写的非常好,并且API也非常好,并且全是中文的。
ServletUtil在线API文档:https://apidoc.gitee.com/dromara/hutool/
API当中包含了:
- cookie相关
- 获取请求体
- header相关
- 获得MultiPart表单内容
- 获得请求参数、将参数转换为Bean
- 以及response相关write操作