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);
--     }
-- }
-- 
posted @ 2024-11-12 19:16  Moonbeamsc  阅读(1)  评论(0编辑  收藏  举报
返回顶端