Struts与Hibernate的完美结合方案

开发 后端
本文介绍敬爱那个Hibernate和Struts进行配合来节省开发时间和成本。作者通过JavaScript生成XML的方式进行操作。

将Hibernate和Struts进行配合,以节省开发时间和成本.经过再三考虑,发现通过JavaScript生成XML发送到后台Servlet利用Hibernate再写入数据库的方法并不可取,此方案只能用于简单操作.当数据库的结构发生变更的时候,则对网站代码需要进行五次修改:

1.修改Hibernate映射;

2.修改Servlet中对XML的解析;

3.修改JavaScript中生成的XML结构;

4.修改HTML表单验证;

5.修改HTML表单.而通过Struts直接将Form表单

递交给Hibernate这种方法则灵活性很强.当数据库的结构发生变更时,我们做三次修改即可达到上述效果:

1.修改Hibernate映射;

2.修改HTML表单验证;

3.修改HTML表单验证.因为我们的控制层是直接将表单交给Beans,再通过Hibernate写入数据库的,中间层的代码除了验证外非常小.

因此,通过Struts可以减少很多代码,并且,当数据模型的变更时,修改起来相对简单!这就是使用Struts+Hibernate的好处之一吧!下面就让我们来看一下整个操作的过程:

1.准备工作.

新建J2EE工程,加入Struts及Hibernate.设定好MySQL连接驱动,打开MyEclipseDatabaseExplorer视图,新建连接Stulib,并将数据库的结构通过Hibernate映射成JavaBeans

2.新建一个From,一个Action,一个ActionFrom.其配置源码如下:

    
"http://struts.apache.org/dtds/struts-config_1_2.dtd">












这里有三个重点需要说明:1.form-beans配置,其名称首先对应于通过Hibernate映射成的JavaBeans名称,其次要与action-mappings中的action中的name的名称一致.

2.action的说明input是指是哪个网页提交过来的Form;path是指在URL中显示的一个路径;name是指此表单对应于哪个JavaBeans,这个JavaBeans必需继承ActionFrom类;scope表示此表单的作用域;type则是对应于哪个Servlet来处理这个表单.3.struts-config.xml中所出现的的type中对应的字符串实际上是表示对应于项目中的哪个Beans或Servlet.

下面是wills.UserReg的代码:

    packagewills;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importorg.apache.struts.action.Action;
importorg.apache.struts.action.ActionForm;
importorg.apache.struts.action.ActionForward;
importorg.apache.struts.action.ActionMapping;
publicclassUserRegextendsAction{
publicActionForwardexecute(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse){
//这条语句就将相对应的From交给JavaBeans了.
Usernamews=(Username)form;
//经过测度,我们可以正确地取出JavaBeans中的值.
System.out.print(ws.getName());
//TODOAuto-generatedmethodstub
returnnull;
}
}

下面是对Hibernate生成的抽象类的修改.AbstractUsername.java代码如下:
我们可以与Hibernate生成的代码比较发现只是多了extendsActionFrom,当然,我们也可以在AbstractUsername.java中添加reset(),validate(),…等方法.
   publicabstractclassAbstractUsernameextendsActionFormimplements
Serializable{
privateintId;
privateStringname;
…..
PublicvoidsetName(String)
{

}
}


其总体结构如上图所示.

3.总结:通过这种方式进行网站应用开发,当需求发生改更时有一定的优势,而它的缺点就是配置非常麻烦.不过借助于Eclipse开发工具,工作变得相对简单.但是,当配置更改时还是需要特别注意.到今天为止,已完成了以下的工作:

1.Apache与Tomcat的整合.

2.数据库的建模及Hibernate的配置.

3.JavaScript与Servlet之间的通讯.

4.Struts与Hibernate之间的整合.

有以上的基础,下面的开发将变得透明而又简单.这是因为:第一,对数据库的操作逻辑是固定的,无论数据库的模型是否发生变理;第二,对在什么时候使用JavaScript通过XMLHTTP与Servlet进行通讯有一定的了解;第三,对Struts与Hibernate的配合操作有一定的了解.

在Hibernate3中发现了一个不能查询与插入中文字符的问题,通过网上查阅资源,原来是Hibernate3中的一个Bug,最后没有办法,在JSP2.0技术手册中看到可以通过Filter来解决中文问题,将其代码摘录下来,结果发现,不仅HTML传过来的表单没有了任何中文问题,而且Hibernate的中文问题也解决了.下面就将整个过程描述如下:

