@[Toc]
前言
Request:获取请求数据
Response:设置响应数据
1 Request的继承体系
service(request,response)是由谁创建的?
- Tomcat。Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法中。
- 使用request对象,只需查阅Java EE API文档的HttpServletRequest接口。
2 Request获取请求数据
2.1 请求路径的划分
2.1.1请求行
2.1.2 请求头
2.1.3 请求体
Post请求方式,会将相应的参数放到请求体里面。
2.2 常见的请求方式
2.2.1 获取请求行的数据
方法名 | 方法类型 | 方法作用 |
---|---|---|
getMethod | String | 获取请求路径的请求方式:如Get、Post |
getContextPath | String | 获取虚拟目录(资源的访问路径) |
getRequestURL | StringBuffer | 获取URL(统一资源定位符) |
getRequestURI | String | 获取URI(统一资源标识符) |
getQueryString | String | 获取请求参数(Get方式) |
实战
访问一个这样的路径http://localhost:8080/JavaWeb_Demo_05_war/webServlet04?name=zhangsan,我们来打印一下这些方法的效果。
- http://localhost:8080:端口号
- JavaWeb_Demo_05_war:项目名
- webServlet04:Servlet名
- name=zhangsan:携带的参数、参数的值
分别对应上述五个方法
2.2.2 获取请求头的数据
方法名 | 方法类型 | 方法作用 |
---|---|---|
getHeader(String name) | String | 根据请求头的名称,获取值 |
2.2.3 获取请求体的数据
方法名 | 方法类型 | 方法作用 |
---|---|---|
getInputStream | ServletInputStream | 获取字节输入流 |
getReader | BufferedReader | 获取字符输入流 |
字节流和字符流的区别
Java中的字节流处理的最基本单位为单个字节,它通常用来处理二进制数据。 二进制数据如图像、多媒体文件和可执行软件代码。Java中的字符流处理的最基本的单元是Unicode码元(大小2字节),它通常用来处理文本数据。所谓Unicode码元,也就是一个Unicode代码单元,范围是0x0000~0xFFFF。
相应的如果传送的是图像、文件资源,需要用到字节输入流,如果是字符串只需要用到字符输入流。
使用方法注意
使用流读取数据时,分两步:
- 获取数据
- 读取数据
代码如下:
/*1、获取数据*/
BufferedReader reader = request.getReader();
/*2、读取数据*/
String s = reader.readLine();
System.out.println("获取请求体的数据:"+s);
效果
获取数据之后,直接输入,则会出现以下的效果
2.3 通用的请求方式
所谓通用的请求方式,即doGet或者doPost都用一种获取参数的方法,另外一个直接调用另一个即可。
2.3.1通用的请求方法
方法名 | 方法类型 | 方法作用 | |
---|---|---|---|
getParameterMap | Map<String, String[]> | 获取所有参数Map集合 | |
getParameterValues(String name) | String[] | 根据名称获取参数值(数组) | |
getParameter | String | 根据名称获取参数值(单个值) |
2.3.2实战演练
2.3.2.1 首先创建一个html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/JavaWeb_Demo_05_war/demo05" method="post">
<input type="text" name="username">
<br/>
<input type="password" name="password">
<br/>
<input type="checkbox" name="hobby" value="1">抽烟
<input type="checkbox" name="hobby" value="2">喝酒
<input type="checkbox" name="hobby" value="3">烫头
<br/>
<input type="submit">
</form>
</body>
</html>
2.3.2.2 创建一个Servlet相应
package com.you.web;
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.util.Map;
@WebServlet(urlPatterns = "/demo05")
public class webServlet05 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/* 1、第一种方法:获取所有的参数Map集合*/
Map<String, String[]> parameterMap = req.getParameterMap();
for (String key : parameterMap.keySet()) {
System.out.print(key+":");
String[] value = parameterMap.get(key);
for (String s : value) {
System.out.print(s+" ");
}
System.out.println();
}
System.out.println("-----------------------------");
/* 2、第二种:根据名称获取参数值 */
String[] hobbies = req.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.print(hobby+" ");
}
System.out.println();
System.out.println("-----------------------------");
/* 3、第三种:根据名称获取参数值*/
String username = req.getParameter("username");
System.out.println(username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
2.3.2.3 提交
2.3.2.4 效果
3 解决中文乱码的问题
3.1 Post的解决方式
在使用req获取数据之前,加上这一句
req.setCharacterEncoding("UTF-8");
3.2 Get的解决方式
3.2.1 Get产生中文乱码的原因
编解码采用的格式不同:
- 浏览器发送的数据采用的是UTF-8格式
- Tomcat内部解码采用的是ISO-8859-1的格式
URL编码规则
- 将字符串按照编码方式转为二进制
- 每个字节转为2个16进制数并在前面加上%
中文字符占3个字节,而且Tomcat8以后已解决了Get请求乱码的问题
4 Request请求转发
4.1 请求转发:一种服务器内部的资源跳转方式
方法名 | 方法类型 | 方法作用 |
---|---|---|
getRequestDispatcher("要转发的资源路径").forward(req,resp); | RequestDispatcher | 转发的作用:从一个Servlet转到另一个Servlet |
setAttribute(String name, Object o) | void | 存储到Request域中 |
getAttribute(String name) | Object | 根据key,获取值 |
removeAttribute(String name) | void | 根据key,删除该键值对 |
getRequestDispatcher()中,要转发的路径直接写Servlet配置的访问路径就好,不需要写'/'
4.2 请求转发的特点
- 浏览器地址栏路径不发生变化
- 只能转发当前服务器的内部资源
- 一次请求,可以在转发的资源间使用request共享数据
4.3 实战举例
demo6设置参数,并转发到demo7,demo7获取参数并输出
package com.you.web;
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("/demo6")
public class webServlet06 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get.....");
req.setAttribute("hobby","girl");
req.getRequestDispatcher("demo7").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
package com.you.web;
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("/demo7")
public class webServlet07 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object hobby = req.getAttribute("hobby");
System.out.println("获取的数据是:"+hobby);
System.out.println("get7....");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post7...");
this.doGet(req,resp);
}
}