对于 **HttpServletResponse
, HttpServletRequest
**我们真的学透彻了吗
问题引入
@PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response)
{ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);util.importTemplateExcel(response, "用户数据");
}
在代码中,importTemplate
方法是一个处理POST请求的控制器方法。这个方法用于导出Excel模板。
util.importTemplateExcel(response, "用户数据");
:
在这一行代码中,importTemplateExcel
方法被调用,它接受两个参数:
response
:这是用于设置HTTP响应的对象,该方法可能会将Excel文件写入响应输出流,以便客户端下载。"用户数据"
:这是导出的Excel文件的名称或标题。
实际上,importTemplateExcel
方法的具体实现会通过 response
对象设置一些响应头,如内容类型、文件名等,然后将Excel模板写入响应输出流,以便客户端浏览器可以下载。
客户端发起请求后,服务器会返回一个Excel文件,供用户下载或填写数据。
那么,我们就会产生一个疑惑,response
到底可以干什么,与之对应的request
又可以干什么呢,我们不能只是浅尝辄止,必须一次性刻骨铭心,不然每次都是懵懵懂懂,不求甚解!
文章概述
HttpServletResponse
和 HttpServletRequest
是在Java Web开发中用于处理HTTP请求和响应的两个重要对象。它们分别承担了客户端(浏览器)向服务器发送请求和服务器向客户端发送响应的角色。以下是它们的概括性角色和任务:
-
HttpServletRequest
:- 角色: 代表一个HTTP请求,包含了客户端发送到服务器的所有信息。
- 任务:
- 获取请求参数:通过
getParameter
方法获取请求参数,包括表单参数、查询字符串参数等。 - 获取请求头信息:通过
getHeader
方法获取请求头信息,如User-Agent、Content-Type等。 - 获取请求的HTTP方法:通过
getMethod
方法获取请求的HTTP方法,如GET、POST等。 - 获取Session:通过
getSession
方法获取与请求相关联的HttpSession
对象。 - 获取请求的URL和URI:通过
getRequestURL
和getRequestURI
方法获取请求的URL和URI。 - 获取请求的输入流:通过
getInputStream
方法获取请求的输入流,用于处理POST请求等。 - 获取请求的属性:通过
getAttribute
方法获取请求的属性,用于在请求范围内共享数据。 - 获取远程地址和端口:通过
getRemoteAddr
和getRemotePort
方法获取客户端的IP地址和端口号。
- 获取请求参数:通过
-
HttpServletResponse
:- 角色: 代表一个HTTP响应,包含了服务器发送到客户端的所有信息。
- 任务:
- 设置响应状态码:通过
setStatus
方法设置响应的状态码,表示请求的处理结果。 - 设置响应头信息:通过
setHeader
或addHeader
方法设置响应头信息,如Content-Type、Cache-Control等。 - 设置响应的字符编码:通过
setCharacterEncoding
方法设置响应的字符编码。 - 写入响应内容:通过
getWriter
或getOutputStream
方法获取输出流,用于向响应中写入内容。 - 设置Cookie:通过
addCookie
方法向响应中添加Cookie。 - 重定向:通过
sendRedirect
方法将客户端重定向到另一个URL。 - 返回错误信息:通过
sendError
方法返回错误状态码和信息,用于处理错误情况。 - 启用缓存控制:通过设置
Cache-Control
、Pragma
和Expires
头部来控制缓存。
- 设置响应状态码:通过
这两个对象共同工作,使得在Web应用中能够实现客户端和服务器之间的有效通信。HttpServletRequest
用于读取客户端的请求,而 HttpServletResponse
用于向客户端发送响应。
下面我们将会一一代码演示,进行详细介绍!
HttpServletRequest
详解
HttpServletRequest
对象用于在Servlet中获取客户端(浏览器)发送的请求信息。它提供了许多方法,允许你获取有关请求的各种信息。以下是一些你可以在 HttpServletRequest
上执行的常见操作:
-
获取请求参数:
通过getParameter
方法,你可以获取请求中的参数值。String username = request.getParameter("username");
对于多值参数,你可以使用
getParameterValues
方法。String[] hobbies = request.getParameterValues("hobby");
-
获取请求头信息:
使用getHeader
方法,你可以获取请求头的信息。String userAgent = request.getHeader("User-Agent");
-
获取请求的HTTP方法:
通过getMethod
方法,你可以获取请求的HTTP方法(GET、POST等)。String method = request.getMethod();
-
获取请求的URL和URI:
使用getRequestURL
和getRequestURI
方法,你可以获取请求的URL和URI。StringBuffer url = request.getRequestURL(); String uri = request.getRequestURI();
-
获取Session:
使用getSession
方法,你可以获取与当前请求相关联的HttpSession
对象。HttpSession session = request.getSession();
-
获取请求的字符编码:
通过getCharacterEncoding
方法,你可以获取请求的字符编码。String encoding = request.getCharacterEncoding();
-
获取请求的参数映射:
使用getParameterMap
方法,你可以获取所有请求参数的映射。Map<String, String[]> parameterMap = request.getParameterMap();
-
获取请求的输入流:
如果请求体是输入流形式(例如,对于POST请求),你可以通过getInputStream
方法获取输入流。InputStream inputStream = request.getInputStream();
-
获取请求的属性:
使用getAttribute
方法,你可以获取请求的属性。Object attributeValue = request.getAttribute("attributeName");
-
获取请求的远程地址和端口:
通过getRemoteAddr
和getRemotePort
方法,你可以获取客户端的IP地址和端口号。String remoteAddr = request.getRemoteAddr(); int remotePort = request.getRemotePort();
这只是一些 HttpServletRequest
类的基本用法,实际上你可以根据需求进行更复杂的操作。
-
文件上传:
如果你的请求包含文件上传,你可以使用getPart
方法来获取文件上传的部分。Part filePart = request.getPart("file"); InputStream fileContent = filePart.getInputStream();
-
处理Session:
使用HttpSession
,你可以在请求之间共享数据。这对于在用户会话中保留状态信息非常有用。HttpSession session = request.getSession(); session.setAttribute("user", "john_doe");
-
处理Cookie:
通过getCookies
方法,你可以获取请求中的所有Cookie。Cookie[] cookies = request.getCookies();
-
获取请求路径参数:
对于RESTful风格的请求,你可以使用@PathVariable
注解或getPathInfo
方法获取路径参数。// 使用 @PathVariable 注解 @GetMapping("/user/{userId}") public String getUserById(@PathVariable String userId) {// 处理请求 }// 使用 getPathInfo 方法 String pathInfo = request.getPathInfo();
-
处理请求转发和包含:
通过getRequestDispatcher
方法,你可以进行请求转发或包含,将请求传递给其他资源。RequestDispatcher dispatcher = request.getRequestDispatcher("/anotherServlet"); dispatcher.forward(request, response);
或者使用
include
方法:dispatcher.include(request, response);
-
处理异步请求:
如果应用支持异步处理,你可以通过startAsync
方法启动异步请求。AsyncContext asyncContext = request.startAsync();
-
获取请求的协议、主机名等信息:
通过getProtocol
、getScheme
、getServerName
等方法,你可以获取请求的协议、方案和服务器名等信息。String protocol = request.getProtocol(); String scheme = request.getScheme(); String serverName = request.getServerName();
HttpServletResponse
详解
HttpServletResponse
对象是在Servlet中用于与客户端(浏览器)通信的类,它提供了一系列方法,允许你设置响应的头部信息、内容类型、状态码等。以下是一些你可以在 HttpServletResponse
上执行的常见操作:
-
设置响应的内容类型(Content Type):
你可以通过setContentType
方法设置响应的内容类型,告诉浏览器如何解释响应内容。response.setContentType("text/html");
-
设置响应的字符编码(Character Encoding):
通过setCharacterEncoding
方法,你可以设置响应的字符编码,确保文本内容能够正确显示。response.setCharacterEncoding("UTF-8");
-
设置响应头部信息:
使用addHeader
或setHeader
方法,你可以设置响应头的信息。response.setHeader("Cache-Control", "no-store");
-
重定向:
通过sendRedirect
方法,你可以将客户端重定向到另一个URL。response.sendRedirect("/new-location");
-
设置状态码:
你可以使用setStatus
方法设置响应的状态码。response.setStatus(HttpServletResponse.SC_OK);
-
写入响应内容:
使用getWriter
方法获取输出流,然后可以使用print
或write
方法写入响应内容。PrintWriter writer = response.getWriter(); writer.print("Hello, world!");
-
设置Cookie:
通过addCookie
方法,你可以向客户端添加Cookie。Cookie cookie = new Cookie("username", "john_doe"); response.addCookie(cookie);
-
设置缓存控制:
通过设置响应头Cache-Control
控制缓存。response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); response.setHeader("Pragma", "no-cache"); response.setDateHeader("Expires", 0);
以下是一些更高级的用例和相关的代码示例:
-
返回JSON数据:
如果你的应用程序提供RESTful服务,你可能需要返回JSON格式的数据。你可以使用response.getWriter()
来写入JSON字符串。response.setContentType("application/json"); PrintWriter writer = response.getWriter(); writer.print("{ \"message\": \"Hello, world!\" }");
或者使用框架提供的JSON序列化工具:
ObjectMapper objectMapper = new ObjectMapper(); String json = objectMapper.writeValueAsString(myObject); response.setContentType("application/json"); response.getWriter().write(json);
-
设置跨域资源共享(CORS):
如果你的应用提供API,并且可能被跨域请求访问,你可以设置CORS头部以允许跨域访问。response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE"); response.setHeader("Access-Control-Allow-Headers", "Content-Type");
-
处理文件下载:
如果你的应用需要提供文件下载功能,你可以设置响应头部并使用OutputStream
写入文件内容。response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment; filename=\"example.txt\""); OutputStream outputStream = response.getOutputStream(); // 写入文件内容
-
压缩响应内容:
通过设置响应头部,你可以指示浏览器接受压缩的响应内容。response.setHeader("Content-Encoding", "gzip"); // 将内容写入 GZIPOutputStream
-
处理错误页面:
通过设置错误码和错误页面,你可以自定义错误页面,提供更友好的错误信息。response.sendError(HttpServletResponse.SC_NOT_FOUND, "Resource not found");
或者使用错误页面配置:
<error-page><error-code>404</error-code><location>/error404.jsp</location> </error-page>
-
使用缓冲区:
通过设置缓冲区,你可以提高响应效率。response.setBufferSize(1024);
送给自己和各位的一段话
人一生中会有一次最奇妙的邂逅,然后一生都会留恋地想着它。
努力向前,满怀期待吧,各位晚安!