Merlin

Life was like a box of chocolates. You never know what you're gonna get.

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  34 随笔 :: 0 文章 :: 40 评论 :: 0 Trackbacks

#

1.   在业务层使用JDBC直接操作数据库-最简单,最直接的操作

1)数据库url,username,password写死在代码中
    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
    String url="jdbc:oracle:thin:@localhost:1521:orcl";
    String user="scott";
    String password="tiger";
    Connection conn= DriverManager.getConnection(url,user,password);  
    Statement stmt=conn.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
    String sql="select * from test";
    ResultSet rs=stmt.executeQuery(sql);

2)采用Facade和Command模式,使用DBUtil类封装JDBC操作;
      数据库url,username,password可以放在配置文件中(如xml,properties,ini等)。
      这种方法在小程序中应用较多。

2.DAO(Data Accessor Object)模式-松耦合的开始
DAO = data + accessor + domain object

例如User类-domain object (javabean)
UserDAO类-accessor ,提供的方法getUser(int id),save(User user)内包含了JDBC操作
在业务逻辑中使用这两个类来完成数据操作。

使用Factory模式可以方便不同数据库连接之间的移植。

3.数据库资源管理模式
3.1 数据库连接池技术
资源重用,避免频繁创建,释放连接引起大大量性能开销;
更快的系统响应速度;

通过实现JDBC的部分资源对象接口( Connection, Statement, ResultSet ),可以使用Decorator设计模式分别产生三种逻辑资源对象: PooledConnection, PooledStatement和 PooledResultSet。


一个最简单地数据库连接池实现:
public class ConnectionPool {

       private static Vector pools;
       private final int POOL_MAXSIZE = 25;
       /**
        * 获取数据库连接
        * 如果当前池中有可用连接,则将池中最后一个返回;若没有,则创建一个新的返回
        */
       public synchronized Connection getConnection() {
              Connection conn = null;
              if (pools == null) {
                     pools = new Vector();
              }

              if (pools.isEmpty()) {
                     conn = createConnection();
              } else {
                     int last_idx = pools.size() - 1;
                     conn = (Connection) pools.get(last_idx);
                     pools.remove(last_idx);
              }

              return conn;
       }

       /**
        * 将使用完毕的数据库连接放回池中
        * 若池中连接已经超过阈值,则关闭该连接;否则放回池中下次再使用
        */
       public synchronized void releaseConnection(Connection conn) {
              if (pools.size() >= POOL_MAXSIZE)
                     try {
                            conn.close();
                     } catch (SQLException e) {
                            // TODO自动生成 catch 块
                            e.printStackTrace();
                     } else
                     pools.add(conn);
       }

       public static Connection createConnection() {
              Connection conn = null;
              try {
                     Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
                     String url = "jdbc:oracle:thin:@localhost:1521:orcl";
                     String user = "scott";
                     String password = "tiger";
                     conn = DriverManager.getConnection(url, user, password);
              } catch (InstantiationException e) {
                     // TODO自动生成 catch 块
                     e.printStackTrace();
              } catch (IllegalAccessException e) {
                     // TODO自动生成 catch 块
                     e.printStackTrace();
              } catch (ClassNotFoundException e) {
                     // TODO自动生成 catch 块
                     e.printStackTrace();
              } catch (SQLException e) {
                     // TODO自动生成 catch 块
                     e.printStackTrace();
              }
              return conn;
       }
}

注意:利用getConnection()方法得到的Connection,程序员很习惯地调用conn.close()方法关闭了数据库连接,那么上述的数据库连接机制便形同虚设。在调用conn.close()方法方法时如何调用releaseConnection()方法?这是关键。这里,我们使用Proxy模式和java反射机制。

public synchronized Connection getConnection() {
              Connection conn = null;
              if (pools == null) {
                     pools = new Vector();
              }

              if (pools.isEmpty()) {
                     conn = createConnection();
              } else {
                     int last_idx = pools.size() - 1;
                     conn = (Connection) pools.get(last_idx);
                     pools.remove(last_idx);
              }
        
        ConnectionHandler handler=new ConnectionHandler(this);
              return handler.bind(con);
       }

public class ConnectionHandler implements InvocationHandler {
     private Connection conn;
     private ConnectionPool pool;
    
     public ConnectionHandler(ConnectionPool pool){
            this.pool=pool;
     }
    
     /**
      * 将动态代理绑定到指定Connection
      * @param conn
      * @return
      */
     public Connection bind(Connection conn){
            this.conn=conn;
Connection proxyConn=(Connection)Proxy.newProxyInstance(
conn.getClass().getClassLoader(), conn.getClass().getInterfaces(),this);
          return proxyConn;
     }
    
       /* (非 Javadoc)
        * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
        */
       public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
              // TODO自动生成方法存根
              Object obj=null;
              if("close".equals(method.getName())){
                     this.pool.releaseConnection(this.conn);
              }
              else{
                     obj=method.invoke(this.conn, args);
              }
              
              return obj;
       }
}

      在实际项目中,并不需要你来从头开始来设计数据库连接池机制,现在成熟的开源项目,如C3P0,dbcp,Proxool等提供了良好的实现。一般推荐使用Apache dbcp,基本使用实例:
DataSource ds = null;
   try{
     Context initCtx = new InitialContext();
     Context envCtx = (Context) initCtx.lookup("java:comp/env");
     ds = (DataSource)envCtx.lookup("jdbc/myoracle");
        if(ds!=null){
                out.println("Connection is OK!");
                Connection cn=ds.getConnection();
                if(cn!=null){
                        out.println("cn is Ok!");
                Statement stmt = cn.createStatement();
                 ResultSet rst = stmt.executeQuery("select * from BOOK");
                out.println("<p>rst is Ok!" + rst.next());
                while(rst.next()){
                        out.println("<P>BOOK_CODE:" + rst.getString(1));
                  }
                        cn.close();
                }else{
                        out.println("rst Fail!");
                }
        }
        else
                out.println("Fail!");
           }catch(Exception ne){ out.println(ne);
         }


3.2 Statement Pool
普通预编译代码:
String strSQL=”select name from items where id=?”;
PreparedStatement ps=conn.prepareStatement(strSQL);
ps.setString(1, “2”);
ResultSet rs=ps.executeQuery();

但是PreparedStatement 是与特定的Connection关联的,一旦Connection关闭,则相关的PreparedStatement 也会关闭。
为了创建PreparedStatement 缓冲池,可以在invoke方法中通过sql语句判断池中还有没有可用实例。

4. 持久层设计与O/R mapping 技术
1) Hernate:适合对新产品的开发,进行封闭化的设计
Hibernate 2003年被Jboss接管,通过把java pojo对象映射到数据库的table中,采用了xml/javareflection技术等。3.0提供了对存储过程和手写sql的支持,本身提供了hql语言。
开发所需要的文件:
hibernate配置文件: hibernate.cfg.xml 或 hibernate.properties
hibernate 映射文件: a.hbm.xml
pojo类源文件: a.java  

导出表与表之间的关系:
a. 从java对象到hbm文件:xdoclet
b. 从hbm文件到java对象:hibernate extension
c. 从数据库到hbm文件:middlegen
d. 从hbm文件到数据库:SchemaExport

2)Iatis :适合对遗留系统的改造和对既有数据库的复用,有很强的灵活性 3) Apache OJB:优势在于对标准的全面支持 4)EJB:适合集群服务器,其性能也不象某些人所诟病的那么差劲 5) JDO (java data object)
设置一个Properties对象,从而获取一个JDO的PersistenceManagerFactory(相当于JDBC连接池中的DataSource),进而获得一个PersistenceManager对象(相当于JDBC中的Connection对象),之后,你可以用这个PersistenceManager对象来增加、更新、删除、查询对象。
JDOQL是JDO的查询语言;它有点象SQL,但却是依照Java的语法的。

5. 基于开源框架的Struts+Spring+Hibernate实现方案
示例:这是一个3层架构的web 程序,通过一个Action 来调用业务代理,再通过它来回调 DAO类。下面的流程图表示了MyUsers是如何工作的。数字表明了流程的先后顺序,从web层(UserAction)到中间层(UserManager),再到数据层(UserDAO),然后返回。
Spring是AOP, UserManager和UserDAO都是接口.
1)       web层(UserAction) :调用中间层的接口方法,将UserManager作为属性注入。
             采用流行的Struts框架,虽然有很多人不屑一顾,但是这项技术在业界用的比较普遍,能满足基本的功能,可以减少培训学习成本。
2)       中间层(UserManager):将UserDAO作为属性注入,其实现主要是调用数据层接口的一些方法;它处于事务控制中。
            采用Spring框架实现,IOC与AOP是它的代名词,功能齐全,非常棒的一个架构。
3)       数据层(UserDAO):实现类继承HibernateDaoSupport类,在该类中可以调用getHibernateTemplate()的一些方法执行具体的数据操作。
            采用Hibernate做O/R mapping,从种种迹象可以看出,Hibernate就是EJB3.0的beta版。
posted @ 2006-07-11 19:10 Merlin 阅读(136) | 评论 (0)编辑 收藏

Java总有它的千般好处使你选择它,但这些随便翻翻书或在网上逛一圈就能找到答案。在本文中,笔者把自己学习Java的一些切身体会和过程写出来,供初学者做个参考。

我在学习Java的过程中主要围绕以下几个方面来学习:

1.时刻提醒自己Java是一种OOP语言工具,而不仅仅是编码,只有这样才能总体把握和运用Java。

2.在学习的过程中,最好能够了解Java的底层机制,而不是仅仅停留在表层,不是抄书上的例子运行出结果就可以。要注意,即便对一个简单的例子也要有耐心去琢磨、调试、改动。

3.在学习的过程中一定要动手做、写代码,而不是抱一本书看看就行。很多东西和体会必须自己动手才能真正属于自己,最好能参与一些实际的项目。

4.在学到一定阶段后,你开始希望用学过的东西做些什么。这时的你应该开始学习一些更多、更复杂的知识,比如J2EE平台的构建、EJB的开发等。对于这一部分,我建议最好找一本较薄的书先了解一个大概,心里有个总体的认识,对更多的技术术语做个初步掌握。我认为这个阶段看看《J2EE技术实践》很不错,它可以让你了解J2EE包含的各种技术和框架,同时提供很多实际的例子来加深对J2EE的整体了解。

学习Java的兴趣和决心起了很关键的作用。在有了上述基础后,我便开始一步一步地学习Java。


Java环境的搭建


要运行Java程序,必须安装JDK。JDK是整个Java的核心,其中包括了Java编译器、JVM、大量的Java工具以及Java基础API。

可以从http://Java.sun.com下载JDK,有1.4版本和1.31版本。我的学习环境中首先,采用的是1.31版本。