因为Filter的是起过滤的作用,它运行于Servlet的Service()之前,所以,在表单还没有到达Service()之前会执行Filter.添加Filter的方法和我们添加Servlet的方法是一样的.都要配置Web.xml,下面是解决中文问题的Web.xml配置:

   
setCharacterEncoding
wills.servlet.SetCharacterEncodingFilter

encoding
gb2312



setCharacterEncoding
/*

上面的配置说明了:1.定义了一个FiltersetCharacterEncoding它的执行路径是:wills.servlet.SetCharaterEncodingFilter初始化参数是:encoding和gb2312等下我们来看它们是什么意思.2.定义了对于哪些文件通过的时候执行setCharacterEncoding上面我们可以看出所有的相关Jsp也好,Serlet也好等等,都执行setCharacterEncoding.下面是setCharacterEncoding.javapackagewills.servlet;
   importjava.io.IOException;
importjavax.servlet.Filter;
importjavax.servlet.FilterChain;
importjavax.servlet.FilterConfig;
importjavax.servlet.ServletException;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
publicclassSetCharacterEncodingFilterimplementsFilter{
protectedStringencoding=null;
protectedFilterConfigfilterConfig=null;
protectedbooleanignore=true;
publicvoiddestroy(){
this.encoding=null;
this.filterConfig=null;
}
publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
FilterChainchain)throwsIOException,ServletException{
//Conditionallyselectandsetthecharacterencodingtobeused
if(ignore||(request.getCharacterEncoding()==null)){
Stringencoding=selectEncoding(request);
if(encoding!=null)
request.setCharacterEncoding(encoding);
}
//Passcontrolontothenextfilter
chain.doFilter(request,response);
}
publicvoidinit(FilterConfigfilterConfig)throwsServletException{
this.filterConfig=filterConfig;
this.encoding=filterConfig.getInitParameter("encoding");
Stringvalue=filterConfig.getInitParameter("ignore");
if(value==null)
this.ignore=true;
elseif(value.equalsIgnoreCase("true"))
this.ignore=true;
elseif(value.equalsIgnoreCase("yes"))
this.ignore=true;
else
this.ignore=false;
}
protectedStringselectEncoding(ServletRequestrequest){
return(this.encoding);
}
}

此方法基本解决了通讯中的中文问题,但是在JavaScript与XML中行不通,解决的办法是:在Servlet的第一行添加语句request.setCharacterEncoding("utf-8");原因可能是Filter对Stream流的信息也进行了编码,所以必须将编码变成UTF-8.

在Structs-config.xml的forward的配置中添加redirect=”true”要注意,redirect中重新定位,将会清除本页面范围以内的所有的变量的值.而不用redirect则将造成表单重复递交,解决的办法是,可以在后台将表单清除。

【编辑推荐】

  1. OpenCore: OSGi上部署Hibernate的四种方式
  2. Hibernate单元测试的方法HSQLDB详述
  3. 解析Hibernate的批量删除功能
  4. 层层解析Hibernate中的事务的滥用
责任编辑:张攀 来源: 百度空间
相关推荐

2011-03-07 16:10:41

FireFTPFirefoxFTP

2022-05-17 09:19:17

XebianLinuxLinux 发行版

2010-04-29 10:32:14

虚拟技术上海世博会

2022-04-19 20:39:03

协程多进程

2009-06-19 15:28:03

SpringHibernate

2009-07-03 13:54:38

Java Servle

2009-08-02 17:26:11

以太网电源以太网供电

2021-03-17 11:29:24

物联网环境数据环境风险

2009-01-06 09:19:16

Google Andr华硕Eee PCGoogle 操作系统

2009-06-22 11:11:00

J2EE架构数据表示

2010-03-04 09:16:05

Opera版本发布

2010-07-27 09:11:38

FlexBuilder

2015-11-04 15:13:56

华为

2024-05-15 08:54:04

C++类型限定符代码

2009-09-21 18:13:11

Hibernate S

2010-09-01 15:28:11

CSSexpression

2024-04-15 10:25:05

2009-07-23 13:30:46

JDBC事务

2009-09-22 14:46:18

struts-spri

2009-09-28 15:14:45

Hibernate S
点赞
收藏

51CTO技术栈公众号