Struts Spring Hibernate Ajax 技术大全.doc_第1页
Struts Spring Hibernate Ajax 技术大全.doc_第2页
Struts Spring Hibernate Ajax 技术大全.doc_第3页
Struts Spring Hibernate Ajax 技术大全.doc_第4页
Struts Spring Hibernate Ajax 技术大全.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Struts Spring Hibernate Ajax 技术大全框架(Framework):是提供了可重用的公共结构的一个半成品。它集成了优秀的程序架构和前人的经验总结框架技术的优势:1)不用再考虑公共问题,框架已经帮我们做好了2)可以专心在业务逻辑上,保证核心业务逻辑的开发质量3)结构统一,便于学习、维护4)框架中集成了前人的经验,可以帮助新手写出稳健、性能优良而且结构优美的高质量程序主流技术框架1. Struts框架:定义了通用的Controller,通过配置文件(struts-config.xml)隔离了Model和View,以Action的概念对用户请求做了封装,使代码更清晰易读。还提供了自动将请求的数据填充到对象中以及页面标签等简化编码的工具。使大型Java Web项目成为可能2. Hibernate框架:是一个优秀的持久化框架,负责简化将对象数据保存到数据库中或从数据库中读取数据并封装到对象的工作。通过简单配置和编码即可替代JDBC繁琐的程序代码。处理数据库操作的方式代表了当前的趋势3. Spring框架:主要作为依赖注入容器和AOP实现存在。提供了声明式事务、对DAO层的支持等简化开发功能。还可方便地与Struts、Hibernate等技术集成4. DWR框架:是一个Ajax框架,使Ajax开发更加轻松。Ajax是一种通过JavaScript代码异步请求服务器资源的技术,可在不刷新当前页面的情况下取得服务器端的最新数据并更新页面显示三层结构:和.NET程序类似,java程序中也提倡使用三层结构表示层:包括JSP页面和对应的后台Servlet(或Struts的Action Bean和Form Bean代码),放在web包下业务逻辑层:放在biz包下,类名(或接口名)后缀为Biz(business的简写,意思是业务逻辑)数据访问层:放在dao包下,类名(或接口名)后缀为DAO(Data Access Object的简写,意思是数据访问对象)实体对象:放在entity包下实现自定义框架和加法器1. 将所有的请求发送到控制器(基于Servlet技术实现),而且系统中只有一个控制器2. 使用Action表示用户请求的一种操作,如:加法或登录3. 控制器根据请求路径判断找哪一个Action执行操作。如:如果请求路径是http:/localhost:8080/y2ssh/add.do则调用AddAction,如果请求路径是http:/localhost:8080/y2ssh/login.do则调用LoginAction4. Action调用模型,执行业务操作,获得操作结果。然后将结果返回到页面MVC框架实现的核心是控制器。控制器Controller类基于Servlet技术实现,在配置Servlet访问路径时可以配成*.do,表示只要是以.do结束的请求就会派发到Controller在框架上开发要遵照一定的规则和步骤。遵循的步骤如下:1. 开发模型 2. 开发控制器 3. 开发视图 4. 调试运行Struts应用中包含3类组件:1. 控制器组件:包括ActionServlet(核心控制器)、自定义Action(代表一个用户操作)2. 模型组件:包括定义和实现业务逻辑的接口和类3. 视图组件:包括JSP页面、ActionForm和Struts标签ActionServlet是Struts最核心的组件。在Web容器启动时,ActionServlet被初始化,加载struts-config.xml配置文件。Struts处理请求的过程如下:1) 当客户端浏览器发起请求到ActionServlet时,ActionServlet首先对请求进行一系列处理:根据请求的路径和配置信息找到对应的ActionBean和FormBean2) 在确定将要调用的ActionBean和对应的FormBean后,就将请求中包含的值填充到FormBean中(Acion可以不关联任何ActionForm,这一步可省),在调用Action的execute方法前,ActionServlet还需要准备好ActionMapping参数,ActionMapping中包含了该Action的配置信息3) 然后Struts将请求分发至相应的ActionBean处理,ActionMapping参数、ActionForm参数、request和response都作为参数传给处理请求的ActionBean的execute方法4) Action调用业务逻辑方法,得到返回值,并返回ActionForward对象5) 控制权重新回到ActionServlet,ActionServlet根据Action返回的ActionForward对象转发到相应的JSP页面6) 处理结果返回给浏览器需要注意的三点如下:1) ActionServlet将控制权转到页面时采用的是转发的方式,所以转发到页面的request和Action方法参数中的request是同一个请求,数据可通过request对象的attribute属性传递2) ActionForm根据对应的Action的scope属性配置不同而生命周期有所不同。一般情况下,scope属性设为request,则每次请求开始时ActionSerlvet创建新的ActionForm对象,保存在request对象的attribute属性中。所以可在Action代码中设置ActionForm的值,在页面中取出3) 当需要采取重定向的方式转到新的页面时,可在Action代码中使用response.sendRedirect(url),并返回null将Struts加入到项目中需要添加Struts库、Struts标签tld文件和Struts配置文件,并在web.xml中配置ActionServlet1. struts-config.xml 说明:ActionForm配置较简单,只需指定name和type属性。Action配置属性较多,具体如下:1) name属性指定关联的ActionForm的name2) path属性指定访问这个Action的路径,以/开头,注意不需要加.do3) type属性指定这个ActionBean的类名4) scope属性定义这个Action对应的ActionForm的作用域,这个属性配置为request或session的效果,默认为session。Forward节点定义了该Action可能转发到的页面,对应每一个页面有一个逻辑名,在Action代码中,只通过这个逻辑名引用将要转发到的页面,Struts不允许直接在Action中引用页面的物理名什么是DispatchAction通常,一个Action中只能完成一种业务操作,通过扩展org.apache.struts.actions.DispatchAction实现的Action类可以完成一组相关的几种业务操作。扩展自DispatchAction的Action类中不必定义execute方法,而是创建一些实际业务操作的方法,如doAdd()、doSubtract等,但这些业务方法的参数和返回值要和普通Action的execute方法相同如何使用DispatchAction:使用DispatchAction时,定义Action类和在struts-config.xml中配置该Action都有所不同1. 定义CalcAction,继承自DispatchAction Public class CalcAction extends DispatchAction Public ActionForward doAdd(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) CalcForm myForm = (CalcForm) form; double model = new Calculator().add(myForm.getNum1(), myForm.getNum2(); request.setAttribute(result, model); return mapping.findForward(result); 2. CalcAction在struts-config.xml中的配置 parameter属性表示Struts从请求对象中找名称为operate的参数值,参数值是什么就到CalcAction中执行同名的方法。在表单提交时,将隐藏表单域operate的值设置为想要执行的CalcAction中的方法名3. 在表单中的配置function doSubmit(operate) document.forms0.elementsoperate.value = operate; document.forms0.submit();    Struts错误处理机制1. 编辑属性文件 增加Struts支持时,将自动增加名称为ApplicationRperties资源文件到项目中,并在struts-config.xml中配置了对这个属性文件的引用: 为了支持国际化,Struts的报错信息通过先在资源文件中定义然后再引用的方式实现: # ApplicationRpertieserrors.header = errors.footer = error.validate.number = Divisor cannot be 0.说明:errors.head和errors.footer是Struts要求的。在页面显示错误信息时,将显示在错误信息的前后,还需要准备中文的资源文件:# ApplicationRpertieserrors.header = errors.footer = error.validate.number = u9664u6570u4E0Du80FDu4E3A0u3002可使用Resourcebundle Editor属性编辑插件编辑属性文件,该插件具有编辑国际化资源文件的功能,可避免繁琐的native2ascii操作,将相应的文件复制到Eclipse plugins目录下重启Eclipse,插件即可生效。在资源文件上单击右键,选择打开方式 资源文件编辑器选项就可享受插件带来的便利功能2. 修改对应Action代码 public class CalcAction extends DispatchAction public ActionForward doDivide(.) CalcForm myForm = (CalcForm) form; / 输入合法性验证 ActionMessages errors = new ActionMessages(); if (myForm.getNum2() = 0) errors.add(error2, new ActionMessage(error.validate.number); if (!errors.isEmpty() super.saveErrors(request, response); return mapping.findForward(input);return mapping.findForward(result); 说明:ActionMessages类型的变量errors用于保存出错信息,然后根据业务逻辑进行判断,对出错的情况添加出错信息到errors中,error.validate.number对应到资源文件中的属性名称。error2是出错信息名,在页面显示错误时可根据名称来引用出错信息。对同一个名称,可添加多个出错信息。如果不需要单独指定错误信息,在页面里统一显示错误信息即可,则可将错误信息添加到ActionMessages.GLOBAL_MESSAGE名下,代码如下:errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(error.validate.number);最后判断errors中是否有错误信息,如果有,则使用saveErrors方法保存错误信息到request对象中,并转发到输入页面3. 在页面上显示报错信息 使用Struts标签来显示错误信息,首先要在页首声明标签,代码如下:说明:标签通过property属性指定引用的错误信息名,并将资源文件中errors.header和error.footer自动加在错误信息的前后。可省略property属性,则显示所有错误信息。可通过设置errors.header和error.footer实现弹出javascript窗口提示错误信息,设置两个属性的值即可errors.header = alert(errors.footer = );Struts的报错机制强制我们提供国际化支持,从编码的角度也提供了一些封装,使实现错误提示功能时代码既规范又灵活使用动态Form简化开发1. 配置动态Form:在Struts-config.xml中定义fwxxDynaForm,代码如下:.还需修改Action配置中name的名称为fwxxDynaForm2. 取得动态Form中的值 从动态Form中取值的方式与普通Form Bean getter方法取值不同,所以对应Action代码也不同,代码如下:DynaActionForm fwxxForm = (DynaActionForm) form;FWXX fwxx = new FWXX();fwxx.setTitle(fwxxForm.getString(title);fwxx.setShi(Integer)fwxxForm.get(shi);biz.post(fwxx);可使用get方法从动态Form中取值,key值为动态Form配置中对应的name属性。get方法取到的值为Object,需要转换,还可通过getString方法直接得到String的值,使用动态Form可不必创建对应Form Bean类,减少了编码工作,也方便修改使用实体对象作为Form属性简化开发1. 创建FwxxForm,并相应修改PostAction配置信息的name属性为fwxxFormpublic class FwxxForm extends ActionFormprivate FWXX item = new FWXX();/ Getter and Setter2. 修改post.jsp中表单域的属性,并修改PostAction的代码FwxxForm fwxxForm = (FwxxForm) form;FWXX fwxx = fwxxForm.getItem();biz.post(fwxx);采用这种方法,Action Bean中省掉了繁琐的代码,而且当业务逻辑变化引起数据库增减字段时,只需修改实体类和页面就可以了,Action Bean和Form Bean都不需要修改html标签1. 引入Struts标签:2. 使用html标签进行页面编码* * -不限- * 说明:name属性表明,在范围内查找名称为qxList的属性值,label和value属性表明对应查找到的集合数据的每个元素属性,哪个用作候选项的字面显示,哪个用作候选项的值logic标签1. 引入Struts标签:2. 使用logic:notEmpty判断Bean值是否存在或非空:在session范围内,查找名为user的属性,如果找到了,且值不为null,则执行logic:notEmpty标签内的内容;相对的还有logic:empty标签,表示找不到或找到的值为null时招待标签内的内容.3. 使用logic:equal判断Bean值是否相等.其中,logic:equal标签用name和property属性取得自身的值,然后和value属性指定的值进行比较。value属性可以是常量;可以是JSP表达式;还可以是EL表达式。类似的还有logic:notEqual标签,用法和logic:equal类似iterate标签:循环处理集合数据1. 使用iterate标签进行页面编码.其中,name用于取得标签的值,id和c:forEach的var属性类似,有两个作用:一是定义名称为fwxx的Bean,值为每次循环到的,集合中一个元素的值,可通过$fwxx.title 进行输出;二是定义名称为fwxx的页面脚本变量,在标签内通过显示数据。一般只有Struts bean标签才有id属性,logic:iterate是一个例外 bean标签1. 引入Struts标签:2. 使用bean:write格式化输出:可以通过format属性设定输出格式,支持对数字和日期的格式化3. 使用bean:define定义页面变量其中,id和type属性用于指定新脚本变量和Bean的名称和类型;name和scope属性用于取得标签的值;bean:define标签用于定义脚本变量和新的Bean4. 使用bean:size得到集合数据记录集共找到$count 条记录例:include和write联合使用需要在struts-config.xml中增加相应的配置(指定路径),并在Action里加入toOnSaleGoodsList()方法对Struts标签的几个属性name、property和scope做小结:name属性指定了使用什么名称去查找值。在html:text可省略name属性,默认值是当前的Form Beanproperty属性指定取找到的Bean中哪个属性的值。如果不指定property属性则取Bean本身的值为标签的值Hibernate:一个优秀的Java持久化层解决方案,当今主流的对象-关系映射工具持久化:将程序中数据在瞬时状态和持久状态间转换的机制对象-关系映射机制(O/R Mapping,ORM):在编程时,以面向对象的方式处理数据;保存数据时,却以关系型数据库的方式储存使用Hibernate的基本步骤:1. 需要的jar包:在MyEclipse项目节点上右击,选择MyEclipse Add Hibernate Capabilities选项,选择Hibernate 3.1,单击下一步,在Specify Hibernate database connection details对话框中,取消复选框的选中状态,先不配置数据库连接2. Hibernate配置文件:在项目中添加Hibernate配置文件,默认文件名为hibernate.cfg.xmlcom.microsoft.sqlserver.jdbc.SQLServerDriverjdbc:sqlserver:/localhost:1433;DatabaseName=zfsasaorg.hibernate.dialect.DerbyDialecttrue其中,dialect参数是必须配置的,用于配置Hibernate使用的不同数据库类型。Hibernate支持几乎所有的主流数据库。show_sql参数为true,则程序运行时在控制台输出执行的SQL语句数据库表和实体的映射信息在另外的映射文件中定义,但需要在配置文件中声明,具体如下:3. 实体类和映射文件:要使用Hibernate实现添加用户的功能,首先要定义用户实体类,必须实现Serializable接口;添加默认构造方法,然后还需要告诉Hibernate实体类User映射到数据库哪个表,以及哪个属性对应到数据库表的哪个字段,这些在映射文件中配置,User.hbm.xml如下所示:在映射文件中,每个节点配置一个实体类的映射信息,节点的name属性对应实体类的名字,table属性对应数据库表的名字。在节点下,有一个必须的节点,用于定义实体的标识属性(对应数据库表的主键),节点的name属性对应实体类的属性,type为对应的Java类型,节点下有两个子节点,用于通过其name属性指定对应的数据库表的主键,节点用于指定主键的生成策略,常用的值有native和assigned,native表示由数据库生成主键的值,assigned表示在添加新记录到数据前由程序设定主键的值,节点下除了子节点,还包括子节点,节点与节点类似,只是不能包括子节点,每个节点指定一对属性和字段的对应关系Hibernate执行持久化操作的步骤步 骤操 作代 码与JDBC类比1读取并解析配置文件Configuration conf = Configuration.configure();相当于使用DataSource获取连接前读取DataSource的配置文件2读取并解析映射信息,创建SessionFactorySessionFactory sf = conf.buildSessionFactory();相当于创建DataSource对象3打开sessionSession session = sf.openSession();相当于JDBC获得连接4开始一个事务(增删改操作必须,查询可选)tx = session.beginTransaction();开始事务5持久化操作session.save(user);持久化操作6提交事务mit();提交事务7关闭sessionsession.close();关闭连接Configuration conf = new Configuration().configure();/ 1.读取配置文件SessionFactory sf = conf.buildSessionFactory();/ 2.创建SessionFactorySession session = sf.openSession();/ 3.打开SessionTransaction tran = null;try tran = session.beginTransaction();/ 4.开始一个事务User user = new User();user.setUname(Hibernate user);user.setUpass(123456);session.save(user);/ 5.持久化操作mit();/ 6.提交事务 catch (Exception e) if (tran != null) tran.rollback(); e.printStackTrace(); finally session.close();/ 7.关闭session使用工具简化Hibernate开发使用MyEclipse工具给项目添加Hibernate支持,自动添加了Hibernate配置文件。步骤如下所示:在项目工程右击MyEclipse Add Hibernate Capabilities 选择Hibernate 3.1和Copy checked Library Jars to project folder and add to build-path 取消复选框Specify database connection etails 新建Java package,打开Hibernate配置文件,单击DB Connect Profile旁边的下拉框按钮,MyEclipse就会自动在Hibernate配置文件中配置好数据库相关参数。Properties部分和Mappings部分也都有相应的向导,因此,完全可以充分利用这些工具的帮助,而不必编辑Hibernate.cfg.xml文件使用工具自动生成映射文件,如:User.hbm.xml在MyEclipse工作区右上角选择进入MyEclipse Database Explorer透视图(也可通过菜单窗口 透视图 MyEclipse Database Explorer进入),在DB Browser(数据库浏览器)视图中,逐次展开节点,右键选择TBL_USER表,在弹出的菜单中选择Hibernate Reverse Engineering(Hibernate反向工程)选项,在弹出的对话框中选择生成实体类和映射文件的包名(Java Package)。选中Hibernate mapping file复选框,表示要生成映射文件;选中Java Data Object,复选框表示要生成实体类。然后单击下一步按钮,在Config type mapping details对话框中,ID Generator选native,继续单击下一步按钮,在Config reverse engineering details中,保持所有复选框未选中,单击完成按钮,开始生成代码,完成后,返回Java透视图,发现已经生成了实体类和映射文件一、一对多关联1) 面向对象领域的关联关系2) 关联关系的映射配置1. 单向多对一关联的映射其中,name属性对应Jd类的属性名(tblQx);column属性定义了映射到表TBL_JD的字段名,将使用这个字段作为外键去和一的一方主键关联;class属性为关联到一的一方的类别2. 单向一对多关联的映射需要创建一个节点,其name属性对应到TblQx类的jds属性,节点下需要建立两个子节点,一个节点,通过其column属性指定多的一方的外键字段名(注:是Tbl_JD表的字段名);一个节点,通过其class属性指定关联到的多的一方的类别,只需要配置这3个信息即可3. 双向一对多关联的映射 3) 通过程序维护关联关系 1. 在many一方添加数据 2. 在many一方删除数据:配置一对多关联时,set节点可有一个inverse(反转)属性,可设为true或false。为true时,表示由对方(one的多方)管理双方的关联关系;为false时,表示自己管理双方的关联关系。一般情况下,设为true,由多的一方管理一对多的关联关系 3. 修改关联关系 4. 在one一方删除数据:在set节点中增加cascade属性,值设为all,可选的值包括:all,对所有的操作都进行级联;none,对所有的操作都不进行级联;save-update,执行更新操作时级联;delete,执行删除操作时级联二、多对多关联.首先,set节点要指定一个table属性,值为关联表的表名。其下子节点的column属性为关联表中关联到自己的字段名,然后是子节点。与类似,需要设置两个属性,class用来设置关联属性的类型,column属性用来设定用哪个字段作外键去关联。最后,还要根据业务需要,将某一方的inverse属性设为true,我们希望由项目(Project)一方管理关联,所以在Employee一方将节点的inverse属性设为true利用List配置一对多关系:HQL(Hibernate Query Language):是Hibernate提供的一种面向对象的查询语言,使用HQL可以避免使用JDBC查询的一些弊端。使用HQL需要的4个步骤:1. 得到session 2. 编写HQL语句 3. 创建Query对象 4. 执行查询,得到结果Session session = super.getSession();/得到sessionString hql = from TblFwxx;/编写HQL语句Query query = session.createQuery(hql);/创建Query对象List list = query.list();/执行查询,得到结果说明:TblFwxx并非表名,而是类名,区分大小写,可只是类名,也可以包含包名,与SQL语句不同,没有SELECT子句。在HQL中,也可给类名指定别名,上面的HQL语句可以写成:select fw from TblFwxx as fw,select子句中内容是fw,表示查询所有的房屋信息数据,以TblFwxx对象列表的方式返回,其中fw是TblFwxx的别名,通过as关键字指定,as可省略HQL的丰富功能1. 属性查询:假如不想查询整个对象的数据,只需要房屋出租信息中的发布日期和标题,查询结果还是保存在List中,不过每条数据体现为一个Object数组的形式select fw.date,fw.title from TblFwxx fw2. 参数查询:假如想对title属性进行模糊查询,HQL语句支持where子句,支持like关键字,也支持%通配符 select fw from TblFwxx fw where fw.title like %健翔桥% 也可以使用?作占位符,然后通过Query的setString方法逐个设置参数的值。Query还提供setLong、setDouble、setDate等方法用于设置不同类型的参数值。需要注意的是:必须保证每个占位符都设置参数值;设置参数值时,下标从0开始Session session = this.getSession();String hql = from TblFwxx fw where fw.title like ?;Query query = session.createQuery(hql);query.setString(0, %健翔桥%); 还可以使用命名参数查询,例:private List searchByZj(int zj1, int zj2) Session session = this.getSession();String hql = from TblFwxx fw where fw.zj=:zj1 and fw.zj=和、=、=、和is null等运算符,支持and、or、not和括号,而且还支持in和between。使用between的写法:from TblFwxx fw where fw.zj between :zj1 and :zj23. 关联查询:指的就是多表查询 Select jd from TblJd jd,TblFwxx fw where fw.jd=jd and fw.lxr=伊先生 说明:关联了TblJd和TblFwxx两类数据,关联的条件是fw.jd=jd,注意到这个关联条件等式的两端都是对象,Hibernate通过两个对象主键值是否相等判断两个对象是否相等4. 分页查询public List search(int pageNo, int pageSize) Session session = this.getSession();String hql = from TblFwxx fw ord

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论