??xml version="1.0" encoding="utf-8" standalone="yes"?>高清欧美日韩,久久精品国产99国产精品澳门,日韩av网站在线观看http://www.aygfsteel.com/taonlyt/archive/2007/01/01/91318.html之?/dc:creator>之?/author>Mon, 01 Jan 2007 13:24:00 GMThttp://www.aygfsteel.com/taonlyt/archive/2007/01/01/91318.htmlhttp://www.aygfsteel.com/taonlyt/comments/91318.htmlhttp://www.aygfsteel.com/taonlyt/archive/2007/01/01/91318.html#Feedback0http://www.aygfsteel.com/taonlyt/comments/commentRss/91318.htmlhttp://www.aygfsteel.com/taonlyt/services/trackbacks/91318.html一、反的概念 Q?/h3>
反射的概忉|由Smith?982q首ơ提出的Q主要是指程序可以访问、检和修改它本w状态或行ؓ的一U能力。这一概念的提出很快引发了计算机科学领域关于应用反性的研究。它首先被程序语a的设计领域所采用,q在Lisp和面向对象方面取得了成W。其中LEAD/LEAD++ 、OpenC++ 、MetaXa和OpenJava{就是基于反机制的语言。最q,反射机制也被应用C视窗pȝ、操作系l和文gpȝ中?

反射本nq不是一个新概念Q它可能会我们联想到光学中的反概念,管计算机科学赋予了反射概念新的含义Q但是,从现象上来说Q它们确实有某些盔R之处,q些有助于我们的理解。在计算机科学领域,反射是指一cd用,它们能够自描q和自控制。也是_q类应用通过采用某种机制来实现对自己行ؓ的描qͼself-representationQ和监测QexaminationQ,q能Ҏ自n行ؓ的状态和l果Q调整或修改应用所描述行ؓ的状态和相关的语义。可以看出,同一般的反射概念相比Q计机U学领域的反不单单指反本w,q包括对反射l果所采取的措施。所有采用反机制的pȝQ即反射pȝQ都希望使系l的实现更开放。可以说Q实C反射机制的系l都h开放性,但具有开放性的pȝq不一定采用了反射机制Q开放性是反射pȝ的必要条件。一般来_反射pȝ除了满开放性条件外q必L_因连接(Causally-connectedQ。所谓原因连接是指对反射pȝ自描q的改变能够立即反映到系l底层的实际状态和行ؓ上的情况Q反之亦然。开放性和原因q接是反系l的两大基本要素?3700863760

Java中,反射是一U强大的工具。它使您能够创徏灉|的代码,q些代码可以在运行时装配Q无需在组件之间进行源代表链接。反允许我们在~写与执行时Q我们的程序代码能够接入装载到JVM中的cȝ内部信息Q而不是源代码中选定的类协作的代码。这使反成为构建灵zȝ应用的主要工兗但需注意的是Q如果用不当,反射的成本很高?/div>

二、Java中的cd:


Reflection ?Java E序开发语a的特征之一Q它允许q行中的 Java E序对自w进行检查,或者说“自审”,q能直接操作E序的内部属性。Java 的这一能力在实际应用中也许用得不是很多Q但是在其它的程序设计语a中根本就不存在这一Ҏ。例如,Pascal、C 或?C++ 中就没有办法在程序中获得函数定义相关的信息?/div>
1Q检类Q?/div>
1.1 reflection的工作机?/div>
考虑下面q个单的例子Q让我们看看 reflection 是如何工作的?/div>
import java.lang.reflect.*;
public class DumpMethods {
   public static void main(String args[]) {
        try {
            Class c = Class.forName(args[0]);
            Method m[] = c.getDeclaredMethods();
            for (int i = 0; i < m.length; i++)
                System.out.println(m[i].toString());
        } catch (Throwable e) {
            System.err.println(e);
        }
    }
}

按如下语句执行:

java DumpMethods java.util.Stack

它的l果输出为:

public java.lang.Object java.util.Stack.push(java.lang.Object)

public synchronized java.lang.Object java.util.Stack.pop()

public synchronized java.lang.Object java.util.Stack.peek()

public boolean java.util.Stack.empty()

public synchronized int java.util.Stack.search(java.lang.Object)

q样列Zjava.util.Stack cȝ各方法名以及它们的限制符和返回类型?/div>
q个E序使用 Class.forName 载入指定的类Q然后调?getDeclaredMethods 来获取这个类中定义了的方法列表。java.lang.reflect.Methods 是用来描q某个类中单个方法的一个类?/div>
1.2 Javacd中的主要方?/div>
对于以下三类lg中的M一cL?-- 构造函数、字D和Ҏ -- java.lang.Class 提供四种独立的反调用,以不同的方式来获得信息。调用都遵@一U标准格式。以下是用于查找构造函数的一l反调用:

l         Constructor getConstructor(Class[] params) -- 获得使用Ҏ的参数类型的公共构造函敎ͼ

l         Constructor[] getConstructors() -- 获得cȝ所有公共构造函?/div>
l         Constructor getDeclaredConstructor(Class[] params) -- 获得使用特定参数cd的构造函?与接入别无?

l         Constructor[] getDeclaredConstructors() -- 获得cȝ所有构造函?与接入别无?

获得字段信息的Class 反射调用不同于那些用于接入构造函数的调用Q在参数cd数组中用了字段名:

l         Field getField(String name) -- 获得命名的公共字D?/div>
l         Field[] getFields() -- 获得cȝ所有公共字D?/div>
l         Field getDeclaredField(String name) -- 获得cd明的命名的字D?/div>
l         Field[] getDeclaredFields() -- 获得cd明的所有字D?

用于获得Ҏ信息函数Q?/div>
l         Method getMethod(String name, Class[] params) -- 使用特定的参数类型,获得命名的公共方?/div>
l         Method[] getMethods() -- 获得cȝ所有公共方?/div>
l         Method getDeclaredMethod(String name, Class[] params) -- 使用特写的参数类型,获得cd明的命名的方?/div>
l         Method[] getDeclaredMethods() -- 获得cd明的所有方?

 

1.3开始?ReflectionQ?/div>
用于 reflection 的类Q如 MethodQ可以在 java.lang.relfect 包中扑ֈ。用这些类的时候必要遵@三个步骤Q第一步是获得你想操作的类?java.lang.Class 对象。在q行中的 Java E序中,?java.lang.Class cL描述cd接口{?/div>
下面是获得一?Class 对象的方法之一Q?/div>
Class c = Class.forName("java.lang.String");

q条语句得到一?String cȝcd象。还有另一U方法,如下面的语句Q?/div>
Class c = int.class;

或?/div>
Class c = Integer.TYPE;

它们可获得基本类型的cM息。其中后一U方法中讉K的是基本cd的封装类 (?Integer) 中预先定义好?TYPE 字段?/div>
W二步是调用诸如 getDeclaredMethods 的方法,以取得该cM定义的所有方法的列表?/div>
一旦取得这个信息,可以进行第三步了——?reflection API 来操作这些信息,如下面这D代码:

Class c = Class.forName("java.lang.String");

Method m[] = c.getDeclaredMethods();

System.out.println(m[0].toString());

它将以文本方式打印出 String 中定义的W一个方法的原型?/div>
2Q处理对象:

如果要作一个开发工具像debugger之类的,你必能发现filed values,以下是三个步?

a.创徏一个Class对象
b.通过getField 创徏一个Field对象
c.调用Field.getXXX(Object)Ҏ(XXX是Int,Float{,如果是对象就省略QObject是指实例).

例如Q?br />import java.lang.reflect.*;
import java.awt.*;

class SampleGet {

   public static void main(String[] args) {
      Rectangle r = new Rectangle(100, 325);
      printHeight(r);

   }

   static void printHeight(Rectangle r) {
      Field heightField;
      Integer heightValue;
      Class c = r.getClass();
      try {
        heightField = c.getField("height");
        heightValue = (Integer) heightField.get(r);
        System.out.println("Height: " + heightValue.toString());
      } catch (NoSuchFieldException e) {
          System.out.println(e);
      } catch (SecurityException e) {
          System.out.println(e);
      } catch (IllegalAccessException e) {
          System.out.println(e);
      }
   }
}

 

三、安全性和反射 Q?/h3>
在处理反时安全性是一个较复杂的问题。反经常由框架型代码用,׃q一点,我们可能希望框架能够全面接入代码Q无需考虑常规的接入限制。但是,在其它情况下Q不受控制的接入会带来严重的安全性风险,例如当代码在不值得信Q的代码共享的环境中运行时?/div>
׃q些互相矛盾的需求,Java~程语言定义一U多U别Ҏ来处理反的安全性。基本模式是对反实施与应用于源代码接入相同的限Ӟ

n         从Q意位|到cdq件的接入

n         c自w外部无M到私有组件的接入

n         受保护和打包Q缺省接入)lg的有限接?

不过臛_有些时候,围绕q些限制q有一U简单的Ҏ。我们可以在我们所写的cMQ扩展一个普通的基本cjava.lang.reflect.AccessibleObject cR这个类定义了一UsetAccessibleҎQ我们能够启动或关闭对q些cM其中一个类的实例的接入。唯一的问题在于如果用了安全性管理器Q它检正在关闭接入检的代码是否许可了这样做。如果未许可Q安全性管理器抛出一个例外?/div>
下面是一D늨序,在TwoString cȝ一个实例上使用反射来显C安全性正在运行:

public class ReflectSecurity {

    public static void main(String[] args) {

        try {

            TwoString ts = new TwoString("a", "b");

            Field field = clas.getDeclaredField("m_s1");

//          field.setAccessible(true);

            System.out.println("Retrieved value is " +

                field.get(inst));

        } catch (Exception ex) {

            ex.printStackTrace(System.out);

        }

    }

}

如果我们~译q一E序Ӟ不用Q何特定参数直接从命o行运行,它将在field .get(inst)调用中抛Z个IllegalAccessException异常。如果我们不注释field.setAccessible(true)代码行,那么重新~译q新运行该代码Q它编译成功。最后,如果我们在命令行d了JVM参数-Djava.security.manager以实现安全性管理器Q它仍然不能通过~译Q除非我们定义了ReflectSecuritycȝ许可权限?/div>

四、反性能 Q?/h3>
反射是一U强大的工具Q但也存在一些不뀂一个主要的~点是对性能有媄响。用反基本上是一U解释操作,我们可以告诉JVMQ我们希望做什么ƈ且它满我们的要求。这cL作L慢于只直接执行相同的操作?/div>
下面的程序是字段接入性能试的一个例子,包括基本的测试方法。每U方法测试字D|入的一UŞ?-- accessSame 与同一对象的成员字D协作,accessOther 使用可直接接入的另一对象的字D,accessReflection 使用可通过反射接入的另一对象的字Dc在每种情况下,Ҏ执行相同的计?-- 循环中简单的?乘顺序?/div>
E序如下Q?/div>
public int accessSame(int loops) {

    m_value = 0;

    for (int index = 0; index < loops; index++) {

        m_value = (m_value + ADDITIVE_VALUE) *

            MULTIPLIER_VALUE;

    }

    return m_value;

}

 

public int accessReference(int loops) {

    TimingClass timing = new TimingClass();

    for (int index = 0; index < loops; index++) {

        timing.m_value = (timing.m_value + ADDITIVE_VALUE) *

            MULTIPLIER_VALUE;

    }

    return timing.m_value;

}

 

public int accessReflection(int loops) throws Exception {

    TimingClass timing = new TimingClass();

    try {

        Field field = TimingClass.class.

            getDeclaredField("m_value");

        for (int index = 0; index < loops; index++) {

            int value = (field.getInt(timing) +

                ADDITIVE_VALUE) * MULTIPLIER_VALUE;

            field.setInt(timing, value);

        }

        return timing.m_value;

    } catch (Exception ex) {

        System.out.println("Error using reflection");

        throw ex;

    }

}

在上面的例子中,试E序重复调用每种ҎQ用一个大循环敎ͼ从而^均多ơ调用的旉衡量l果。^均g不包括每U方法第一ơ调用的旉Q因此初始化旉不是l果中的一个因素。下面的图清楚的向我们展CZ每种Ҏ字段接入的时_


我们可以看出Q在前两副图?Sun JVM)Q用反的执行旉过使用直接接入?000倍以上。通过比较QIBM JVM可能E好一些,但反方法仍旧需要比其它Ҏ?00倍以上的旉。Q何JVM上其它两U方法之间时间方面无M显著差异Q但IBM JVM几乎比Sun JVM快一倍。最有可能的是这U差异反映了Sun Hot Spot JVM的专业优化,它在单基准方面表现得很糟p。反性能是Sun开?.4 JVM时关注的一个方面,它在反射Ҏ调用l果中显C。在q类操作的性能斚wQSun 1.4.1 JVM昄了比1.3.1版本很大的改q?/div>
如果Zؓ创徏使用反射的对象编写了cM的计时测试程序,我们会发现这U情况下的差异不象字D和Ҏ调用情况下那么显著。用newInstance()调用创徏一个简单的java.lang.Object实例耗用的时间大U是在Sun 1.3.1 JVM上用new Object()?2倍,是在IBM 1.4.0 JVM的四倍,只是Sun 1.4.1 JVM上的两部。用Array.newInstance(type, size)创徏一个数l耗用的时间是M试的JVM上用new type[size]的两倍,随着数组大小的增加,差异逐步~小?/div>

l束?/font> Q?/h3>
Java语言反射提供一U动态链接程序组件的多功能方法。它允许E序创徏和控制Q何类的对?Ҏ安全性限?Q无需提前编码目标类。这些特性得反特别适用于创Z非常普通的方式与对象协作的库。例如,反射l常在持l存储对象ؓ数据库、XML或其它外部格式的框架中用。Java reflection 非常有用Q它使类和数据结构能按名U动态检索相关信息,q允许在q行着的程序中操作q些信息。Java 的这一Ҏ非常强大,q且是其它一些常用语aQ如 C、C++、Fortran 或?Pascal {都不具备的?/div>
但反有两个~点。第一个是性能问题。用于字D和Ҏ接入时反要q慢于直接代码。性能问题的程度取决于E序中是如何使用反射的。如果它作ؓE序q行中相对很涉及的部分Q缓慢的性能不会是一个问题。即使测试中最坏情况下的计时图昄的反操作只耗用几微U。仅反射在性能关键的应用的核心逻辑中用时性能问题才变得至关重要?/div>
许多应用中更严重的一个缺Ҏ使用反射会模p程序内部实际要发生的事情。程序h员希望在源代码中看到E序的逻辑Q反等l过了源代码的技术会带来l护问题。反代码比相应的直接代码更复杂Q正如性能比较的代码实例中看到的一栗解册些问题的最x案是保守C用反——仅在它可以真正增加灉|性的地方——记录其在目标类中的使用?/div>
 

 

利用反射实现cȝ动态加?br />


Bromon原创 请尊重版?/div>
最q在成都写一?a rel="nofollow" name="2">Ud增值项目,责后台server端。功能很单,手机用户通过GPRS打开Socket与服务器q接Q我则根据用户传q来的数据做出响应。做q类似项目的兄弟一定都知道Q首先需要定义一个类gMSNP的通讯协议Q不q今天的话题是如何把q个pȝ设计得具有高度的扩展性。由于这个项目本w没有进行过较ؓ完善的客h通和需求分析,所以以后肯定会有很多功能上的扩展,通讯协议肯定会越来越庞大Q而我作ؓ一个不那么勤快的hQ当然不想以后再M改写好的E序Q所以这个项目是实践面向对象设计的好Z?/div>
首先定义一个接口来隔离c:

package org.bromon.reflect;

public interface Operator

{

public java.util.List act(java.util.List params)

}

Ҏ设计模式的原理,我们可以Z同的功能~写不同的类Q每个类都承Operator接口Q客L只需要针对Operator接口~程可以避免很多麻烦。比如这个类Q?/div>
package org.bromon.reflect.*;

public class Success implements Operator

{

public java.util.List act(java.util.List params)

{

List result=new ArrayList();

result.add(new String(“操作成功?);

return result;

}

}

我们q可以写其他很多c,但是有个问题Q接口是无法实例化的Q我们必L动控制具体实例化哪个c,q很不爽Q如果能够向应用E序传递一个参敎ͼ让自己去选择实例化一个类Q执行它的actҎQ那我们的工作就L多了?/div>
很幸q,我用的是JavaQ只有Java才提供这L反射机制Q或者说内省机制Q可以实现我们的无理要求。编写一个配|文件emp.properties:

#成功响应

1000=Success

#向客户发送普通文本消?/div>
2000=Load

#客户向服务器发送普通文本消?/div>
3000=Store

文g中的键名是客户将发给我的消息_客户发?000l我Q那么我执行SuccesscȝactҎQ类似的如果发?000l我Q那执行LoadcȝactҎQ这样一来系l就完全W合开闭原则了Q如果要d新的功能Q完全不需要修改已有代码,只需要在配置文g中添加对应规则,然后~写新的c,实现actҎokQ即使我弃这个项目而去Q它来也可以很好的扩展。这Lpȝ具备了非常良好的扩展性和可插入性?/div>
下面q个例子体现了动态加载的功能Q程序在执行q程中才知道应该实例化哪个类Q?/div>
package org.bromon.reflect.*;

import java.lang.reflect.*;

public class TestReflect

{

//加蝲配置文g,查询消息头对应的cd

private String loadProtocal(String header)

{

String result=null;

try

{

Properties prop=new Properties();

FileInputStream fis=new FileInputStream("emp.properties");

prop.load(fis);

result=prop.getProperty(header);

fis.close();

}catch(Exception e)

{

System.out.println(e);

}

return result;

}

//针对消息作出响应,利用反射导入对应的类

public String response(String header,String content)

{

String result=null;

String s=null;

try

{

/*

* 导入属性文件emp.properties,查询header所对应的类的名?/div>
* 通过反射机制动态加载匹配的c?所有的c都被Operator接口隔离

* 可以通过修改属性文件、添加新的类(l承MsgOperator接口)来扩展协?/div>
*/

s="org.bromon.reflect."+this.loadProtocal(header);

//加蝲c?/div>
Class c=Class.forName(s);

//创徏cȝ事例

Operator mo=(Operator)c.newInstance();

//构造参数列?/div>
Class params[]=new Class[1];

params[0]=Class.forName("java.util.List");

//查询actҎ

Method m=c.getMethod("act",params);

Object args[]=new Object[1];

args[0]=content;

//调用Ҏq且获得q回

Object returnObject=m.invoke(mo,args);

}catch(Exception e)

{

System.out.println("Handler-response:"+e);

}

return result;

}

public static void main(String args[])

{

TestReflect tr=new TestReflect();

tr.response(args[0],”消息内容?;

}

}

试一下:java TestReflect 1000

q个E序是针对Operator~程的,所以无需做Q何修改,直接提供Load和Storec,可以支?000?000做参数的调用


]]>反射机制与strutshttp://www.aygfsteel.com/taonlyt/archive/2007/01/01/91315.html之?/dc:creator>之?/author>Mon, 01 Jan 2007 13:07:00 GMThttp://www.aygfsteel.com/taonlyt/archive/2007/01/01/91315.htmlhttp://www.aygfsteel.com/taonlyt/comments/91315.htmlhttp://www.aygfsteel.com/taonlyt/archive/2007/01/01/91315.html#Feedback0http://www.aygfsteel.com/taonlyt/comments/commentRss/91315.htmlhttp://www.aygfsteel.com/taonlyt/services/trackbacks/91315.html一、Struts中引入ActionFormcȝ意义与缺P
在Struts应用E序中,ActionForm是一个很重要的概?它的主要功能是为Action的操作提供与客户表单相映的数据Q如果在客户指定的情况下Q还包括Ҏ据进行校验)。ActionҎ业务逻辑的需要,Ҏ据状态进行修改,在改变系l状态后QActionForm则自动的回写新的数据状态ƈ保持。程序员对JSP与ActionForm Bean的对应关p,通常感到很迷惑,JSP与ActionForm到底?:1,q是N:1,ҎQStruts本nҎq没有提q观点。无论是一对一Q还是多对一QStruts本nq不兛_Q它都能很好得工作。Struts在它的开发文档中指出Q对于较规模的开发,开发h员可以根据自q需要,每个模块只写一个ActionForm BeanQ甚x个应用程序只写一个ActionForm Bean.当然QStruts也不反对每个ActionForm Bean只对应一个JSP,他们之间的对应关p,由开发h员自己决定?

在我看来Q正如Entity EJB对J2EE的重大A献一PEntity EJB使得E序员对二维关系数据库的存取对象化了Q程序员可以使用Set 或者Get{面向对象的Ҏ来操U关pL据库的数据,而ActionForm也得程序员对网늚数据存取奇迹般的对象化了Q程序员同样也可以用Set 或者Get{面向对象的Ҏ存取|页上的数据Q这是一个开发模式方式上的重大{变。基于此Q我个h认ؓActionForm与JSP即VIEW层的关系最好是一对一的关p,q样Q在理解上会更清C些。但是,q样也会带来一个很现实的问题,在一个应用程序中Q也许有非常多得JSP面Q如果每个ActionForm 都只对应一个JSP面Q那么系l的Java代码׃急剧膨胀hQ而且Q每个ActionForm都是只有很简单的Set或者GetҎ存取数据Q那么,如何化Struts应用E序的开发呢Q?

在Struts1.1 中,Struts引入了DynaActionForm和Dyna Bean,试图解决q个问题Q在我看来,DynaActionForm的引入,破坏了对|页存取对象化的概念Q开发h员重新回C使用HashTable、Map、Collection、ArrayList{集合对象来实现Ҏ据进行存取的老\上来。虽然应用程序的灉|性大大增加了Q但是代码的可读性也大大降低了,开发h员之间的交流隑ֺ也增加了?

在传l的应用E序对ActionForm Bean的访问中Q我们通常都写成如下的形式Q?


Connection conn=DriverManager.getConnection("JDBC URL ");
sql=" select * from some tables ";
PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
ArrayList array=new ArrayList();
while (rs.next()) {
AActionForm actionForm =new AActionForm ();
actionForm.setId(rs.getString("Id"));
actionForm.setName(rs.getString("Name"));
array.add(actionForm);
}




在Action 的ExecuteҎ中,我们 把这个集合用request.setAttribute("array", array)存储hQ然后在JSP面中,我们用iterate Tag把数据@环现实出来。代码通常都是q个样子Q?


<logic:present name=" array " scope="request">
<logic:iterate name=" array " id=" array "
type="com.bhsky.webis.Goods">
<tr align="center">
<td class="table2">
<bean:write name=" array " property="goodsid"/>
</td>
<td class="table2">
<bean:write name=" array " property="goodsname"/>
</td>
</tr>
</logic:iterate>
</logic:present>




在Struts中,Ҏ据的讉K和显C的写法通常都是很固定的Q在VIEW层,我们是没有办法简化自q代码的,在Action层,其写法通常也很固定Q只是做一个页面的跌{Q商业逻辑和对数据得访问,通常都是攑֜JavaBean中。那么,在此Q我提出一U运用类反射的机Ӟ使应用程序对ActionForm Bean的赋D动化Q即应用E序通过一个简单的接口Q用一个通用的方法,可以完成对ActionForm Bean的赋|而不必在每个使用ActionFormBean的地方,都把数据库中的值手动赋值给ActionForm BeanQ然后再在JSP面中显C出来。虽然它不能减少ActionForm Bean的数量,但是Q它臛_使应用程序对ActionForm Bean的赋D动化了,从而减了E序出错概率Q提高了EY件开发效率?

二、类反射的概念:
关于cd的概念Q在此我׃详细介绍了,它不是本文的重点QIBM developerWorks|站上有大量介绍cd概늚文章Q大家可以找出来参考一下。其实,Struts本n大量利用了cd的机制?

三、如何应用类反射机制化Struts应用E序的开?


1?先定义Action FormBean:


package com.bhsky.webis.system;
import org.apache.struts.action.*;
import javax.servlet.http.*;

public class UsersActionForm extends ActionForm {
private String usr_id;
private String usr_name;
public void setUsr_id(String usr_id) {
this.usr_id = usr_id;
}
public String getUsr_id() {
return usr_id;
}
public String getUsr_memo() {
return usr_memo;
}
public void setUsr_name(String usr_name) {
this.usr_name = usr_name;
}
}




2?~写通用的ؓActionFormBean赋值的ҎQ?


/////////////////////////////////////////////////////////////////////////////
//Function: 完成ResultSet对象向ArrayList对象为集合的对象的{?
//Para:sql,指定的查询Sql
//Para:className,Sql相对应得JavaBean/FormBeancȝ名字
//Return:以类classNameZ条记录的l果集,完成ResultSet对象向ArrayList对象为集//合的className对象的{?
//////////////////////////////////////////////////////////////////////////////
public ArrayList Select(String sql,String className){
ArrayList paraList=new ArrayList();
try{
if (conn == null){
Connection();
}
PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
String recordValue="";
Object c1=null;
paraList=new ArrayList();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
while (rs.next()){
c1=Class.forName(className).newInstance();
for (int i=1; i<=columnCount; i++) {
if(rs.getString(rsmd.getColumnName(i))!=null){
recordValue=rs.getString(rsmd.getColumnName(i));
}else{
recordValue="";
}
Method
m=c1.getClass().getMethod(getSetMethodName(rsmd.getColumnName(i)),
new Class[]{recordValue.getClass()});
m.invoke (c1, new Object[]{recordValue});
}
paraList.add(c1);
}
}catch(SQLException ex){

}catch(ClassNotFoundException e){

}catch(NoSuchMethodException e) {

}catch(InvocationTargetException e){

}catch (IllegalAccessException e){

}catch(InstantiationException e){

} finaly{
closeConnection();
return paraList;
}
}




3?在JavaBean装的商业逻辑中调用Select ҎQ然后在JSP面上显C出来:


//Function:取得用户列表
//Para:
//Return:q回用户列表
/////////////////////////////////////////////////////////////////////////////
public ArrayList getUsers(){
ArrayList ret=null;
DatabaseManage db=new DatabaseManage();
String sql=" select usr_id,usr_name "
+" from users " ;
ret=db.Select(sql," com.bhsky. webis.system.UsersActionForm");
return ret;
}




4?在Action的executeҎ中调用getUsers()ҎQ?


public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm,
HttpServletRequest request, HttpServletResponse httpServletResponse)
{
/**@todo: complete the business logic here, this is just a skeleton.*/
UsersActionForm uaf=(UsersActionForm)actionForm;
SystemService ubb=new SystemService();
ArrayList userList=ubb.getUsers();
request.setAttribute("userList",userList);
ActionForward actionForward=actionMapping.findForward(url);
return actionForward;
}




5?在JSP中显C:


<table width="700" class="1" border="1" cellspacing="1" align="center">
<tr>
<td class="list" >用户ID</td>
<td class="list" >??lt;/td>
</tr>
<logic:present name="userList" scope="request">
<logic:iterate name="userList" id="userList"
type="com.bhsky.webis.system.UsersActionForm">
<tr>
<td class="cell1" height="22"><bean:write name="userList"
property="usr_id"/></td>
<td class="cell1" height="22"><bean:write name="userList"
property="usr_name"/></td>
</tr>
</logic:iterate>
</logic:present>
</table>




四、结语:
我们通过q用cd机Ӟ在一个Struts应用开发中Q完成了一个通用查询Ҏ的实现。它使得E序员摆׃在每个应用程序中都要~写枯燥的set、get{方法来讉KActionForm Bean,从而简化了Struts应用E序的开发?img src ="http://www.aygfsteel.com/taonlyt/aggbug/91315.html" width = "1" height = "1" />

]]>
վ֩ģ壺 ʯɽ| ض| ׸| | | ˹| | | | | ®| | ˮ| | ɽ| ѷ| ͷ| | ƶ| Ǩ| ¹| ʯ| | | ˮ| | | | «ɽ| | ̫| | | | | | ľ˹| | ̨| | ˳|