HttpServletResponse
功能:设置响应消息,由服务器创建。
web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象、代表响应的一个 HttpServletResponse对象;
代码语言:javascript复制如果要获取客户端请求过来的参数:找request
如果要给客户端响应一些信息:找response
设置响应行
格式:HTTP/1.1 200 ok 1、设置状态码
代码语言:javascript复制setStatus(int sc)
2、设置响应头
代码语言:javascript复制setHeader(String name, String value)
设置响应体
1、获取字符输出流
代码语言:javascript复制PrintWriter getWriter()
2、字节输出流
代码语言:javascript复制ServletOutputStream getOutputStream()
使用输出流,将数据输出到客户端浏览器
重定向
简单方法:
代码语言:javascript复制// 设置状态码为302
response.setStatus(302);
// 设置响应头location
response.setHeader("location","/book/servlet2");
或者:
代码语言:javascript复制response.sendRedirect("/09_Response/responseServletDemo2");
web资源B收到客户端A的请求后,会通知AS客户端去访问两外一个web资源C,这个过程就叫重定向
代码语言:javascript复制@Override
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
// 重定向
response.setHeader("Location","/r/image");
response.setStatus(302);
// response.sendRedirect("/r/image");
}
Rediret: 1、地址栏发生变化 2、重定向可以访问其他站点(服务器)的资源 3、重定向是两次请求。不能使用request对象来共享数据
如何解决中文乱码的问题?
代码语言:javascript复制//1.获取流对象,流的默认编码,ISO-8859-1 设置为:GBK
response.setCharacterEncoding("utf-8");
//2.告诉浏览器,服务器发送的消息体数据的编码 (直接写这句就行)
response.setHeader("content-type","text/html;charset=utf-8");
或者一般在开头就写好:
代码语言:javascript复制 @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
设置编码的简单的写法:
代码语言:javascript复制response.setContentType("text/html;charset=utf-8");
路径问题
如何判断呢?判断定义的路径是给谁用的?判断请求将来从哪儿发出
几个小应用
1、浏览器输出消息 输出字节数据:
代码语言:javascript复制 // 设置编码的简单写法
response.setContentType("text/html;charset=utf-8");
// 获取字节输出流
ServletOutputStream sos = response.getOutputStream();
// 输出数据 (不用刷新和关闭)
sos.write("<h1>hello RRRR</h1>".getBytes());
sos.write("hello".getBytes());
sos.write("你好".getBytes("utf-8"));
输出字符数据: response在一次响应完成后会自动销毁,流也会销毁
代码语言:javascript复制 // 设置编码的简单写法
response.setContentType("text/html;charset=utf-8");
// 获取字符输出流,response在一次响应完成后会自动销毁,流也会销毁
PrintWriter pw = response.getWriter();
// 输出数据 (不用刷新和关闭)
pw.write("<h1>hello RRRR</h1>");
pw.write("你好");
2、下载文件
代码语言:javascript复制 @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1、要获取下载文件的路径
String realPath = "E:\Data_study\Programming_study\javaWebMAVEN\ServletResponse\src\main\resources\1.jpg";
System.out.println(realPath);
//2、下载的文件名是什么?
String filename = realPath.substring(realPath.lastIndexOf("\") 1);
//3、设置想办法让浏览器知道能够支持我们下载的东西
resp.setHeader("Content-Disposition","attachment;filename=" URLEncoder.encode(filename,"UTF-8"));
//4、获取下载文件的输入流,就是把文件变成流
FileInputStream fileInputStream = new FileInputStream(realPath);
//5、创建缓冲区
int len = 0;
byte[] buffer = new byte[1024];
//6、获取OutputStream对象
ServletOutputStream outputStream = resp.getOutputStream();
//7、将FileOutputStream对象写在缓冲区,使用OutputStream将缓冲区中的数据输出
while ((len = fileInputStream.read(buffer))>0){
outputStream.write(buffer,0,len);
}
fileInputStream.close();
outputStream.close();
}
3、验证码功能
代码语言:javascript复制 @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//如何让浏览器3秒刷新一次
resp.setHeader("refresh","3");
//在内存中创建一个图片
BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_3BYTE_BGR);
//得到图片
//先有一支笔
Graphics2D g = (Graphics2D) image.getGraphics();
//设置图片的背景颜色
g.setColor(Color.BLUE);
g.fillRect(0,0,80,20);
//给图片写数据
g.setColor(Color.CYAN);
g.setFont(new Font(null,Font.BOLD,20));
g.drawString(makeNum(),0,20);
//告诉浏览器,这个请求用图片的形式打开
resp.setContentType("image/jpeg");
//网站存在缓存,不让浏览器缓存
resp.setDateHeader("expires",-1);
resp.setHeader("Cache-Control","no-cache");
resp.setHeader("Pragma","no-cache");
//把图片写给浏览器
boolean jpg = ImageIO.write(image, "jpg", resp.getOutputStream());
}
//生成随机数
private String makeNum(){
Random random = new Random();
String num = random.nextInt(99999999) "";
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < 7 - num.length(); i ) {
stringBuffer.append("0");
}
num = stringBuffer.toString() num;
return num;
}
相应的web.xml配置:映射关系
代码语言:javascript复制 <servlet>
<servlet-name>image_down</servlet-name>
<servlet-class>com.xiong.servlet.ImageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>image_down</servlet-name>
<url-pattern>/image_down</url-pattern>
</servlet-mapping>
重点:重定向和转发的区别
共同点是:页面都会实现跳转 特点:forward ---->这是转发
代码语言:javascript复制转发地址栏路径不变【307】
转发只能访问当前服务器下的资源
转发是一次请求。可以使用request对象来共享数据
特点:redirect ----->这是重定向
代码语言:javascript复制地址栏发生变化【302】
重定向可以访问其他站点(服务器)的资源
重定向是两次请求。不能使用request对象来共享数据
代码语言:javascript复制package com.xiong.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
public class RequestServlet 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[] parameterValues = req.getParameterValues("hobbys");
//输出
System.out.println(username);
System.out.println(password);
System.out.println(Arrays.toString(parameterValues));
resp.sendRedirect("/r/success.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
相应的index.jsp页面
需要注意的是这个东西:action="${pageContext.request.contextPath}/login"
<%--
Created by IntelliJ IDEA.
User: 86152
Date: 2021/5/26
Time: 16:46
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/login" method="post">
用户名:<input type="username" name="username"> <br>
密码:<input type="password" name="password"> <br>
爱好:
<input type="checkbox" name="hobbys" value="数学">数学
<input type="checkbox" name="hobbys" value="语文">语文
<input type="checkbox" name="hobbys" value="英语">英语
<input type="checkbox" name="hobbys" value="地理">地理
<br>
登录:<input type="submit">
</form>
</body>
</html>
web.xml文件:
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0"
metadata-complete="true">
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.xiong.servlet.RequestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app>