HTC:HTML Component

前些天公司做了个内部培训,主要是有几位同事要加入到一个B/S的项目中去,由有B/S开发经验的同事给他们做个培训,大致介绍一下公司目前做表示层使用的框架和技术。我由于刚进公司,比较闲,于是被拉去旁听,第一次听说了这个HTC。

其实HTC也不是什么新的东西,只不过是一个封装,由微软免费提供,当然也仅仅支持IE,而且没有文档和任何技术支持。但是HTC说起来也挺简单的,就是把最常用的表单验证、动态表单生成等封装起来,使用到的基本技术也就是CSS和JS,而我们公司在使用JSP做View的时候,还结合了一点JST,使页面代码更清晰一点。

HTC的优势就在于它提供了一种适合程序员思路的写网页的方式。本来如做客户端验证之类的问题之所以成为一个问题,就是因为这里面有一定的业务逻辑,但是放在服务器端的确没有必要,放在客户端,那就是一个老问题了??逻辑与表示混合在一起。

HTC的具体技术实现可以到网上查一下,或者到微软的网站上下一份源码看看,很简单的,就是将逻辑用js写到htc文件里,然后通过css分布给各个表单控件,这里特别要提到的是,是通过控件css的behavior属性,或者是onBehavior方法发布到各个控件的。

下载地址

http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/samples/internet/behaviors/library/webservice/default.asp

微软的refrence

http://msdn.microsoft.com/library/default.asp?url=/workshop/components/htc/reference/htcref.asp

表示层技术学习

目的:在此记录一些与表示层相关的技术学习。

虽然我不是专业做网站的,但是做java的总归会接触到一点B/S构架的,我就在几个项目里使用到了JSP、JSTL等等,以及DHTML、CSS、JS等技术,此外在学习Struts的过程中还听说了一些如Webwork和Velocity之类的表示层框架。虽然没有系统的学习、实践过这些技术,但点点滴滴的也遇到不少,可是又因为不常用,许多东西也忘记了。以后我会把用到过的一些表示层技术记录在此,再要用到的时候可以翻翻看看。

很久没来了

换了一个工作,忙着做交接。主要是原来的工作太轻闲了,实在对自己的发展不利。新的工作与原来的类似,但是公司规模更大一些,也更正规一些。目前也在使用Hibernate+Struts的框架,我现在正在学习,平时零散的学习笔记会写在自己的blog上,以后会整理后贴到这里的。

我觉得使用开源软件对于学习的最大的好处就是可以去看源码,看看牛人们是怎么写程序的,而且可以从中理解框架的原理和思想。譬如DAO、譬如MVC、由譬如DI和AOP,为什么要实现这些模式,又是怎么实现这些模式的。今天看到csdn的java emag上采访Adams,JDO成员组的专家,他说,JDO不是凭空出现的,早在java诞生前,他们就用c做过一个O/R Mapping概念的组件了。实际上Hibernate、Struts、Spring这些眼下很红火的东东,其中的思想也是很早就有了,它们都是多年来经验的总结。

另外,看源码的另一个好处就是知道了很多很实用但一直不被多数了解的东西,即框架背后默默无闻的那些工具包,比如负责事务处理的jta,有比如jakarta commons下面的许多包,像Digester和BeanUtils,还有像Antlr。另外也包括像maven这样的工具,还有docbook,原来大牛们都用啊......

看源码最后一个好处就是遇到后来新出的东西也不会害怕了,即使是不同的思想,但是框架的原理是一样的,或者目的是一样的,只是实现方式不同,就算不一样,也可以有个参照么。像我们这些整体闲着的,或者是学生,没太多实践的机会,如果看通源码,那出去和人侃,照样能把人侃晕啊,hiahia~~

[转]Java中四种XML解析技术之不完全测试

本文原始出处:Java中四种XML解析技术之不完全测试: http://www.blogjava.net/rosen/archive/2005/08/12/9950.html

正文:

