java web-7.4Response

大纲:
一、response重定向
二、response相对路径和绝对路径
三、response输出数据
四、response验证码
五、ServletContext对象
六、文件下载

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)使用输出流,将数据输出到客户端浏览器

一、response重定向

1.完成重定向
(1)告诉浏览器重定向,状态码302
(2)告诉浏览器B资源的路径,响应头lcation:B资源的路径
第一种

 //1设置状态吗为302
resp.setStatus(302);
//2设置响应头location
resp.setHeader("location","pro2/responsedemo2");

第二种

 resp.sendRedirect("/pro2/responsedemo2");

重定向特点:(redirect)
1.地址栏发生变化
2.重定向可以访问其他站点的资源
3.重定向是两次请求。不能使用requst对象共享数据
转发的特点:(forward)
1.地址栏路径不变
2.转发只能访问当前服务器下的资源
3.转发是一次请求,可以使用requst对象共享数据

二、response相对路径和绝对路径

1.路径分类:
(1)相对路径:通过相对路径不能确定唯一资源(以.开头的路径)
规则:找到当前资源和目标资源之间的相对关系

./ 表示当前目录
../表示后退一级目录

(2)绝对路径:通过绝对路径可以确定唯一资源(以/开头的路径)
规则:判断定义的路径是给谁用的,
①给客户端浏览器使用,需要加虚拟目录(项目的访问路径)
a.建议虚拟目录动态获取:request.getContextPath()
b.<a>,<form>重定向
②给服务器使用:不需要加虚拟目录
转发路径

三、response输出数据

1.服务器输出字符数据到浏览器
(1)获取字符输出流
(2)输出数据

  //获取字符输出流
  PrintWriter pw = resp.getWriter();//获取的流默认编码是ISO-8859-1
 //输出数据
 pw.write("hello...");

注意
中文出现乱码:
原因:编解码使用的字符集不一致
方法1:

//告诉浏览器,服务器发送的消息体数据的编码,建议浏览器使用该编码解码
response.setHeader("content-type","text/html;charset=utf-8");

方法2:简化

//告诉浏览器,服务器发送的消息体数据的编码,建议浏览器使用该编码解码
response.setHeader("content-type","text/html;charset=utf-8");

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

  //获取字节输出流
  ServletOutputStream sos = resp.getOutputStream();
  //输出数据
  sos.write("hello".getBytes());

方法

resp.setContentType("text/html;charset=utf-8");
  //获取字节输出流
  ServletOutputStream sos = resp.getOutputStream();
  //输出数据
  sos.write("hello".getBytes("utf-8"));

四、response验证码

分析
验证码案例分析:
本质:图片
目的:防止恶意表单注册
步骤:
1创建对象,在内存图片(验证码图片对象)
2.美化图片
3.将图片输出到页面展示
代码:

@Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) 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= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        //生成随机角标
        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);
        }
        //画干扰线
        g.setColor(Color.GREEN);
        //随机生成坐标点
        for (int i = 0; i < 8; 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);
        }
        /*
        这是固定的要随机的
        //2.3写验证码
        g.drawString("A",20,25);
        g.drawString("B",40,25);
        g.drawString("C",60,25);
        g.drawString("D",80,25);
         */
        //3.将图片输出到页面展示
        ImageIO.write(image,"jpg",resp.getOutputStream());
    }

在使用时需要看不清的时候需要改变它,看页面 和js交互

<head>
    <meta charset="UTF-8"  >
    <title>regist</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 = "/pro3/checkcode?"+date
            }
        }
    </script>
</head>
<body>
<img id = "checkCode" src = "/pro3/checkcode"/>
<a id = "change" href = "">看不清 换一张</a>
</body>

效果
在这里插入图片描述

五、ServletContext对象

1.概念

代表整个web应用,可以和程序的容器(服务器)来通信

2.获取

(1)通过request对象获取request.getServletContext();
(2)通过HttpServlet获取this.getServletContext();
代码示例

//servletcontext对象的获取
        //(1)通过request对象获取`request.getServletContext();`
        ServletContext servletContext1 = req.getServletContext();
        //(2)通过HttpServlet获取`this.getServletContext();`
        ServletContext servletContext2 = this.getServletContext();
     System.out.println(servletContext1);//org.apache.catalina.core.ApplicationContextFacade@de3306e
        System.out.println(servletContext2);//org.apache.catalina.core.ApplicationContextFacade@de3306e
        System.out.println(servletContext1 == servletContext2);//true

3.功能:

(1)获取MIME类型:
①MIME类型: 在互联网通信过程中定义的一种文件数据类型

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

②获取:String getMimeType(String file);
代码示例

 //servletcontext功能
        //获取:String getMimeType(String file);
        //1.通过HttpServlet获取`this.getServletContext();`
        ServletContext servletContext2 = this.getServletContext();
       //2.定义文件名称
        String fileName = "a.jpg";
        //3.获取MIME类型
        String mimeType = servletContext2.getMimeType(fileName);
        System.out.println(mimeType);

在这里插入图片描述
(2)域对象:共享数据
1.setAttribute(String name,Object value)
2.getAttribute(String name);
3.removeAttribute(String name)
servletContext对象范围:所有用户请求的数据
servletcontextdemo3

//1.通过HttpServlet获取`this.getServletContext();`
        ServletContext servletContext2 = this.getServletContext();
        //3.获取MIME类型
        servletContext2.setAttribute("msg","haha");

servletcontextdemo4

//1.通过HttpServlet获取`this.getServletContext();`
        ServletContext servletContext2 = this.getServletContext();
        Object msg = servletContext2.getAttribute("msg");
        System.out.println(msg);

效果:
在这里插入图片描述
(3)获取文件的真实(服务器)路径
方法:String getRealPath(String path)
代码示例

public class ServletContextDemo5 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //1.通过HttpServlet获取`this.getServletContext();`
        ServletContext servletContext2 = this.getServletContext();
       //获取文件的真实路径
        String realPath = servletContext2.getRealPath("/b.txt");//web目录下资源访问
        System.out.println(realPath);
        //File file = new File(realPath);
        String realPath1 = servletContext2.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下资源访问
        System.out.println(realPath1);
        String realPath2 = servletContext2.getRealPath("/WEB-INF/classes/a.txt");//src目录下资源访问
        System.out.println(realPath2);

    }

文件存放位置
在这里插入图片描述
打印结果
在这里插入图片描述

六、文件下载

文件下载需求:
1.页面显示超链接
2.点击超链接后弹出下载提示框
3.完成图片下载
分析:
1.超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框,不满足需求
2.任何资源都必须弹出下载提示框
3.使用响应设置资源的打开方式
content-disposition:attachment,filename = xxx
步骤
1.定义页面,编辑超链接href属性,指向servlet,传递资源名称filename
2.定义servlet
(1)获取文件名称
(2)使用字节输入流加载文件进内存
(3)指定response的响应头,content-disposition:attachment;filename=xxx
(4)将数据写出到response输出流
问题:中文文件问题
解决思路:
1.获取客户端使用的浏览器版本信息
2.根据不同的版本信息,设置filename的编码方式不同

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值