解压安装。然后,进行环境设置。

1.对于Windows平台要进行以下设置:

set PATH=YOUR_INSTALL_ DIR\bin; C:\Windows;C:\Windows\Command
set classpath=. ;YOUR_INSTALL_DIR\lib\tools.jar



2.对于Linux平台要编辑/etc/profile文件:

JAVA_HOME=your_install_dir/JDK/j2sdk
CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/td.jar:$JAVA_HOME/jr  
-e/lib/rt.jar:.
PATH=$PATH:$JAVA_HOME/bin
export PATH PS1 USER LOGNAME MAIL HOSTNAME HISTSIZE HISTFILESIZE  
INPUTRC JAVA_HOME CLASSPATH RESIN_HOME



最后,在终端上输入Java看能不能找到这个命令,如果能找到安装就成功了。

下面介绍一下JDK的几个重要的命令:

◆Java执行工具,是启动JVM(虚拟机)并执行class(BYTE CODE)文件的命令;

◆javac 编译器,由.java文件生成.class文件;

◆jar Java压缩打包工具;

◆Javadoc 文档生成器。

最后就是JDK Documentation,这是JDK的联机帮助文档,是最有用和最重要的学习参考文档,应该多看。


开始写自己的代码


现在环境有了,应该写个简单的代码进行测试了。还是从经典的“hello word”开始。

1. 先用编辑器写一代码(我用的是Linux的vi):

[stone@coremsg work]$ vi Hello.Java
  public class Hello{
        public static void main(String []argc){
                System.out.println("Hello Word!");
        }
  }



2. 编译:

[stone@coremsg work]$ Javac Hello.Java



3. 执行:

[stone@coremsg work]$ Java Hello
     Hello Word!



成功了!这就是我的第一个Java程序。从那时起我知道已开始走进Java的世界,接下来就靠自己的努力了。在这个过程中,笔者认为有几点需要注意。

学习一门新的语言,参考书是离不开的。我的建议是开始最好找一本篇幅较短的入门书来学习那些最简单、最基本的东西,包括学习Java语法等。同时,对一个最简单的程序也应该多去调试,多想想如果改动一下会出现什么结果?为什么必须那样写?多去想想这些问题然后去操作,会让你有更多的收获。这样反复地思考是很有用的。此外,在这一阶段还应该多看JDK的联机帮助,尽量多地掌握JDK提供的Java基本类库API。

在有一定基础、能够写一些简单的程序后,可以开始看《Thinking in Java》这本书。它比较完整地介绍了Java的语法、面向对象的特性、核心类库等。通过这一层次的学习能够加深对Java的理解和底层原理的运用,同时又可以完整地了解Java的整个体系。在这一阶段,应该重点学习Java的面向对象编程语言的特性,比如继承、构造器、抽象类、接口、方法的多态、重载、覆盖、Java的异常处理机制等,要对上述概念有非常清楚的了解。这样做的目的,是要让自己把这些技术应用到实践中进行合理的程序设计(比如,你会考虑一个类是用抽象还是接口来设计等)。这就要求必须在大量的实践中去应用和学习。这也是当初很多朋友给我的建议。


学习更多


如果要用Java来完成各种功能更强大的任务,那么就要学习语言以外的更多的东西。

1.Java Web编程

对于Java Web 编程来说,应该而且必须熟悉和掌握HTTP协议,可以参考 Stevens的《TCP/IP 详解》第三卷。Java Servlet技术提供了生成动态Web页面内容的能力,这在你的Java项目中是最基本的功能之一,所以必须学习。通过这一阶段的学习应该掌握Servlet/JSP的Web编程。

2. J2EE的学习

J2EE包含的技术太多了。如果你想坐在桌子旁边抱着一大堆书来学习的话,效果不大的。我建议在开始这一阶段的学习的时候,可以按以下步骤来做,总的思想是“总体把握,各个击破”。

◆ 了解J2EE中的技术术语的含义。

我的感觉是J2EE标准中涉及到的各种技术很多,如果一开始就一个一个去学习的话是不现实的,也是没效果的。我的建议是,先对其中的技术有个大概的了解,比如EJB、JavaIDL、JTA等。可能你不知道怎么去写一个EJB,但是要知道什么是EJB、它能做什么,当有了这样的概念后,再去有目的地学习它就会快很多。我还要再重复一句——必须要在实践中动手去做才行。

◆ 了解J2EE中的设计模式,这样能帮助你对J2EE做个整体把握。

MVC开发模式被证明是有效的处理方法之一。它可以分离数据访问和数据表现。你可以开发一个有伸缩性的、便于扩展的控制器,来维护整个流程。通过这一层次的学习,当你面对一个项目的时候,应该首先把握它的总体架构的设计,以及决定采用J2EE标准中的哪些技术。

◆ 了解一些J2EE平台的典型案列,加深对这一技术的概念和理解。

平时可以多留意这方面,熟悉一些典型案例,分析它为什么要采用那个时间?那样做能达到什么样的目的?然后联系到自己身边的项目是否可以作为参考。

◆ 学习J2EE下的各种技术。

在有了前几阶段的学习后,可以自己搭建一个J2EE平台开始具体学习每一种技术。你可以参与公司相关项目进行学习,也可以自己搭建一个平台进行学习。这时候应该找点相关的书来一步一步学习,没有捷径可走。如果你不满足于这些,那么还应该更深入地学习UML、设计模式等方面的东西
posted @ 2006-07-11 17:00 Merlin 阅读(155) | 评论 (0)编辑 收藏

