Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2551858
  • 博文数量: 709
  • 博客积分: 12251
  • 博客等级: 上将
  • 技术积分: 7905
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-17 00:00
个人简介

实现有价值的IT服务

文章存档

2012年(7)

2011年(147)

2009年(3)

2008年(5)

2007年(74)

2006年(431)

2005年(42)

分类: 系统运维

2006-07-24 13:51:31

strutshibernate协同工作之一(准备篇)

一,下载安装 j2sdk1.4))或以上,设置 CLASSPATHjava_home

二,下载服务器,免费版本的有 tomcat,resin,当然也还有 weblogic之类的巨无霸,不过得看你电脑的配置是否承受的了!
这里只以resin来说明,其他的配置都差不多,可以查看各个服务器自带的说明文件。
resin
服务器可以在 caucho.com下载,选择合适的版本,下载解压缩就可以直接使用。
这里resin有一个 resin-ee版本,这个主要是带ejb功能支持的。 如果用不到ejb,一般的就足够了。

三,然后就是数据库,有很多数据库产品可以选择,DB2,Oracle,MSSQL,MySQL等等太多了。这里我选择MySQL,不仅因为它是免费的,而且它的4.0版本在继承以前版本的快速稳定的基础上,整合了InnoDB()先进的事务处理机制。相信伴随着Linux的壮大,它将在商业数据库市场占的一席之地。不过就数据库本身,它还缺少子查询等强大功能的支持。
安装就不多说了,配置好用户名,密码。 然后就可以下载 MySQL-Front 来可视化操作数据库。

四,在Java编程上,一个IDE的功能显然不可缺少,现在流行的IDE很多,有JBuilder,Eclipse,IntellJ IDEA,JCreator等等,其中 eclipse借着开源东风,依靠强大的插件功能被誉为最有前途的工具,JBuilder从来都最强大功能的java工具,不过大到我的电脑实在运行不了,穷啊,可没钱配新电脑。所以我还是喜欢JCreator,小巧而又功能不俗,应付小规模的应用绰绰有余。编译开发时要想获得提示支持,需要在 configure--option--JDK Profiles 导入jar文件。

五,一个站点前台的界面开发,当然离不开大名鼎鼎的 Dreamweaver 了,它支持jspasp等很多语言的开发。特别是最近的Dreamweaver MX 2004 增强了站点的功能,可以方便的对一个站点进行控制。面对struts的前台自定义标签,有一个mxp插件可以用来支持显示sturts的标签。使用前还要在编辑--标签库 里面导入.tld文件,目前只支持html,和bean 两个标签。

 

strutshibernate协同工作之二(配置篇)

总论:在这一节我们要配置一个完整的应用配置。

  一,resin虚拟站点配置


  
    
  

  

然后在定义的目录下面建立站点。

  二,Dreamweaver站点的配置就不多说了。

  三,Struts的配置
  
这里我们使用的是struts1.1,下载并解压缩到临时文件夹,就假设是tem文件夹吧
首先拷贝tem/lib/下面所有的.tld文件到站点的/WEB-INF/目录下,再拷贝所有的.jar文件到/WEB-INF/lib/目录下
最后web.xml文件中的配置差不多如下:

PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"">


action
org.apache.struts.action.ActionServlet

config
/WEB-INF/struts-config.xml


debug
2


detail
2

2



action
*.do



index.jsp



/tags/struts-bean
/WEB-INF/struts-bean.tld


/tags/struts-html
/WEB-INF/struts-html.tld


/tags/struts-logic
/WEB-INF/struts-logic.tld


/tags/struts-nested
/WEB-INF/struts-nested.tld


/tags/struts-tiles
/WEB-INF/struts-tiles.tld

  四,Hibernate配置
下载并拷贝/lib目录下的
hibernate2.jar
commons-beanutils.jar
commons-collections.jar
commons-dbcp.jar
commons-lang.jar
commons-logging.jar
commons-pool.jar
dom4j.jar
cglib-asm.jar
connector.jar

