前言
Request:获取请求数据
Response:设置响应数据
1 Request 的继承体系
service(request,response)是由谁创建的?
2 Request 获取请求数据
2.1 请求路径的划分
2.1.1 请求行
2.1.2 请求头
2.1.3 请求体
Post 请求方式,会将相应的参数放到请求体里面。
2.2 常见的请求方式
2.2.1 获取请求行的数据
实战
访问一个这样的路径 http://localhost:8080/JavaWeb_Demo_05_war/webServlet04?name=zhangsan,我们来打印一下这些方法的效果。
分别对应上述五个方法
2.2.2 获取请求头的数据
2.2.3 获取请求体的数据
字节流和字符流的区别
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 通用的请求方法
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 产生中文乱码的原因
编解码采用的格式不同:
URL 编码规则
将字符串按照编码方式转为二进制
每个字节转为 2 个 16 进制数并在前面加上 %
中文字符占 3 个字节,而且 Tomcat8 以后已解决了 Get 请求乱码的问题
4 Request 请求转发
4.1 请求转发:一种服务器内部的资源跳转方式
getRequestDispatcher()中,要转发的路径直接写 Servlet 配置的访问路径就好,不需要写'/'
4.2 请求转发的特点
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);
}
}
复制代码
评论