- 浏览: 2888453 次
- 性别:
- 来自: 武汉
-
文章分类
- 全部博客 (1173)
- 名言警句 (5)
- 心情随笔 (50)
- 数据库 (57)
- Java基础 (241)
- J2EE框架 (91)
- 数据结构 (12)
- 程序设计 (21)
- WEB技术 (128)
- 网络日志 (12)
- IT资讯 (247)
- linux (64)
- solaris (2)
- 其它 (143)
- WebService (4)
- 日语学习 (2)
- 机器人 (5)
- Android (5)
- cgywin (3)
- Game (1)
- DWR (1)
- spring (8)
- canvas (1)
- Guava (3)
- Modbus (5)
- 测试 (6)
- mongodb (9)
- Quartz (2)
- Cron (1)
- windows (2)
- 持续集成 (1)
- bootstrap (3)
- 结对编程 (1)
- nodejs (1)
- Netty (1)
- 安全 (3)
- webstorm (2)
- sparkline (1)
- Job (1)
- git (3)
- Maven (3)
- knockout (5)
- jquery (1)
- bower (1)
- docker (1)
- confluence (4)
- wiki (1)
- GoogleMap (1)
- jekyll (10)
- ruby (2)
- npm (3)
- browserify (1)
- gulp (3)
- openwrt (1)
- discuz (3)
- 输入法 (1)
- JPA (1)
- eclipse (2)
- IntelliJ (1)
- css (1)
- 虚拟机 (1)
- 操作系统 (1)
- azkaban (2)
- scrum (1)
最新评论
-
pangxiea_:
你好, 想请问一下 Linux下 这么使用rxtxcomm 在 ...
使用Java进行串口通信 -
abababudei:
请教一下,这个您是怎么解决的:/dev/ttyS2enteri ...
Java应用程序的MODBUS通讯 -
xuniverse:
hannibal005 写道楼主,我问下 request.se ...
用javascript与java进行RSA加密与解密 -
atxkm:
找了一下午,终于找到了
gulp 拷贝文件时如何移除文件目录结构 -
kalogen:
gtczr 写道非常感谢,经过我自己的修改,已经完美实现。发出 ...
用javascript与java进行RSA加密与解密
一、概述
第一次看到BeanUtils包,是在Struts项目中,作为Struts一个工具来使用的,
估计功能越弄越强,就移到Common项目中了吧。
BeanUtils一共有四个package:
org.apache.commons.beanutils
org.apache.commons.beanutils.converters
org.apache.commons.beanutils.locale
org.apache.commons.beanutils.locale.converters
后三个包主要是用于数据的转换,围绕着一个Converter接口,该接口只有一个方法:
java.lang.Object convert(java.lang.Class type, java.lang.Object value) ,
用于将一个value转换成另一个类型为type的Object。在一些自动化的应用中应该会有用。
这里不作评论,以后有兴趣了,或者觉得有用了,再行研究。
这里只讲第一个包。
二、测试用的Bean
在开始所有的测试之前,我写了一个简单的Bean,以便于测试,代码如下:
三、BeanUtils
这是一个主要应用于Bean的Util(呵呵,这个解释很绝吧),以下是其中几个方法的例子
//static java.util.Map describe(java.lang.Object bean)
//这个方法返回一个Object中所有的可读属性,并将属性名/属性值放入一个Map中,另外还有
//一个名为class的属性,属性值是Object的类名,事实上class是java.lang.Object的一个属性
注意到所有Map中的key/value都是String,而不管object中实际的值是多少。
与此对应的还有static void populate(java.lang.Object bean, java.util.Map properties)
用于将刚才describe出的Map再装配成一个对象。
再看这样一段代码
曹晓钢也许还记得,为了取一个不确定对象的property,着实花了不少时间,
难度不大,但要做到100%的正确,仍然需要付出很大的精力。
BeanUtils中还有一个方法:
static void copyProperties(java.lang.Object dest, java.lang.Object orig)
它真是太有用,还记得struts中满天飞的都是copyProperties,我甚至怀疑整个BeanUtils最初
是不是因为这个方法的需求才写出来的。
它将对象orig中的属性复制到dest中去。
四、PropertyUtils
这个类和BeanUtils类很多的方法在参数上都是相同的,但返回值不同。
BeanUtils着重于"Bean",返回值通常是String,而PropertyUtils着重于属性,
它的返回值通常是Object。
五、ConstructorUtils
这个类中的方法主要分成两种,一种是得到构造方法,一种是创建对象。
事实上多数时候得到构造方法的目的就是创建对象,这里只介绍一下创建对象。
//static java.lang.Object ConstructorUtils.invokeConstructor
//(java.lang.Class klass, java.lang.Object[] args)
//根据一个java.lang.Class以及相应的构造方法的参数,创建一个对象。
Object obj=ConstructorUtils.invokeConstructor(Month.class, {new Integer(1), "Jan"});
Month month=(Month)obj;
try {
System.out.println(BeanUtils.getProperty(month,"value"));
} catch (Exception e) {
e.printStackTrace();
}
输出证明,构造方法的调用是成功的。
如果需要强制指定构造方法的参数类型,可以这样调用:
Object[] args={new Integer(1), "Jan"};
Class[] argsType={int.class, String.class};
Object obj;
obj = ConstructorUtils.invokeExactConstructor(Month.class, args, argsType);
Month month=(Month)obj;
System.out.println(BeanUtils.getProperty(month,"value"));
argsType指定了参数的类型。
六、ConstructorUtils补遗
创建对象还有一个方法:invokeExactConstructor,该方法对参数要求
更加严格,传递进去的参数必须严格符合构造方法的参数列表。
例如:
Object[] args={new Integer(1), "Jan"};
Class[] argsType={int.class, String.class};
Object obj;
//下面这句调用将不会成功,因为args[0]的类型为Integer,而不是int
//obj = ConstructorUtils.invokeExactConstructor(Month.class, args);
//这一句就可以,因为argsType指定了类型。
obj = ConstructorUtils.invokeExactConstructor(Month.class, args, argsType);
Month month=(Month)obj;
System.out.println(BeanUtils.getProperty(month,"value"));
七、MethodUtils
与ConstructorUtils类似,不过调用的时候,通常需要再指定一个method name的参数。
八、DynaClass/DynaBean
这似乎是BeanUtils中最有趣的部分之一了,很简单,简单到光看这两个接口中的方法会不明白
为什么要设计这两个接口。不过看到ResultSetDynaClass后,就明白了。下面是java doc中的代码:
ResultSet rs = ...;
ResultSetDynaClass rsdc = new ResultSetDynaClass(rs);
Iterator rows = rsdc.iterator();
while (rows.hasNext()) {
DynaBean row = (DynaBean) rows.next();
... process this row ...
}
rs.close();
原来这是一个ResultSet的包装器,ResultSetDynaClass实现了DynaClass,它的iterator方法返回一个
ResultSetIterator,则是实现了DynaBean接口。
在获得一个DynaBean之后,我们就可以用
DynaBean row = (DynaBean) rows.next();
System.out.println(row.get("field1")); //field1是其中一个字段的名字
再看另一个类RowSetDynaClass的用法,代码如下:
是不是很有趣?封装了ResultSet的数据,代价是占用内存。如果一个表有10万条记录,rsdc.getRows()
就会返回10万个记录。@_@
需要注意的是ResultSetDynaClass和RowSetDynaClass的不同之处:
1,ResultSetDynaClass是基于Iterator的,一次只返回一条记录,而RowSetDynaClass是基于
List的,一次性返回全部记录。直接影响是在数据比较多时ResultSetDynaClass会比较的快速,
而RowSetDynaClass需要将ResultSet中的全部数据都读出来(并存储在其内部),会占用过多的
内存,并且速度也会比较慢。
2,ResultSetDynaClass一次只处理一条记录,在处理完成之前,ResultSet不可以关闭。
3,ResultSetIterator的next()方法返回的DynaBean其实是指向其内部的一个固定
对象,在每次next()之后,内部的值都会被改变。这样做的目的是节约内存,如果你需要保存每
次生成的DynaBean,就需要创建另一个DynaBean,并将数据复制过去,下面也是java doc中的代码:
事实上DynaClass/DynaBean可以用于很多地方,存储各种类型的数据。自己想吧。嘿嘿。
九、自定义的CustomRowSetDynaClass
两年前写过一个与RowSetDynaClass目标相同的类,不过多一个功能,就是分页,只取需要的数据,
这样内存占用就会减少。
先看一段代码:
在这里用到了一个CustomRowSetDynaClass类,构造方法中增加了page和pageSize两个参数,
这样,不管数据库里有多少条记录,最多只取pageSize条记录,若pageSize==-1,则功能和
RowSetDynaClass一样。这在大多数情况下是适用的。该类的代码如下:
第一次看到BeanUtils包,是在Struts项目中,作为Struts一个工具来使用的,
估计功能越弄越强,就移到Common项目中了吧。
BeanUtils一共有四个package:
org.apache.commons.beanutils
org.apache.commons.beanutils.converters
org.apache.commons.beanutils.locale
org.apache.commons.beanutils.locale.converters
后三个包主要是用于数据的转换,围绕着一个Converter接口,该接口只有一个方法:
java.lang.Object convert(java.lang.Class type, java.lang.Object value) ,
用于将一个value转换成另一个类型为type的Object。在一些自动化的应用中应该会有用。
这里不作评论,以后有兴趣了,或者觉得有用了,再行研究。
这里只讲第一个包。
二、测试用的Bean
在开始所有的测试之前,我写了一个简单的Bean,以便于测试,代码如下:
java 代码
- package test.jakarta.commons.beanutils;
- /**
- * @author SonyMusic
- *
- */
- public class Month {
- private int value;
- private String name;
- private int[] days={11,22,33,44,55};
- public Month(int v, String n){
- value=v;
- name=n;
- }
- /**
- * Returns the name.
- * @return String
- */
- public String getName() {
- return name;
- }
- /**
- * Returns the value.
- * @return int
- */
- public int getValue() {
- return value;
- }
- /**
- * Sets the name.
- * @param name The name to set
- */
- public void setName(String name) {
- this.name = name;
- }
- /**
- * Sets the value.
- * @param value The value to set
- */
- public void setValue(int value) {
- this.value = value;
- }
- /**
- * @see java.lang.Object#toString()
- */
- public String toString() {
- return value+"("+name+")";
- }
- public int[] getDays() {
- return days;
- }
- public void setDays(int[] is) {
- days = is;
- }
- }
这是一个主要应用于Bean的Util(呵呵,这个解释很绝吧),以下是其中几个方法的例子
//static java.util.Map describe(java.lang.Object bean)
//这个方法返回一个Object中所有的可读属性,并将属性名/属性值放入一个Map中,另外还有
//一个名为class的属性,属性值是Object的类名,事实上class是java.lang.Object的一个属性
java 代码
- Month month=new Month(1, "Jan");
- try {
- Map map=BeanUtils.describe(month);
- Set keySet=map.keySet();
- for (Iterator iter = keySet.iterator(); iter.hasNext();) {
- Object element = (Object) iter.next();
- System.out.println("KeyClass:"+element.getClass().getName());
- System.out.println("ValueClass:"+map.get(element).getClass().getName());
- System.out.print(element+"\t");
- System.out.print(map.get(element));
- System.out.println();
- }
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
- }
- 输出为:
- KeyClass:java.lang.String
- ValueClass:java.lang.String
- value 1
- KeyClass:java.lang.String
- ValueClass:java.lang.String
- class class test.jakarta.commons.beanutils.Month
- KeyClass:java.lang.String
- ValueClass:java.lang.String
- name Jan
与此对应的还有static void populate(java.lang.Object bean, java.util.Map properties)
用于将刚才describe出的Map再装配成一个对象。
再看这样一段代码
曹晓钢也许还记得,为了取一个不确定对象的property,着实花了不少时间,
难度不大,但要做到100%的正确,仍然需要付出很大的精力。
java 代码
- //static java.lang.String getProperty(java.lang.Object bean, java.lang.String name)
- Month month=new Month(1, "Jan");
- try {
- System.out.println(BeanUtils.getProperty(month,"value"));
- } catch (Exception e) {
- e.printStackTrace();
- }
- //输出是:1
- 与getProperty类似的还有getIndexedProperty, getMappedProperty,
- 以getIndexedProperty为例:
- Month month=new Month(1, "Jan");
- try {
- System.out.println(BeanUtils.getIndexedProperty(month,"days",1));
- System.out.println(BeanUtils.getIndexedProperty(month,"days[1]"));
- } catch (Exception e) {
- e.printStackTrace();
- }
- 这两个调用是相同的。
BeanUtils中还有一个方法:
static void copyProperties(java.lang.Object dest, java.lang.Object orig)
它真是太有用,还记得struts中满天飞的都是copyProperties,我甚至怀疑整个BeanUtils最初
是不是因为这个方法的需求才写出来的。
它将对象orig中的属性复制到dest中去。
四、PropertyUtils
这个类和BeanUtils类很多的方法在参数上都是相同的,但返回值不同。
BeanUtils着重于"Bean",返回值通常是String,而PropertyUtils着重于属性,
它的返回值通常是Object。
五、ConstructorUtils
这个类中的方法主要分成两种,一种是得到构造方法,一种是创建对象。
事实上多数时候得到构造方法的目的就是创建对象,这里只介绍一下创建对象。
//static java.lang.Object ConstructorUtils.invokeConstructor
//(java.lang.Class klass, java.lang.Object[] args)
//根据一个java.lang.Class以及相应的构造方法的参数,创建一个对象。
Object obj=ConstructorUtils.invokeConstructor(Month.class, {new Integer(1), "Jan"});
Month month=(Month)obj;
try {
System.out.println(BeanUtils.getProperty(month,"value"));
} catch (Exception e) {
e.printStackTrace();
}
输出证明,构造方法的调用是成功的。
如果需要强制指定构造方法的参数类型,可以这样调用:
Object[] args={new Integer(1), "Jan"};
Class[] argsType={int.class, String.class};
Object obj;
obj = ConstructorUtils.invokeExactConstructor(Month.class, args, argsType);
Month month=(Month)obj;
System.out.println(BeanUtils.getProperty(month,"value"));
argsType指定了参数的类型。
六、ConstructorUtils补遗
创建对象还有一个方法:invokeExactConstructor,该方法对参数要求
更加严格,传递进去的参数必须严格符合构造方法的参数列表。
例如:
Object[] args={new Integer(1), "Jan"};
Class[] argsType={int.class, String.class};
Object obj;
//下面这句调用将不会成功,因为args[0]的类型为Integer,而不是int
//obj = ConstructorUtils.invokeExactConstructor(Month.class, args);
//这一句就可以,因为argsType指定了类型。
obj = ConstructorUtils.invokeExactConstructor(Month.class, args, argsType);
Month month=(Month)obj;
System.out.println(BeanUtils.getProperty(month,"value"));
七、MethodUtils
与ConstructorUtils类似,不过调用的时候,通常需要再指定一个method name的参数。
八、DynaClass/DynaBean
这似乎是BeanUtils中最有趣的部分之一了,很简单,简单到光看这两个接口中的方法会不明白
为什么要设计这两个接口。不过看到ResultSetDynaClass后,就明白了。下面是java doc中的代码:
ResultSet rs = ...;
ResultSetDynaClass rsdc = new ResultSetDynaClass(rs);
Iterator rows = rsdc.iterator();
while (rows.hasNext()) {
DynaBean row = (DynaBean) rows.next();
... process this row ...
}
rs.close();
原来这是一个ResultSet的包装器,ResultSetDynaClass实现了DynaClass,它的iterator方法返回一个
ResultSetIterator,则是实现了DynaBean接口。
在获得一个DynaBean之后,我们就可以用
DynaBean row = (DynaBean) rows.next();
System.out.println(row.get("field1")); //field1是其中一个字段的名字
再看另一个类RowSetDynaClass的用法,代码如下:
java 代码
- String driver="com.mysql.jdbc.Driver";
- String url="jdbc:mysql://localhost/2hu?useUnicode=true&characterEncoding=GBK";
- String username="root";
- String password="";
- java.sql.Connection con=null;
- PreparedStatement ps=null;
- ResultSet rs=null;
- try {
- Class.forName(driver).newInstance();
- con = DriverManager.getConnection(url);
- ps=con.prepareStatement("select * from forumlist");
- rs=ps.executeQuery();
- //先打印一下,用于检验后面的结果。
- while(rs.next()){
- System.out.println(rs.getString("name"));
- }
- rs.beforeFirst();//这里必须用beforeFirst,因为RowSetDynaClass只从当前位置向前滚动
- RowSetDynaClass rsdc = new RowSetDynaClass(rs);
- rs.close();
- ps.close();
- List rows = rsdc.getRows();//返回一个标准的List,存放的是DynaBean
- for (int i = 0; i <rows.size(); i++) {
- DynaBean b=(DynaBean)rows.get(i);
- System.out.println(b.get("name"));
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- finally{
- try {
- con.close();
- } catch (Exception e) {
- }
- }
就会返回10万个记录。@_@
需要注意的是ResultSetDynaClass和RowSetDynaClass的不同之处:
1,ResultSetDynaClass是基于Iterator的,一次只返回一条记录,而RowSetDynaClass是基于
List的,一次性返回全部记录。直接影响是在数据比较多时ResultSetDynaClass会比较的快速,
而RowSetDynaClass需要将ResultSet中的全部数据都读出来(并存储在其内部),会占用过多的
内存,并且速度也会比较慢。
2,ResultSetDynaClass一次只处理一条记录,在处理完成之前,ResultSet不可以关闭。
3,ResultSetIterator的next()方法返回的DynaBean其实是指向其内部的一个固定
对象,在每次next()之后,内部的值都会被改变。这样做的目的是节约内存,如果你需要保存每
次生成的DynaBean,就需要创建另一个DynaBean,并将数据复制过去,下面也是java doc中的代码:
java 代码
- ArrayList results = new ArrayList(); // To hold copied list
- ResultSetDynaClass rsdc = ...;
- DynaProperty properties[] = rsdc.getDynaProperties();
- BasicDynaClass bdc =
- new BasicDynaClass("foo", BasicDynaBean.class,
- rsdc.getDynaProperties());
- Iterator rows = rsdc.iterator();
- while (rows.hasNext()) {
- DynaBean oldRow = (DynaBean) rows.next();
- DynaBean newRow = bdc.newInstance();
- PropertyUtils.copyProperties(newRow, oldRow);
- results.add(newRow);
- }
九、自定义的CustomRowSetDynaClass
两年前写过一个与RowSetDynaClass目标相同的类,不过多一个功能,就是分页,只取需要的数据,
这样内存占用就会减少。
先看一段代码:
java 代码
- String driver="com.mysql.jdbc.Driver";
- String url="jdbc:mysql://localhost/2hu?useUnicode=true&characterEncoding=GBK";
- String username="root";
- String password="";
- java.sql.Connection con=null;
- PreparedStatement ps=null;
- ResultSet rs=null;
- try {
- Class.forName(driver).newInstance();
- con = DriverManager.getConnection(url);
- ps=con.prepareStatement("select * from forumlist order by name");
- rs=ps.executeQuery();
- /*
- while(rs.next()){
- System.out.println(rs.getString("name"));
- }
- rs.beforeFirst();
- */
- //第二个参数表示第几页,第三个参数表示页的大小
- CustomRowSetDynaClass rsdc = new CustomRowSetDynaClass(rs, 2, 5);
- //RowSetDynaClass rsdc = new RowSetDynaClass(rs);
- rs.close();
- ps.close();
- List rows = rsdc.getRows();
- for (int i = 0; i <rows.size(); i++) {
- DynaBean b=(DynaBean)rows.get(i);
- System.out.println(b.get("name"));
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- finally{
- try {
- con.close();
- } catch (Exception e) {
- }
- }
这样,不管数据库里有多少条记录,最多只取pageSize条记录,若pageSize==-1,则功能和
RowSetDynaClass一样。这在大多数情况下是适用的。该类的代码如下:
java 代码
- package test.jakarta.commons.beanutils;
- import java.io.*;
- import java.sql.*;
- import java.util.*;
- import org.apache.commons.beanutils.*;
- /**
- * @author SonyMusic
- *
- * To change this generated comment edit the template variable "typecomment":
- * Window>Preferences>Java>Templates.
- * To enable and disable the creation of type comments go to
- * Window>Preferences>Java>Code Generation.
- */
- public class CustomRowSetDynaClass implements DynaClass, Serializable {
- // ----------------------------------------------------------- Constructors
- /**
- * <p>Construct a new {@link RowSetDynaClass} for the specified
- * <code>ResultSet</code>. The property names corresponding
- * to column names in the result set will be lower cased.</p>
- *
- * @param resultSet The result set to be wrapped
- *
- * @exception NullPointerException if <code>resultSet</code>
- * is <code>null</code>
- * @exception SQLException if the metadata for this result set
- * cannot be introspected
- */
- public CustomRowSetDynaClass(ResultSet resultSet) throws SQLException {
- this(resultSet, true);
- }
- /**
- * <p>Construct a new {@link RowSetDynaClass} for the specified
- * <code>ResultSet</code>. The property names corresponding
- * to the column names in the result set will be lower cased or not,
- * depending on the specified <code>lowerCase</code> value.</p>
- *
- * <p><strong>WARNING</strong> - If you specify <code>false</code>
- * for <code>lowerCase</code>, the returned property names will
- * exactly match the column names returned by your JDBC driver.
- * Because different drivers might return column names in different
- * cases, the property names seen by your application will vary
- * depending on which JDBC driver you are using.</p>
- *
- * @param resultSet The result set to be wrapped
- * @param lowerCase Should property names be lower cased?
- *
- * @exception NullPointerException if <code>resultSet</code>
- * is <code>null</code>
- * @exception SQLException if the metadata for this result set
- * cannot be introspected
- */
- public CustomRowSetDynaClass(ResultSet resultSet, boolean lowerCase)
- throws SQLException {
- this(resultSet, 1, -1, lowerCase);
- }
- public CustomRowSetDynaClass(
- ResultSet resultSet,
- int page,
- int pageSize,
- boolean lowerCase)
- throws SQLException {
- if (resultSet == null) {
- throw new NullPointerException();
- }
- this.lowerCase = lowerCase;
- this.page = page;
- this.pageSize = pageSize;
- introspect(resultSet);
- copy(resultSet);
- }
- public CustomRowSetDynaClass(ResultSet resultSet, int page, int pageSize)
- throws SQLException {
- this(resultSet, page, pageSize, true);
- }
- // ----------------------------------------------------- Instance Variables
- /**
- * <p>Flag defining whether column names should be lower cased when
- * converted to property names.</p>
- */
- protected boolean lowerCase = true;
- protected int page = 1;
- protected int pageSize = -1;
- /**
- * <p>The set of dynamic properties that are part of this
- * {@link DynaClass}.</p>
- */
- protected DynaProperty properties[] = null;
- /**
- * <p>The set of dynamic properties that are part of this
- * {@link DynaClass}, keyed by the property name. Individual descriptor
- * instances will be the same instances as those in the
- * <code>properties</code> list.</p>
- */
- protected Map propertiesMap = new HashMap();
- /**
- * <p>The list of {@link DynaBean}s representing the contents of
- * the original <code>ResultSet</code> on which this
- * {@link RowSetDynaClass} was based.</p>
- */
- protected List rows = new ArrayList();
- // ------------------------------------------------------ DynaClass Methods
- /**
- * <p>Return the name of this DynaClass (analogous to the
- * <code>getName()</code> method of <code>java.lang.Class</code), which
- * allows the same <code>DynaClass</code> implementation class to support
- * different dynamic classes, with different sets of properties.</p>
- */
- public String getName() {
- return (this.getClass().getName());
- }
- /**
- * <p>Return a property descriptor for the specified property, if it
- * exists; otherwise, return <code>null</code>.</p>
- *
- * @param name Name of the dynamic property for which a descriptor
- * is requested
- *
- * @exception IllegalArgumentException if no property name is specified
- */
- public DynaProperty getDynaProperty(String name) {
- if (name == null) {
- throw new IllegalArgumentException("No property name specified");
- }
- return ((DynaProperty) propertiesMap.get(name));
- }
- /**
- * <p>Return an array of <code>ProperyDescriptors</code> for the properties
- * currently defined in this DynaClass. If no properties are defined, a
- * zero-length array will be returned.</p>
- */
- public DynaProperty[] getDynaProperties() {
- return (properties);
- }
- /**
- * <p>Instantiate and return a new DynaBean instance, associated
- * with this DynaClass. <strong>NOTE</strong> - This operation is not
- * supported, and throws an exception.</p>
- *
- * @exception IllegalAccessException if the Class or the appropriate
- * constructor is not accessible
- * @exception InstantiationException if this Class represents an abstract
- * class, an array class, a primitive type, or void; or if instantiation
- * fails for some other reason
- */
- public DynaBean newInstance()
- throws IllegalAccessException, InstantiationException {
- throw new UnsupportedOperationException("newInstance() not supported");
- }
- // --------------------------------------------------------- Public Methods
- /**
- * <p>Return a <code>List</code> containing the {@link DynaBean}s that
- * represent the contents of each <code>Row</code> from the
- * <code>ResultSet</code> that was the basis of this
- * {@link RowSetDynaClass} instance. These {@link DynaBean}s are
- * disconnected from the database itself, so there is no problem with
- * modifying the contents of the list, or the values of the properties
- * of these {@link DynaBean}s. However, it is the application's
- * responsibility to persist any such changes back to the database,
- * if it so desires.</p>
- */
- public List getRows() {
- return (this.rows);
- }
- // ------------------------------------------------------ Protected Methods
- /**
- * <p>Copy the column values for each row in the specified
- * <code>ResultSet</code> into a newly created {@link DynaBean}, and add
- * this bean to the list of {@link DynaBean}s that will later by
- * returned by a call to <code>getRows()</code>.</p>
- *
- * @param resultSet The <code>ResultSet</code> whose data is to be
- * copied
- *
- * @exception SQLException if an error is encountered copying the data
- */
- protected void copy(ResultSet resultSet) throws SQLException {
- int abs = 0;
- int rowsCount = 0;
- int currentPageRows = 0;
- resultSet.last();
- rowsCount = resultSet.getRow();
- if (pageSize != -1) {
- int totalPages = (int) Math.ceil(((double) rowsCount) / pageSize);
- if (page > totalPages)
- page = totalPages;
- if (page < 1)
- page = 1;
- abs = (page - 1) * pageSize;
- //currentPageRows=(page==totalPages?rowsCount-pageSize*(totalPages-1):pageSize);
- } else
- pageSize = rowsCount;
- if (abs == 0)
- resultSet.beforeFirst();
- else
- resultSet.absolute(abs);
- //int
- while (resultSet.next() && ++currentPageRows <= pageSize) {
- DynaBean bean = new BasicDynaBean(this);
- for (int i = 0; i < properties.length; i++) {
- String name = properties[i].getName();
- bean.set(name, resultSet.getObject(name));
- }
- rows.add(bean);
- }
- }
- /**
- * <p>Introspect the metadata associated with our result set, and populate
- * the <code>properties</code> and <code>propertiesMap</code> instance
- * variables.</p>
- *
- * @param resultSet The <code>resultSet</code> whose metadata is to
- * be introspected
- *
- * @exception SQLException if an error is encountered processing the
- * result set metadata
- */
- protected void introspect(ResultSet resultSet) throws SQLException {
- // Accumulate an ordered list of DynaProperties
- ArrayList list = new ArrayList();
- ResultSetMetaData metadata = resultSet.getMetaData();
- int n = metadata.getColumnCount();
- for (int i = 1; i <= n; i++) { // JDBC is one-relative!
- DynaProperty dynaProperty = createDynaProperty(metadata, i);
- if (dynaProperty != null) {
- list.add(dynaProperty);
- }
- }
发表评论
-
30个你必须熟记的CSS选择器
2015-06-27 08:44 1788你学会了基本的id,class类选择器和descendant ... -
40 个超棒的免费 Bootstrap HTML5 网站模板
2015-04-11 16:12 2908Bootstrap 是快速开发Web应用程序的前端工具包。它 ... -
必须记住的 30 类 CSS 选择器
2014-12-30 08:56 1018大概大家读知道`id`,`class`以及`descenda ... -
如何防止google map 加载Roboto字体
2014-12-26 13:16 894思路是在window.onload中当检测到加载Roboto ... -
JavaScript Equality Table
2014-12-09 16:17 1911Tables displaying the issue: ... -
WebStorm快捷键收集
2014-11-25 10:40 30221、webstorm快捷键: IntelliJ-Idea ... -
webstorm 常用快捷键
2014-08-25 15:58 958常用快捷键 Ctrl+/ 或 Ctrl+Shift+/ ... -
how to change bower components folder
2014-08-25 09:26 7881. create the file bower.json ... -
程序员应该知道的 13 个设计技巧
2014-07-14 09:34 758开发你的美感 … 我最喜欢的站点是: a ... -
tomcat7中tomcat-users.xml配置
2014-04-26 15:48 724将以下代码加入tomcat-users.xml中,即可登录t ... -
tomcat-maven-plugin的使用
2014-03-04 10:52 895环境: Ubuntu 8.10, tomcat6, ma ... -
Jsp动态显示服务器时间
2013-12-31 13:16 1093<script language=" ... -
前端工程与性能优化(下):静态资源管理与模板框架
2013-09-25 08:57 1007本系列文章从一个全新的视角来思考web性能优化与前端工程之间 ... -
前端工程与性能优化(上):静态资源版本更新与缓存
2013-09-20 09:35 985每个参与过开发企业级 ... -
Handy and Useful jQuery Snippets for Developers
2013-09-18 15:43 822jQuery is a cross browser Java ... -
11 个用来创建图形和图表的 JavaScript 工具包
2013-08-13 07:00 1381Aristochart DEMO || Download ... -
Jive 论坛 license破解
2013-08-03 13:27 13441. 找到文件 \admin\global.jspf 注释 ... -
2012年度最佳Web前端开发工具和框架
2013-01-10 10:52 17892012年,Web 开发领域继续在快速的发展,HTML5 ... -
为网页设计师准备的 10 个色彩方案生成器
2012-02-22 23:01 1229Pictaculous ColorExplo ... -
13个最常用的CSS和HTML快速开发工具
2012-02-21 08:18 12871)CleverCSS CleverCSS ...
相关推荐
"jakarta-taglibs-standard-1.1.2.rar"是一个包含Jakarta Taglibs标准版1.1.2版本的压缩包文件,这个版本在当时是广泛使用的。下面我们将深入探讨Jakarta Taglibs、标准标签库以及它们与Struts框架的关系。 Jakarta...
在"jakarta-struts-1.1.zip"这个压缩包中,包含了Jakarta Struts 1.1版本的核心组件和相关资源。 `struts-documentation.war`文件是一个预打包的Web应用,通常用于部署到Servlet容器,如Tomcat或Jetty。这个WAR文件...
而`jakarta-oro-2.0.8`目录可能包含了完整的源代码、API文档和其他相关资源,如构建脚本和测试用例,这些都是深入学习和调试的重要资料。 总的来说,Jakarta ORO 2.0.8提供了与Perl 5兼容的正则表达式引擎,对于...
apache-jakarta-commons-codec.jar apache-jakarta-commons-collections.jar apache-jakarta-commons-discovery.jar apache-jakarta-commons-email.jar apache-jakarta-commons-fileupload.jar apache-jakarta-...
而"jakarta-oro-2.0.1"可能是一个包含源码、jar文件和其他资源的目录,供开发者研究和集成到他们的项目中。 总的来说,Jakarta ORO 是Java开发者处理正则表达式的强大工具,它的灵活性和高效性使其成为许多项目的...
【Jakarta Tomcat 5.0.28 免安装版详解】 Jakarta Tomcat,由Apache软件基金会开发,是一个开源的、免费的应用服务器,它主要用于处理Java Servlets和JavaServer Pages (JSP)。Tomcat 5.0.28是这个系列的一个重要...
jakarta-httpcore-4.0-alpha2.jar用于移动开发的包
jakarta-commons 相关依赖包,文件列表: commons-attributes-api.jar commons-attributes-compiler.jar commons-beanutils.jar commons-codec.jar commons-collections.jar commons-dbcp.jar commons-digester.jar ...
要使用jakarta-taglibs-standard-1.1.2.zip,首先需要将其解压缩,然后将jar文件添加到项目的类路径中。接着,在JSP页面上通过`<%@ taglib %> `指令导入所需的JSTL库。例如,导入Core库的指令为: ```jsp ``` ...
《Jakarta Taglibs Standard 1.1.2:Java Web开发中的标签库解析》 Jakarta Taglibs Standard 1.1.2是Java Web开发中的一款重要组件,它为开发者提供了一套标准的标签库,使得在JSP(JavaServer Pages)页面中编写...
压缩包中的"jakarta-oro-2.0.8.jar"是Jakarta ORO库的JAR文件,可以直接引入Java项目中使用。而"commons-net-1.4.1.zip"则是Apache Commons Net库的源代码压缩包,通常用于开发人员查看源代码、调试或自定义库的功能...
`jakarta-oro-2.0.8.jar`则是Jakarta ORO(Oracle Regular Expressions for Java)库,它提供了Perl 5风格的正则表达式支持。虽然在FTP操作中不是必需的,但它在处理字符串时非常有用,比如在解析FTP服务器返回的...
jakarta-servletapi-5.rar jakarta-servletapi-5.rar jakarta-servletapi-5.rar jakarta-servletapi-5.rar jakarta-servletapi-5.rar jakarta-servletapi-5.rar jakarta-servletapi-5.rar
使用commons的net包进行ftp链接,commons-net包封装了一些常见的网络包:ftp,smtp,pop3等 相关包:commons-net-1.4.1.jar ; commons-io-1.4.jar;jakarta-oro-2.0.8.jar
《 jakarta-tomcat-4.0-b1.zip:深入解析Tomcat与JSTL的融合应用》 在IT行业中,服务器端应用的部署和运行是至关重要的环节,而Apache Tomcat作为Java Servlet和JavaServer Pages(JSP)的开源Web应用服务器,一直...
在给定的压缩包`jakarta-taglibs-standard-1.1.2`中,我们主要关注的是JSTL 1.1.2版本。 **JSTL的核心组件包括:** 1. **Core标签库(c:tags)**:这是最基础的库,包含一系列用于控制流程(如if、choose、when、...
jar包,亲测可用
总的来说,Jakarta Taglibs虽然已经不再是最新的技术,但它仍然是Java Web开发历史上的一个重要里程碑,对于希望深入理解Web开发技术的程序员来说,仍然是一个值得学习和研究的对象。通过探索和实践,我们可以从中...
commons-beanutils-1.8.3.rar官方正版免费版,BeanUtils主要提供了对于JavaBean进行各种操作。 个包主要提供用于操作JavaBean的工具类,Jakarta-Common-BeanUtils的主要功能都在这个包里实现。