让Struts与Hibernate顺利协同事情
当前位置:以往代写 > JAVA 教程 >让Struts与Hibernate顺利协同事情
2019-06-14

让Struts与Hibernate顺利协同事情

让Struts与Hibernate顺利协同事情

副标题#e#

安装篇

一,下载安装 j2sdk1.4(www.sun.com))或以上,配置 CLASSPATH,java_home。

二,下载处事器,免费版本的有 tomcat,resin,虽然也尚有 weblogic之类的巨无霸,不外得看你电脑的设置是否遭受的了!

这里只以resin来说明,其他的设置都差不多,可以查察各个处事器自带的说明文件。

resin 处事器可以在 caucho.com下载,选择符合的版本,下载解压缩就可以直接利用。

这里resin有一个 resin-ee版本,这个主要是带ejb成果支持的。 假如用不到ejb,一般的就足够了。

三,然后就是数据库,有很大都据库产物可以选择,DB2,Oracle,MSSQL,MySQL等等太多了。这里我选择MySQL,不只因为它是免费的,并且它的4.0版本在担任以前版本的快速不变的基本上,整合了InnoDB(http://www.innodb.com)先进的事务处理惩罚机制。相信陪伴着Linux的壮大,它将在贸易数据库市场占的一席之地。不外就数据库自己,它还缺少子查询等强大成果的支持。

安装就不多说了,设置好用户名,暗码。 然后就可以下载 MySQL-Front 来可视化操纵数据库。

四,在Java编程上,一个IDE的成果显然不行缺少,此刻风行的IDE许多,有JBuilder,Eclipse,IntellJ IDEA,JCreator等等,个中 eclipse借着开源春风,依靠强大的插件成果被誉为最有前途的东西,JBuilder从来都最强大成果的java东西,不外大到我的电脑实在运行不了,穷啊,可没钱配新电脑。所以我照旧喜欢JCreator,小巧而又成果不俗,应付小局限的应用绰绰有余。编译开拓时要想得到提示支持,需要在 configure–option–JDK Profiles 导入jar文件。

五,一个站点前台的界面开拓,虽然离不开台甫鼎鼎的 Dreamweaver 了,它支持jsp,asp等许多语言的开拓。出格是最近的Dreamweaver MX 2004 加强了站点的成果,可以利便的对一个站点举办节制。面临struts的前台自界说标签,有一个mxp插件可以用来支持显示sturts的标签。利用前还要在编辑–标签库 内里导入.tld文件,今朝只支持html,和bean 两个标签。

设置篇

一,resin虚拟站点设置

<host id='yourweb:8080' app-dir='e:\blog\' class-update-interval='2'>
<web-app id='/'>
<directory-servlet id='false'/>
</web-app>
<error-log id='log/web-error.log'/>
<host>

然后在界说的目次下面成立站点。

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

三,Struts的设置

这里我们利用的是struts1.1,下载并解压缩到姑且文件夹,就假设是tem文件夹吧。

首先拷贝tem/lib/下面所有的.tld文件到站点的/WEB-INF/目次下,再拷贝所有的.jar文件到/WEB-INF/lib/目次下,最后web.xml文件中的设置差不多如下:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- The Usual Welcome File List -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- Struts Tag Library Descriptors -->
<taglib>
<taglib-uri>/tags/struts-bean</taglib-uri>
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/tags/struts-html</taglib-uri>
<taglib-location>/WEB-INF/struts-html.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/tags/struts-logic</taglib-uri>
<taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/tags/struts-nested</taglib-uri>
<taglib-location>/WEB-INF/struts-nested.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/tags/struts-tiles</taglib-uri>
<taglib-location>/WEB-INF/struts-tiles.tld</taglib-location>
</taglib>
</web-app>


#p#副标题#e#

四,Hibernate设置

下载并拷贝/lib目次下的

#p#分页标题#e#

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文件

<?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="hibernate.connection.url">
jdbc:mysql://localhost:3306/yourdatabase
</property>
<property name="hibernate.connection.driver_class">
org.gjt.mm.mysql.Driver
</property>
<property name="hibernate.connection.username">
yourname
</property>
<property name="hibernate.connection.password">
youyrpassword
</property>
<!?- 是否将运行期生成的SQL输出到日志以供调试-->
<property name="show_sql">false</property>
<!--dialect ,每个数据库都有其对应的Dialet以匹配其平台特性-->
<propertyname="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<!?- 事务打点范例,这里我们利用JDBC Transaction -->
<property name="transaction.factory_class">
net.sf.hibernate.transaction.JDBCTransactionFactory</property>
<property name="jdbc.batch_size">10</property>
<property name="jdbc.use_scrollable_resultset">true</property>
<!?映射文件设置,留意设置文件名必需包括其相对付根的全路径-->
<mapping resource="net/seerlog/hbm/Cat.hbm.xml"/>
</session-factory>
</hibernate-configuration>

以上设置了数据库毗连所用的地点和用户名,暗码等。详细参数的寄义请参考官方文档。

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

整个需要两种文件: .hbm.xml设置文件 和 .java耐久化工具 , 两者是彼此关联的,.hbm.xml 对数据库的映射还需要 .java这个bean来操纵。所以整个进程需要首先设计好数据库,然后按照数据库导出 .hbm.xml文件 ,然后再导出 .java 文件。 有许多东西可以实现这个工程,我们这里回收 Middlegen-Hibernate来实现 数据库到.hbm.xml文件的转化,用Hibernate-Extension东西包中的 hbm2java 来实现 .hbm.xml 到 .java 文件的转化!

让Struts与Hibernate顺利协同工作

查找要害字”!ENTITY”,获得:

<!DOCTYPE project [
<!ENTITY database SYSTEM
"file:./config/database/hsqldb.xml">
]>

b) Application name

<property name="name" value="airline"/>

c) 输出目次

查找要害字“name="build.gen-src.dir"”,获得:

<property name="build.gen-src.dir" value="${build.dir}/gen-src"/>

d) 对应代码的Package name

<hibernate
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_DRIVER和HIBERNATE_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\

通过以上步调我们就生成了所需要的所有根基设置文件。接下来就可以来初始化这些设置啦。

#p#副标题#e#

实战篇

#p#分页标题#e#

在这一节我们要设置一个完整的应用设置。其实每一个单独拿出来都能写本书,不外我只是偏重对本身总结,在今后我会不绝地把进修的履历教导写下来。

一,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);
}
}

#p#副标题#e#

文中DBConnectionManager.getConnection()是一个DAO类,提供毗连池的实现。

我们利用这个con毗连来建设一个 session ,sission是一个数据库毗连操纵的会话周期,它提供了强大的打点数据的本领。

今后我们在action的 execute 要领中就可以利用 Hi.getSession()来得到一个会话支持。典范的应用如下:

#p#分页标题#e#

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协同事情的全部内容了,这篇文章只能让你相识整个进程,这里的例子不能作为实现的进修例子。

    关键字:

在线提交作业