java day38——response对象、路径问题、cookie

response对象

  • 响应对象: HttpServletResponse
  • 响应行: 状态码
  • 响应头: Map set-cookie
  • 响应体: 输出流, write/println写出到response缓冲区
    response缓冲区默认ISO8859-1字符集
    response.setContentType(“text/html;charset=utf-8”);
    在这里插入图片描述

常见状态码

  • 200 - 正常返回响应
  • 404 - 资源未找到, 1.浏览器中地址写错 2.地址对应的资源不存在
  • 500 - 代码出现异常
  • 405 - 服务方法出错 service, doGet, doPost
  • 304 - 访问缓存
  • 302 - 重定向

重定向

在这里插入图片描述

特点
1.客户端发送了两次请求
2.浏览器地址栏会发生改变, 变成第二次请求地址
3.不能使用request域来分享数据
重定向适用场景:
第一个资源已经做完了一件事情, 需要做下一件事情

@WebServlet("/Demo03Servlet")
		// 1.设置响应行信息 - 状态码 为重定向
        response.setStatus(302);

        // response.setHeader("name", "zhangsan");
        // 2.设置响应头内容 - 重定向地址
//        response.setHeader("location", "http://www.baidu.com");
        response.setHeader("location", "/web03_war_exploded/Demo01Servlet");
        // 重定向后, 代码也不会执行

response.sendRedirect(“url/uri”)

@WebServlet("/Demo04Servlet")
		// 获得虚拟目录
        String path = request.getContextPath();
        // 重定向
        response.sendRedirect(path + "/Demo01Servlet");

获得字符、字节输出流getWriter()

		// 获得字符输出流 -> 输出内容, 页面内容
        PrintWriter writer = response.getWriter();
        // 获得字节输出流 -> 复制文件, 文件下载
//        ServletOutputStream out = response.getOutputStream();

        // 两种输出流只能选择一种来使用, 不需要手动关闭流

设置response响应类型

		// 设置response缓冲区字符集
		//response.setCharacterEncoding("UTF-8");
        // 告诉客户端响应体类型, 解析方式
        response.setContentType("text/html;charset=utf-8");

        // 获得字符输出流 -> 输出内容, 页面内容
        PrintWriter writer = response.getWriter();

        writer.println("<h1>Demo06Servlet字符流的println方法</h1>");
        writer.write("<h1>Demo06Servlet字符流的write方法</h1>");

案例

图片验证码

通过response的输出流, 写出一张图片

 	<script>
        $(function(){
            $("#checkCode").click(function() {
                // $("#checkCode").prop("src", "/web03/CheckImgServlet")
                this.src = "/day03_war_exploded/CheckImgServlet?random=" + Math.random();
            });
        });
    </script>
验证码: <input type="text" name="check_code"/>
        <img id="checkCode" src="/day03_war_exploded/CheckImgServlet"/><br/>

文件下载——字节流

getOutputStream()

  .txt .jpg .zip .mp3 .mp4 .flv
   1.超链接的方式: 浏览器能解析的文件就会直接显示, 不能解析的才会下载
   2.通过Servlet方式下载:
      1.response.getOutputStream()
        输入流: 文件路径 - application.getRealPath()
      2.设置响应内容类型 MIME Type
        根据文件的后缀名自动识别 application.getMimeType("xx.zip");
        text/html    tomcat/conf/web.xml
@WebServlet("/DownloadServlet")
 // 1.获得要下载的文件名
        String filename = request.getParameter("filename");
        // filename乱码处理
//        filename = new String(filename.getBytes("ISO8859-1"), "UTF-8");

        // 2./Download/filename
        //   创建文件对应的输入流
        String path = this.getServletContext().getRealPath("/Download/"+filename);
        BufferedInputStream in = new BufferedInputStream(new FileInputStream(path));
        // 3.1 告诉客户端响应的文件类型, 通过后缀名获得文件类型
