JavaWeb基础专项复习5——请求对象和响应对象request and response

系列文章目录

1、JavaWeb基础专项复习1------XML文件-CSDN博客

2、JavaWeb基础专项复习2------JSP文件-CSDN博客

3、JavaWeb基础专项复习2------Servlet相关知识-CSDN博客

4、JavaWeb基础专项复习4------会话对象Session and Cookie-CSDN博客


文章目录

  • 系列文章目录
  • 文章目录
  • [1、Tomcat 请求响应机制](#1、Tomcat 请求响应机制)
  • [2、HttpServletRequest 功能](#2、HttpServletRequest 功能)
  • [2.1 获取请求头数据](#2.1 获取请求头数据)
  • [2.2 获取请求相关其他方法](#2.2 获取请求相关其他方法)
  • 3、HttpServletRequest获取参数
  • [3.1 传递参数方式](#3.1 传递参数方式)
  • [3.2 获取参数方法](#3.2 获取参数方法)
  • [3.3 中文乱码处理](#3.3 中文乱码处理)
  • [3.3.1 POST 请求:](#3.3.1 POST 请求:)
  • [3.3.2 GET 请求:](#3.3.2 GET 请求:)
  • [3.6 HttpServletRequest请求转发](#3.6 HttpServletRequest请求转发)
  • [3.7 request 作用域](#3.7 request 作用域)
  • [4、HttpServletResponse 功能](#4、HttpServletResponse 功能)
  • [4.1 功能介绍](#4.1 功能介绍)
  • [4.2 设置状态码和其他方法](#4.2 设置状态码和其他方法)
  • [4.3 设置响应头信息](#4.3 设置响应头信息)
  • [4.4 中文乱码问题](#4.4 中文乱码问题)
  • [4.5 重定向](#4.5 重定向)

1、Tomcat 请求响应机制

Web 服务器接收到客户端的 HTTP 请求后,会为每次请求创建requestresponse对象,分别用于获取客户端数据和向客户端输出数据。

2、HttpServletRequest 功能

HttpServletRequest在JavaWeb中非常重要的一个类。它是Servlet的service()方法的参数之一。所以必须要掌握它

request的功能可以分为以下几种:

  • 封装了请求头数据;
  • 封装了请求正文数据,如果是GET请求,那么就没有正文;
  • request是一个域对象,可以把它当成Map来添加获取数据;
  • 做请求的转发(一次请求一次数据)·(重定向(两次请求,两次数据))

2.1 获取请求头数据

通过request.getHeader("请求头名称")获取指定请求头数据

request.getHeaderNames()可获取所有请求头名称。

java 复制代码
response.setContentType("text/html;charset=utf-8");
Enumeration names = request.getHeaderNames();
while(names.hasMoreElements()) {
    String name = (String)names.nextElement();
    String value = request.getHeader(name);
    System.out.println(name + ": " + value);
    response.getWriter().println(name + ": " + value + "<br/>");
}

2.2 获取请求相关其他方法

涵盖获取请求正文字节数、请求类型、请求方法、客户端 IP 地址等众多方法,还能操作请求 URL 各部分信息。

  • int getContentLength():获取请求正文的字节数,GET请求没有正文,没有正文返回-1;
  • String getContentType() **:**获取请求类型,如果请求是GET,那么这个方法返回null;如果是POST请求,那么默认为application/x-www-form-urlencoded(理解为字符串类型),其它类型以后再学;
  • String getMethod():返回请求方法,例如:GET post delete put
  • Locale getLocale():返回当前客户端浏览器支持的Locale。java.util.Locale表示国家和言语,这个东西在国际化中很有用;
  • String getCharacterEncoding() **:**获取请求编码,如果没有setCharacterEncoding(),那么返回null。表示使用ISO-8859-1编码;GBK UTF-8
  • void setCharacterEncoding(String code):设置请求编码,只对正文有效!注意,对于GET而言,没有正文!!!所以此方法只能对POST请求中的参数有效!
  • http://localhost:8080/hello/oneServlet?name=zhangSan
  • String getContextPath() **:**返回上下文路径,例如:/项目名称
  • String getQueryString():返回请求URL中的参数,例如:name=zhangSan
  • String getRequestURI():返回请求URI路径,例如:/hello/oneServlet
  • StringBuffer getRequestURL():返回请求URL路径,例如:http://localhost/hello/oneServlet,即返回除了参数以外的路径信息;
  • String getServletPath():返回Servlet路径,例如:/oneServlet
  • String getRemoteAddr():返回当前客户端的IP地址;
  • String getRemoteHost():返回当前客户端的主机名,但这个方法的实现还是获取IP地址;
  • int getRemotePort():返回客户端的端口号,每次请求都会变;
  • String getSchema():返回请求协议,例如:http;
  • String getServerName():返回主机名,例如:localhost
  • int getServerPort():返回服务器端口号,例如:80

3、 HttpServletRequest获取参数

3.1 传递参数方式

GET 和 POST,GET 可在地址栏、超链接、表单中传递参数;POST 主要在表单中传递。

GET:

<a href=" http://localhost/param/ParamServlet?p1=v1&p2=v2">点一下</a>

  • 表单中给出参数:<form method="GET" action="ParamServlet">...</form>
  • Ajax

POST:

  • 表单中给出参数:<form method="POST" action="ParamServlet">...</form>
  • Ajax

3.2 获取参数方法

  • String getParameter(String name)获取单值参数;
  • String[] getParameterValues(String name)获取多值参数(如复选框);
  • Enumeration getParameterNames()获取所有参数名;
  • Map getParameterMap()获取所有参数的 Map 集合。

单值参数接收示例

前台接收

html 复制代码
<form action="ParamServlet" method="post">
    <input type="text" name="p1"/><br/>
    <input type="text" name="p2"/><br/>
    <input type="submit" value="提交"/><br/>
</form>
<a href="ParamServlet?p1=v1&p2=v2">Param</a>

后台接收

java 复制代码
String s1 = request.getParameter("p1");
String s2 = request.getParameter("p2");
response.getWriter().print("p1 = " + s1 + "<br/>");
response.getWriter().print("p2 = " + s2 + "<br/>");
Enumeration names = request.getParameterNames();
while(names.hasMoreElements()) {
    String name = (String)names.nextElement();
    String value = request.getParameter(name);
    System.out.println(name + " = " + value);
}

Map<String, String[]> map = request.getParameterMap();
Set<String> keySet = map.keySet();
for(String key : keySet){
    String[] vals = map.get(key);
    System.out.print(key+" :");
    System.out.println(key+" :" + Arrays.toString(vals));
    System.out.println();
}

多值参数接收

多值参数主要就是多选checkbox

例如在注册表单中,如果让用户填写爱好,那么爱好可能就是多个。那么hobby参数就会对应多个值:

前台接收

html 复制代码
<form action="ParamServlet" method="post">
    上网:<input type="checkbox" name="hobby" value="netplay" /><br/>
    踢球:<input type="checkbox" name="hobby" value="football" /><br/>
    看书:<input type="checkbox" name="hobby" value="read" /><br/>
    编程:<input type="checkbox" name="hobby" value="programme" /><br/>
    <input type="submit" value="提交"/><br/>
</form>

后台接收

java 复制代码
String[] hobbies = request.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbies));

Map<String, String[]> map = request.getParameterMap();
Set<String> keySet = map.keySet();
for(String key : keySet){
    String[] vals = map.get(key);
    System.out.println(key+" :" + Arrays.toString(vals));
}

3.3 中文乱码处理

3.3.1 POST 请求

我们知道,请求信息中,只有POST存在正文,所谓POST参数编码就是就是请求正文的编码。默认情况下,使用getParameter()获取POST请求参数时,使用的是ISO-8859-1编码。

方法一,针对字符串本身进行手动转码

java 复制代码
String name = request.getParameter("name");
name = new String(name.getBytes("ISO-8859-1"),"UTF-8");
System.out.println("name:"+name);

方法二,在获取参数前使用**request.setCharacterEncoding("UTF-8")**设置编码。

java 复制代码
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
System.out.println("name:"+name);

对于每个请求,只需要调用request的setCharacterEncodng()一次,然后所有getParameter()都会使用这个编码来解读参数。但要注意,只对请求正文有效,即POST参数。

该方法 必须放在获取参数值之前

3.3.2 GET 请求

方法一,对字符串单独解码

java 复制代码
String name = request.getParameter("name");
name = new String(name.getBytes("ISO-8859-1"),"UTF-8");
System.out.println("name:"+name);

方法二,在 Tomcat 的server.xml中配置URIEncoding="UTF-8",但 Tomcat8.5 及以上版本无需设置即可支持 URL 传递中文。(不建议使用get请求传递中文参数

java 复制代码
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8"/>

3.6 HttpServletRequest请求转发

用于在 Servlet 中执行后台业务逻辑后跳转页面,地址栏不变,可跳转到静态页面或 Servlet,还能在请求域内设置和获取属性值。

java 复制代码
request.getRequestDispatcher("/success.html").forward(request, response);

此时我们可以给request来设置当前域中的属性值,在该域之内(当前请求完成之前)都能获得到该属性值。

java 复制代码
request.setAttribute("name", "txjava");
request.getAttribute("name");

3.7 request 作用域

范围是一次请求响应内,每个线程请求会新生成HttpServletRequestHttpServletResponse对象。

ServletContext

ServletContext 代表整个 Web 应用程序的上下文,在服务器启动时为每个 Web 应用创建一个 ServletContext 对象,所有 Servlet 共享这个对象。它主要用于在整个 Web 应用的不同部分之间共享数据、获取 Web 应用的全局信息等。

HttpSession

HttpSession 用于在服务器端跟踪客户端的会话状态。每个客户端访问服务器时,服务器会为其创建一个唯一的 HttpSession 对象,通过会话 ID 来识别不同的客户端。它可以在用户的多次请求之间保持数据,适用于存储用户的登录信息、购物车内容等。

HttpServletRequest

HttpServletRequest 代表客户端的请求,当客户端向服务器发送请求时,服务器会创建一个 HttpServletRequest 对象,该对象封装了客户端请求的所有信息,如请求头、请求参数、请求方法等.

4、HttpServletResponse 功能

request是请求对象,而response是响应对象。

response对象用于响应client请求,向客户输出信息。

他封装了JSP产生的响应,并发送到client以响应client请求。

4.1 功能介绍

用于响应客户端请求,包括设置响应头信息、发送状态码、设置响应正文、重定向等功能。

  • 设置响应头信息;addHeader("reFresh", "5;URL=xxxx");
  • 发送状态码;sendError(404);
  • 设置响应正文;getWriter().print( "fdsfdsa ");
  • 重定向:sendRedirect( "path ");

4.2 设置状态码和其他方法

  1. **response.setContentType("text/html;charset=utf-8")**设置响应类型和编码
  2. response.setCharacterEncoding( "utf-8 "):如果响应类型为文本,那么就需要设置文本的编码类型,然后浏览器使用这个编码来解读文本。**注意!**如果没有设置contentType,那么浏览器会认为contentType为text/html,如果没设置编码,那么默认为ISO-8859-1编码。所以以上两点在使用response返回结果之前必须设置。
  3. response.setStatus(200):设置状态码
  4. response.sendError(404, "您要查找的资源不存在"):发送错误状态码并显示错误信息。

4.3 设置响应头信息

  • response.setHeader("contentType", "text/html;charset=utf-8"):与setContentType()方法的功能相同。setContentType()方法属于便捷方法;
  • 刷新(定时重定向):response.setHeader("Refresh","5; URL=http://www.baidu.com"):5秒后自动跳转到百度主页。

4.4 中文乱码问题

通过setContentType("text/html;charset=utf-8")setCharacterEncoding("UTF-8")解决。

java 复制代码
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("UTF-8");
response.getWriter().write("张三");

4.5 重定向

使用sendRedirect方法,可重定向到不同主机,会使request中的属性失效并开启新的request对象。

这一点与转发不同。在client浏览器上将会得到跳转后的地址,并又一次发送请求链接;用户能够从浏览器的地址栏中看到跳转后的地址

java 复制代码
response.sendRedirect("/param_demo/success.html");
相关推荐
SomeB1oody29 分钟前
【Rust中级教程】2.10. API设计原则之受约束性(constrained) Pt.1:对类型进行修改、`#[non_exhaustive]`注解
开发语言·后端·性能优化·rust
SomeB1oody33 分钟前
【Rust中级教程】2.9. API设计原则之显然性(obvious) :文档与类型系统、语义化类型、使用“零大小”类型
开发语言·后端·rust
但老师1 小时前
Jenkins垃圾清理指南
java·运维·jenkins
西域编娃2 小时前
图书馆系统源码详解
开发语言·后端·scala
计算机毕设孵化场3 小时前
计算机毕设-基于springboot的人工智能领域复合型人才校企协同培养管理系统的设计与实现(附源码+lw+ppt+开题报告)
java·spring boot·课程设计·计算机毕设论文·计算机毕业设计如何选题·计算机毕业设计选题推荐
青衫一笔墨4 小时前
企业级大模型应用的Java-Python异构融合架构实践
java·人工智能·python·架构
m0_748238924 小时前
Java进阶:Docker
java·docker·eureka
励碼4 小时前
BUG: 解决新版本SpringBoot3.4.3在创建项目时勾选lombok但无法使用的问题
java·spring boot·bug·lombok
石兴稳4 小时前
SSD 固态硬盘存储密度的分区
开发语言·javascript·数据库
88号技师4 小时前
2025年2月最新SCI-中华穿山甲优化算法Chinese Pangolin Optimizer-附Matlab免费代码
开发语言·算法·matlab·优化算法