到应用站点的/lib目录下。接下来配置 hibernate.cfg.xml文件


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





jdbc:mysql://localhost:3306/yourdatabase


org.gjt.mm.mysql.Driver


yourname


youyrpassword

是否将运行期生成的SQL输出到日志以供调试-->
false


net.sf.hibernate.dialect.MySQLDialect
事务管理类型,这里我们使用JDBC Transaction -->

  net.sf.hibernate.transaction.JDBCTransactionFactory


10
true

映射文件配置,注意配置文件名必须包含其相对于根的全路径-->





  
以上配置了数据库连接所用的地址和用户名,密码等。具体参数的含义请参考官方文档

  映射文件的内容可以手工来写,也可通过一些工具来自动生成。

  
整个需要两种文件: .hbm.xml配置文件 .java持久化对象 , 两者是相互关联的,.hbm.xml 对数据库的映射还需要 .java这个bean来操作。所以整个过程需要首先设计好数据库,然后根据数据库导出 .hbm.xml文件 ,然后再导出 .java 文件。 有很多工具可以实现这个工程,我们这里采用 Middlegen-Hibernate来实现 数据库到.hbm.xml文件的转化,用Hibernate-Extension工具包中的 hbm2java 来实现 .hbm.xml .java 文件的转化!

  Middlegen-Hibernate
的配置如下:(最好是放到c盘根目录下面)
  
进入MiddleGen 目录下的\config\database 子目录,根据我们实际采用的数据库打开对应的配置文件。如这里我们用的是mysql数据库,对应的就是mysql.xml 文件。

database.script.file" value="${src.dir}/sql/${name}-mysql.sql"/>
database.driver.file
" value="${lib.dir}/mysql.jar"/>
database.driver.classpath
" value="${database.driver.file}"/>
database.driver
" value="org.gjt.mm.mysql.Driver"/>
database.url
" value="jdbc:mysql://localhost/sample"/>
database.userid
" value="user"/>
database.password
" value="mypass"/>
database.schema
" value=""/>
database.catalog
" value=""/>
jboss.datasource.mapping
" value="mySQL"/>


  
主要是修改以上红色的部分。
  
然后是修改MiddleGen 根目录下的build.xml 文件,此文件是Middlegen-Hibernate Ant构建配置。Middlegen-Hibernate将根据build.xml 文件中的具体参数生成数据库表映射文件。 把以下配置中红色的部分用自己的内容代替
  
a) 目标数据库配置文件地址
查找关键字!ENTITY,得到:
"file:./config/database/hsqldb.xml">
]>

  
b) Application name
airline
"/>
  
c) 输出目录
查找关键字“name="build.gen-src.dir"”,得到:
${build.dir}/gen-src
"/>
  
d) 对应代码的Package name
destination="${build.gen-src.dir}"
package="
${name}.hibernate"
genXDocletTags="false"
genIntergratedCompositeKeys="false"
javaTypeMapper="middlegen.plugins.hibernate.HibernateJavaTypeMapper"
/>
  
配置完成后,在MiddleGen 根目录下运行ant,就将出现MiddleGen的界面:
  
选择需要的表,单击窗口顶部的Generate 按钮,MiddleGen 即为我们生成这些数据库表所对应的Hibernate映射文件。
  
接下来的工作通过Hibernate Extension 来完成,Hibernate Extension tools\bin目录下包含三个工具:
1
hbm2java.bat
  
根据映射文件生成对应的POJO。通过MiddleGen 我们已经得到了映射文件,
下一步就是通过hbm2java.bat工具生成对应的POJO
2
class2hbm.bat
  
根据POJO class 生成映射文件,这个工具很少用到,这里也就不再详细介绍。
3
ddl2hbm.bat
  
由数据库导出库表结构,并生成映射文件以及POJO。这个功能与MiddleGen的功能重叠,但由于目前还不够成熟(实际上已经被废弃,不再维护),提供的功能也有限,所以我们还是采用MiddleGen生成映射文件,之后由hbm2java根据映射文件生成POJO 的方式。
  