别人对你说Thank you,你总是回答You're welcome吗?

美国人有时回答“yeah”,非常短促的发音。

no problem

At your service (对女孩子一定要芥末说!!!)

My plessure

I am more than happy to do so.

在英国的回答大多是cheers mate。。或者直接就cheers。。既有谢谢的意思,又有不用谢的意思。。

no worries经常听年轻人用

还有,美国人好像对thank u 的回答是uhun(很随意,但是感觉多少有点不礼貌……)

posted @ 2006-07-10 22:20 Merlin 阅读(2201) | 评论 (0)编辑 收藏

 一、关于XML解析
  
  XML在Java应用程序里变得越来越重要, 广泛应用于数据存储和交换. 比如我们常见的配置文件,都是以XML方式存储的. XML还应用于Java Message Service和Web Services等技术作为数据交换.
  
  因此,正确读写XML文档是XML应用的基础.
  
  Java提供了SAX和DOM两种方式用于解析XML,但即便如此,要读写一个稍微复杂的XML,也不是一件容易的事.
  
  二、XMLBean简介
  
  Hibernate已经成为目前流行的面向Java环境的对象/关系数据库映射工具.
  
  在Hibernate等对象/关系数据库映射工具出现之前,对数据库的操作是通过JDBC来实现的,对数据库的任何操作,开发人员都要自己写SQL语句来实现. 对象/关系数据库映射工具出现后,对数据库的操作转成对JavaBean的操作,极大方便了数据库开发. 所以如果有一个类似的工具能够实现将对XML的读写转成对JavaBean的操作,将会简化XML的读写,即使对XML不熟悉的开发人员也能方便地读写XML. 这个工具就是XMLBean.
  
  三、准备XMLBean和XML文档
  
  XMLBean是Apache的一个开源项目,可以从http://www.apache.org下载,最新的版本是2.0. 解压后目录如下:
  xmlbean2.0.0
  +---bin
  +---docs
  +---lib
  +---samples
  +---schemas
  
  另外还要准备一个XML文档(customers.xml),在本文的例子里,我们将对这个文档进行读写操作. 文档源码如下:
  <?xml version="1.0" encoding="UTF-8"?><Customers>
  <customer>
  <id>1</id>
  <gender>female</gender>
  <firstname>Jessica</firstname>
  <lastname>Lim</lastname>
  <phoneNumber>1234567</phoneNumber>
  <address>
  <primaryAddress>
  <postalCode>350106</postalCode>
  <addressLine1>#25-1</addressLine1>
  <addressLine2>SHINSAYAMA 2-CHOME</
  addressLine2>
  </primaryAddress>
  <billingAddress>
  <receiver>Ms Danielle</receiver>
  <postalCode>350107</postalCode>
  <addressLine1>#167</addressLine1>
  <addressLine2>NORTH TOWER HARBOUR CITY</addressLine2>
  </billingAddress>
  </address>
  </customer>
  <customer>
  <id>2</id>
  <gender>male</gender>
  <firstname>David</firstname>
  <lastname>Bill</lastname>
  <phoneNumber>808182</phoneNumber>
  <address>
  <primaryAddress>
  <postalCode>319087</postalCode>
  <addressLine1>1033 WS St.</addressLine1>
  <addressLine2>Tima Road</addressLine2>
  </primaryAddress>
  <billingAddress>
  <receiver>Mr William</receiver>
  <postalCode>672993</postalCode>
  <addressLine1>1033 WS St.</addressLine1>
  <addressLine2>Tima Road</addressLine2>
  </billingAddress>
  </address>
  </customer></Customers>
  
  这是一个客户的数据模型,每个客户都有客户编号(ID),姓名,性别(gender),电话号码(phoneNumber)和地址,其中地址有两个: 首要地址(PrimaryAddress)和帐单地址(BillingAddress),每个地址有邮编,地址1,和地址2组成.其中帐单地址还有收件人(receiver).
  
  此外,还要准备一个配置文件(文件名customer.xsdconfig),这个文件的作用我后面会讲,它的内容如下:
  <xb:config xmlns:xb="http://xml.apache.org/xmlbeans/2004/02/xbean/config">
  <xb:namespace>
  <xb:package>sample.xmlbean</xb:package>
  </xb:namespace></xb:config>
  
  四、XMLBean使用步骤
  
  和其他面向Java环境的对象/关系数据库映射工具的使用步骤一样,在正式使用XMLBean前,我们要作两个准备.
  
  1. 生成XML Schema文件
  
  什么是XML Schema文件? 正常情况下,每个XML文件都有一个Schema文件,XML Schema文件是一个XML的约束文件,它定义了XML文件的结构和元素.以及对元素和结构的约束. 通俗地讲,如果说XML文件是数据库里的记录,那么Schema就是表结构定义.
  
  为什么需要这个文件? XMLBean需要通过这个文件知道一个XML文件的结构以及约束,比如数据类型等. 利用这个Schema文件,XMLBean将会产生一系列相关的Java Classes来实现对XML的操作. 而作为开发人员,则是利用XMLBean产生的Java Classes来完成对XML的操作而不需要SAX或DOM.
  
  怎样产生这个Schema文件呢? 如果对于熟悉XML的开发人员,可以自己来写这个Schema文件,对于不熟悉XML的开发人员,可以通过一些工具来完成.
  
  比较有名的如XMLSPY和Stylus Studio都可以通过XML文件来生成Schema文件. 加入我们已经生成这个Schema文件(customer.xsd):
  <?xml version="1.0" encoding="UTF-8"?>
  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  elementFormDefault="qualified">
  <xs:element name="Customers">
  <xs:complexType>
  <xs:sequence>
  <xs:element maxOccurs="unbounded" name="customer"
  type="customerType"/>
  </xs:sequence>
  </xs:complexType>
  </xs:element>
  <xs:complexType name="customerType">
  <xs:sequence>
  <xs:element name="id" type="xs:int"/>
  <xs:element name="gender" type="xs:string"/>
  <xs:element name="firstname" type="xs:string"/>
  <xs:element name="lastname" type="xs:string"/>
  <xs:element name="phoneNumber" type="xs:string"/>
  <xs:element name="address" type="addressType"/>
  </xs:sequence>
  </xs:complexType>
  <xs:complexType name="addressType">
  <xs:sequence>
  <xs:element name="primaryAddress" type="primaryAddressType"/>
  <xs:element name="billingAddress" type="billingAddressType"/>
  </xs:sequence>
  </xs:complexType>
  <xs:complexType name="primaryAddressType">
  <xs:sequence>
  <xs:element name="postalCode" type="xs:string"/>
  <xs:element name="addressLine1" type="xs:string"/>
  <xs:element name="addressLine2" type="xs:string"/>
  </xs:sequence>
  </xs:complexType>
  <xs:complexType name="billingAddressType">
  <xs:sequence>
  <xs:element name="receiver" type="xs:string"/>
  <xs:element name="postalCode" type="xs:string"/>
  <xs:element name="addressLine1" type="xs:string"/>
  <xs:element name="addressLine2" type="xs:string"/>
  </xs:sequence>
  </xs:complexType>
  </xs:schema>
  
  2. 利用scomp来生成Java Classes
  
  scomp是XMLBean提供的一个编译工具,它在bin的目录下. 通过这个工具,我们可以将以上的Schema文件生成Java Classes.
  
  scomp的语法如下:-
  
  scomp [options] [dirs]* [schemaFile.xsd]* [service.wsdl]* [config.xsdconfig]*
  
  主要参数说明:
  -src [dir]         -- 生成的Java Classes存放目录
  -srconly         -- 不编译Java Classes,不产生Jar文件
  -out [jarFileName] -- 生成的Jar文件,缺省是xmltypes.jar
  -compiler         -- Java编译器的路径,即Javac的位置
  schemaFile.xsd  -- XML Schema文件位置
  config.xsdconfig  -- xsdconfig文件的位置, 这个文件主要用来制定生成的Java Class
  的一些文件名规则和Package的名称,在本文,package是sample.xmlbean
  
  在本文,我是这样运行的:
  scomp -src build\src -out build\customerXmlBean.jar schema\customer.xsd
  -compiler C:\jdk142_04\bin\javac customer.xsdconfig
  
  这个命令行的意思是告诉scomp生成customerXmlBean.jar,放在build目录下,同时
  生成源代码放在build\src下, Schema文件是customer.xsd,xsdconfig文件是customer.xsdconfig.
  
  其实, 生成的Java源代码没有多大作用,我们要的是jar文件.我们先看一下build\src\sample\xmlbean下生成的Classes.
  CustomersDocument.java
  -- 整个XML文档的Java Class映射
  CustomerType.java
  -- 节点sustomer的映射
  AddressType.java
  -- 节点address的映射
  BillingAddressType.java
  -- 节点billingAddress的映射
  PrimaryAddressType.java
  -- 节点primaryAddress的映射
  
  好了,到此我们所有的准备工作已经完成了. 下面就开始进入重点:利用刚才生成的jar文件读写XML.
  
  五、利用XMLBean读XML文件
  
  新建一个Java Project,将XMLBean2.0.0\lib\下的Jar文件和刚才我们生成的customerXmlBean.jar加入
  
  到Project的ClassPath.
  
  新建一个Java Class: CustomerXMLBean. 源码如下:
  package com.sample.reader;
  import java.io.File;
  import sample.xmlbean.*;
  import org.apache.commons.beanutils.BeanUtils;
  import org.apache.xmlbeans.XmlOptions;
  public class CustomerXMLBean {
  private String filename = null;
  public CustomerXMLBean(String filename) {
  super();
  this.filename = filename;
  }
  public void customerReader() {
  try {
  File xmlFile = new File(filename);
  CustomersDocument doc = CustomersDocument.Factory.parse(xmlFile);
  CustomerType[] customers = doc.getCustomers().getCustomerArray();
  for (int i = 0; i < customers.length; i++) {
  CustomerType customer = customers[i];
  println("Customer#" + i);
  println("Customer ID:" + customer.getId());
  println("First name:" + customer.getFirstname());
  println("Last name:" + customer.getLastname());
  println("Gender:" + customer.getGender());
  println("PhoneNumber:" + customer.getPhoneNumber());
  // Primary address
  PrimaryAddressType primaryAddress = customer.getAddress().getPrimaryAddress();
  println("PrimaryAddress:");
  println("PostalCode:" + primaryAddress.getPostalCode());
  println("AddressLine1:" + primaryAddress.getAddressLine1());
  println("AddressLine2:" + primaryAddress.getAddressLine2());
  // Billing address
  BillingAddressType billingAddress = customer.getAddress().getBillingAddress();
  println("BillingAddress:");
  println("Receiver:" + billingAddress.getReceiver());
  println("PostalCode:" + billingAddress.getPostalCode());
  println("AddressLine1:" + billingAddress.getAddressLine1());
  println("AddressLine2:" + billingAddress.getAddressLine2());
  }
  } catch (Exception ex) {
  ex.printStackTrace();
  }
  }
  private void println(String str) {
  System.out.println(str);  }  public static void main(String[] args) {
  String filename = "F://JavaTest//Eclipse//XMLBean//xml//customers.xml";
  CustomerXMLBean customerXMLBean = new CustomerXMLBean(filename);
  customerXMLBean.customerReader();
  }
  }
  
  运行它,参看输出结果:
  Customer#0
  Customer ID:1
  First name:Jessica
  Last name:Lim
  Gender:female
  PhoneNumber:1234567
  PrimaryAddress:
  PostalCode:350106
  AddressLine1:#25-1
  AddressLine2:SHINSAYAMA 2-CHOME
  BillingAddress:
  Receiver:Ms Danielle
  PostalCode:350107
  AddressLine1:#167
  AddressLine2:NORTH TOWER HARBOUR CITY
  Customer#1
  Customer ID:2
  First name:David
  Last name:Bill
  Gender:male
  PhoneNumber:808182
  PrimaryAddress:
  PostalCode:319087
  AddressLine1:1033 WS St.
  AddressLine2:Tima Road
  BillingAddress:
  Receiver:Mr William
  PostalCode:672993
  AddressLine1:1033 WS St.
  AddressLine2:Tima Road
  怎么样,是不是很轻松? XMLBean的威力.
  
  六、利用XMLBean写XML文件
  
  利用XMLBean创建一个XML文档也是一件轻而易举的事.我们再增加一个Method,
  请看一下的Java Class:
  public void createCustomer() {
  try {
  // Create Document
  CustomersDocument doc = CustomersDocument.Factory.newInstance();
  // Add new customer
  CustomerType customer = doc.addNewCustomers().addNewCustomer();
  // set customer info
  customer.setId(3);
  customer.setFirstname("Jessica");
  customer.setLastname("Lim");
  customer.setGender("female");
  customer.setPhoneNumber("1234567");
  // Add new address
  AddressType address = customer.addNewAddress();
  // Add new PrimaryAddress
  PrimaryAddressType primaryAddress = address.addNewPrimaryAddress();
  primaryAddress.setPostalCode("350106");
  primaryAddress.setAddressLine1("#25-1");
  primaryAddress.setAddressLine2("SHINSAYAMA 2-CHOME");
  // Add new BillingAddress
  BillingAddressType billingAddress = address.addNewBillingAddress();
  billingAddress.setReceiver("Ms Danielle");
  billingAddress.setPostalCode("350107");
  billingAddress.setAddressLine1("#167");
  billingAddress.setAddressLine2("NORTH TOWER HARBOUR CITY");
  File xmlFile = new File(filename);
  doc.save(xmlFile);    } catch (Exception ex) {
  ex.printStackTrace();    } }
  修改main method.
  public static void main(String[] args) {
  String filename = "F://JavaTest//Eclipse//XMLBean//xml//customers_new.xml";
  CustomerXMLBean customerXMLBean = new CustomerXMLBean(filename);
  customerXMLBean.createCustomer();
  }
  运行,打开customers_new.xml:
  <?xml version="1.0" encoding="UTF-8"?>
  <Customers>
  <customer>
  <id>3</id>
  <gender>female</gender>
  <firstname>Jessica</firstname>
  <lastname>Lim</lastname>
  <phoneNumber>1234567</phoneNumber>
  <address>
  <primaryAddress>
  <postalCode>350106</postalCode>
  <addressLine1>#25-1</addressLine1>
  <addressLine2>SHINSAYAMA 2-CHOME</addressLine2>
  </primaryAddress>
  <billingAddress>
  <receiver>Ms Danielle</receiver>
  <postalCode>350107</postalCode>
  <addressLine1>#167</addressLine1>
  <addressLine2>NORTH TOWER HARBOUR CITY</addressLine2>
  </billingAddress>
  </address>
  </customer>
  </Customers>
  
  七、利用XMLBean修改XML文件
  
  我们再增加一个Method:
  public void updateCustomer(int id,String lastname) {
  try {
  File xmlFile = new File(filename);
  CustomersDocument doc = CustomersDocument.Factory.parse(xmlFile);
  CustomerType[] customers = doc.getCustomers().getCustomerArray();
  for (int i = 0; i < customers.length; i++) {
  CustomerType customer = customers[i];
  if(customer.getId()==id){
  customer.setLastname(lastname);
  break;
  }
  }
  doc.save(xmlFile);
  } catch (Exception ex) {
  ex.printStackTrace();
  }
  }
  main method:
  public static void main(String[] args) {
  String filename = "F://JavaTest//Eclipse//XMLBean//xml//customers_new.xml";
  CustomerXMLBean customerXMLBean = new CustomerXMLBean(filename);
  customerXMLBean.updateCustomer(3,"last");  }
  运行之后,我们将会看到客户编号为3的客户的lastname已经改为last.
  
  八、利用XMLBean删除一个customer
  
  再增加一个Method:
  public void deleteCustomer(int id) {
  try {
  File xmlFile = new File(filename);
  CustomersDocument doc = CustomersDocument.Factory.parse(xmlFile);
  CustomerType[] customers = doc.getCustomers().getCustomerArray();
  for (int i = 0; i < customers.length; i++) {
  CustomerType customer = customers[i];
  if(customer.getId()==id){
  customer.setNil() ;
  break;
  }
  }
  doc.save(xmlFile);
  } catch (Exception ex) {
  ex.printStackTrace();
  }
  }
  
  main method:
  public static void main(String[] args) {
  String filename = "F://JavaTest//Eclipse//XMLBean//xml//customers_new.xml";
  CustomerXMLBean customerXMLBean = new CustomerXMLBean(filename);
  customerXMLBean.deleteCustomer(3);
  }
  
  运行,我们将会看到客户编号为3的客户的资料已经被删除.
  
  九、查询XML
  

  除了本文在以上讲述的,利用XMLBean能轻轻松松完成XML的读写操作外,结合XPath和XQuery,
  
  XMLBean还能完成象SQL查询数据库一样方便地查询XML数据. 关于XML查询以及如何创建XML数据库, 我将在另一篇文章里讨论.
  
  十、结束语
  
  XMLBean能帮助我们轻易读写XML,这将有助于我们降低XML的学习和使用,有了这个基础,开发人员将为学习更多地XML相关技术和Web Services,JMS等其他J2EE技术打下良好地基础.
