文章目录
- javaWeb学习笔记思维导图
- 问题扩展与汇总:
- 6. HttpServletResponse
- 6.1 简单分类:
- 6.2 下载文件
- 6.3 验证码功能实现
- 6.4 实现重定向
- 7. HttpServletRequest
javaWeb学习笔记思维导图
参考狂神说javaweb教程笔记
参考尚硅谷javaWeb教程笔记
问题扩展与汇总:
6. HttpServletResponse
- 用来给客户端响应一些信息
6.1 简单分类:
- 负责向浏览器发送数据的方法:(从程序中向浏览器写,输出流)
字节流 | getOutputStream(); | 常用于下载(传递二进制数据) |
字符流 | getWriter(); | 常用于回传字符串(常用) |
- 两个流同时只能使用一个。
使用了字节流, 就不能再使用字符流, 反之亦然, 否则就会报错
// 获取字节流,
ServletOutputStream getOutputStream() throws IOException;
ServletOutputStream = resp.getOutputStream()
// 获取字符流
PrintWriter getWriter() throws IOException; // 字符流
PrintWriter writer = resp.getWriter();
// 向客户端写数据
writer.write("response's content!!!");
- 负责向浏览器发送响应头的方法(了解)
void setCharacterEncoding(String var1);
void setContentLength(int var1);
void setContentLengthLong(long var1);
void setContentType(String var1);
void setDateHeader(String var1, long var2);
void addDateHeader(String var1, long var2);
void setHeader(String var1, String var2);
void addHeader(String var1, String var2);
void setIntHeader(String var1, int var2);
void addIntHeader(String var1, int var2);
- Http响应及相应状态码
- 示例:
ache-Control:private 缓存控制
Connection:Keep-Alive 连接
Content-Encoding:gzip 编码
Content-Type:text/html 类
- 相应体
Accept:告诉浏览器,它所支持的数据类型
Accept-Encoding:支持哪种编码格式 GBK UTF-8 GB2312 ISO8859-1
Accept-Language:告诉浏览器,它的语言环境
Cache-Control:缓存控制
Connection:告诉浏览器,请求完成是断开还是保持连接
HOST:主机..../.
Refresh:告诉客户端,多久刷新一次;
Location:让网页重新定位
- 相应状态码
- 200:请求响应成功 200
- 3xx:请求重定向(302,303)
重定向:你重新到我给你新位置去; - 4xx:找不到资源 (404)
资源不存在;一般是请求的url路径错误 - 5xx:服务器代码错误 500 502:网关错误
6.2 下载文件
- 要获取下载文件的路径
- 下载的文件名是啥?
- 设置想办法让浏览器能够支持下载我们需要的东西
- 获取下载文件的输入流
- 创建缓冲区
- 获取OutputStream对象
- 将FileOutputStream流写入到buffer缓冲区
- 使用OutputStream将缓冲区中的数据输出到客户端!
public class Response1_down extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 要获取下载文件的路径
String realpath = getServletContext().getRealPath("/测试.png");
System.out.println(realpath); // 这个只是在tomcat中的路径
realpath = "E:\\idea\\JavaWeb\\javaWeb02-Servlet\\response\\target\\classes\\static\\image\\测试.png";
System.out.println(realpath);
// 2. 下载的文件名
String fileName = realpath.substring(realpath.lastIndexOf("\\") + 1);
// 3.设置(Content-Disposition),支持下载功能,浏览器编码,使得支持中文
resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
// 4. 获取下载文件的输入流
FileInputStream inputStream = new FileInputStream(realpath);
// 5. 创建缓冲区
int len = 0;
byte[] buffer = new byte[1024];
// 6. 获取向浏览器反映的输出流
ServletOutputStream outputStream = resp.getOutputStream();
// 7.将读取的下载文件输出到浏览器中
while((len = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, len);
}
inputStream.close();
outputStream.close();
}
- 测试结果
6.3 验证码功能实现
- 后端实现,用java的图片类。生产一个图片,然后写给浏览器
public class Response2_verification extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 如何让浏览器3秒自动刷新一次
resp.setHeader("refresh", "3");
// 2. 在内存中创建一个图片
BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_3BYTE_BGR);
// 得到图片
Graphics2D graphics2D = (Graphics2D) image.getGraphics(); // 拿到一支笔
graphics2D.setColor(Color.white);
graphics2D.fillRect(0, 0, 80, 20);
// 给图片写数据
graphics2D.setColor(Color.blue);
graphics2D.setFont(new Font(null, Font.BOLD, 20)); // 粗体字体
graphics2D.drawString(makeNum(), 0, 20);
// 3. 告诉浏览器,这个请求用图片的方式打开
resp.setContentType("image/png");
// 网站存在缓存,不让浏览器缓存
resp.setDateHeader("expires", -1);
resp.setHeader("Cache-Control","no-cache");
resp.setHeader("Pragma","no-cache");
// 4. 把图片写给浏览器
ImageIO.write(image, "png", resp.getOutputStream());
}
// 生成7位随机数
private String makeNum() {
Random rad = new Random();
String num = rad.nextInt(9999999) + "";
StringBuilder buffer = new StringBuilder();
for(int i = 0; i < 7 -num.length(); i ++) { // 不足7位的用0来填充
buffer.append("0");
}
num = buffer.toString() + num;
return num;
}
- 测试结果:
6.4 实现重定向
- void sendRedirect(String var1) 方法,302状态码,会访问var1工程的url地址
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws
ServletException, IOException {
/*
resp.setHeader("Location","/r/img");
resp.setStatus(302);
*/
// 默认是没有工程名,http://localhost:8080/verification,前面必须加上工程名
resp.sendRedirect("/response/verification");
}
简单实现登录重定向
- 新建jsp文件login.jsp,创建访问的前端表单
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注册/登录</title>
</head>
<body>
<%--这里提交的路径,需要寻找到项目的路径--%>
<%--${pageContext.request.contextPath}代表当前的项目--%>
<form action="${pageContext.request.contextPath}/index.jsp" method="post">
用户名:<input type="text" name="username"> <br>
密码:<input type="password" name="password"> <br>
<input type="submit" value="登录">
</form>
</body>
</html>
- 书写重定向逻辑,转向登录表单页面
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username+":"+password);
//重定向时候一定要注意,路径问题,否则404;
resp.sendRedirect("/response/login.jsp");
- 点击登录后,跳转到指定页面
7. HttpServletRequest
- HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,
- HTTP请求中的所有信息会被封装到HttpServletRequest,
- 通过这个HttpServletRequest的方法,获得客户端的所有信息;
获取参数,请求转发
- 常用的两个获取参数方法是:
String password = req.getParameter("password");
String[] hobbies = req.getParameterValues("hobby");
- 先在主页面设置表单
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<form action="${pageContext.request.contextPath}/dispatcher" method="post">
用户名:<input type="text" name="username"> <br>
密码:<input type="password" name="password"> <br>
爱好:
<input type="checkbox" name="hobby", value="hobby1"> 电影
<input type="checkbox" name="hobby", value="hobby2"> 音乐
<input type="checkbox" name="hobby", value="hobby2"> 看书 <br>
<input type="submit" value="登录">
</form>
</body>
</html>
- 提交表单后,会进入redirecter工程,设置该工程的处理逻辑,获取表单中请求的参数,并转发到指定页面
public class Request1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
// 获取客户端请求的参数
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobbies = req.getParameterValues("hobby");
// 处理请求的参数
System.out.println("==================");
System.out.println(username);
System.out.println(password);
System.out.println(Arrays.toString(hobbies));
System.out.println("==================");
//通过请求转发
//这里的 / 代表当前的web应用,与转发不同
req.getRequestDispatcher("/success.jsp").forward(req,resp);
}
- 测试结果:
- 主页表单
- - 获取的参数
- 转发的页面