这里我们使用第一个hbm2java.bat,利用刚才生成的.hbm.xml文件自动生成 java 文件。
  
为了使用这个工具,首先我们需要配置一些参数,打开tools\bin\setenv.bat 文件,修改其中的JDBC_DRIVERHIBERNATE_HOME环境变量,使其指向我们的实际JDBC Driver文件和Hibernate所在目录。同时检查一下环境变量CP中的各个项目中是否实际存在,特别是%CORELIB%下的jar文件,某些版本的发行包中,默认配置中的文件名与实际的文件名有所出入(如%CORELIB%\commons-logging.jar, Hibernate 发行包中,可能实际的文件名是commons-logging-1.0.3.jar,诸如此类)。
  
使用hbm2java,根据MiddleGen生成的映射文件生成Java 代码:
  
打开Command Window,在tools\bin目录下执行:
    
hbm2java c:\sample\org\hibernate\sample\*.xml --output=c:\sample\
  
通过以上步骤我们就生成了所需要的所有基本配置文件。接下来就可以来初始化这些配置啦。

本章就写到这里了先.....

总论:在这一节我们要配置一个完整的应用配置。其实每一个单独拿出来都能写本书,不过我只是侧重对自己总结,在以后我会不断地把学习的经验教训写下来。

  一,Log4j 的初始化
配置log4j.properties

### direct log messages to stdout ###
#log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#log4j.appender.stdout.Target=System.out
#log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
%c{1}:%L - %m%n
#log4j.appender.stdout.layout.ConversionPattern=%-5p %d{yyyy-MM-dd HH:mm:ss} %l%n%m%n

log4j.logger.seerlog=DEBUG,A2
log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A2.file=d:\\log\\applog.txt
log4j.appender.A2.DatePattern='.'yyyy-MM-dd
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%-5p %d{yyyy-MM-dd HH:mm:ss} %m%n

#log4j.logger.ALL=DEBUG,A1
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.file=d:\\log\\all.log
log4j.appender.A1.DatePattern='.'yyyy-MM-dd
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-5p %d{yyyy-MM-dd HH:mm:ss} %l%n%m%n

### direct messages to file hibernate.log ###
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

###log4j.rootLogger=warn, stdout
log4j.rootLogger=info, A1

#以下是hibernate API需要的配置

log4j.logger.net.sf.hibernate=info

### log just the SQL
#log4j.logger.net.sf.hibernate.SQL=debug

### log JDBC bind parameters ###
log4j.logger.net.sf.hibernate.type=info

### log schema export/update ###
log4j.logger.net.sf.hibernate.tool.hbm2ddl=debug

### log cache activity ###
#log4j.logger.net.sf.hibernate.cache=debug

### enable the following line if you want to track down connection ###
### leakages when using DriverManagerConnectionProvider ###
#log4j.logger.net.sf.hibernate.connection.DriverManagerConnectionProvider=trac


配置后如下来调用,首先需要初始化配置文件,这个过程只需要一次,所以我们可以在ServletContextListener中来进行。

String prefix = context.getRealPath("/");
PropertyConfigurator.configure(
prefix+"/WEB-INF/classes/log4j.properties");


这里需要你的配置文件的路径来初始化。
初始化完成后,我们在以后的action中就可以 象下面一样来调用

static Logger log=Logger.getLogger("seerlog");
log.warn("it's log4j warn");
log.info("it's log4j info");


关于 log4j 的完全使用方法,偶会在以后做详细的说明!

二,hibernate 的初始化
首先我们要把hibernate.cfg.xml 放到应用的 classes 目录中,然后可以使用hibernate参考文档提供的例子来封装对后台的使用。