posted @ 2006-07-10 20:20 Merlin 阅读(267) | 评论 (0)编辑 收藏

     摘要: 利用(二)中我写的两个函数(放在package src中),这次实现web页面的操作。index.html:<%@ page language="java" pageEncoding="GB2312"%><body><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;<...  阅读全文
posted @ 2006-07-10 18:31 Merlin 阅读(135) | 评论 (0)编辑 收藏

     摘要: 这是读取xml文件的java程序,我调试好的。采用的是dom方式读取xml文件到Vector中。  1 package  src;  2 import  java.io. * ;  3 import ...  阅读全文
posted @ 2006-07-10 18:16 Merlin 阅读(177) | 评论 (0)编辑 收藏

JAXP API--嵌入不同的解释器

SAX解释器+DOM解释器+XSL转换器

javax.xml.parsers中加载XML文档的类:
DocumentBuilder
DocumentBuildrFactory
SAXParser
SAXParserFactory
=====================================
SAX API

SAX的XML解释器:Apache的Xerces或Crimson

处理XML文档的接口:
ContentHandler
EntityResolver
ErroHandler
DTDHandler

DeclHandler
LexicalHandler
======================================
DOM API

两个DOM标准:DOM Level1 DOM Level 2 Core

节点
Node-节点类型接口层次结构的根。
Document-树结构的根
Element-XML元素
Text-元素内的文本
Attr-元素的特性
CDATA Sectionn-CDATA
NodeList-子节点的集合
ProcessingInstruction-指令
Comment-包含注释的信息
DocumentFragment-Document的消减版,用于在树中移动节点
DocumentType-文档类型定义的子集。
Entity-DTD中的实体标记
EntityReference-XML文档中的实体引用
Notation-DTD中的符号标记


