HttpServletRequest简介

打印 上一主题 下一主题

主题 1720|帖子 1720|积分 5160

HttpServletRequest是什么?



  • HttpServletRequest是一个接口,其父接口是ServletRequest;
  • HttpServletRequest是Tomcat将请求报文转换封装而来的对象,在Tomcat调用service方法时传入;
  • HttpServletRequest代表客户端发来的请求,请求中的全部信息都可以通过该对象获得;
 
如何使用HttpServletRequest? 

获取请求行信息相干方法:

这些方法用于获取客户端发送请求时的信息,包括 URL、协议、方法、端口等。
API功能表明StringBuffer getRequestURL()获取客户端请求的完整 URL。String getRequestURI()获取客户端请求的项目目录的详细资源。int getServerPort()获取客户端发送请求时使用的服务器端口。int getLocalPort()获取应用步伐所在容器的端口。int getRemotePort()获取客户端步伐所使用的端口。String getScheme()获取请求的协议(如 HTTP、HTTPS)。String getProtocol()获取请求使用的协议及版本号(如 HTTP/1.1)。String getMethod()获取请求的 HTTP 方法(如 GET、POST)。 获取请求头信息相干方法:

这些方法用于处置惩罚请求头信息,包括获取特定请求头或全部请求头的名称。
API功能表明String getHeader(String headerName)根据头名称获取请求头的值。Enumeration getHeaderNames()获取全部的请求头名称。String getContentType()获取 Content-Type 请求头。  
  1. package Servlet;
  2. import jakarta.servlet.ServletException;
  3. import jakarta.servlet.annotation.WebServlet;
  4. import jakarta.servlet.http.HttpServlet;
  5. import jakarta.servlet.http.HttpServletRequest;
  6. import jakarta.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. import java.util.Enumeration;
  9. @WebServlet("/servlet04")
  10. public class servlet4_1 extends HttpServlet {
  11.     @Override
  12.     protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  13.         // 行情求相关 get/post           uri         http/1.1
  14.         System.out.println(req.getMethod()); // 获取请求方式
  15.         System.out.println(req.getScheme()); // 获取请求协议
  16.         System.out.println(req.getProtocol()); //获取请求协议及其版本
  17.         System.out.println(req.getRequestURI());// 获取请求的uri 项目内的资源路径
  18.         System.out.println(req.getRequestURL());// 获取请求的url 项目内的资源的完成的路径
  19.         System.out.println(req.getLocalPort());//本应用容器的端口号8080
  20.         System.out.println(req.getServerPort());        // 客户端发请求时使用的端口号
  21.         System.out.println(req.getRemotePort());// 客户端软件的端口号
  22.         System.out.println("--------------------头请求-------------------------");
  23.         // 根据名字单独获取请求头
  24.         String accept = req.getHeader("Accept");
  25.         System.out.println("Accept :" + accept );
  26.         // 获取本次请求中所有的请求头的名字
  27.         System.out.println("--------------------所有请求头----------------------");
  28.         Enumeration<String> headNames = req.getHeaderNames();
  29.         while(headNames.hasMoreElements()){
  30.             String hname = headNames.nextElement();
  31.             System.out.println(hname +" : " +req.getHeader(hname));
  32.         }
  33.     }
  34. }
复制代码
控制台输出:

 浏览器的报文内容

获取请求参数相干API

在 Servlet 中,获取请求参数是指从客户端发送的 HTTP 请求中提取传递的参数。这些参数通常通过 URL、表单提交 或 查询字符串 发送,常见的获取请求参数的方法有以下几种:
GET 请求中的查询参数: 通过 URL 传递的参数,例如:http://example.com?name=John&age=25。参数 name 和 age 就是 URL 中的查询参数。
POST 请求中的表单数据: 通过 HTML 表单的提交来传递数据。表单数据以键值对的形式提交,服务器可以接收这些参数。
API功能表明String getParameter(String parameterName)根据请求参数名获取请求单个参数值。String[] getParameterValues(String parameterName)根据请求参数名获取请求多个参数值数组。Enumeration getParameterNames()获取全部请求参数名。Map<String, String[]> getParameterMap()获取全部请求参数的键值对聚集。BufferedReader getReader() throws IOException获取读取请求体的字符输入流。(JSON串)ServletInputStream getInputStream() throws IOException获取读取请求体的字节输入流。(读文件)int getContentLength()获取请求体长度的字节数。
  1. package Servlet;
  2. import jakarta.servlet.ServletException;
  3. import jakarta.servlet.annotation.WebServlet;
  4. import jakarta.servlet.http.HttpServlet;
  5. import jakarta.servlet.http.HttpServletRequest;
  6. import jakarta.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. import java.util.Arrays;
  9. import java.util.Enumeration;
  10. import java.util.Map;
  11. import java.util.Set;
  12. @WebServlet ("/servlet05")
  13. public class servlet4_2 extends HttpServlet {
  14.     @Override
  15.     protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  16.         // 获取键值对形式的参数
  17.         // 获取请求中的参数
  18.         String username =  req.getParameter("username");
  19.         System.out.println(username);
  20.         String password =  req.getParameter("usePsw");
  21.         System.out.println(password);
  22.         // 根据参数名获取多个参数值
  23.         String[] hobbies = req.getParameterValues("hobby");
  24.         System.out.println(Arrays.toString(hobbies));
  25.         // 获取所有的参数名
  26.         Enumeration<String> pnames = req.getParameterNames();
  27.         while(pnames.hasMoreElements()){
  28.             String pname = pnames.nextElement();
  29.             String[]  values = req.getParameterValues(pname);
  30.             if(values.length > 1){
  31.                 System.out.println(Arrays.toString(values));
  32.             }else System.out.println(pname + " =  " + values[0]);
  33.         }
  34.         System.out.println("----------------Map--------------------");
  35.         // 返回所有参数的map集合         key = 参数名 value = 参数值
  36.         Map<String,String[]> parameterMap = req.getParameterMap();
  37.         Set<Map.Entry<String,String[]>> entries = parameterMap.entrySet();
  38.         for (Map.Entry<String,String[]> entry : entries){
  39.          String pname =  entry.getKey();
  40.             String[] value = entry.getValue();
  41.             if(value.length > 1){
  42.                 System.out.println(pname +" = " + Arrays.toString(value));
  43.             } else System.out.println(pname + " = " + value[0]);
  44.         }
  45.     }
  46. }