*******************************************************************************

  在平时工作中,难免会遇到把XML作为数据存储格式。面对目前种类繁多的解决方案,哪个最适合我们呢?在这篇文章中,我对这四种主流方案做一个不完全评测,仅仅针对遍历XML这块来测试,因为遍历XML是工作中使用最多的(至少我认为)。

  预备

  测试环境:

  AMD毒龙1.4G OC 1.5G、256M DDR333、Windows2000 Server SP4、Sun JDK 1.4.1+Eclipse 2.1+Resin 2.1.8,在Debug模式下测试。

  XML文件格式如下:

  <?xml version="1.0" encoding="GB2312"?><RESULT><VALUE>

  <NO>A1234</NO>

  <ADDR>四川省XX县XX镇XX路X段XX号</ADDR></VALUE><VALUE>

  <NO>B1234</NO>

  <ADDR>四川省XX市XX乡XX村XX组</ADDR></VALUE></RESULT>

  测试方法:

  采用JSP端调用Bean(至于为什么采用JSP来调用,请参考:http://blog.csdn.net/rosen/archive/2004/10/15/138324.aspx),让每一种方案分别解析10K、100K、1000K、10000K的XML文件,计算其消耗时间(单位:毫秒)。

  JSP文件:

  <%@ page contentType="text/html; charset=gb2312" %><%@ page import="com.test.*"%>

  <html><body><%String args[]={""};MyXMLReader.main(args);%></body></html>

  测试

  首先出场的是DOM(JAXP Crimson解析器)

  DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。DOM以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。DOM使用起来也要简单得多。

  另一方面,对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如SAX。

  Bean文件:

  package com.test;

  import java.io.*;import java.util.*;import org.w3c.dom.*;import javax.xml.parsers.*;

  public class MyXMLReader{

  public static void main(String arge[]){

  long lasting =System.currentTimeMillis();

  try{ 

   File f=new File("data_10k.xml");

   DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

   DocumentBuilder builder=factory.newDocumentBuilder();

   Document doc = builder.parse(f);

   NodeList nl = doc.getElementsByTagName("VALUE");

   for (int i=0;i<nl.getLength();i++){

    System.out.print("车牌号码:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());

    System.out.println("车主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());

  }

  }catch(Exception e){

   e.printStackTrace();

  }

  System.out.println("运行时间:"+(System.currentTimeMillis() - lasting)+"毫秒");}} 

  10k消耗时间:265 203 219 172

  100k消耗时间:9172 9016 8891 9000

  1000k消耗时间:691719 675407 708375 739656

  10000k消耗时间:OutOfMemoryError

  接着是SAX

  这种处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX还比它的替代者DOM快许多。

   选择DOM还是选择SAX?

  对于需要自己编写代码来处理XML文档的开发人员来说, 

  选择DOM还是SAX解析模型是一个非常重要的设计决策。

  DOM采用建立树形结构的方式访问XML文档,而SAX采用的事件模型。

  DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。用DOM解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用DOM解析器的时候需要处理整个XML文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。

  SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时,SAX这种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。

  Bean文件:

  package com.test;import org.xml.sax.*;import org.xml.sax.helpers.*;import javax.xml.parsers.*;

  public class MyXMLReader extends DefaultHandler {

  java.util.Stack tags = new java.util.Stack();

  public MyXMLReader() {

  super();}

  public static void main(String args[]) {

  long lasting = System.currentTimeMillis();

  try {

   SAXParserFactory sf = SAXParserFactory.newInstance();

   SAXParser sp = sf.newSAXParser();

   MyXMLReader reader = new MyXMLReader();

   sp.parse(new InputSource("data_10k.xml"), reader);

  } catch (Exception e) {

   e.printStackTrace();

  }

  System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + "毫秒");}

  public void characters(char ch[], int start, int length) throws SAXException {

  String tag = (String) tags.peek();

  if (tag.equals("NO")) { 

   System.out.print("车牌号码:" + new String(ch, start, length));}if (tag.equals("ADDR")) {

  System.out.println("地址:" + new String(ch, start, length));}}

  public void startElement(String uri,String localName,String qName,Attributes attrs) {

  tags.push(qName);}} 

  10k消耗时间:110 47 109 78

  100k消耗时间:344 406 375 422

  1000k消耗时间:3234 3281 3688 3312

  10000k消耗时间:32578 34313 31797 31890 30328

  然后是JDOM http://www.jdom.org/

  JDOM的目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。由于是第一个Java特定模型,JDOM一直得到大力推广和促进。正在考虑通过“Java规范请求JSR-102”将它最终用作“Java标准扩展”。从2000年初就已经开始了JDOM开发。

  JDOM与DOM主要有两方面不同。首先,JDOM仅使用具体类而不使用接口。这在某些方面简化了API,但是也限制了灵活性。第二,API大量使用了Collections类,简化了那些已经熟悉这些类的Java开发者的使用。

  JDOM文档声明其目的是“使用20%(或更少)的精力解决80%(或更多)Java/XML问题”(根据学习曲线假定为20%)。JDOM对于大多数Java/XML应用程序来说当然是有用的,并且大多数开发者发现API比DOM容易理解得多。JDOM还包括对程序行为的相当广泛检查以防止用户做任何在XML中无意义的事。然而,它仍需要您充分理解XML以便做一些超出基本的工作(或者甚至理解某些情况下的错误)。这也许是比学习DOM或JDOM接口都更有意义的工作。

  JDOM自身不包含解析器。它通常使用SAX2解析器来解析和验证输入XML文档(尽管它还可以将以前构造的DOM表示作为输入)。它包含一些转换器以将JDOM表示输出成SAX2事件流、DOM模型或XML文本文档。JDOM是在Apache许可证变体下发布的开放源码。

  Bean文件:

  package com.test;

  import java.io.*;import java.util.*;import org.jdom.*;import org.jdom.input.*;

  public class MyXMLReader {

  public static void main(String arge[]) {

  long lasting = System.currentTimeMillis();

  try {

   SAXBuilder builder = new SAXBuilder(); 

   Document doc = builder.build(new File("data_10k.xml")); 

   Element foo = doc.getRootElement(); 

   List allChildren = foo.getChildren(); 

   for(int i=0;i<allChildren.size();i++) { 

    System.out.print("车牌号码:" + ((Element)allChildren.get(i)).getChild("NO").getText());

    System.out.println("车主地址:" + ((Element)allChildren.get(i)).getChild("ADDR").getText());

   }

  } catch (Exception e) {

   e.printStackTrace();

  }

  System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + "毫秒");}} 

  10k消耗时间:125 62 187 94

  100k消耗时间:704 625 640 766

  1000k消耗时间:27984 30750 27859 30656

  10000k消耗时间:OutOfMemoryError

  最后是DOM4J http://dom4j.sourceforge.net/

  虽然DOM4J代表了完全独立的开发结果,但最初,它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,它通过DOM4J API和标准DOM接口具有并行访问功能。从2000下半年开始,它就一直处于开发之中。

  为支持所有这些功能,DOM4J使用接口和抽象基本类方法。DOM4J大量使用了API中的Collections类,但是在许多情况下,它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是,虽然DOM4J付出了更复杂的API的代价,但是它提供了比JDOM大得多的灵活性。

  在添加灵活性、XPath集成和对大文档处理的目标时,DOM4J的目标与JDOM是一样的:针对Java开发者的易用性和直观操作。它还致力于成为比JDOM更完整的解决方案,实现在本质上处理所有Java/XML问题的目标。在完成该目标时,它比JDOM更少强调防止不正确的应用程序行为。

  DOM4J是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML,特别值得一提的是连Sun的JAXM也在用DOM4J。

  Bean文件:

  package com.test;

  import java.io.*;import java.util.*;import org.dom4j.*;import org.dom4j.io.*;

  public class MyXMLReader {

  public static void main(String arge[]) {

  long lasting = System.currentTimeMillis();

  try {

   File f = new File("data_10k.xml");

   SAXReader reader = new SAXReader();

   Document doc = reader.read(f);

   Element root = doc.getRootElement();

   Element foo;

   for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) {

    foo = (Element) i.next();

    System.out.print("车牌号码:" + foo.elementText("NO"));

    System.out.println("车主地址:" + foo.elementText("ADDR"));

   }

  } catch (Exception e) {

   e.printStackTrace();

  }

  System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + "毫秒");}} 

  10k消耗时间:109 78 109 31

  100k消耗时间:297 359 172 312

  1000k消耗时间:2281 2359 2344 2469

  10000k消耗时间:20938 19922 20031 21078

  JDOM和DOM在性能测试时表现不佳,在测试10M文档时内存溢出。在小文档情况下还值得考虑使用DOM和JDOM。虽然JDOM的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。另外,DOM仍是一个非常好的选择。DOM实现广泛应用于多种编程语言。它还是许多其它与XML相关的标准的基础,因为它正式获得W3C推荐(与基于非标准的Java模型相对),所以在某些类型的项目中可能也需要它(如在JavaScript中使用DOM)。

  SAX表现较好,这要依赖于它特定的解析方式。一个SAX检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。

  无疑,DOM4J是这场测试的获胜者,目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J吧!(文/rosen)

