Servlet之response

1.响应消息的格式

        响应行:HTTP/1.1 200 OK
            响应码:
                        1. 1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
                        2. 2xx:成功。代表:200
                        3. 3xx:重定向。代表:302(重定向),304(访问缓存)
                        4. 4xx:客户端错误。
                            * 代表:
                                * 404(请求路径没有对应的资源)
                                * 405:请求方式没有对应的doXxx方法
                        5. 5xx:服务器端错误。代表:500(服务器内部出现异常)
        响应头:
                1. 格式:头名称: 值
                2. 常见的响应头:
                    1. Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
                    2. Content-disposition:服务器告诉客户端以什么格式打开响应体数据
                        * 值:
                            * in-line:默认值,在当前页面内打开
        响应空行:
        响应体:

2.response对象

        1.设置响应行
            设置状态码:setStatus(int sc)
        2.设置响应头
            setHeader(String name, String value)
        3.设置响应体
            * 使用步骤:
                1. 获取输出流
                    * 字符输出流:PrintWriter getWriter()

                    * 字节输出流:ServletOutputStream getOutputStream()

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

        方法的几个应用:

       

        1.重定向
                //简单的重定向方法
                response.sendRedirect("/day15/responseDemo2");
                
            * 转发的特点:forward
                1. 转发地址栏路径不变
                2. 转发只能访问当前服务器下的资源
                3. 转发是一次请求,可以使用request对象来共享数据
            * 重定向的特点:redirect
                1. 地址栏发生变化
                2. 重定向可以访问其他站点(服务器)的资源
                3. 重定向是两次请求。不能使用request对象来共享数据
                
            * 路径写法:
                1. 路径分类
                    1. 相对路径:通过相对路径不可以确定唯一资源
                        * 如:./index.html
                        * 不以/开头,以.开头路径

                        * 规则:找到当前资源和目标资源之间的相对位置关系
                            * ./:当前目录
                            * ../:后退一级目录
                    2. 绝对路径:通过绝对路径可以确定唯一资源
                        * 如:http://localhost/day15/responseDemo2        /day15/responseDemo2
                        * 以/开头的路径

                        * 规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出
                            * 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
                                * 建议虚拟目录动态获取:request.getContextPath()
                                * <a> , <form> 重定向...
                            * 给服务器使用:不需要加虚拟目录
                                * 转发路径
        2. 服务器输出字符数据到浏览器
            * 步骤:
                1. 获取字符输出流
                    PrintWriter pw = resp.getWriter();
                2. 输出数据
                
            //简单的形式,设置编码,是在获取流之前设置
                    response.setContentType("text/html;charset=utf-8");
        3. 服务器输出字节数据到浏览器
            * 步骤:
                1. 获取字节输出流
                2. 输出数据
                
        4.验证码
            本质:随机生成的图片
            作用:防止恶意表单注册

package cn.itcast.web.response;

import javax.imageio.ImageIO;
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.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;


@WebServlet("/checkCode")
public class CheckCode extends HttpServlet {
    @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);
        //2.3在图片上写字符串
        Random random = new Random();
        String str = "ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        for(int i = 1;i < 5;i ++){
            int num = random.nextInt(str.length());
            g.drawString(str.charAt(num)+"",width/5*i,height/2);
        }
        //2.4在图片上添加干扰线
        g.setColor(Color.green);
        for(int i = 0;i<10;i++){
            int x1 = random.nextInt(width);
            int x2 = random.nextInt(width);
            int y1 = random.nextInt(height);
            int y2 = random.nextInt(height);
            g.drawLine(x1,y1,x2,y2);
        }


        //3.图片显示在浏览器上
        ServletOutputStream sos = resp.getOutputStream();
        ImageIO.write(image,"jpg",sos);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
}



<!DOCTYPE html>
<html lang="ch">
<head>
    <meta charset="UTF-8">
    <title>验证码</title>
    <!--我需要动态的切换验证码,点击图片可以刷新,点击文字也可以刷新-->
    <script>
        //绑定单击事件
        window.onload=function () {
            //给图片绑定单击事件
            var img = document.getElementById("image");
            img.onclick=function () {
                var date = new Date().getTime();
                img.src="/day15/checkCode?"+date;
            }


            var word = document.getElementById("word");
            word.onclick=function () {
                var date = new Date().getTime();
                var img = document.getElementById("image");
                img.src="/day15/checkCode?"+date;
            }
        }
    </script>
</head>
<body>
<img src="/day15/checkCode" id = "image" />
<a href="/day15/CheckCode.html" id="word">看不清?换一张</a>

</body>
</html>

3.servletContext对象

            1. 概念:代表整个web应用,可以和程序的容器(服务器)来通信。

            2. 获取:
                1. 通过request对象获取
                    request.getServletContext();
                2. 通过HttpServlet获取
                    this.getServletContext();
                3.功能:
                    1.获取MIME文件:String getMimeType(String file)  
                    2.共享数据
                    3.获取web文件的真实路径
                        1. 方法: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. 完成图片文件下载
                
                分析:
                    1.图片的话,如果是超链接直接指过去就是直接解析,我们要的是下载
                    2.如果是超链接指向一个servlet的话,然后servlet里面改变响应头,应该可以出现下载按钮
                    3.* content-disposition:attachment;filename=xxx
                    
                步骤:
                    1.创建一个html,里面的超链接指向servlet
                    2.获取文件名称
                    2.将图片资源复制过去,然后就是获取一个输入流,把文件读到内存中
                    3.根据响应的输出流,把文件输出到浏览器上
                    4.不要忘记设置响应头
                    
                中文乱码问题存在:
                    根据不同的浏览器,设置不同的解析方式
                    
                    1.获取浏览器的版本信息
                    2.根据不同的版本信息,设置filename的编码方式不同

package cn.itcast.web.response;

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.FileInputStream;
import java.io.IOException;

@WebServlet("/downloadImg")
public class download extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //2.获取文件名称
        String filename = request.getParameter("filename");

        //3.将图片资源复制过去,然后就是获取一个输入流,把文件读到内存中
        //3.1找到文件的真实路径
        ServletContext servletContext = this.getServletContext();
        String realPath = servletContext.getRealPath("/img/"+filename);
        //3.2加载进内存
        FileInputStream fis = new FileInputStream(realPath);



        //解决中文乱码问题
        String agent = request.getHeader("user-agent");
        filename = DownLoadUtils.getFileName(agent,filename);
        //4.不要忘记设置响应头
        //4.1设置响应头类型
        String mimeType = servletContext.getMimeType(filename);
        response.setHeader("content-type",mimeType);
        //4.2设置成附件方式:content-disposition:attachment;filename=xxx
        response.setHeader("content-disposition","attachment;filename="+filename);


        //5.将字符输入流输出
        ServletOutputStream sos = response.getOutputStream();
        int len = 0;
        byte[] b = new byte[1024 * 8];
        while((len = fis.read(b)) != -1){
            sos.write(b,0,len);
        }


        fis.close();

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>download</title>
</head>
<body>

<a href="/day15/downloadImg?filename=1.jpg">九尾</a>
<a href="/day15/downloadImg?filename=2.jpg">鼬</a>
</body>
</html>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值