从程序中读取X M L文档基本上有三种方式:
1把X M L只当做一个文件读取,然后自己挑选出其中的标签。这是黑客们的方法,我们不推荐这种方式。
你很快会发现处理所有的特殊情况(包括不同的字符编码,例外约定,内部和外部实体,缺省属性等)比想象的困难得多;
你可能不能够正确地处理所有的特殊情况,这样你的程序会接收到一个非常规范的X M L文档,却不能正确地处理它。
要避免这种想法:XML解析器似乎并不昂贵(大多数是免费的)。
2可以用解析器分析文档并在内存里创建对文档内容树状的表达方式:解析器将输出传递给文档对象模型,即DOM。
这样程序可以从树的顶部开始遍历,按照从一个树单元到另一个单元的引用,从而找到需要的信息。
3也可以用解析器读取文档,当解析器发现标签时告知程序它发现的标签。
例如它会告知它何时发现了一个开始标签,何时发现了一些特征数据,以及何时发现了一个结束标签。
这叫做事件驱动接口,因为解析器告知应用程序它遇到的有含义的事件。
如果这正是你需要的那种接口,可以使用SAX。

SAX是只读的
DOM可以从XML原文件中读取文档,也可以创建和修改内存中的文档。相比较而言,SAX是用来读取XML文档而不是书写文档。

