工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 14069|回复: 18

[原创]Struts+Hibernate入门实例(Eclipse版)--已完成

[复制链接]
发表于 2005-10-6 21:32 | 显示全部楼层 |阅读模式
呵呵,拖了那么久,今晚终于下定决心决定要把这篇文章写完。废话不多说,按照我以往的习惯,本篇文章分下列几part来下:

一、前言
二、相关概念与工具介绍
三、实例需求与总体设计
四、持久化层与业务层实践(Hibernate实践)
五、控制层与表示层实践(Struts实践)
六、发布与运行
七、写在最后

[ Last edited by wool王 on 2005-10-25 at 09:49 ]
 楼主| 发表于 2005-10-6 21:33 | 显示全部楼层
一、前言

J2EE和.NET是目前企业级运用的两大阵营,谁优谁劣各有说法。笔者是做J2EE方向的,觉得J2EE比起.NET最大的优势就是其经过长实践发展总结出来的大量模式和大量先进的框架。这些框架许多都是开源的——开源也是J2EE阵营的另一优势。本篇文章的主角就是目前J2EE web应用中最流行的两大开源框架——Hibernate和Struts。

[ Last edited by wool王 on 2005-10-22 at 12:34 ]
回复

使用道具 举报

 楼主| 发表于 2005-10-6 21:33 | 显示全部楼层
二、相关概念与工具介绍

下面我将分别对本文“三大主角”所涉及到相关概念进行说明。

Hibernate及相关知识介绍
Hibernate:
中文意思是\"冬眠“,呵呵,不知道设计者为何用这个名字。它是一个开源的ORM框架(关于ORM下文还会讲解),它是通过对JDBC API进行封装从而实现对java对象持久化的。有人可能要问:JDBC其实不难操作,为什么还要封装它哪?其实答案很简单,因为现在通用的数据库都是关系数据库,我们通过JDBC操作无法做到OOP,所以Hibernate将JDBC封装起来,并且提供了一套OO化的Hibernate API供顶层操作。Hibernate现在几乎已经成为ORM的公认标准了(刚推出的EJB 3.0标准中使用的ORM事实上就是Hibernate)

ORM:
这里解释下ORM。ORM是一种模式(关于模式,笔者之前在这里发表过一篇介绍工厂模式的文章,读者可以看看),它的英文是Object-Relation Mapping,中译为对象-关系映射,它指的是“在单个组建中负责所有实体域对象的持久化,封装数据访问细节”(注:此定义来自《精通Hibernate:java对象持久化技术详解》,孙卫琴,电子工业出版社)。笔者的觉得很容易理解:把关系数据库对象化。


Struts及相关知识介绍
Struts:
Struts是由著名的Apache基金会开发的开源项目。中译为“框架”,顾名思义,它就是一种MVC框架。众所周知,MVC是一种业务逻辑与表示分离的模式,在java web上的应用十分广泛。以前MVC的主要表现形式是JSP Model2,也就是JSP+Servlet+Javabean的应用,而近年来Struts的应用越来越广泛,目前已经是最流行的MVC框架了。

MVC:
Model-View-Controller,中译为模型-视图-控制器。MVC不是真正意义上的软件设计模式,而更是一种解决方案,它把软件系统的所有业务逻辑方面的编程交给了Model,把所有UI视图的设计和编程交给了View,再用Controller控制器控制Model并生成相应的View,从而真正实现了业务逻辑与用户界面的分离。


Eclipse介绍
Eclipse是由IBM公司开发出来,后来又免费捐献出来的开源工具,是一套主要用于Java开发的IDE(Eclipse通过添加某些插件可以实现对UML、C++等的开发)。Eclipse具有强大的扩展功能,加上其开源的特性,导致许多爱好者和公司为其开发了非常优秀的插件,Myeclipse就是其中之一。Myeclipse是面向J2EE开发者的Eclipse插件,功能强大,好用。本文的实例就是基于Eclipse+Myeclipse环境下开发出来的。

创建/运行本文实例除了安装以上工具和插件外还需要安装一个Web容器,本文使用的是Jboss,笔者可以自行选择使用Tomcat或Weblogic等,这些对运行本文实例影响不大。

