E014Web学习笔记-Request和Respons(二)

一、BeanUtils工具类,简化数据封装

1、作用

用于封装JavaBean,将字符串自动转换为对应的数据类型;

说明:

在整个J2EE的编程过程中,我们经常会从各种配置文件中读取相应的数据,需要明白的一点是从配置文件中读取到的数据都是String,但是很显然我们的应用程序中不仅仅有String一种数据类型,比如:基本数据类型(int、double、char、float等),还有自定义数据类型(引用数据类型),那么我们必须面临的一个问题就是将字符串类型转换为各种具体的数据类型,BeanUtils工具类就是来干这件事情的!

 

2、JavaBean

标准的Java类;

 

3、标准的Java类的规范

①类必须被public修饰;

②必须提供空参的构造方法;

③成员变量必须使用pravite修饰;

④提供公共的setter和getter方法;

 

4、JavaBean的功能

封装数据;

 

5、概念

①成员变量;

②类的属性:setter和getter方法截取后的产物;

例如:setName -> Name -> name
大多数跟成员变量一样,但是如果设置name的方法是:
private void setN(String name){
    this.name = name;
} 
上面这个方法是正确的,但是“属性”和“成员变量”就是不一样的。

③方法

setProperty():设置属性值;
public static void setProperty(Object bean, String name, Object value):
参数说明:
Object bean:JavaBean;
String name:属性名(注意属性名步总是成员变量名哦);
Object value:属性值;

getProperty():获取属性值;
public static String getProperty(Object bean, String name):
参数说明:
Object bean:JavaBean;
String name:属性名(注意属性名步总是成员变量名哦);

populate():封装JavaBean;
public static void populate(Object bean, Map<String, ? extends Object> properties):
参数说明:
Object bean:JavaBean;
Map<String, ? extends Object> properties:存放属性和属性值的键值对集合;

 

6、BeanUtils工具类简单使用

第一步:导包(commons-beanutils-1.9.4.jar)

下载地址http://commons.apache.org/proper/commons-beanutils/download_beanutils.cgi

第二步:写JavaBean;

要求:

遵循上面的第3条:标准的Java类的规范

示例:

package BeanUtils;

public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

第三步:测试使用

示例:

package BeanUtils;

import org.apache.commons.beanutils.BeanUtils;

import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;

public class Test {
    public static void main(String[] args) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
        Student stu = new Student();
        BeanUtils.setProperty(stu,"name","大哥");
        BeanUtils.setProperty(stu,"age","23");
        System.out.println(stu.getName());//大哥
        System.out.println(BeanUtils.getProperty(stu,"name"));//大哥

        Student stu1 = new Student();
        Map<String,Object> map = new HashMap<>();
        map.put("name","二哥");
        map.put("age",22);
        BeanUtils.populate(stu1,map);
        System.out.println(BeanUtils.getProperty(stu1,"name"));
        System.out.println(BeanUtils.getProperty(stu1,"age"));
    }
}

输出结果:

 

二、HTTP响应协议

1、概述

说明:

①请求消息:客户端给服务器发送的数据;

格式:
1、请求行;
2、请求头;
3、请求空行;
4、请求体;

②响应消息:服务器给客户端发送的数据;

格式:
1、响应行;
2、响应头;
3、响应空行;
4、响应体;

 

2、响应行

组成:

①协议/版本;

②状态码;

③状态码的描述;

示例:

HTTP/1.1 200 OK

 

状态码:

服务器告诉客户端本次请求和响应的一个状态;

状态码分5类:

状态码都是3位数字;
1、1xx:服务器接收客户端消息,但没有接收完成,等待一段时间后,还没有接收完成,发送1xx状态码;
2、2xx:成功;代表200;
3、3xx:代表:302代表重定向(资源跳转的一种方式),304代表访问缓存,服务器告诉客户端访问缓存资源;
4、4xx:客户端错误;代表:404(请求路径没有对应的资源),405(请求方式和对应的doXXX方法);
405比如:访问的是doGet,但是没有写deGet方法;
5、5xx:服务器错误;代表500(服务器内部出现异常);

 

3、响应头:

格式:

头名称:值

常见的响应头:

1、Content-Type:服务器告诉浏览器本次响应体数据格式以及编码格式;
2、Content-disposition:服务器告诉客户端以什么样的格式打开响应体数据;
    值:
    默认值in-line,在当前页面内打开;
    attachment;filename=XXX:以附件形式打开,文件下载;

 

4、响应体

传输的数据;

 

三、response对象

1、功能:设置响应消息;

①设置响应行

1、格式:HTTP/1.1 200 ok
2、设置状态码:setStatus(int sc)

②设置响应头

void setHeader(String name, String value);

③设置响应体

使用步骤:
1、获取输出流;
字符输出流:只能输出字符数据,PrintWriter getWriter();
字节输出流:可以删除任意数据,ServletOutputStream getOutputStream();
ServletOutputStream可以直接当作OutputStream使用;
2、使用输出流,将数据输出到浏览器;

 

2、设置重定向

步骤:

第一步:设置状态码为302;

第二步:设置响应头location;

代码示例:

MyServlet:

package com.zibo.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("/my")
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet……");
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost……");
        //1、设置状态码为302
        resp.setStatus(302);
        //2、设置响应头location
        resp.setHeader("location","/s1");
    }
}

SecondServlet:

package com.zibo.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("/s1")
public class SecondServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("s1...");
    }
}