*****************************************************************************

JAVA学习日记致本文转载者: andjia

andjia,您好,

感谢您转载的这篇文章,据本文作者反映,移去您原来的转载地网址,改为原作者网址。

                                   admin   2007年4月16日下午

DAO

DAO-数据访问对象(Data Access Object),是将业务逻辑层与持久性数据层解耦的一个集成层模式,它处理与持久性数据(关系数据库、面向对象数据库、纯文件、集成时遇到的遗产或者异类系统)的事务性交互,生成VO-值对象(Value Object)并将其返回给业务逻辑层。这样,业务逻辑层就不需要了解持久性数据的具体操作,而是直接操作值对象。(JSP页面里不会再有Connection conn = DriverManager.getConnection……什么的了)

这样,DAO模式中的四个参与角色就很明白了:

业务对象Business Object

数据访问对象Data Access Object

数据源Data Source

值对象Value Object

DAO模式实际上是一种代理模式,使对象(资源)的访问具有间接性,分类资源层和其他层客户端,如业务层或者表示层。

一个典型的 DAO 实现有以下组件:

一个 DAO 工厂类

一个 DAO 接口

一个实现了 DAO 接口的具体类

数据传输对象(有时称为值对象)

具体的 DAO 类包含访问特定数据源的数据的逻辑。