本文选择的数据库是SQLServer2000,关于Mysql、Oracle等其他数据库的操作方法类似。

关于Eclipse下载和安装方法本文不做介绍,请读者自行在网上查找相关方法。

[ Last edited by wool王 on 2005-10-22 at 17:22 ]
回复

使用道具 举报

 楼主| 发表于 2005-10-6 21:34 | 显示全部楼层
三、实例需求与总体设计
1、需求定义
由于本文的目的是介绍在Eclipse IDE下开发Struts+Hibernate的具体方法,而不是介绍项目开发/软件设计的技巧,所以本文实例需求非常简单。

本文实例是一个web留言簿,可以让匿名用户发表一些留言信息,并保存至数据库。做过web开发的朋友肯定做过这类实例,非常经典。由于实例简单并且容易理解,所以笔者也省去画用例图说明的步骤。

2、总体设计
本实例按传统J2EE web项目的设计方法,分为5层架构,自底向上分别是:数据库层 -> ORM层(Hibernate层) -> 业务逻辑层 -> 控制层(Struts Action) -> 视图表示层。

数据库的DDL语句如下:

  1. create database memotest
  2. create table Memo
  3. (
  4. ID int not null identity(1,1),
  5. topic varchar(255),
  6. content text,
  7. guest varchar(50),
  8. primary key(ID)
  9. )
复制代码

[ Last edited by wool王 on 2005-10-22 at 19:19 ]
回复

使用道具 举报

 楼主| 发表于 2005-10-6 21:34 | 显示全部楼层
四、持久化层与业务层实践(Hibernate实践)
好,戏肉开始。

1、先打开Eclipse。点击“新建项目”->“Web Project”,出现如下窗口,在窗口中Project Name填入“Memo”作为项目名:


2、点击“窗口”->“打开透视图”->“其他”,出现如下窗口,双击“Myeclipse Database Explorer”,切换到如下视图:


3、在“DB Browser”控制面板点击“new”,新建一个数据库连接。在弹出的窗口中点击“new driver”新建一个数据库连接驱动。如下图:


4、上一步后回到以下视图,在列表中选择上一步创建的驱动,填入相关数据库资料,点击确定即可。(此步骤前必须已经打开数据库,最后已经按照本实例的DDL创建了库和表)


5、完成上一步后出现以下视图。点击“memo”的右键,点击“open connetion”->“确定”。如果上述步骤成功的话这里会连接到数据库,并显示相关的数据库结构。

成功后如下图:


6、点击“窗口”->“打开透视图”->“其他”->“Myeclipse”切换到项目控制视图。在项目名上点击右键->“myeclipse”->“Add Hibernate capabilites”,出现以下视图,并按下图填入相关信息:
点下一步后出现如下框图,按图片上内容填写:

提交后出现以下视图,按图片内容填写:


7、在项目名上点击右键->“myeclipse”->“Add Struts capabilites”,出现下面视图,按图中内容天下:


8、点击“窗口”->“打开透视图”->“其他”,出现如下窗口,双击“Myeclipse Database Explorer”,切换到数据库管理视图,找到我们为本次实例创建的表格,点右键->“create hibernate mapping”后出现下图,按图上内容填写:


9、至此Hibernate的创建工作已经完成,如下图,接下来我们写个DAO工厂类来操作Hibernate API。

点击com.woden包,新建个类,如下图:

输入以下代码:

  1. package com.woden;

  2. import net.sf.hibernate.HibernateException;
  3. import net.sf.hibernate.Session;
  4. import net.sf.hibernate.Transaction;



  5. public class MemoDAOFactory {
  6.         Session session;
  7.     Transaction tx;
  8.    
  9.     public void add(Memo memo) throws HibernateException{
  10.             try{
  11.                     session = SessionFactory.currentSession();
  12.                     tx = session.beginTransaction();
  13.                     session.save(memo);
  14.                     tx.commit();
  15.             }catch(HibernateException e){
  16.                     System.out.println(e.toString());
  17.             }finally{
  18.                     if(tx!=null){
  19.                             tx.rollback();
  20.                     }
  21.                     SessionFactory.closeSession();
  22.             }
  23.     }

  24. }
