分享
 
 
 

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

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

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

一,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 或 yujiebo025@hotmail.com

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有