以上是从Core J2EE Patterns书中DAO一节以及一些网上资料中摘录的,Hibernate作为一个ORM的实现,分离出了持久层的操作,所以也是DAO模式。参照DAO的基本组件构架和“与猫同乐”的那个简单的例子,来分析一下Hibernate的基本构架和关键类。

DAO接口:net.sf.hibernate.Session接口,获取实例的方法SessionFactory.openSession();

Session接口是Hibernate应用的主要接口,一个Session实例是轻量级的,可以轻易的创建和销毁,由于应用程序在调用Hibernate时,会经常性的创建和销毁Session实例,所以Session实例必须是轻量级的。同时,Session不是线程安全的,一个session能并只能被一个线程调用。

Session处理对象的各种持久性操作,如存储、重新载入等,ses.save(princess);

DAO工厂类:net.sf.hibernate.SessionFactory类,生成方法

sessionFactory = new Configuration().configure().buildSessionFactory();

由于Hibernate的配置信息存放在xml里,所以由一个net.sf.hibernate.cfg.Configuration类来完成配置,它的configure()方法将读取hibernate.cfg.xml里的内容,Configuration是使用Hibernate需要的第一个类,以后使用的SessionFactory和Session等多为接口。具体的配置过程参见Configuration类的protected Configuration doConfigure(org.dom4j.Document doc) throws HibernateException;方法。

SessionFactory接口向应用程序提供Session实例,SessionFactory不是轻量级的,所以最好被所有的应用共享,通常为每个数据源创建一个SessionFactory。SessionFactory会处理各个ORM配置XML(Cat.hbm.xml),在它的实现类的构造函数里就载入所有的Mapping配置,见net.sf.hibernate.impl.SessionFactoryImpl的构造函数。

我的儿子叫嘟嘟

生于2004年10月17日,出生体重9.5斤,身长55cm,跟他妈姓袁,小名嘟嘟,就是“圆嘟嘟”的意思啦,呵呵,希望长大了别是个胖子。