可扩展样式语言(XSL,eXtensible Sytlesheet Language)是一种基于XML的语言,
它被设计用来转换XML文档到另一种XML文档或转换XML文档为可翻译对象。
原始的XSL语言已经被分割成三种不同的语言:
1转换工具(XSLT)是一种转换XML文档到其他XML文档的语言
2翻译工具(XSLF—可以包括X S LT的使用)
3XML分级命令处理工具(XPath)
XSL有它自已的根,不管是在层叠样式表(CSS)中还是在一种叫DSSSL(文档样式语义和规格语言—读为'deessel')的语言中。
随着它的发展,XSL的样式表现变得更接近于CSS和远离DSSSL

posted @ 2006-07-10 17:33 Merlin 阅读(128) | 评论 (0)编辑 收藏

学完了C++,在学java, 会发现很多东西很像,我在这就只是记录一些不同的地方,其他的就不提了 呵呵

这个在java中是不合法的:

1 {
2 int  x = 12 ;
3 {
4 int  x = 23 ;
5 }

6 }
编译器会说 x已经定义了,呵呵 。
posted @ 2006-04-27 21:47 Merlin 阅读(122) | 评论 (0)编辑 收藏

男女定律

情人定律:男人想当女人的初恋情人;女人想做男人的最后情人。