public class Hi{


private static final SessionFactory sessionFactory;

private static Connection conn;

static {
try {

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

} catch (HibernateException ex) {
throw new RuntimeException("Exception building SessionFactory: " + ex.getMessage(), ex);
}
}

public static final ThreadLocal session = new ThreadLocal();

public static Session getSession() throws HibernateException {

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

// 假如没有一个可用的线程,开启一个新 Session,

if (s == null) {

conn=
DBConnectionManager.getConnection();

s =
sessionFactory.openSession(conn);

session.set(s);
}

return s;

}

public static void closeSession() throws HibernateException {
Session s = (Session) session.get();
session.set(null);
if (s != null)
s.close();
if(conn!=null)
DBConnectionManager.returnConnection(conn);
}
}


文中DBConnectionManager.getConnection()是一个DAO类,提供连接池的实现。
我们使用这个con连接来创建一个 session sission是一个数据库连接操作的会话周期,它提供了强大的管理数据的能力。
以后我们在action execute 方法中就可以使用 Hi.getSession()来获得一个会话支持。典型的应用如下:

try{
//开启一个会话,并启动事务回滚能力
Session session =
Hi.getSession();
Transaction tx=
session.beginTransaction();


//查询数据库,使用HQL
Query q = session.createQuery("
from Topic as topic order by topic.id desc");
q.setFirstResult(0);
q.setMaxResults(5);

//得到一个List类型的数据
List newTopicList = q.list();

// 业务处理
NewTopicList ntlBean=new NewTopicList();
ntlBean.setList(newTopicList);
req.setAttribute("newtopiclist",ntlBean);

//事务提交,记得关闭会话!
tx.commit();
Hi.closeSession();

}
//因为整个会话会抛出异常,所以需要用try--catch来包裹
catch(HibernateException e){

//日志记录
Log.error(e.toString());
}

其中的HQL 可以参考 hibernate 官方文档来学习。

三,Struts
struts
的配置文件 struts-config.xml 放在 应用的 /WEB-INF/目录下面,大致的配置如下


"-//Apache Software Foundation//DTD Struts Configuration 1.0//EN"
"">


















这里的配置有一个可视化工具叫做 struts-console,目前版本4.8,网上可以免费下载的到。
配置文件其实不用去记,需要时参考一下,拷贝一个过来修改一下即可。只是这里的主要是在于设计 ,设计好有什么formbean,什么action,他们的关系,等等问题。一个好的设计绝对能为后期节省大量的返工可能性。struts有一本《struts on action》,绝对是学习struts的经典书籍,我手上有翻译的前8章,有需要的可以联系我。
我们这里不详细说明各个配置,只讲struts hibernate 合作的过程。
一个action 有一个 execute 方法,当然也可以用 perform方法,不过 perform 方法 struts1.1已经不推荐使用了,而使用了更强大的execute()方法。

package net.seerlog.action;

//导入所有用的到的包
import java.util.List;

import net.seerlog.po.*;
import net.seerlog.vo.*;
import net.seerlog.util.*;

import net.sf.hibernate.*;

import org.apache.struts.action.*;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import javax.servlet.ServletException;

public class IndexAction extends Action{

//action的主体方法 execute ,注意要抛出异常
public ActionForward execute (ActionMapping mapping,
ActionForm form,
HttpServletRequest req,
HttpServletResponse res) throws IOException, ServletException{
try{
//开启会话
Session session = Hi.getSession();
Transaction tx= session.beginTransaction();

//查询

Query q = session.createQuery("from Topic as topic order by topic.id desc");
q.setFirstResult(0);
q.setMaxResults(5);
List newTopicList = q.list();

NewTopicList ntlBean=new NewTopicList();
ntlBean.setList(newTopicList);
req.setAttribute("newtopiclist",ntlBean);

//事务提交,关闭session
tx.commit();
Hi.closeSession();

//捕获异常
}catch(HibernateException e){
Log.error(e.toString());
//日志记录
}

//返回一个 actionForward 对象
return mapping.findForward("index");
}

}


以上就是 struts hibernate协同工作的全部内容了,这篇文章只能让你了解整个过程,这里的例子不能作为实现的学习例子。 有问题请联系 QQ 2533300

阅读(1169) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~