现在嘟嘟和他妈妈都在南通,而我在上海,只有每个周末才能回去。每次回去嘟嘟都长大好多,现在他听到声音会转转眼睛到处看了,如果有人抱他,他就会盯着抱他的人的脸看,呵呵,在学着认人吧。

与猫同乐(Tomcat+Hibernate)

这是一个Hibernate文档中的简单例子,环境是Tomcat+MySql+Hibernate

下载了Tomcat5.0,安装……

下载了Hibernate2,解包……

下载了MySql-nt5.0,安装……

下载数据库驱动mysql-connector-java-3.0.15-ga,解包……

数据库连接池配置:把数据库驱动mysql-connector-java-3.0.15-ga-bin.jar拷贝到%Tomcat%\common\lib下,在%Tomcat%\conf\server.xml里找到<Host>……</Host>,在其间添加

<Context path="/mytest" docBase="mytest" debug="0" reloadable="true" crossContext="true">

<Resource name="jdbc/mysql" auth="Container" type="javax.sql.DataSource"/>

<ResourceParams name="jdbc/mysql">

<parameter>

<name>factory</name>

<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>

</parameter>

<!-- MySQL dB username and password for dB connections -->

<parameter>

<name>username</name>

<value>root</value>

</parameter>

<parameter>

<name>password</name>

<value>root</value>

</parameter>

<parameter>

<name>driverClassName</name>

<value>org.gjt.mm.mysql.Driver</value>

</parameter>

<parameter>

<name>url</name>

<value>jdbc:mysql://localhost:3306/test</value>

</parameter>

<parameter>

<name>maxActive</name>

<value>100</value>

</parameter>

<parameter>

<name>maxIdle</name>

<value>30</value>

</parameter>

<parameter>

<name>maxWait</name>

<value>10000</value>

</parameter>

</ResourceParams>

</Context>

解释:Context里的path是应用程序的路径,就是%tomcat%\webapps下的目录。

然后配置Hibernate:

在%tomcat%\webapps下建一个mytest目录,以及相应的WEB-INF、classes、lib目录,将Hibernate2.jar拷到lib下,将Hibernate解包后的lib目录下需要用到的包也拷过去:

cglib-full-2.0.2.jar

commons-collections-2.1.1.jar

commons-logging-1.0.4.jar

dom4j-1.4.jar

ehcache-0.9.jar

jta.jar

log4j-1.2.8.jar

odmg-3.0.jar

log4j还有一个properties文件要拷到classes目录下

在WEB-INF下的web.xml里添加数据库连接池的设置

<web-app>

<resource-ref>

<description>DB Connection</description>

<res-ref-name>jdbc/mysql</res-ref-name>

<res-type>javax.sql.DataSource</res-type>

<res-auth>Container</res-auth>

</resource-ref>

</web-app>

这用来指明数据库连接池。然后是设置Hibernate使用这个容器管理的连接池来连接数据库:在classes目录下建一个hibernate.cfg.xml,写入

<?xml version='1.0' encoding='utf-8'?>

<!DOCTYPE hibernate-configuration

PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"

"http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">

<hibernate-configuration>

<session-factory>

<property name="connection.datasource">java:comp/env/jdbc/mysql</property>

<property name="show_sql">false</property>

<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>

<!-- Mapping files -->

<mapping resource="Cat.hbm.xml"/>

</session-factory>

</hibernate-configuration>

这里可以看到连接的设置,其中dialect是用来指明一个类,来处理数据库数据类型和Java数据类型之间的对照的。<mapping resource="Cat.hbm.xml"/>是映射设置,下面会提到。先看看根据数据库表结构制作的java bean:

数据库结构为:CAT

Column | Type | Modifiers

--------+-----------------------+-----------

cat_id | character(32) | not null

name | character varying(16) | not null

sex | character(1) |

weight | real |

Indexes: cat_pkey primary key btree (cat_id)

对应的java bean源程序:

package net.sf.hibernate.examples.quickstart;

