javaWeb学习笔记思维导图问题扩展与汇总:
6. HttpServletResponse
6.1 简单分类:6.2 下载文件6.3 验证码功能实现6.4 实现重定向 7. HttpServletRequest
javaWeb学习笔记思维导图思维导图链接
问题扩展与汇总: 6. HttpServletResponse参考狂神说javaweb教程笔记
参考尚硅谷javaWeb教程笔记
用来给客户端响应一些信息 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:请求响应成功 2003xx:请求重定向(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 {
// 默认是没有工程名,http://localhost:8080/verification,前面必须加上工程名
resp.sendRedirect("/response/verification");
}
简单实现登录重定向
新建jsp文件login.jsp,创建访问的前端表单
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
注册/登录
<%--这里提交的路径,需要寻找到项目的路径--%>
<%--${pageContext.request.contextPath}代表当前的项目--%>
书写重定向逻辑,转向登录表单页面
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username+":"+password);
//重定向时候一定要注意,路径问题,否则404;
resp.sendRedirect("/response/login.jsp");
点击登录后,跳转到指定页面
7. HttpServletRequestHttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息;
获取参数,请求转发
常用的两个获取参数方法是:
String password = req.getParameter("password");
String[] hobbies = req.getParameterValues("hobby");
先在主页面设置表单
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
提交表单后,会进入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);
}
测试结果:
主页表单 - 获取的参数
转发的页面



