JavaWeb之 Request 和 Response 两大对象

Servlet:

  1. 概念:服务器中的java小程序

  2. 生命周期
    从开始到死亡

    init () -> getServletConfig () -> service () -> getServletInfo () -> destroy ()

  3. 注解配置web.xml路径
    一个Servlet可以定义多个访问路径 : @WebServlet({"/d4","/dd4","/ddd4"})

Request:

request功能:

  1. 获取请求消息数据
    1.1. 获取请求行数据
    * GET /day14/demo1?name=zhangsan HTTP/1.1
    * 方法:

    1. 获取请求方式 :GET
      * String getMethod()
      2. (*)获取虚拟目录:/day14
      * String getContextPath()

    2. 获取Servlet路径: /demo1
      * String getServletPath()

    3. 获取get方式请求参数:name=zhangsan
      * String getQueryString()
      5. (*)获取请求URI:/day14/demo1
      * String getRequestURI(): /day14/demo1
      * StringBuffer getRequestURL() :http://localhost/day14/demo1

      • URL:统一资源定位符 : http://localhost/day14/demo1 中华人民共和国
        * URI:统一资源标识符 : /day14/demo1 共和国
      1. 获取协议及版本:HTTP/1.1
        * String getProtocol()

      2. 获取客户机的IP地址:
        * String getRemoteAddr()

      3. 获取请求头数据

        • 方法:
          * (*)String getHeader(String name):通过请求头的名称获取请求头的值
          • Enumeration getHeaderNames():获取所有的请求头名称
      4. 获取请求体数据:

        • 请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
        • 步骤:
          1. 获取流对象

            • BufferedReader getReader():获取字符输入流,只能操作字符数据
            • ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
              • 在文件上传知识点后讲解
          2. 再从流对象中拿数据

    4. 其他功能:

      1. 获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数
        1. String getParameter(String name):根据参数名称获取参数值 username=zs&password=123
        2. String[] getParameterValues(String name):根据参数名称获取参数值的数组 hobby=xx&hobby=game
        3. Enumeration getParameterNames():获取所有请求的参数名称
        4. Map<String,String[]> getParameterMap():获取所有参数的map集合

      * 中文乱码问题:
      * get方式:tomcat 8 已经将get方式乱码问题解决了
      * post方式:会乱码
      * 解决:在获取参数前,设置request的编码request.setCharacterEncoding(“utf-8”);

    2. 请求转发:一种在服务器内部的资源跳转方式
    1. 步骤:
    1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
    2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)

    1. 特点:
      1. 浏览器地址栏路径不发生变化
      2. 只能转发到当前服务器内部资源中。
      3. 转发是一次请求

      1. 共享数据:

        • 域对象:一个有作用范围的对象,可以在范围内共享数据
        • request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
        • 方法:
          1. void setAttribute(String name,Object obj):存储数据
          2. Object getAttitude(String name):通过键获取值
          3. void removeAttribute(String name):通过键移除键值对
      2. 获取ServletContext:

        • ServletContext getServletContext()

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. 使用输出流,将数据输出到客户端浏览器
    
    
    
    
      * 重定向:资源跳转的方式
      	* 代码实现:
      		//1. 设置状态码为302
              response.setStatus(302);
              //2.设置响应头location
              response.setHeader("location","/day15/responseDemo2");
    
    
              //简单的重定向方法
              response.sendRedirect("/day15/responseDemo2");
    
      	* 重定向的特点:redirect
      		1. 地址栏发生变化
      		2. 重定向可以访问其他站点(服务器)的资源
      		3. 重定向是两次请求。不能使用request对象来共享数据
      	* 转发的特点:forward
      		1. 转发地址栏路径不变
      		2. 转发只能访问当前服务器下的资源
      		3. 转发是一次请求,可以使用request对象来共享数据
      	
      	* forward 和  redirect 区别
    
  1. 服务器输出字符数据到浏览器
    * 步骤:
    1. 获取字符输出流
    2. 输出数据

     	* 注意:
     		* 乱码问题:
     			1. PrintWriter pw = response.getWriter();获取的流的默认编码是ISO-8859-1
     			2. 设置该流的默认编码
     			3. 告诉浏览器响应体使用的编码
    
     			//简单的形式,设置编码,是在获取流之前设置
     			response.setContentType("text/html;charset=utf-8");
     3. 服务器输出字节数据到浏览器
     	* 步骤:
     		1. 获取字节输出流
     		2. 输出数据
    
    1. 验证码
      1. 本质:图片
      2. 目的:防止恶意表单注册
      详情:
//验证码功能
public class CheckCodeServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建一对象,在内存中画图
        int width = 50;
        int height = 100;

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

        //美化图片
        //2.1填充背景颜色
        Graphics graphics = image.getGraphics();//画笔对象
        graphics.setColor(Color.PINK);//设置画笔颜色
        graphics.fillRect(0, 0, width, height);
        //2.2画边框
        graphics.setColor(Color.blue);
        graphics.drawRect(0, 0, width - 1, height - 1);

        String str = "QWERTYUIOPASDFGHJKLZXCVBNM1234567890";
        //生成随机角标
        Random random = new Random();
        for (int i = 1; i <= 4; i++) {
            int index = random.nextInt(str.length());
            //获取字符
            char ch = str.charAt(index);//随机字符
            //2.3写验证码
            graphics.drawString(ch + "", width / 5 * i, height / 2);
        }
            //2.4画干扰线
        graphics.setColor(Color.green);

        //随机生成坐标
        for (int i = 0; i <8; i++) {
             int x1 = random.nextInt(width);
             int x2 = random.nextInt(width);

             int y1 = random.nextInt(height);
             int y2 = random.nextInt(height);

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


        }
        //3 将图片输出到页面展示
        ImageIO.write(image,"jpg",resp.getOutputStream());
    }

}

对编程感兴趣的朋友可以一起交流交流!禁止一切招生,广告!抠Q裙:947405150

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

废弃的root

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值