public class Cat {

private String id;

private String name;

private char sex;

private float weight;

public Cat() {

}

public String getId() {

return id;

}

private void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public char getSex() {

return sex;

}

public void setSex(char sex) {

this.sex = sex;

}

public float getWeight() {

return weight;

}

public void setWeight(float weight) {

this.weight = weight;

}

}

然后在classes目录下创建一个Cat.cfg.xml来配置PO对象:

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping

PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>

<class name="net.sf.hibernate.examples.quickstart.Cat" table="CAT">

<!-- A 32 hex character is our surrogate key. It's automatically

generated by Hibernate with the UUID pattern. -->

<id name="id" type="string" unsaved-value="null" >

<column name="CAT_ID" sql-type="char(32)" not-null="true"/>

<generator class="uuid.hex"/>

</id>

<!-- A cat has to have a name, but it shouldn' be too long. -->

<property name="name">

<column name="NAME" length="16" not-null="true"/>

</property>

<property name="sex"/>

<property name="weight"/>

</class>

</hibernate-mapping>

在这里可以看到java bean类net.sf.hibernate.examples.quickstart.Cat和数据库表CAT的映射关系。

编译好Cat类,放到相应目录下,OK,配置就完成了。下面是在JSP里应用的例子。

首先我们再创建一个类HibernateUtil,用来处理一些诸如取/关Session的功能,这些功能也可以直接写在JSP里:

package net.sf.hibernate.examples.quickstart;

import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;

import net.sf.hibernate.*;

import net.sf.hibernate.cfg.*;

public class HibernateUtil {

private static Log log = LogFactory.getLog(HibernateUtil.class);

private static final SessionFactory sessionFactory;

static {

try {

// Create the SessionFactory

sessionFactory = new Configuration().configure().buildSessionFactory();

} catch (Throwable ex) {

log.error("Initial SessionFactory creation failed.", ex);

throw new ExceptionInInitializerError(ex);

}

}

public static final ThreadLocal session = new ThreadLocal();

public static Session currentSession() throws HibernateException {

Session s = (Session) session.get();

// Open a new Session, if this Thread has none yet

if (s == null) {

s = sessionFactory.openSession();

session.set(s);

}

return s;

}

public static void closeSession() throws HibernateException {

Session s = (Session) session.get();

session.set(null);

if (s != null)

s.close();

}

}

然后是Cat.JSP,很简单

<%@ page language="java" pageEncoding="GB2312" %>

<%@ page import="net.sf.hibernate.Transaction"%>

<%@ page import="net.sf.hibernate.Session"%>

<%@ page import="net.sf.hibernate.cfg.*"%>

<%@ page import="net.sf.hibernate.Query"%>

<%@ page import="net.sf.hibernate.examples.quickstart.HibernateUtil"%>

<%@ page import="net.sf.hibernate.examples.quickstart.Cat"%>

<%@ page import="java.util.*"%><!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"><html><head><title>Lomboz JSP</title></head><body bgcolor="#FFFFFF">

<%

//添加一只Cat

Session ses = HibernateUtil.currentSession();

Transaction tx= ses.beginTransaction();

Cat princess = new Cat();

princess.setName("ahxu");

princess.setSex('F');

princess.setWeight(7.4f);

ses.save(princess);

tx.commit();

HibernateUtil.closeSession();

//读取库里所有Cat

ses = HibernateUtil.currentSession();

tx= ses.beginTransaction();

Query query = ses.createQuery("select c from Cat as c where c.sex = :sex");

query.setCharacter("sex", 'F');

for (Iterator it = query.iterate(); it.hasNext();) {

Cat cat = (Cat) it.next();

out.println("Female Cat: " + cat.getName() );

}

tx.commit();

HibernateUtil.closeSession();

%>

</body>

</html>

学习Hibernate

Hibernate是一个开放源代码的O/R Mapping (对象关系映射)框架,它对JDBC进行了轻量级的对象封装,使Java程序员可以随心所欲的使用对象编程思维来操纵数据库。由于EJB在部署、调试等方面使用不便,而JDO尚处于开发阶段,还没有成熟统一的标准,Hibernate虽然并不是java官方的持久层方案,仍然被越来越多的人所使用,以至于在即将发布的EJB3.0的标准中,也能看到不少Hibernate的影子。