15 http协议(响应)&response域对象&ServletContext对象

一、http协议(响应)

    响应字符串格式

        HTTP/1.1 200 OK            ---------------------------------------------------------->响应行

        Content-Type: text/html;charset=UTF-8

        Content-Length: 101                            --------------------------------------------->响应头

        Date: Wed, 06 Jun 2018 07:08:42 GMT

                                                                                  ------------------------------------->响应空行

        <html>

          <head>

            <title>$Title$</title>

          </head>                                                        ------------------------------------>响应体

          <body>

          hello , response

          </body>

        </html>

 


 


二、Response对象

 

1. 设置响应行

        1. 格式:HTTP/1.1 200 ok

        2. 设置状态码:setStatus(int sc)

 2. 设置响应头:setHeader(String name, String value)

        

 3. 设置响应体:

        * 使用步骤:

            1. 获取输出流

                * 字符输出流:PrintWriter getWriter()

 

                * 字节输出流:ServletOutputStream getOutputStream()

 

            2. 使用输出流,将数据输出到客户端浏览器

 

 

 4.forward(转发) 和  redirect(重定向) 区别

    1.转发

        *地址栏不发生改变

        *只能跳转到服务器内部资源

        *一次请求,可以使用request域对象共享数据

    2.重定向

        *地址栏发生改变

        *可以跳转到服务器外部资源

        *两次请求,不能使用request域对象共享数据

 

5.相对路径和绝对路径

   1. 相对路径

        以 . 开头路径

        ./   :当前目录

        ../   : 后退一级目录

    2.绝对路径

        以 / 开头的路径

        规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出?

             1.给客户端浏览器使用:需要加虚拟目录(项目的访问路径)

                 建议虚拟目录动态获取:request.getContextPath()                        ------------------------>一般用于重定向

 

            2. 给服务器使用:不需要加虚拟目录                                   ---------------------------------->一般用于转发                                                   

                           

6.服务器输出数据到浏览器

    服务器输出字符数据到浏览器

        * 步骤:

            1. 获取字符输出流

            2. 输出数据

 

        * 注意:

            * 乱码问题:

                1. PrintWriter pw = response.getWriter();获取的流的默认编码是ISO-8859-1

                2. 设置该流的默认编码

                3. 告诉浏览器响应体使用的编码

 

                //简单的形式,设置编码,是在获取流之前设置

                response.setContentType("text/html;charset=utf-8");

 

     服务器输出字节数据到浏览器

        * 步骤:

            1. 获取字节输出流

 

            2. 输出数据

 



三、ServletContext域对象

 

    1.代表整个web应用

    2.获取的2种方式

        1.通过request对象获取

            request.getServletContext();

        2.通过HttpServlet获取

            this.getServletContext();

    3.功能

       1. 获取MIME类型:

        * MIME类型:在互联网通信过程中定义的一种文件数据类型

            * 格式: 大类型/小类型   text/html        image/jpeg

 

        * 获取:String getMimeType(String file)  

        2. 域对象:共享数据

            1. setAttribute(String name,Object value)

            2. getAttribute(String name)

            3. removeAttribute(String name)

 

            * ServletContext对象范围:所有用户所有请求的数据    

        3. 获取文件的真实(服务器)路径

                 String getRealPath(String path)  

                 String b = context.getRealPath("/b.txt");//web目录下资源访问

                 System.out.println(b);

        

                String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下的资源访问

                System.out.println(c);

 

                String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问

                System.out.println(a);

-------------------------------------------------------------------------------------------------------------------------------------------------------

练习:

* 文件下载需求:                                                                                                                                                 

    1. 页面显示超链接

    2. 点击超链接后弹出下载提示框(以附件的形式下载)

    3. 完成图片文件下载

源代码如下:

项目结构图:虚拟目录为day15

 

 

直接上代码:

download.html

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Title</title>

</head>

<body>

    <a href="/day15/img/2.jpg">图片1</a>

    <a href="/day15/img/1.avi">视频</a>

    <hr>

    <a href="/day15/downLoadServlet?filename=九尾.jpg">图片1</a>

    <a href="/day15/downLoadServlet?filename=1.avi">视频</a>

</body>

</html>

 

DownLoadServlet

package cn.itcast.web.download;

import cn.itcast.utils.DownLoadUtils;

import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.ServletOutputStream;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.BufferedInputStream;

import java.io.FileInputStream;

import java.io.IOException;

@WebServlet("/downLoadServlet")

