2024/11/12日 日志 关于Servlet ---- Request(请求)& Response(响应) 的补充
Request(请求)& Response(响应)
-- ·Request:获取请求数据
-- ·Response:设置响应数据
Request
点击查看代码
-- Request 继承体系
-- ServletRequest Java提供的请求对象根接口
-- HttpServletRequest Java提供的对Http协议封装的请求对象接口
-- RequestFacade Tomcat 定义的实现类
--
-- 1.Tomcat需要解析请求数据,封装为request对象并且创建request对象传递到service方法中
-- 2.使用request对象,查阅JavaEE API文档的HttpServletRequest接口
--
-- Request 获取请求数据
-- 请求数据分为3部分:
-- 1.请求行:GET/request-demo/req1?username=zhangsan HTTP/1.1
-- String getMethod():获取请求方式: GET
-- String getContextPath():获取虚拟目录(项目访问路径):/request-demo
-- StringBuffer getRequestURL(): 获取URL(统一资源定位符):http://localhost:8080/request-demo/request-demo/req1
-- getRequestURl():获取URI(统一资源标识符):/request-demo/reg1
-- String getQueryString():获取请求参数(GET方式):username=zhangsan&password=123
--
-- 2.请求头:
-- User-Agent:Mozilla/5.0 Chrome/91.0.4472.106
-- String getHeader(String name):根据请求头名称,获取值
--
-- 3.请求体:
-- username=superbaby&pasword=123
-- ServletInputStream getlnputStream():获取字节输入流
-- BufferedReader qetReader():获取字符输入流
--
-- package com.itheima.web.request;
--
-- import javax.servlet.ServletException;
-- import javax.servlet.annotation.WebServlet;
-- import javax.servlet.http.HttpServlet;
-- import javax.servlet.http.HttpServletRequest;
-- import javax.servlet.http.HttpServletResponse;
-- import java.io.BufferedReader;
-- import java.io.IOException;
--
-- /**
-- * request 获取请求数据
-- */
-- @WebServlet("/req1")
-- public class RequestDemo1 extends HttpServlet {
-- @Override
-- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-- // String getMethod():获取请求方式: GET
-- String method = req.getMethod();
-- System.out.println(method);//GET
-- // String getContextPath():获取虚拟目录(项目访问路径):/request-demo
-- String contextPath = req.getContextPath();
-- System.out.println(contextPath);
-- // StringBuffer getRequestURL(): 获取URL(统一资源定位符):http://localhost:8080/request-demo/req1
-- StringBuffer url = req.getRequestURL();
-- System.out.println(url.toString());
-- // String getRequestURI():获取URI(统一资源标识符): /request-demo/req1
-- String uri = req.getRequestURI();
-- System.out.println(uri);
-- // String getQueryString():获取请求参数(GET方式): username=zhangsan
-- String queryString = req.getQueryString();
-- System.out.println(queryString);
--
--
-- //------------
-- // 获取请求头:user-agent: 浏览器的版本信息
-- String agent = req.getHeader("user-agent");
-- System.out.println(agent);
-- }
--
-- @Override
-- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-- //获取post 请求体:请求参数
--
-- //1. 获取字符输入流
-- BufferedReader br = req.getReader();
-- //2. 读取数据
-- String line = br.readLine();
-- System.out.println(line);
--
--
-- }
-- }
--
-- Request 通用方式获取请求参数
-- 请求参数获取方式
-- GET 方式
-- String getQueryString()
-- POST 方式
-- BufferedReader getReader()
--
-- Map<String, String[ ]> getParameterMap():获取所有参数Map集合
-- String[]getParameterValues(String name):根据名称获取参数值(数组)
-- String getParameter(String name):根据名称获取参数值(单个值)
--
-- package com.itheima.web.request;
-- import javax.servlet.*;
-- import javax.servlet.http.*;
-- import javax.servlet.annotation.*;
-- import java.io.IOException;
-- import java.util.Map;
--
-- /**
-- * request 通用方式获取请求参数
-- */
-- @WebServlet("/req2")
-- public class RequestDemo2 extends HttpServlet {
-- @Override
-- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-- //GET请求逻辑
-- //System.out.println("get....");
--
-- //1. 获取所有参数的Map集合
-- Map<String, String[]> map = req.getParameterMap();
-- for (String key : map.keySet()) {
-- // username:zhangsan lisi
-- System.out.print(key+":");
--
-- //获取值
-- String[] values = map.get(key);
-- for (String value : values) {
-- System.out.print(value + " ");
-- }
--
-- System.out.println();
-- }
--
-- System.out.println("------------");
--
-- //2. 根据key获取参数值,数组
-- String[] hobbies = req.getParameterValues("hobby");
-- for (String hobby : hobbies) {
--
-- System.out.println(hobby);
-- }
--
-- //3. 根据key 获取单个参数值
-- String username = req.getParameter("username");
-- String password = req.getParameter("password");
--
-- System.out.println(username);
-- System.out.println(password);
-- }
--
-- @Override
-- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-- //POST请求逻辑
--
-- this.doGet(req,resp);
--
-- /*System.out.println("post....");
--
-- //1. 获取所有参数的Map集合
-- Map<String, String[]> map = req.getParameterMap();
-- for (String key : map.keySet()) {
-- // username:zhangsan lisi
-- System.out.print(key+":");
--
-- //获取值
-- String[] values = map.get(key);
-- for (String value : values) {
-- System.out.print(value + " ");
-- }
--
-- System.out.println();
-- }
--
-- System.out.println("------------");
--
-- //2. 根据key获取参数值,数组
-- String[] hobbies = req.getParameterValues("hobby");
-- for (String hobby : hobbies) {
--
-- System.out.println(hobby);
-- }
--
-- //3. 根据key 获取单个参数值
-- String username = req.getParameter("username");
-- String password = req.getParameter("password");
--
-- System.out.println(username);
-- System.out.println(password);*/
--
--
-- }
-- }
--
-- 中文乱码问题解决方案
--
-- 请求参数如果存在中文数据,则会乱码
-- 解决方案:
-- POST:设置输入流的编码
-- req.setCharacterEncoding(“UTF-8"):
-- 通用方式(GET/POST):先编码,再解码
-- new String(username.getBytes("lSO-8859-1"),"UTF-8");
--
-- URL编码
-- 1.将字符串按照编码方式转为二进制
-- 2.每个字节转为2个16进制数并在前边加上%
--
--
-- package com.itheima.web.request;
--
-- import javax.servlet.*;
-- import javax.servlet.http.*;
-- import javax.servlet.annotation.*;
-- import java.io.IOException;
-- import java.nio.charset.StandardCharsets;
--
-- /**
-- * 中文乱码问题解决方案
-- */
-- @WebServlet("/req4")
-- public class RequestDemo4 extends HttpServlet {
-- @Override
-- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-- //1. 解决乱码:POST,getReader()
-- //request.setCharacterEncoding("UTF-8");//设置字符输入流的编码
--
-- //2. 获取username
-- String username = request.getParameter("username");
-- System.out.println("解决乱码前:"+username);
--
-- //3. GET,获取参数的方式:getQueryString
-- // 乱码原因:tomcat进行URL解码,默认的字符集ISO-8859-1
-- /* //3.1 先对乱码数据进行编码:转为字节数组
-- byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
-- //3.2 字节数组解码
-- username = new String(bytes, StandardCharsets.UTF_8);*/
--
-- username = new String(username.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8);
--
-- System.out.println("解决乱码后:"+username);
--
-- }
--
-- @Override
-- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-- this.doGet(request, response);
-- }
-- }
--
-- 关于GET原因---新版Tomcat无需
--
-- package com.itheima.web.request;
--
-- import java.io.UnsupportedEncodingException;
-- import java.net.URLDecoder;
-- import java.net.URLEncoder;
--
-- public class URLDemo {
--
-- public static void main(String[] args) throws UnsupportedEncodingException {
-- String username = "张三";
--
-- //1. URL编码
-- String encode = URLEncoder.encode(username, "utf-8");
-- System.out.println(encode);
--
-- //2. URL解码
-- //String decode = URLDecoder.decode(encode, "utf-8");
-- String decode = URLDecoder.decode(encode, "ISO-8859-1");
--
-- System.out.println(decode);
--
-- //3. 转换为字节数据,编码
-- byte[] bytes = decode.getBytes("ISO-8859-1");
-- /* for (byte b : bytes) {
-- System.out.print(b + " ");
-- }*/
--
-- //4. 将字节数组转为字符串,解码
-- String s = new String(bytes, "utf-8");
--
-- System.out.println(s);
--
--
-- }
-- }
--
--
-- 请求转发
-- ·请求转发(forward):一种在服务器内部的资源跳转方式
-- ·实现方式:
-- req.getRequestDispatcher("资源B路径").forward(req,isp);
-- ·请求转发资源间共享数据:使用Request对象
-- void setAttribute(String name,Object o):存储数据到 request域中
-- Object getAttribute(String name):根据 key,获取值
-- void removeAttribute(String name):根据 key,删除该键值对
-- ·请求转发特点:
-- 浏览器地址栏路径不发生变化
-- 只能转发到当前服务器的内部资源
-- 一次请求,可以在转发的资源间使用request共享数据
--
-- package com.itheima.web.request;
--
-- import javax.servlet.ServletException;
-- import javax.servlet.annotation.WebServlet;
-- import javax.servlet.http.HttpServlet;
-- import javax.servlet.http.HttpServletRequest;
-- import javax.servlet.http.HttpServletResponse;
-- import java.io.IOException;
-- import java.nio.charset.StandardCharsets;
--
-- /**
-- * 请求转发
-- */
-- @WebServlet("/req5")
-- public class RequestDemo5 extends HttpServlet {
-- @Override
-- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-- System.out.println("demo5...");
-- System.out.println(request);
-- //存储数据
-- request.setAttribute("msg","hello");
--
-- //请求转发
-- request.getRequestDispatcher("/req6").forward(request,response);
--
-- }
--
-- @Override
-- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-- this.doGet(request, response);
-- }
-- }
--
-- package com.itheima.web.request;
-- import javax.servlet.ServletException;
-- import javax.servlet.annotation.WebServlet;
-- import javax.servlet.http.HttpServlet;
-- import javax.servlet.http.HttpServletRequest;
-- import javax.servlet.http.HttpServletResponse;
-- import java.io.IOException;
--
-- /**
-- * 请求转发
-- */
-- @WebServlet("/req6")
-- public class RequestDemo6 extends HttpServlet {
-- @Override
-- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-- System.out.println("demo6...");
-- System.out.println(request);
-- //获取数据
-- Object msg = request.getAttribute("msg");
-- System.out.println(msg);
--
-- }
--
-- @Override
-- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-- this.doGet(request, response);
-- }
-- }
--
Response
点击查看代码
-- Response:使用 response对象来设置响应数据
--
-- ServletResponse Java提供的请求对象根接口
-- HttpServletResponse Java提供的对Http协议封装的请求对象
-- ResponseFacade Tomcat 定义的实现类
--
-- Response 设置响应数据功能介绍
-- 响应数据分为3部分:
-- 1. 响应行: HTTP/1.1 200 OK
-- · void setStatus(int sc):设置响应状态码
-- 2. 响应头: Content-Type: text/html
-- · void setHeader(String name, String value):设置响应头键值对
-- 3. 响应体: <html><head>head><body></body></html>
-- · PrintWriter getWriter0):获取字符输出流
-- · ServletOutputStream getOutputStream():获取字节输出流
--
-- Response 完成重定向
-- · 重定向(Redirect):一种资源跳转方式
-- · 实现方式:
-- resp.setStatus(302);
-- resp.setHeader“location”,“资源B的路径");
-- resp.sendRedirect("资源B的路径");
-- 重定向特点:
-- 浏览器地址栏路径发生变化
-- 可以重定向到任意位置的资源(服务器内部、外部均可)
-- 两次请求,不能在多个资源使用request共享数据
--
-- 路径问题
-- 明确路径谁使用?
-- 浏览器使用:需要加虚拟目录(项目访问路径)
-- 服务端使用:不需要加虚拟目录
-- 练习:
-- <a href='路径'加虚拟目录
-- <form action='路径’> 加虚拟目录
-- req.getRequestDispatcher(“路径”)不加虚拟目录
-- resp.sendRedirect(“路径”)加虚拟目录
--
-- package com.itheima.web.response;
-- import javax.servlet.*;
-- import javax.servlet.http.*;
-- import javax.servlet.annotation.*;
-- import java.io.IOException;
--
-- @WebServlet("/resp1")
-- public class ResponseDemo1 extends HttpServlet {
-- @Override
-- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-- System.out.println("resp1....");
--
-- //重定向
-- /*//1.设置响应状态码 302
-- response.setStatus(302);
-- //2. 设置响应头 Location
-- response.setHeader("Location","/request-demo/resp2");*/
--
-- //简化方式完成重定向
-- //动态获取虚拟目录
-- String contextPath = request.getContextPath();
--
-- response.sendRedirect(contextPath+"/resp2");
-- //response.sendRedirect("https://www.itcast.cn");
-- }
--
-- @Override
-- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-- this.doGet(request, response);
-- }
-- }
--
-- Response 响应字符数据
-- 使用:
-- 1. 通过Response对象获取字符输出流 PrintWriter writer = resp.getriter();
-- 2. 写数据 writer.write("aaa");
--
-- ·注意:
-- · 该流不需要关闭,随着响应结束,response对象销毁,由服务器关闭
-- · 中文数据乱码:原因通过Response获取的字符输出流默认编码:ISO-8859-1
-- resp.setContentType("text/html;charset=utf-8");
--
-- 例:
-- package com.itheima.web.response;
-- import javax.servlet.ServletException;
-- import javax.servlet.annotation.WebServlet;
-- import javax.servlet.http.HttpServlet;
-- import javax.servlet.http.HttpServletRequest;
-- import javax.servlet.http.HttpServletResponse;
-- import java.io.IOException;
-- import java.io.PrintWriter;
--
-- /**
-- * 响应字符数据:设置字符数据的响应体
-- */
-- @WebServlet("/resp3")
-- public class ResponseDemo3 extends HttpServlet {
-- @Override
-- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-- response.setContentType("text/html;charset=utf-8");
-- //1. 获取字符输出流
-- PrintWriter writer = response.getWriter();
-- //content-type
-- //response.setHeader("content-type","text/html");
--
-- writer.write("你好");
-- writer.write("<h1>aaa</h1>");
-- //细节:流不需要关闭
--
-- }
--
-- @Override
-- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-- this.doGet(request, response);
-- }
-- }
--
-- Response 响应字节数据
-- · 使用:
-- 1.通过Response对象获取字符输出流
-- ServletOutputStream outputStream= resp.getOutputStream();
-- 2.写数据
-- outputStream.write(字节数据);
-- · IOUtils工具类使用
-- 1.导入坐标
-- <dependency>
-- <groupld>commons-io</groupld>
-- <artifactld>commons-io</artifactld>
-- <version>2.6</version>
-- </dependency>
-- 2.使用
-- lOUtils.copy(输入流,输出流);
--
-- package com.itheima.web.response;
-- import org.apache.commons.io.IOUtils;
--
-- import javax.servlet.ServletException;
-- import javax.servlet.ServletOutputStream;
-- import javax.servlet.annotation.WebServlet;
-- import javax.servlet.http.HttpServlet;
-- import javax.servlet.http.HttpServletRequest;
-- import javax.servlet.http.HttpServletResponse;
-- import java.io.FileInputStream;
-- import java.io.IOException;
-- import java.io.PrintWriter;
--
-- /**
-- * 响应字节数据:设置字节数据的响应体
-- */
-- @WebServlet("/resp4")
-- public class ResponseDemo4 extends HttpServlet {
-- @Override
-- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
--
-- //1. 读取文件
-- FileInputStream fis = new FileInputStream("d://a.jpg");
--
-- //2. 获取response字节输出流
-- ServletOutputStream os = response.getOutputStream();
--
-- //3. 完成流的copy
-- /* byte[] buff = new byte[1024];
-- int len = 0;
-- while ((len = fis.read(buff))!= -1){
-- os.write(buff,0,len);
-- }*/
--
-- IOUtils.copy(fis,os);
--
-- fis.close();
--
-- }
--
-- @Override
-- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-- this.doGet(request, response);
-- }
-- }
--