HttpRequest&HttpResponse补充

Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。

重定向
1、sendRedirect(String location) 请求重定向
2、


setHeader(String name, String value) 设置响应头信息

设置服务器响应回来数据,在浏览器上进行解析的编码格式:
1)response.setContentType("text/html;charset=UTF-8");==>包含setCharacterEncoding的功能。并能告诉浏览器,响应体使用的编码。
2)response.setCharacterEncoding("UTF-8");==>一般不使用,设置流pw的编码。
  PrintWriter pw = response.getWriter();获取的流的默认编码是ISO-8859-1
3)response.setHeader("Content-type", "text/html;charset=UTF-8");
另外一种方法:
ServletOutputStream sos = response.getOutputStream();
sos.write("你好123".getByte("UTF-8"));
由于浏览设置的编码格式不一定是UTF-8。需要设置:
request.setCharacterEncoding("UTF-8");


HttpServletResponse设置客户端下载文件

public class ServletDemo3 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 实现文件下载的功能
        // 通过路径得到一个输入流
        String path = this.getServletContext().getRealPath("/WEB-INF/classes/pic.jpg");
        FileInputStream fis = new FileInputStream(path);
        // 创建字节输出流
        ServletOutputStream sos = resp.getOutputStream();

        // 获取要下载的文件名  "\\"表示一个字符
        String fileName = path.substring(path.lastIndexOf("\\") + 1); // 获取到pic.jpg这个文件名 +1不要斜杠
        // 设置文件名的编码格式
        //URLEncoder类:HTML 格式编码的实用工具类。
        //该类包含了将 String 转换为 application/x-www-form-urlencoded MIME 格式的静态方法。
        fileName = URLEncoder.encode(fileName, "UTF-8");

        // 告知客户端要下载文件
        resp.setHeader("content-disposition", "attachment;filename=" + fileName);
        resp.setHeader("content-type", "image/jpeg");

        // 执行输出操作
        int len = 1;
        byte[] buff = new byte[1024];
        while ((len = fis.read(buff)) != -1) {
            sos.write(buff, 0, len);
        }
        sos.close();
        fis.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO Auto-generated method stub
        super.doPost(req, resp);
    }

}
View Code

HttpServletResponse设置客户端响应验证码图片案例

public class ServletDemo4 extends HttpServlet {    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        test01(resp);
        
        //告诉客户端不适用缓存
//        resp.setHeader("pragma", "no-cache");
//        resp.setHeader("cache-control", "no-cache");
//        resp.setDateHeader("expires", 0);
        
        //使用别人写好的验证码的jar包
//        ValidateCode  vc = new ValidateCode(110, 25, 4, 9);
//        String code= vc.getCode();      //得到生成的字符串
//        vc.write(resp.getOutputStream());
    }

    private void test01(HttpServletResponse resp) throws IOException {
        int height = 25;
        int width = 110;
        //在内存中创建一个图片对象
        BufferedImage img =new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        //创建一个画笔
        Graphics g = img.getGraphics();
        
        //给图片添加背景颜色
        g.setColor(Color.PINK);
        g.fillRect(1, 1, width-2, height-2);
        
        //给边框一个颜色
        g.setColor(Color.RED);
        g.drawRect(0, 0, width-1, height-1);

        //设置文本的样式
        g.setColor(Color.BLUE);
        g.setFont(new Font("宋体", Font.BOLD|Font.ITALIC, 15));
        
        //给图片添加文字
        Random rand= new Random();
        int position = 20;
        for(int i=0;i<4;i++) {
            g.drawString(rand.nextInt(10)+"", position, 20);
            position+=20;
        }
        
        //添加9干扰线
        for(int i=0;i<9;i++) {
            g.drawLine(rand.nextInt(width), rand.nextInt(height), rand.nextInt(width), rand.nextInt(height));
        }
        //将图片以流的形式输出到客户端
        ImageIO.write(img, "jpg", resp.getOutputStream());
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}
View Code


定时跳转
response.setHeader("refresh","3;url=/day09_00_httpServletResponse/servlet/demo6");

public class ServletDemo5 extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*        //设置定时刷新功能  1s刷新一次
        resp.setInitHeader("refresh", 1); 
        Random r= new Random();
        resp.getWriter().write(r.nextInt()+"");*/
        
        resp.setHeader("content-type", "text/html;charset=UTF-8");
        resp.getWriter().write("注册成功!三秒后跳转到主页。");
        //设置3s跳转
        resp.setHeader("refresh", "3;url=/day09_00_httpServletResponse/servlet/demo6");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}
View Code


设置重定向

public class ServletDemo7 extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("A:我要借钱!");
        System.out.println("B:我不有,但是我可以告诉你谁有");
        //告诉客户端要重定向新的资源   重新设置状态码302重定向
        resp.setStatus(302);
        //告诉客户端要去访问哪一个URL
        resp.setHeader("location", "/day09_00_httpServletResponse/servlet/demo8");
        
        System.out.println("A:我去了");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}
View Code
public class ServletDemo8 extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("我有钱,我借你!");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}
View Code

A:我要借钱!
B:我不有,但是我可以告诉你谁有
A:我去了
我有钱,我借你!
执行顺序:先将本程序中代码执行完毕。在执行跳转的程序。
以后重定向用得比较多。可以使用用简化的形式:sendRedirect(".....");
response.setHeader("location", "http://www.baidu.com"); ==>重定向外部资源。需要写上协议


响应正文
 *** getWrite(); 字符输出流  获取打印流
getOutputStream(); 字节输出流  获取输出流
setCharacterEncoding(String charset) 告知服务器使用什么编码
*****setContentType(String type)   可以顺便设置charset=UTF-8
如resp.setContentType(“text/html;charset=UTF-8”);

 

posted @ 2018-12-01 22:22  payn  阅读(144)  评论(0)    收藏  举报