//        this.getServletContext().getMimeType(filename);
        response.setContentType(this.getServletContext().getMimeType(filename));
        // 浏览器响应头不支持中文, 需要处理filename
        String agent = request.getHeader("user-agent");
        String newName = DownLoadUtils.getFileName(agent, filename);
        // 3.2 设置响应头, 告诉客户端文件是以附件形式打开 - 下载
        response.setHeader("Content-Disposition","attachment;filename="+newName);
        // 3.获得响应对应的输出流
        OutputStream out = response.getOutputStream();
        // 4.复制文件
        byte[] bs = new byte[1024];
        int len;
        while((len = in.read(bs)) != -1) {
            out.write(bs, 0, len);
        }
        in.close();
    }

路径问题

绝对路径  /xx: 绝对路径URI   http://xxx: 绝对路径URL
      URL: 给客户端使用, 客户端访问服务器时必须使用的路径
           例如: form action="url"
                a href="url"
                img src="url"
                link href="url"
                script src="url"
                重定向: url
      URI: 给客户端使用可以用URI, 或者给服务器使用必须用URI
           给服务器使用: 转发, 不需要使用虚拟目录
           给客户端使用: 必须加虚拟目录

           如果客户端通过URI来访问服务器, 会将URI拼接成URL

      资源在同一个服务器中, 可以将URL简化成URI
          http://localhost:8080/web03/form.html
          /web03/CheckImgServlet
      不在同一个服务器中, 只能填完整的URL
          http://www.baidu.com
		
		应用的绝对路径:

cookie

客户端技术, 不安全[客户端可以删除,查看], 减轻服务器压力
在会话期间, 存储数据

会话技术

一次会话: 客户端连接上服务器开始, 客户端退出结束,会产生多次请求
在这里插入图片描述

存储/获取

向客户端存储cookie
response.addCookie(cookie) - 本质是response.setHeader(“set-cookie”)

@WebServlet("/Demo07Servlet")
		// 3.将数据存储在cookie中, 通过response对象
        // a.创建cookie对象 String-String类型的键值对
        Cookie cookie = new Cookie("name", "zhangsan");
        // 设置cookie的持久化时间
        cookie.setMaxAge(60*5);
        // 设置cookie的携带路径,
        // 设置cookie在访问Demo08Servlet的时候才会携带到服务器
//        cookie.setPath("/web03/Demo08Servlet");
        // 设置cookie在访问/web03应用中所有的资源都会携带到服务器
//        cookie.setPath("/web03/");
        // 设置cookie在访问这个服务器中所有的资源时,都会携带到服务器
//        cookie.setPath("/");
        // b.通过response将cookie传递给客户端
        // 本质是通过响应头set-cookie,把数据传递给客户端的
        response.addCookie(cookie);

        response.getWriter().write("success");

从客户端获取cookie
request.getCookies() - 本质是request.getHeader(“cookie”)
它会将客户端携带过来的cookie全部获得

@WebServlet("/Demo08Servlet")
 		// 2.通过请求对象获得cookie
        // 将客户端携带过来的cookie全部获得
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            String name = cookies[0].getName();
            String value = cookies[0].getValue();

            response.getWriter().write("success: " + name + "," + value);
        } else {
            response.getWriter().write("cookie is null");
        }

生命周期、持久化

cookie默认的生命周期: new 开始, 到会话结束
设置持久化时间
cookie.setMaxAge(int 秒);
设置时间=0, 立即删除
设置时间=-1, 恢复默认

携带路径

		cookie.setPath(): / -> 当前服务器所有资源
                          /web03 -> 当前应用所有资源
                          /web03/Demo08Servlet -> 单纯只有Demo08Servlet资源
        默认: 当前目录
             set-cookie的资源路径: http://localhost:8080/web03/cookie/Demo07Servlet

小结

  • 存储一定是响应,获取一定是请求
  • 只有当cookie的name和path一致的时候才会认为是同一个cookie
   	 Cookie c1 = new Cookie("name","zhangsan");

     Cookie c2 = new Cookie("name","zhangsan);
     c2.setPath("/");

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值