public class DownLoadServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //获取请求参数

        String filename = request.getParameter("filename");

        /**

         * 1.根据文件名称获取图片在服务器上的真实路径,并读入内存

         */

        ServletContext servletContext = request.getServletContext();

        String realPath = servletContext.getRealPath("/img/" + filename);

        //读取文件进内存

        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(realPath));

        /**

         * 2.设置响应头类型

         */

        String mimeType = servletContext.getMimeType(filename);//获取文件的mime类型

        response.setHeader("content-type", mimeType);

        //设置响应头打开方式:content-disposition,并且以附件的形式打开attachment;filename="+filename,filename

        response.setHeader("content-disposition", "attachment;filename=" + filename);

        /**

         * 3.解决中文文件名问题

         */

        //获取请求头

        String userAgent = request.getHeader("user-agent");

        filename = DownLoadUtils.getFileName(userAgent, filename);

        response.setHeader("content-disposition", "attachment;filename=" + filename);

        //输出到页面

        ServletOutputStream os = response.getOutputStream();

        byte[] bytes = new byte[1024];

        int len = 0;

        while ((len = bis.read(bytes)) != -1) {

            os.write(bytes, 0, len);

        }

        bis.close();

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        this.doPost(request, response);

    }

}

 

DownLoadUtils(浏览器兼容工具类----->支持jdk1.9,但是不支持jdk1.8)

package cn.itcast.utils;

import java.io.UnsupportedEncodingException;

import java.net.URLEncoder;

import java.util.Base64;

public class DownLoadUtils {

    public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {

        if (agent.contains("Firefox")) {

            // 火狐浏览器----------->jdk1.8,     1.9已经不再支持这种写法

//            BASE64Encoder base64Encoder = new BASE64Encoder();

//            filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";

            // 火狐浏览器---------->jdk1.9之后

           filename = "=?UTF-8?B?" + Base64.getEncoder().encodeToString(filename.getBytes("utf-8")) + "?=";

        } else {

            // 其它浏览器(非火狐)

            filename = URLEncoder.encode(filename, "utf-8");

        }

        return filename;

    }

}

 

 

DownLoadUtils(浏览器兼容工具类支持jdk1.8但是不支持1.9)

package cn.itcast.web.utils;

import java.io.UnsupportedEncodingException;

import java.net.URLEncoder;

public class DownLoadUtils {

    public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {

        if (agent.contains("MSIE")) {

            // IE浏览器

            filename = URLEncoder.encode(filename, "utf-8");

            filename = filename.replace("+", " ");

        } else if (agent.contains("Firefox")) {

            // 火狐浏览器

            BASE64Encoder base64Encoder = new BASE64Encoder();

            filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";

        } else {

            // 其它浏览器

            filename = URLEncoder.encode(filename, "utf-8");

        }

        return filename;

    }

}

 

练习二:java实现验证码功能                                                                                                                        

register.html

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Title</title>

    <script>

        /*

            分析:

                点击超链接或者图片,需要换一张

                1.给超链接和图片绑定单击事件

                2.重新设置图片的src属性值

         */

        window.onload = function () {

            //1.获取图片对象

            var img = document.getElementById("checkCode");

            //2.绑定图片单击事件

            img.onclick = function () {

                //加时间戳(为了区分每次访问都不一样)

                var date = new Date().getTime();

                img.src = "/day15/checkCodeServlet?date=" + date;

            }

            document.getElementById("change").onclick = function (ev) {

                //加时间戳(为了区分每次访问都不一样)

                var date = new Date().getTime();

                img.src = "/day15/checkCodeServlet?date=" + date;

            };

        }

    </script>

</head>

<body>

<img id="checkCode" src="/day15/checkCodeServlet"/>

<a id="change" href="">看不清换一张?</a>

</body>

</html>

 

CheckCodeServlet.java

package cn.itcast.web.servlet;

import javax.imageio.ImageIO;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.awt.*;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.util.Random;

@WebServlet("/checkCodeServlet")

public class CheckCodeServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        int width = 100;

        int height = 50;

        //1.创建一对象,在内存中图片(验证码图片对象)

        BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);

        //2.美化图片

        //2.1 填充背景色

        Graphics g = image.getGraphics();//画笔对象

        g.setColor(Color.PINK);//设置画笔颜色

        g.fillRect(0,0,width,height);

        //2.2画边框

        g.setColor(Color.BLUE);

        g.drawRect(0,0,width - 1,height - 1);

        String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789";

        //生成随机角标

        Random ran = new Random();

        for (int i = 1; i <= 4; i++) {

            int index = ran.nextInt(str.length());

            //获取字符

            char ch = str.charAt(index);//随机字符

            //2.3写验证码

            g.drawString(ch+"",width/5*i,height/2);

        }

        //2.4画干扰线

        g.setColor(Color.GREEN);

        //随机生成坐标点

        for (int i = 0; i < 10; i++) {

            int x1 = ran.nextInt(width);

            int x2 = ran.nextInt(width);

            int y1 = ran.nextInt(height);

            int y2 = ran.nextInt(height);

            g.drawLine(x1,y1,x2,y2);

        }

        //3.将图片输出到页面展示

        ImageIO.write(image,"jpg",response.getOutputStream());

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        this.doPost(request,response);

    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值