运行结果:

简单的重定向方法:

resp.sendRedirect("/s1");

重定向与转发的特点比较:

重定向(redirect):

1、地址栏发生变化;
2、重定向可以访问其他(站点)服务器资源;
3、重定向是两次请求;

转发(forward):

1、地址栏路径不变;
2、转发只能访问当前服务器下的资源;
3、转发是异次请求;

 

3、路径写法

分类:

①相对路径——通过相对路径不可以确定唯一的资源;

如:./index.html

不以/开头,以.开头;当前目录./可以省略;

规则:找到当前资源与目标资源之间的相对位置关系;

./:代表当前目录;../:代表上级目录;

②绝对路径——通过绝对路径可以确定唯一的资源;

如:http://localhost:8080/my——可省略为/my

以/开头的路径;

JSP推荐使用绝对路径;

规则:判断定义的路径是给谁用的(判断请求源);

给浏览器用:需要加虚拟目录(项目的访问路径);
推荐-动态获取虚拟目录,防止虚拟目录更改的时候改的代码太多:
request.getContextPath();

给服务器用:不需要加虚拟目录;
转发是给服务器用的;

 

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

步骤:

第一步:获取输出流;

第二步:将数据输出到浏览器;

代码演示(内含解决中文乱码问题):

package com.zibo.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("/my")
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet……");
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost……");
        //获取流之前解决中文乱码问题:
        // 1、获取流之前将流的默认编码从ISO-8859-1设置为utf-8
//        resp.setCharacterEncoding("utf-8");
        //2、告诉浏览器服务器发送数据的编码方式,建议浏览器使用对应的解码方式解码
        //其实第二步把第一步的事情也做了,第一步可以省略
//        resp.setHeader("content-type","text/html;charset=utf-8");
        //简单方式
        resp.setContentType("text/html;charset=utf-8");
        //输出数据到浏览器
        //1、获取输出流
        PrintWriter writer = resp.getWriter();
        //2、将数据输出到浏览器
        writer.write("<h1 style='color:#ff0000;'>你好啊-简单方式啦! Response!</h1>");
    }
}

 

5、服务器输出字节数据到浏览器

步骤:

第一步:获取输出流;

第二步:将数据输出到浏览器;

代码演示(内含解决中文乱码问题):

package com.zibo.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;
import java.nio.charset.StandardCharsets;

@WebServlet("/my")
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet……");
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost……");
        //获取流之前解决中文乱码问题:
        // 1、获取流之前将流的默认编码从ISO-8859-1设置为utf-8
//        resp.setCharacterEncoding("utf-8");
        //2、告诉浏览器服务器发送数据的编码方式,建议浏览器使用对应的解码方式解码
        //其实第二步把第一步的事情也做了,第一步可以省略
//        resp.setHeader("content-type","text/html;charset=utf-8");
        //简单方式
        resp.setContentType("text/html;charset=utf-8");
        //输出数据到浏览器
        //1、获取输出流
        ServletOutputStream outputStream = resp.getOutputStream();
        //2、将数据输出到浏览器
        outputStream.write("你好啊".getBytes(StandardCharsets.UTF_8));
    }
}

备注:

输出字节数据到浏览器一般输出的是图片等资源;

 

6、验证码

本质:

图片;

目的:

防止而已表单注册;

步骤:

第一步:创建一个对象,代表内存中的图片;

第二步:美化图片(将图片变成想要的样子);

第三步:将图片在页面中展示;

代码演示:

package com.zibo.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.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.util.Random;

@WebServlet("/my")
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet……");
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost……");
        //第一步:创建一个对象,代表内存中的图片;
        int width = 200;
        int height = 100;
        BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR);
        //第二步:美化图片(将图片变成想要的样子);
        //1、填充背景色
        Graphics graphics = image.getGraphics();
        graphics.setColor(Color.pink);
        graphics.fillRect(0,0,width,height);
        //2、画边框
        graphics.setColor(Color.BLUE);
        graphics.drawRect(0,0,width-1,height-1);
        //3、写验证码
        String string = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        Random random = new Random();
        int n;
        char c;
        for (int i = 0; i < 4; i++) {
            n = random.nextInt(string.length());
            c = string.charAt(n);
            graphics.drawString(c+"",(width/5)*(i+1),height/2);
        }
        //4、画干扰线
        graphics.setColor(Color.black);
        int x1,x2,y1,y2;
        for (int i = 0; i < 10; i++) {
            x1 = random.nextInt(width);
            x2 = random.nextInt(width);
            y1 = random.nextInt(height);
            y2 = random.nextInt(height);
            graphics.drawLine(x1,y1,x2,y2);
        }
        //第三步:将图片在页面中展示;
        ImageIO.write(image,"jpg",resp.getOutputStream());
    }
}

运行结果:

点击图片或者超链接更换验证码代码演示(html):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        window.onload = function () {
            //1、获取图片对象
            var img = document.getElementById("checkCode");
            var a = document.getElementById("change");
            img.onclick = function () {
                var time = new Date().getTime();
                img.src = "/my?"+time;
            };
            a.onclick = function () {
                var time = new Date().getTime();
                img.src = "/my?"+time;
            };
        }
    </script>
</head>
<body>
    <img id="checkCode" src="/my" alt="验证码"/>
    <a id="change" href="javascript:void(0);">换一张图片</a>
</body>
</html>

运行结果:

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值