文章目录

  • 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 下载文件

  1. 要获取下载文件的路径
  2. 下载的文件名是啥?
  3. 设置想办法让浏览器能够支持下载我们需要的东西
  4. 获取下载文件的输入流
  5. 创建缓冲区
  6. 获取OutputStream对象
  7. 将FileOutputStream流写入到buffer缓冲区
  8. 使用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();
    }
  • 测试结果

java 输出response java response.getoutputstream_java 输出response

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;
    }
  • 测试结果:

java 输出response java response.getoutputstream_开发语言_02

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");

java 输出response java response.getoutputstream_开发语言_03

  • 点击登录后,跳转到指定页面

java 输出response java response.getoutputstream_开发语言_04

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);
    }
  • 测试结果:
  • 主页表单
  • - 获取的参数
  • 转发的页面

java 输出response java response.getoutputstream_java 输出response_05