复制代码
.System.out.println(Arrays.toString(hobbies))


  • Arrays.toString(hobbies) 将数组 hobbies 转换为字符串表现形式(如 ["reading", "swimming", "coding"]),方便输出查看。
  • System.out.println 会将转换后的字符串打印到控制台,便于开发者查抄获取到的参数值
HTML代码
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>Title</title>
  6. </head>
  7. <body>
  8. # 可以改成post方法,Java代码同样可以处理
  9. <form action="servlet05" method="get">
  10.     <input type="text" name="username"> <br>
  11.     <input type="password" name="usePsw"> <br>
  12.     爱好:
  13.     <input type="checkbox" name="hobby" value="1"> 篮球
  14.     <input type="checkbox" name="hobby" value="2"> 足球
  15.     <input type="checkbox" name="hobby" value="3"> 排球
  16.     <input type="checkbox" name="hobby" value="4"> 铅球
  17.     <input type="submit" >
  18. </form>
  19. </body>
  20. </html>
复制代码
Get请求和post请求的区别 
数据传递方式


  • GET 请求

    • 数据通过 URL 查询字符串 传递,放在 URL 的末尾。
    • 例如:GET /search?query=java HTTP/1.1,其中 query=java 是查询参数。
    • 查询字符串长度受浏览器和服务器的限定(通常在 2000 个字符左右)。

  • POST 请求

    • 数据通过 请求体(body) 传递,而不是 URL。这使得 POST 请求适合传输较大或复杂的数据。
    • 例如:POST /submit HTTP/1.1,数据放在请求体中(如表单数据或 JSON 数据)。

其他常用API

API功能表明String getServletPath()获取请求的 Servlet 的映射路径。(就是WebServlet ("/servlet05")中的 /servlet05)ServletContext getServletContext()获取 ServletContext 对象,用于与 Servlet 情况交互。Cookie[] getCookies()获取请求中全部的 Cookie。HttpSession getSession()获取 HttpSession 对象,处置惩罚会话信息。void setCharacterEncoding(String encoding)设置请求体字符编码。 HttpServletRequest怎么用? 

1. 设置响应行相干:

API功能表明void setStatus(int code)设置响应状态码

  • setStatus(int code):用于设置 HTTP 响应的状态码,如 200(乐成)、404(未找到)、500(服务器内部错误)等。
2. 设置响应头相干:

API功能表明void setHeader(String headerName, String headerValue)设置或修改响应头键值对。void setContentType(String contentType)设置 Content-Type 响应头以及字符集(设置 MIME 范例)。

  • setHeader(String headerName, String headerValue):用于设置或修改 HTTP 响应头信息。例如,设置 Content-Type、Cache-Control 等。
  • setContentType(String contentType):用于设置 Content-Type 响应头,指定返回内容的范例,如 text/html、application/json 等。
3. 设置响应体相干:

API功能表明PrintWriter getWriter() throws IOException获取响应输出体放入信息的字符输出流(通常用于文本)。ServletOutputStream getOutputStream() throws IOException获取响应输出体放入信息的字节输出流(通常用于二进制数据)。void setContentLength(int length)设置响应体的字节长度,着实质是在设置 Content-Length 响应头。

  • getWriter():用于获取 PrintWriter 对象,可以通过它向客户端发送字符数据(如 HTML、JSON、纯文本等)。
  • getOutputStream():用于获取 ServletOutputStream 对象,通常用于发送二进制数据(如图片、PDF 等)。
  • setContentLength(int length):设置响应体的字节长度,用于告诉客户端响应内容的大小
  1. package Servlet;
  2. import jakarta.servlet.ServletException;
  3. import jakarta.servlet.annotation.WebServlet;
  4. import jakarta.servlet.http.HttpServlet;
  5. import jakarta.servlet.http.HttpServletRequest;
  6. import jakarta.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. import java.io.PrintWriter;
  9. @WebServlet("/servlet06")
  10. public class servlet4_3 extends HttpServlet {
  11.     @Override
  12.     protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  13.         // 设置响应行相关的API
  14. //        resp.setStatus(404); // 故意响应404
  15.         resp.setStatus(200);
  16.         // 设置响应头相关的API
  17. //            resp.setHeader("aaa","valuea");
  18. //        resp.setHeader("Content-Type","text/html");
  19. //        resp.setHeader("Content-Length","1234");
  20.         String info = "<h1>hello<h1>";
  21.         resp.setContentType("text/html");
  22.         resp.setContentLength(info.length());
  23.         // 设置响应体内容的API
  24.         // 获得一个响应体中输入文本字符输出流
  25.         PrintWriter writer = resp.getWriter();
  26.         writer.write(info);
  27.     }
  28. }
复制代码
 
 
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

曂沅仴駦

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表