初坠情网定律:女人姣好的长相,是使男人迅速坠入情网的“导火线”;男人的“甜言蜜语”,使女人乐于被拉下爱河。

求爱定律:男人追求女人,如隔着一座山--难;女人追求男人,如隔着一层纸--易。尽管如此,实际生活中男人往往能追到他喜欢的女人,而女人却得不到她爱恋的男人,原因是:男人不怕翻山越岭,女人却怕伤了手指头。

初恋定律:男人获得爱的方式是迅速出击,在燃烧中拥抱爱的烈焰;女人获得爱的方法是缓慢地渗透,然后在平静中品尝爱的芬芳。

热恋定律:男人热恋时有用不完的聪明;女人热恋时却易变得愚蠢。

考验定律:男人考验女人的方法是远走飞;女人考验男人的方式是约会迟到。

目的定律:男人为结婚而恋爱;女人为爱情而结婚。

结婚定律:男人结婚是因为无聊,女人结婚则是因为好奇。结婚双方都很失望。

夫妻定律:父亲--兄长--弟弟;母亲--姐姐--妹妹。需要什么时就变出什么样子来。

婚前婚后定律:婚前,男人说:“你是我的一切。”女人会说:“我属于你。”婚后,男人会说:“我是你的一切。 ”女人会说:“你属于我。” 

说话定律:男人酒后话多,女人婚后话多。所以,一个热闹的家庭往往是由于嗜酒的丈夫和爱唠叨的妻子组成的。

家庭观念定律:“晚出夜不归”的是男人;“多想这个家”的是女人。

区别定律:当一个男人不修边幅时,人们会说:“他的老婆可真够呛!”当一个女人仪容不整时,人们会说:“她的丈夫可真倒霉!”

成功背后定律:一个成功的男人背后,总有一个坚强的女人;而一个成功的女人背后,常是一个伤她心的男人。

posted @ 2006-04-24 18:45 Merlin 阅读(133) | 评论 (0)编辑 收藏

注意事项:
1。本试卷分第I卷(选择贴)和第II卷(非选择题)两部分。考试结束后,将本试卷和答题卡一并交回。
2。本试卷采取魔兽争霸3冰封王座1.18版本。

 
第I卷

一。选择题:(共12道题,每题5分)

(1)不死女妖能不能够占据空军?(   )
A.不网下来不可以,网下来可以。
B.不网下来不可以,网下来也不可以。
C.不网下来可以,网下来不可以。
D.不网下来可以,网下来也可以。

(2)被释放妖术的不死单位是否可以用死亡缠绕加血?( )
A.不能。
B.能。
C.一级妖术可以。
D.完全看人品。


(3)下面哪种方法不可以用来探隐形?( )
A.造哨塔,并升级探隐形。
B.先知的透视。
C.地精研究所探照灯。
D.抓住对手脖子猛摇,导致对手操作失误。


(4)下面哪种伤害性技能会打断恢复性药品(比如兽族的补血药膏)? (   )
A.恶魔猎手的Mana Burn,
B.丛林守护者的缠绕,
C.毒素伤害。
D.死亡缠绕。


(5)下面四组技能中哪一组不全能打断对手? ( )
A.战争践踏,须根缠绕,飓风。
B.睡眠,变羊,放逐。
C.风暴之锤,沉默,重击。
D.巫术,静止陷阱,雷霆一击。

(6)什么办法可以加快农民采矿速度?( )
A.加速卷轴。
B.耐久光环。
C.提高工资。
D.现在的版本任何增加速度的光环和魔法效果都不会改变采金速度。

(7)下面四组技能中哪一组不全是持续性魔法技能? ( )
A.占据,地震,巫毒
B.食尸,流星群,宁静之雨
C.烈焰风暴,暴风雪,放逐。
D.火雨,万兽惊袭,火山

(8)下列什么情况下战场上的单位光环不会失效? ( )
A.隐形;
B.上飞艇;
C.被吹上天;
D.英雄挂掉。

(9)下面哪些技能能够躲避已经投出的风暴之锤? ( )
A.剑圣疾风步。
B.蜘蛛钻地。
C.女巫隐形。
D.熊猫分身。

(10)哪个1级英雄最贫血?( )
A.巫妖
B.先知
C.test师。
D.娜迦。

(11)下列哪种技能不能够被破法者盗取? ( ) 
A.嗜血。
B.须根缠绕。
C.静止陷阱。
D.飓风。

(12)农民能否修理第精飞艇? ( )
A.不能。
B.能。
C.必须用飓风权杖将农民吹上天才能修理。
D.必须用穿刺将农民插上天才能修理。

第II卷
二。计算:[ne]弓箭手攻击升级了自然祝福的暗夜基地伤害是百分之多少?如果基地站起,伤害又是百分之多少?(10分)


三。计算:[orc]3级闪电链和3级震荡波打在满血兽人步兵身上,问需要用1级的治疗波治疗几次方可满血?(10分)

四。计算:[hum]一个满魔的破法者能否占据一个半血的3级水元素?计算数据说明理由。(10分)


五。计算:[ud]三级的死亡缠绕二级的霜之新星加一级的穿刺对普通兵可以造成多少伤害?(10分)

posted @ 2006-04-15 18:09 Merlin 阅读(176) | 评论 (0)编辑 收藏

仅列出标题
共4页: 1 2 3 4