用于封装JavaBean,将字符串自动转换为对应的数据类型;
说明:
在整个J2EE的编程过程中,我们经常会从各种配置文件中读取相应的数据,需要明白的一点是从配置文件中读取到的数据都是String,但是很显然我们的应用程序中不仅仅有String一种数据类型,比如:基本数据类型(int、double、char、float等),还有自定义数据类型(引用数据类型),那么我们必须面临的一个问题就是将字符串类型转换为各种具体的数据类型,BeanUtils工具类就是来干这件事情的!
标准的Java类;
①类必须被public修饰;
②必须提供空参的构造方法;
③成员变量必须使用pravite修饰;
④提供公共的setter和getter方法;
封装数据;
①成员变量;
②类的属性: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:存放属性和属性值的键值对集合;
下载地址http://commons.apache.org/proper/commons-beanutils/download_beanutils.cgi
要求:
遵循上面的第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"));
}
}
输出结果:
①请求消息:客户端给服务器发送的数据;
格式:
1、请求行;
2、请求头;
3、请求空行;
4、请求体;
②响应消息:服务器给客户端发送的数据;
格式:
1、响应行;
2、响应头;
3、响应空行;
4、响应体;
①协议/版本;
②状态码;
③状态码的描述;
示例:
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(服务器内部出现异常);
头名称:值
1、Content-Type:服务器告诉浏览器本次响应体数据格式以及编码格式;
2、Content-disposition:服务器告诉客户端以什么样的格式打开响应体数据;
值:
默认值in-line,在当前页面内打开;
attachment;filename=XXX:以附件形式打开,文件下载;
传输的数据;
1、格式:HTTP/1.1 200 ok
2、设置状态码:setStatus(int sc)
void setHeader(String name, String value);
使用步骤:
1、获取输出流;
字符输出流:只能输出字符数据,PrintWriter getWriter();
字节输出流:可以删除任意数据,ServletOutputStream getOutputStream();
ServletOutputStream可以直接当作OutputStream使用;
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、转发是异次请求;
①相对路径——通过相对路径不可以确定唯一的资源;
如:./index.html
不以/开头,以.开头;当前目录./可以省略;
规则:找到当前资源与目标资源之间的相对位置关系;
./:代表当前目录;../:代表上级目录;
②绝对路径——通过绝对路径可以确定唯一的资源;
如:http://localhost:8080/my——可省略为/my
以/开头的路径;
JSP推荐使用绝对路径;
规则:判断定义的路径是给谁用的(判断请求源);
给浏览器用:需要加虚拟目录(项目的访问路径);
推荐-动态获取虚拟目录,防止虚拟目录更改的时候改的代码太多:
request.getContextPath();
给服务器用:不需要加虚拟目录;
转发是给服务器用的;
第一步:获取输出流;
第二步:将数据输出到浏览器;
代码演示(内含解决中文乱码问题):
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>");
}
}
第一步:获取输出流;
第二步:将数据输出到浏览器;
代码演示(内含解决中文乱码问题):
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));
}
}
备注:
输出字节数据到浏览器一般输出的是图片等资源;
图片;
防止而已表单注册;
第一步:创建一个对象,代表内存中的图片;
第二步:美化图片(将图片变成想要的样子);
第三步:将图片在页面中展示;
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());
}
}
<!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>