程序员社区

【Servlet-0】Response对象功能与案例

文章目录

    • 1.HTTP协议概述
    • 2.Response对象功能
    • 3.重定向的案例
    • 4.服务器输出字符数据到浏览器
    • 5.输出字符数据导致中文乱码的解决方法
    • 6.服务器输出字节数据到浏览器
    • 7.验证码的制作与切换

1.HTTP协议概述

1.响应消息:
在这里插入图片描述
1.响应行
 组成:协议/版本 响应状态码 状态码状态
  响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态
   1.状态码都是三位数字
   2.HTTP响应状态码分类:
    1.1xx:服务器接收客户端消息,但没有接收完成,等待一段时间后发送1xx码
    2.2xx:成功。代表:200
    3.3xx:重定向。代表:304(重定向),304(访问缓存)
    4.4xx:客户端错误。
     代表:404(请求路径没有对应的资源)
     代表:405(请求方式没有对应的doXxx()方法)
    5.5xx:服务器端错误。
     代表:500(服务器内部出现异常)
2.响应头
 1.Content-Type :服务器告诉客户端本次响应体数据格式以及编码格式
 2.Content-disposition:服务器告诉客户端以什么格式打开响应体数据
  in-line:默认值,在当前页面打开
  attachment;filename =xx:以附件的形式打开响应体。
3.响应空行
4.响应体

2.Response对象功能

功能:设置响应消息
1.设置响应头
 格式:HTTP/1.1 200 ok
 设置状态码:setStatus(int sec)
2.设置响应行:setHeader(String name,String value)
3.设置响应体:
 获取字符输出流:PrintWriter getWriter ()
 获取字节输出流:ServletOutputStream getOutputStream()
 使用输出流将数据输出到客户端浏览器

3.重定向的案例

1.重定向:完成资源的跳转
2.代码实现:
 重定向的方法:
  response.setStatus(302);
  response.setHeader("location","/18-Http-Response/ResponseDemo2");

简单的重定向的方法:
  response.sendRedirect("/18-Http-Response/ResponseDemo2");
3.重定向的特点:
 1.地址栏发生变化
 2.重定向可以访问其他站点(服务器)的资源
 3.重定向是两次请求
4.转发的特点:
 1.转发地址栏路径不变
 2.转发只能访问当前服务器下的资源
 3.转发只是一次请求
5.路径分类:
 1.相对路径:通过相对路径不可以确定唯一资源
  以./开头,代表当前目录
  以../开头,代表后退一级目录,当前目录的父目录的父目录
  规则:找到当前资源和目标l资源之间的相对位置关系
 2.绝对路径:通过绝对路径可以获得唯一资源
  以/开头
  规则:判断定义的路径是给谁用的?判断请求将来从哪发出
   给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
    建议虚拟目录动态获取:Request.getContextpath()
   给服务器使用:不需要加虚拟目录(服务器内部的转发)

package servlet;

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

@WebServlet("/ResponseDemo1")
public class ResponseDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo1......");
//        //访问ResponseDemo1会自动跳转到ResponseDemo2的资源
//        //设置状态码为302
//        response.setStatus(302);
//        //设置响应头的location
//        response.setHeader("location","/18-Http-Response/ResponseDemo2");

        //简单的重定向的方法
        //这个方法的原理和上面的相同
        response.sendRedirect("/18-Http-Response/ResponseDemo2");

        //因为虚拟目录有时可能会改变,所以最好动态获取虚拟目录
        String contextPath = request.getContextPath();
       response.sendRedirect(contextPath+"/ResponseDemo2");
        
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}
package servlet;

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

@WebServlet("/ResponseDemo2")
public class ResponseDemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo2........");
    }

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

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

步骤:
获取字符输出流:PrintWriter pw = response.getWriter();
输出数据:pw.write("hello");

package servlet;
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.io.IOException;
import java.io.PrintWriter;

@WebServlet("/ResponseDemo3")
public class ResponseDemo3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取字符输出流
        PrintWriter pw = response.getWriter();
        //输出数据
        pw.write("hello");
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

5.输出字符数据导致中文乱码的解决方法

获取流之前设置流的编码:
response.setCharacterEncoding("utf-8");
告诉浏览器,服务器发送的消息体数据的编码,建议浏览器使用该编码解码:
response.setHeader("content-type","text/html;charset=utf-8");
最终的简单的形式,设置编码:
response.setContentType("text/html;charset=utf-8");

package servlet;

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

@WebServlet("/ResponseDemo4")
public class ResponseDemo4 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取流之前设置流的编码,流的默认编码为:ISO-8859-1设置为:GBK
        //response.setCharacterEncoding("utf-8");

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

        //获取字符输出流
        PrintWriter pw = response.getWriter();
        //输出数据
        pw.write("你好 response");
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

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

获取字节输出流:
ServletOutputStream outputStream = response.getOutputStream();
输出数据:
outputStream.write("hello".getBytes());

package servlet;

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

@WebServlet("/ResponseDemo5")
public class ResponseDemo5 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.获取字节输出流
        ServletOutputStream outputStream = response.getOutputStream();
        //2.输出数据
       outputStream.write("hello".getBytes());
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

7.验证码的制作与切换

验证码的制作:

package servlet;

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("/CheckCodeServlet")
public class CheckCodeSevlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int width = 100;
        int height = 50;
        //创建一个对象,在内存中代表图片
        BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);

        //美化图片
        //填充背景色
        Graphics g = image.getGraphics();//画笔对象
        //设置画笔的颜色
        g.setColor(Color.pink);
        g.fillRect(0,0,width,height);

        //画边框
        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);
            g.drawString(ch+"",width/5*i,25);
        }

        //画干扰线
        for(int i=0;i<5;i++){
            //随机生成四个点
            int x1 = ran.nextInt(width);
            int y1 = ran.nextInt(height);
            int x2 = ran.nextInt(width);
            int y2 = ran.nextInt(height);
            g.setColor(Color.GREEN);
            g.drawLine(x1,y1,x2,y2);
        }
        //将图片输出到页面
        ImageIO.write(image,"jpg",response.getOutputStream());
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

验证码的切换:

<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">
        /*
        点击超链接或者图片,需要换一张
        1.给超链接或者图片绑定单击事件
        2.重新设置图片的src属性值
         */
       onload=function(){
            //获取图片对象
            var img = document.getElementById("checkCode");
            //绑定单击事件
            img.onclick=function () {
               //加时间戳(为了保证验证码能够随机出现)
               var date = new Date().getTime();
               img.src = "/18-Http-Response/CheckCodeServlet?"+date;
            }
       }
    </script>
</head>
<body>
<img id="checkCode" src="/18-Http-Response/CheckCodeServlet">
<a id="change" href="">看不清换一张</a>

</body>
</html>

赞(0) 打赏
未经允许不得转载:IDEA激活码 » 【Servlet-0】Response对象功能与案例

相关推荐

  • 暂无文章

一个分享Java & Python知识的社区