javabean以及内省技术详解(转)
一、关于javabean
javabean是固定写法的java类
书写格式为:
1)必须有无参构造函数
2)属性必须私有, 我们称为字段
3)提供标准的getter和setter
例: name 字段 的getter: String getName() settter: void setName(String name)
javabean例子:
//快捷键是shift+alt+s
public class User
{
private String name;
private int age;
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;
}
@Override
//为了方便打印,添加一个toString方法
public String toString()
{
return "User [age=" + age + ", name=" + name + "]";
}
}
二、关于 内省
内省是什么?: 通过反射的方式访问javabean的技术
Jdk中的api : PropertyDescriptor类操作Bean的属性
内省的作用:我们可以去实现一种通用性
1.传统的方式去访问javabean
public class Demo1
{
public static void main(String[] args)
{
User user=new User(); user.setName("zhangsan");
user.setAge(19);
System.out.println(user);
} }
2.使用内省的方式来访问javabean
public class Demo1
{
public static void main(String[] args) throws Exception
{
User user=new User();
//创建属性描述器
PropertyDescriptor descriptor=new PropertyDescriptor("name",User.class);
//获得写方法
Method writeMethod=descriptor.getWriteMethod(); //调用写方法
writeMethod.invoke(user, "lisi");
System.out.println(user); } }
3.简化书写,实现通用性。这里写一个通用的方法,让属性名称为一个变量,假如属性名很多的话,得到属性名后,就可以遍历,然后给他们一一的赋值,这就是内省的魅力。
如果不用反射,那么传统的方式是不可能实现通用的。
下面代码实现能够为任何的javabean赋任何的值,只有用内省的方法才可以做的到:
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import cn.itcast.day08.domain.User; public class Demo2 { /**
* @param args
* @throws IntrospectionException
* @throws InvocationTargetException
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
public static void main(String[] args) throws Exception {
// 内省 User user = new User(); setProperty(user, "name", "wangwu");
setProperty(user, "age", 11); System.out.println(user); } // 实现一个通用的方法 为任意的一个javabean的任意属性赋任意值
public static void setProperty(Object bean, String fieldName, Object value) throws Exception {
// 创建属性描述器
PropertyDescriptor descriptor = new PropertyDescriptor(fieldName, bean.getClass()); // 获得 写方法
Method writeMethod = descriptor.getWriteMethod(); // 调用 写方法
writeMethod.invoke(bean, value);
} }
由于内省用起来特别麻烦,Apache组织开发了一套用于操作JavaBean的API,如下详讲:
三、BeanUtils工具包
Apache组织开发了一套用于操作JavaBean的API(内省)
核心类 BeanUtils
setProperty(bean, name, value)
copyProperties(target, source);
可以支持String到8中基本数据类型转换
其他引用数据类型都需要注册转换器 ConvertUtils.register(Converter, Class)
注意:1、要想使用beanutils需要导入外部的jar包:commons-beanutils-1.8.0.jar这个jar包到lib目录里面
2、BeanUtils要想使用,还需要导入一个log的jar包:commons-logging.jar
下面我们来看看BeanUtils的魅力:
使用BeanUtils来格式化日期
1.javabean
package cn.itcast.day08.domain; import java.util.Date; // 一个javabean 是否有name属性取决于是否getter或setter方法
public class User { private String name; // 字段 private int age; private Date birthday; 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;
} public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} @Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
} }
2.beanutils
package cn.itcast.day08.introspector; import java.lang.reflect.InvocationTargetException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;
import org.apache.commons.beanutils.converters.DateConverter;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter; import cn.itcast.day08.domain.User; public class Demo3 { public static void main(String[] args) throws Exception { User user = new User(); String name = "zhangsan";
String age = "19";
String birthday = "19801122";
// 11/22/1980 1980 11 22 // 注册一个转换器
/* 使用匿名内部类来注册转换器
ConvertUtils.register(new Converter() { public Object convert(Class beanClass, Object value) {
// String -- Date
String birthday = (String) value;
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
try {
return sdf.parse(birthday);
} catch (ParseException e) {
return null;
}
}
}, Date.class);
*/
DateConverter converter = new DateConverter();
converter.setPatterns(new String[]{"yyyy-MM-dd","yyyyMMdd","MM/dd/yyyy"});
ConvertUtils.register(converter, Date.class); String fieldName = "name";
BeanUtils.setProperty(user, fieldName, name);
BeanUtils.setProperty(user, "age", age);
BeanUtils.setProperty(user, "birthday", birthday); System.out.println(user);
System.out.println(user.getBirthday().toLocaleString()); } }
四. WebUtils 工具类
实现任何request提交的表单封装到对应的javabean
1.用户注册jsp页面:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head> <title>用户注册表单</title> </head> <body style="text-align: center;">
<form action="/myday08/servlet2" method="post" >
<table border="1" width="600px">
<tr>
<td>用户名</td>
<td>
<input type="text" name="name" />
</td>
</tr> <tr>
<td>年龄</td>
<td>
<input type="text" name="age" />
</td>
</tr>
<tr>
<td>出生日期</td>
<td>
<input type="text" name="birthday" />
</td>
</tr> <tr>
<td>
<input type="reset" value="重置" />
</td>
<td>
<input type="submit" value="用户注册" />
</td>
</tr>
</table>
</form>
</body>
</html>
2.写一个工具类,把request里面所有的参数全部封装到javabean中去:
package cn.itcast.day08.util; import java.lang.reflect.InvocationTargetException;
import java.sql.Date;
import java.util.Enumeration; import javax.servlet.http.HttpServletRequest; import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.DateConverter; public class WebUtils
{
private WebUtils(){} //定义一个通用工具方法,将请求参数封装到javabean
public static Object request2bean(HttpServletRequest request,Class beanClass){ try{
Object bean=beanClass.newInstance();
// 获得所有请求参数名
Enumeration names = request.getParameterNames();
//注册日期转换器
DateConverter converter=new DateConverter();
converter.setPattern("yyyy-MM-dd");
ConvertUtils.register(converter, Date.class); //遍历
while(names.hasMoreElements()){
// 获得一个参数名
String name = (String)names.nextElement();
// 获得参数名对应的参数值
String value = request.getParameter(name);
//将参数名作为属性名 将参数值作为属性值,通过beanutils工具实现属性的封装 BeanUtils.setProperty(bean, name, value);
}
return bean;
}catch (Exception e)
{
throw new RuntimeException(e);
}//异常要抓下来,不能抛给servlet,把编译时异常包装称运行时异常 }
}
3.写一个servlet页面,注意查看导入的包名称!分清关系
package cn.itcast.day08.web.servlet; import java.io.IOException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import cn.itcast.day08.domain.User;
import cn.itcast.day08.util.WebUtils; public class Servlet2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 表单提交的参数封装到javabean
User bean = WebUtils.request2Bean(request, User.class); System.out.println(bean);
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
} }
jsp这块的重点为:
1. jsp运行原理(会被翻译成servlet)
2. jsp脚本表达式和脚本片段
3. jsp九大隐式对象
4. web开发的四个域对象
5. 内省
beanUtils工具的使用
使用
javabean以及内省技术详解(转)的更多相关文章
- Java基础-反射(reflect)技术详解
Java基础-反射(reflect)技术详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.类加载器 1>.JVM 类加载机制 如下图所示,JVM类加载机制分为五个部分 ...
- 《Tomcat与Java Web开发技术详解》思维导图
越想构建上层建筑,就越觉得底层基础很重要.补课系列. 书是良心书,就是太基础了,正适合补课. [纯文字版] Tomcat与Java Web开发技术详解 Servlet Servlet的生命周期 初始化 ...
- 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
- 「视频直播技术详解」系列之七:直播云 SDK 性能测试模型
关于直播的技术文章不少,成体系的不多.我们将用七篇文章,更系统化地介绍当下大热的视频直播各环节的关键技术,帮助视频直播创业者们更全面.深入地了解视频直播技术,更好地技术选型. 本系列文章大纲如下: ...
- 手游录屏直播技术详解 | 直播 SDK 性能优化实践
在上期<直播推流端弱网优化策略 >中,我们介绍了直播推流端是如何优化的.本期,将介绍手游直播中录屏的实现方式. 直播经过一年左右的快速发展,衍生出越来越丰富的业务形式,也覆盖越来越广的应用 ...
- 《CDN技术详解》 - CDN知多少?
开发时间久了,就会接触到性能和并发方面的问题,如果说,在自己还是菜鸟的时候完全不用理会这种问题或者说有其他的高手去处理这类问题,那么,随着经验的丰富起来,自己必须要独立去处理了.或者,知道思路也行,毕 ...
- Comet技术详解:基于HTTP长连接的Web端实时通信技术
前言 一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Ser ...
- SSE技术详解:一种全新的HTML5服务器推送事件技术
前言 一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Ser ...
- Protocol Buffer技术详解(数据编码)
Protocol Buffer技术详解(数据编码) 之前已经发了三篇有关Protocol Buffer的技术博客,其中第一篇介绍了Protocol Buffer的语言规范,而后两篇则分别基于C++和J ...
随机推荐
- IE9、 Firefox、Safari, Chrome的CSS3圆角属性
这篇文章主要是记录一下,微软最新发布的 IE9 浏览器CSS 圆角属性,现在CSS3已经 可以轻松实现跨浏览器的圆角效果,包括Firefox高版本,IE9,Safari,Chrome等高端 浏览器. ...
- Ural1387 Vasya's Dad
Description Vasya's dad is good in maths. Lately his favorite objects have been "beautiful" ...
- Echarts-JAVA
http://www.oschina.net/p/echarts-java http://my.oschina.net/flags/blog/316920
- push 栈顶sp=sp-2 可以把立着的栈,向左侧倒下,那么形态就和反汇编时,内存的形态是一样的。小偏移的字节在前, 大的偏移字节在后
push 栈顶sp=sp-2 可以把立着的栈,向左侧倒下,那么形态就和反汇编时,内存的形态是一样的.小偏移的字节在前, 大的偏移字节在后. 1 2 3 4 5 1 2 3 4 5
- 使用NSURLSession实现下载的进度
- *[codility]GenomicRangeQuery
http://codility.com/demo/take-sample-test/genomicrangequery 这题有点意思.一开始以为是RMQ或者线段树,但这样要O(n*logn).考虑到只 ...
- Android WebView 开发详解(二)
转载请注明出处 http://blog.csdn.net/typename/article/details/39495409 powered by miechal zhao 概览: Androi ...
- Android include和merge标签的使用
在Android布局文件中,某些时候使用include标签会很多的好处1,对于稍微有点复杂的布局界面,将所有布局代码都写在一个xml文件中,界面会显得很冗余,可读性很差,这时可以分开使用include ...
- -_-#【减少 DOM 访问】缓存已经访问过的元素
Minimize DOM Access Cache references to accessed elements 选择器查询是开销很大的方法.所以,使用选择器的次数应该越少越好,并且尽可能缓存选中的 ...
- MongoDB实战开发 【零基础学习,附完整Asp.net示例】
MongoDB实战开发 [零基础学习,附完整Asp.net示例] 阅读目录 开始 下载MongoDB,并启动它 在C#使用MongoDB 重构(简化)代码 使用MongoDB的客户端查看数据 使用Mo ...