复制代码

以上只有一个插入方法,如果读者需要更多方法可以在DAO中自行添加。

至此,数据库层、ORM层和业务层的代码已经完成。

[ 本帖最后由 wool王 于 2006-2-27 03:32 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2005-10-6 21:34 | 显示全部楼层
五、控制层与表示层实践(Struts实践)

1、新建一个welcome.jsp文件,作为实例的首页。具体方法是在“webroot”文件夹图标点右键->new->“jsp”,接下来填写的东西很简单就不用介绍了吧。

2、在上一步骤的第7步中已经在myeclipse中导入了struts,我们下面就可以开始编辑设置我们的struts实例。打开webboot目录下WEB-INF中的struts配置文件“struts-config.xml”,如下图:


3、在屏幕空白处点右键->“new”->“new form,action and jsp”,会出现如下视图,按下图提示填写内容:
这里记得点击“jsp”标签条,出现以下界面,按下图设置:


4、上一步骤设置了form,点击下一步看到如下视图,按下图设置,具体步骤是:点击“foward”标签->“add”->name填“success”,path选择“welcome.jsp”,其他不用填->确定。


5、上一步骤点击了“完成”后出现下图:


6、这一步骤是设置资源文件,为了struts的国际化和错误提示做准备。找到项目文件夹中src(源文件夹),找到ApplicationResourse.properties,双击打开,如下图所示配置:(注:这里笔者安装了一个免费的ascii转unicode的插件)

如果读者没有安装ascii自动转unicode组建,可以直接copy我转换后的资源文件内容:

  1. form.addmemo.err.content=\\u7559\\u8a00\\u5185\\u5bb9\\u4e0d\\u80fd\\u4e3a\\u7a7a\\u3002

  2. form.addmemo.err.guest=\\u7559\\u8a00\\u8005\\u59d3\\u540d\\u4e0d\\u80fd\\u4e3a\\u7a7a\\u3002

  3. form.addmemo.err.topic=\\u7559\\u8a00\\u6807\\u9898\\u4e0d\\u80fd\\u4e3a\\u7a7a\\u3002

  4. jsp.addmemo.content=\\u8bf7\\u8f93\\u5165\\u5185\\u5bb9\\uff1a

  5. jsp.addmemo.guest=\\u60a8\\u7684\\u59d3\\u540d\\uff1a

  6. jsp.addmemo.pagetitle=\\u7559\\u8a00\\u6dfb\\u52a0

  7. jsp.addmemo.reset=\\u91cd\\u8bbe

  8. jsp.addmemo.submit=\\u63d0\\u4ea4

  9. jsp.addmemo.topic=\\u6807\\u9898\\uff1a

  10. jsp.welcome.content=\\u6b22\\u8fce\\u4f7f\\u7528Hibernate+Struts\\u5b9e\\u4f8b\\u3002

  11. jsp.welcome.title=\\u4f60\\u597d\\u3002\\u3002\\u3002
复制代码


7、下面打开com.woden.form.MemoForm.java文件,输入以下代码:

  1. package com.woden.form;

  2. import javax.servlet.http.HttpServletRequest;

  3. import org.apache.struts.action.ActionErrors;
  4. import org.apache.struts.action.ActionForm;
  5. import org.apache.struts.action.ActionMapping;
  6. import org.apache.struts.action.ActionMessage;

  7. public class MemoForm extends ActionForm {

  8.         private String topic;
  9.         private String content;
  10.         private String guest;

  11.         public ActionErrors validate(
  12.                 ActionMapping mapping,
  13.                 HttpServletRequest request) {
  14.                 ActionErrors errors = new ActionErrors();
  15.                
  16.                 if(getGuest()==null||"".equals(getGuest()))
  17.                 {
  18.                         errors.add("memoform.err.guest",new ActionMessage("form.addmemo.err.guest"));
  19.                 }
  20.                
  21.                 if(getTopic()==null||"".equals(getTopic()))
  22.                 {
  23.                         errors.add("memoform.err.topic",new ActionMessage("form.addmemo.err.topic"));
  24.                 }
  25.                
  26.                 if(getContent()==null||"".equals(getContent()))
  27.                 {
  28.                         errors.add("memoform.err.content",new ActionMessage("form.addmemo.err.content"));
  29.                 }
  30.                
  31.                 return errors;
  32.         }


  33.         public void reset(ActionMapping mapping, HttpServletRequest request) {
  34.                 this.topic=null;
  35.                 this.content=null;
  36.                 this.guest=null;
  37.         }

  38.         public String getTopic() {
  39.                 return topic;
  40.         }

  41.         public void setTopic(String topic) {
  42.                 this.topic = topic;
  43.         }

  44.         public String getContent() {
  45.                 return content;
  46.         }

  47.         public void setContent(String content) {
  48.                 this.content = content;
  49.         }

  50.         public String getGuest() {
  51.                 return guest;
  52.         }

  53.         public void setGuest(String guest) {
  54.                 this.guest = guest;
  55.         }
  56. }
复制代码


8、上面已经写出了ActionForm的代码,具体代码笔者在这里不解释,我想看过struts基础的朋友都应该很清楚了,下面贴处Action的代码:

  1. package com.woden.action;

  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpServletResponse;

  4. import org.apache.struts.action.Action;
  5. import org.apache.struts.action.ActionForm;
  6. import org.apache.struts.action.ActionForward;
  7. import org.apache.struts.action.ActionMapping;

  8. import com.woden.Memo;
  9. import com.woden.MemoDAOFactory;
  10. import com.woden.form.MemoForm;

  11. public class MemoAction extends Action {

  12.         public ActionForward execute(
  13.                 ActionMapping mapping,
  14.                 ActionForm form,
  15.                 HttpServletRequest request,
  16.                 HttpServletResponse response) {
  17.                 MemoForm memoForm = (MemoForm) form;
  18.                
  19.                 MemoDAOFactory memoDAO = new MemoDAOFactory();
  20.                 Memo memo = new Memo();
  21.                 memo.setTopic(memoForm.getTopic());
  22.                 memo.setContent(memoForm.getContent());
  23.                 memo.setGuest(memoForm.getGuest());
  24.                
  25.                 try{
  26.                         memoDAO.add(memo);               
  27.                 }catch(Exception e)
  28.                 {
  29.                         System.out.print(e.toString());
  30.                 }
  31.                
  32.                 return mapping.findForward("success");
  33.         }
  34. }
复制代码


9、最后编辑下几个相关jsp文件的内容,分别如下:

  1. welcome.jsp
  2. <%@ page contentType="text/html; charset=utf-8" %>
  3. <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
  4. <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>

  5. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  6. <html:html>
  7.   <head>
  8.     <html:base />
  9.     <title><bean:message key="jsp.welcome.title"/></title>
  10.   </head>
  11.   
  12.   <body>
  13.     <bean:message key="jsp.welcome.content"/>
  14.   </body>
  15. </html:html>


  16. addmemo.jsp
  17. <%@ page contentType="text/html; charset=utf-8"%>
  18. <%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
  19. <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>

  20. <html>
  21.         <head>
  22.                 <title><bean:message key="jsp.addmemo.pagetitle"/></title>
  23.         </head>
  24.         <body>
  25.                 <html:form action="/memo">
  26.                         <bean:message key="jsp.addmemo.guest"/><html:text property="guest"/><html:errors property="memoform.err.guest"/><br/>
  27.                         <bean:message key="jsp.addmemo.topic"/><html:text property="topic"/><html:errors property="memoform.err.topic"/><br/>
  28.                         <bean:message key="jsp.addmemo.content"/><html:textarea property="content"/><html:errors property="memoform.err.content"/><br/>
  29.                         <html:submit><bean:message key="jsp.addmemo.submit"/></html:submit>
  30.                         <html:reset><bean:message key="jsp.addmemo.reset"/></html:reset>
  31.                 </html:form>
  32.         </body>
  33. </html>
复制代码


至此,本实例完成。

[ 本帖最后由 wool王 于 2006-2-27 03:33 编辑 ]
回复

使用道具 举报

发表于 2005-10-9 08:44 | 显示全部楼层
枪位
回复

使用道具 举报

 楼主| 发表于 2005-10-22 20:27 | 显示全部楼层
六、发布与运行
1、在项目文件点右键->“myeclipse”->“Add and remove project deployment”,如下图:


2、点击图标,选择“Jboss”->“start”(注:这里如果用的是tomcat也类似操作,关于服务器配置的方法这里不祥谈,请读者自行在网上查找相关资料),会发现控制台会输出类似如下信息:
打开浏览器,输入:http://localhost:8080/ 后如果出现下图证明启动成功:


3、输入网址:http://localhost:8080/Memo/addmemo.jsp ,会看到效果图如下图:


4、按照正常流程和非正常流程分别留言一次,呵呵,效果出来没有?如果没有出现预期效果请检查前面步骤。

[ 本帖最后由 wool王 于 2006-2-27 03:34 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2005-10-22 20:28 | 显示全部楼层
七、写在最后

在本文最后,笔者再次强调,本文的目的是介绍Eclipse IDE关于创建Struts+Hibernate应用的方法,而不是介绍j2ee框架的概念和运用,更不是介绍java设计与模式。本文对IDE的配置、服务器配置的方法也没做详细介绍,因为这都不是本文重点。对以上知识想了解多点的读者可以google一下。

本文的实例只是一个入门,强调的是一种方法,而不是强调功能,所以本文的实例只有一个简单的录入功能。在看完本文后读者可以添加更多的功能(我想,当这一架构搭建起来后,添加功能已经是相当容易的事情了)。

有任何意见和建议欢迎大家跟贴发表。转贴请注明“工大后院版权所有”,最后欢迎大家访问我的Blog:http://blog.csdn.net/woolceo

[ Last edited by wool王 on 2005-10-25 at 09:33 ]
回复

使用道具 举报

 楼主| 发表于 2005-10-25 17:34 | 显示全部楼层
Originally posted by 寂寞高手 at 2005/10/9 00:44:
枪位

靓仔,为了文章美观,介意让个位吗?呵呵
回复

使用道具 举报

发表于 2005-10-26 13:50 | 显示全部楼层
用户名:         hjack [退出登录]
作者:         wool王
评分:         积分 15 点
标题:         [原创]Struts+Hibernate入门实例(Eclipse版)--已完成

这段时间较忙,先加你分,迟D再看。。。
回复

使用道具 举报

发表于 2005-10-27 20:43 | 显示全部楼层
把开源进行到底,建议不用myeclipse,毕竟不是免费的.
我是用easystruts的,但对eclipse 3.0以上没有支持,所以我用eclipse 2.1开发struts 的.
回复

使用道具 举报

 楼主| 发表于 2005-10-27 23:25 | 显示全部楼层
楼上我也想过。。。easystruts我没用过,,,我倒是用了开发hibernate那个开源的插件。。。发现没有myeclipse好用。。。比较郁闷。。。

斑竹有空写个“开源进行到底”的帖子啊。。。
回复

使用道具 举报

发表于 2005-10-31 01:27 | 显示全部楼层
感谢wool,hjack
回复

使用道具 举报

 楼主| 发表于 2006-2-27 11:39 | 显示全部楼层
重新处理了下图片
回复

使用道具 举报

发表于 2006-3-10 22:28 | 显示全部楼层
支持wool大作。
回复

使用道具 举报

发表于 2006-3-16 16:57 | 显示全部楼层
好好学习!
回复

使用道具 举报

发表于 2006-6-2 16:26 | 显示全部楼层
Wool应该很快出现,但是楼上最好把你的问题说得详细点.
是不是一切正常,就只是数据厍没写入,还是还有其它?错误信息呢?
回复

使用道具 举报

 楼主| 发表于 2006-6-4 15:20 | 显示全部楼层
不好意思,刚才仔细查看了我的文章,发现了一个错误:


里面的连接字符串中的database应该改成DatabaseName,也就是用以下这种形式:
jdbc:microsoft:sqlserver://localhost;DatabaseName=数据库名

因为我在不同的地方发表过这篇文章,后来发现了这个问题的时候在其他地方修改了,但在后院忘了改。

18楼的问题可能是因为这里导致的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2024-4-30 22:34

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表