1、Request:设置请求数据
1.1、Request的继承体系
1.2、Request获取请求数据
获取请求行里面的数据:
请求头和请求体:
POST方式获取请求体的方法如下所示:
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取字符输入流
BufferedReader br = req.getReader();
//读取数据
String s = br.readLine();
//输出读取的信息
System.out.println(s);
}
输出信息:
username=17744&password=45616541
1.3、Request通用方式获取请求参数
前端网页如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action="/test/demo1" 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"> 游泳 <br>
<input type="submit">
</form>
</body>
</html>
Java代码如下所示:
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("/demo1")
public class Demo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get...");
//获取Map集合
Map<String, String[]> map = req.getParameterMap();
//遍历Map集合
for (String key : map.keySet()) {
System.out.print(key + ":");
//通过键获取值
String[] values = map.get(key);
for (String value : values) {
System.out.print(value + " ");
}
System.out.println();
}
//根据Key获取参数值
String[] hobbies = req.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.print(hobby + " ");
}
System.out.println();
//获取单个值
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println("姓名为:" + username + "\t密码为:" + password );
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//这里的doPost方法可以直接调用上面的doGet方法,因为两个方法获取请求参数的方法都是一样的
this.doGet(req,resp);
}
}
1.4、请求参数中文乱码的问题:
POST解决方案:
在最开始写上:request.setCharacterEncoding("utf-8");用于设置字符输入流的编码。
GET方式的解决方案:==原因:编码和解码的方式不一样!!!!==
如下所示:
==解决思路:先把数据转换为字节数组,然后再通过字节数组转换为字符串!!==
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
@WebServlet("/demo2")
public class Demo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
//获取username的字节数组
byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
//然后通过字节数组转换为字符串
username = new String(bytes,StandardCharsets.UTF_8);
//上面的代码可以简写成如下形式
String username1 = new String(request.getParameter("username").getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8);
//输出信息
System.out.println(username);
System.out.println(username1);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
==注意:上面解决GET方式中文乱码的解决方案同样适用于POST方法!!!!==
1.5、request的请求转发:一种在服务器内部的资源跳转方式。
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/demo3")
public class Demo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo3.....");
request.getRequestDispatcher("/demo4").forward(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
上面的代码会输出:
demo3..... demo4......
操作共享数据的方法:
2、Response:设置响应数据
2.1、设置响应数据功能介绍
2.2、Response完成重定向:一种资源跳转的方式
使用如下所示:
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/responseDemo1")
public class Demo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo1......");
//设置响应状态码
response.setStatus(302); //参数是一个固定值,302
//设置响应头
response.setHeader("Location", "/test/responseDemo2"); //参数一是一个固定值,参数二是重定向的资源路径,注意访问路径要添加项目名称
//简写为
response.sendRedirect("/test/responseDemo2");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
比较两种重定向和请求转发:
2.3、路径问题
明确路径是谁使用?
浏览器(发出)使用:需要加虚拟目录(项目访问路径) 服务端使用(发出):不需要加虚拟目录
常见的例子如下所示:
2.4、动态获取虚拟目录:
String contextPath = request.getContextPath(); System.out.println(contextPath);
2.5、Response响应字符数据
@WebServlet("/responseDemo3")
public class Demo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//让浏览器能够解析html标签,并且设置编码,让其能够正常识别中文
response.setContentType("text/html;charset=utf-8");
//获取字符输出流(这个流是不用关闭的,关闭可能会出问题)
PrintWriter writer = response.getWriter();
writer.write("aaa");
//输出带html的字符串
writer.write("aaaaa");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
2.6、Response响应字节数据
import org.apache.commons.io.IOUtils;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.FileInputStream;
import java.io.IOException;
@WebServlet("/responseDemo4")
public class Demo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//读取文件
FileInputStream fis = new FileInputStream("G:\\图片\\111.jpg");
//获取response字节输出流
ServletOutputStream os = response.getOutputStream();
//完成流的copy,从而实现在页面中显示图片(这里使用了工具类,需要在xml中配置依赖)
IOUtils.copy(fis, os);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}