struts与hibernate协同工作之三(实战篇)

类别:Java 点击:0 评论:0 推荐:

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

  一,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/目录下面,大致的配置如下

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.0//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd">
<struts-config>

<form-beans>
<form-bean name="loginForm" type="net.seerlog.vo.LoginForm"/>
<form-bean name="replyForm" type="net.seerlog.vo.ReplyForm"/>
</form-beans>

<global-forwards>
<forward name="index" path="/first.jsp"/>
</global-forwards>

<action-mappings>

<action path="/login" type="net.seerlog.action.LoginAction" scope="request" name="loginForm" input="/login.jsp">
<forward name="success" path="/success.jsp"/>
</action>

<action path="/blog" type="net.seerlog.action.BlogAction" scope="request">
<forward name="success" path="/sublog.jsp"/>
</action>

<action path="/topic" type="net.seerlog.action.TopicAction" scope="request">
<forward name="success" path="/sutopic.jsp"/>
</action>

<action path="/posttopic" type="net.seerlog.action.PostTopicAction" scope="request" >
</action>

<action path="/postreply" type="net.seerlog.action.PostReplyAction" scope="request" name="replyForm" input="/sublog.jsp">
</action>

<action path="/index" type="net.seerlog.action.IndexAction" scope="request">
</action>

</action-mappings>

<message-resources parameter="resouse.application">
</message-resources>
</struts-config>


这里的配置有一个可视化工具叫做 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 或 [email protected]
 

本文地址:http://com.8s8s.com/it/it11679.htm