清华ITJAVAEE教学.ppt

上传人:牧羊曲112 文档编号:5290639 上传时间:2023-06-22 格式:PPT 页数:25 大小:620.50KB
返回 下载 相关 举报
清华ITJAVAEE教学.ppt_第1页
第1页 / 共25页
清华ITJAVAEE教学.ppt_第2页
第2页 / 共25页
清华ITJAVAEE教学.ppt_第3页
第3页 / 共25页
清华ITJAVAEE教学.ppt_第4页
第4页 / 共25页
清华ITJAVAEE教学.ppt_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《清华ITJAVAEE教学.ppt》由会员分享,可在线阅读,更多相关《清华ITJAVAEE教学.ppt(25页珍藏版)》请在三一办公上搜索。

1、第四章,Struts模型组件与视图组件,课程目标,模型的概念与理解 业务对象及其应用 编写ActionForm类 熟悉Struts标签建立表单 各种用户注册程序 各种表单信息提交程序,体验项目,程序实现的功能:程序实现保存用户收货单信息的功能。当用户提交数据时,程序会检验用户提交的数据是否符合要求,如符合要求最后可提交至数据库保存,如果不符合要求将返回提交信息页面并提示错误信息。程序运行过程如下:,图4-1 填写表单信息,(1)访问表单页面,输入用户的收货信息。如图4-1填写表单信息界面所示:,(2)表单信息填写完成后,点击“提交”按钮。如果用户填写的数据符合要求(譬如姓名长度大于2,地址长度

2、大于5等),将弹出如图4-2所示的验证表单信息成功页面,图4-2 验证表单信息成功,(3)如果用户确定所提交的数据无误后,即可点击“确定提交”按钮将数据保存至数据库。数据保存成功,则出现生成收货单页面。,Struts模型组件,模型组件代表应用的业务数据和逻辑。Struts框架并没有为设计和创建模型组件提供现成的框架。不过Strtus允许使用其他的模型组件来处理应用的业务领域。模型是应用中重要的一部分,它包含了业务实体和业务规则,负责访问和更新持久化数据。应该把所有的模型组件放在系统中的同一个位置,这样有利于维护数据的完整性,提高代码的可重用性。设计模型需要在概念模型的基础上设计。可以用UML类

3、框图,活动图以及状态图来描述设计模型。而根据UML语言,类之间又存在以下四种关系。,模型的概念与理解,关联(Association):指类之间的引用关系。依赖(Dependency):指类之间的访问关系。累积(Aggregation):指整体与个体之间的关系,可以把累积看作一种强关联关系。一般化(Generalization):指类之间的继承关系。,业务对象(Business Object,BO)是对数据进行检索和处理的组件。是对简单的真实世界的软件抽象,业务对象通常位于中间层。业务对象(BO)是由第三方开发的,用其可以在一个应用中自动的加入一个特定的功能来获得增值效应。使代码重用变为可能。比

4、如,如果要开发一个包含多货币处理的应用,可以选择使用一个已经开发完成的,包含所有多货币处理功能的业务对象来开始您的开发。使你的开发工作极大的减少。,业务对象,如果一个类可以作为业务对象,那它必须具有以下条件:,1.业务对象的必要条件,由状态和行为组成。表达了来自业务域的一个人、地点、事物或概念。可以重用。,业务对象可以分为以下三类:,2业务对象的分类,(1)实体业务对象:表达了一个人、地点、事物或者概念。根据业务中的名词从业务域中提取。如客户、订单、物品。在EJB应用程序中,一般为实体Bean。在传统的web应用程序中,可能是包含业务应用的状态和行为的普通javabean。(2)过程业务对象:

5、表达应用程序中业务处理过程或者工作流程任务。通常依赖于实体业务对象,是业务的动词。在EJB应用程序中,通常是模型的会话Bean,或者消息驱动Bean。在非EJB应用中,可能是javabean包含特定的行为,作为应用程序的管理者或者控制者。(3)事件业务对象:表达应用程序中由于系统的一些操作造成或产生的一些事件。,在应用中使用业务对象有许多好处,最重要的一点就是业务对象提供了通用的术语和概念,不管是技术人员还是非技术人员都可以共享并理解它们。它们可以直观地代表现实世界中的概念,开发小组的所有成员都能理解他们。如果正对同一个业务领域需要开发出多个应用,那么这些应用可以共享这些业务对象。业务对象的可

6、重用特性可以提高应用开发速度,减少冗余。,3.业务对象的重要性,当应用中的业务对象在内存中创建后,它们不可能永远存在。最后,他们要么从内存中清除,要么被持久化到数据库中。内存无法永久保存数据,因此必需对业务对象进行持久化。否则,如果对象没有被持久化,用户在应用运行时发出的订单信息将在应用结束运行后随之消失。关系型数据库被广泛用来存储数据。关系型数据库中存放的是关系型数据,它是非面向对象的。把业务对象映射到非面向对象的数据库中,存在着阻抗不匹配(impedance mismatch),因此对象由状态和行为组成,而关系型数据库则由表组成,对象之间的各种关系和关系型数据库中表之间的关系并不一一对应。

7、,4.业务对象的持久化,5数据访问对象(DAO)设计模式,DAO模式提供了访问关系型数据库系统所需的所有操作的接口,其中包括创建数据库、定义表、字段和索引,建立表间的关系,更新和查询数据库等。DAO模式将底层数据访问操作与高层业务逻辑分离开,对上层提供面向对象的数据访问接口。在DAO的实现中,可以采用XML语言来配置对象和关系型数据之间的映射。对于Java应用,可以直接通过JDBC编程来访问数据库。JDBC可以说是访问持久数据层最原始、最直接的方法。在企业级应用开发中,可以通过JDBC编程,来开发自己的DAO API,把数据库访问操作封装起来,供业务层统一调用。,注意:ORM框架是一种持久化框

8、架,DAO是用于实现持久化框架的一种设计模式。,ActionForm类,在Struts框架中,模型层包括ActionForm、JavaBean或EJB。通常,Struts框架会为你的应用程序中每一个用户的输入请求创建一个ActionForm bean,它为Action提供用户请求的数据,所以ActionForm代表了由浏览器所传递过来的数据。,(1)控制器接收到请求。(2)从request或session范围中取出ActionForm实例,如果该实例不存在,就自动创建一个新的实例。(3)调用ActionForm的reset()方法。(4)把ActionForm实例保存在request或sess

9、ion范围中。(5)把用户输入的表单数据组装到ActionForm中。(6)如果Struts配置文件中元素的validate属性为true,则调用ActionForm的validate()方法。(7)把请求转发给其他Web组件,ActionForm实例依然保存在request或session范围内。,ActionForm的生命周期,ActionForm是一个抽象类,每一个自定义的ActionForm类都要求继承.action.ActionForm类,本例的ActionForm我们取名为HelloActionForm,它的定义方法如下所示:,定义ActionForm类,package;impor

10、t;import;import;import;import;public class HelloActionForm extends ActionForm,在ActionForm中,需要为每一个用户提交的数据定义一个属性,用来保存数据的值。另外,为了实现对这些属性的存取操作,还需要在ActionForm对象中提供对这些属性操作的setter()和getter()方法。这些setter()和getter()方法的命名要符合JavaBean的规定,也就是将set或get与属性名首字母大写后组成方法名,如getUserName()。,定义ActionForm的属性,定义完属性与相关的setter()

11、和getter()方法后,就需要重写ActionForm父类的reset()方法。reset()方法会在每一次收到用户请求时被调用,定义这个方法的目的是通过这个方法为ActionForm对象中的每一个属性设置初始的默认值,即进行初始化。reset()方法包括了两个参数,分别是ActionMapping和HttpServletRequest。,重写reset()方法,public void reset(ActionMapping actionMapping,HttpServletRequest servletRequest)/,validate()方法的作用主要是对用户提交的表单数据进行初步验证

12、,譬如用户提交的数据是否为空,是否数据长度不够等等。当然,这些验证,我们完全可以在表单页面使用javascript脚本语言来实现。,实现validate()方法,配置ActionForm,Struts配置文件的元素用来配置所有的ActionForm Bean。元素可以包含多个子元素,它代表单个的ActionForm Bean。同一个ActionForm可以和多个Action映射。在元素中,name和scope属性分别指定ActionForm的名字和范围,validate属性指定是否执行表单验证。,开发JavaBean组件,JavaBean可以存活在page、request、session及ap

13、plication范围内。在Web应用中,可以将常用的属性或方法写在JavaBean中,由于一个JavaBean可以被多个JSP页面或Servlet调用,所以这样将很大程度上提高代码的可重用性。如HelloActionForm的代码可以这样写如下(部分代码):,/验证表单数据public ActionErrors validate(ActionMapping actionMapping,HttpServletRequest httpServletRequest)ActionErrors error=new ActionErrors();if(users.getUserName()=null|u

14、sers.getUserName().trim().length()2)error.add(userName.error,new ActionMessage();return error;,如果程序涉及到数据库操作,也可以将数据库操作代码写成方法封装在Bean中,然后可以在其他程序中调用。例如我们要把订单信息保存至数据库,DBConnection.java的代码可以这样写,参考代码如下:,public boolean addInfo(Users users)try PreparedStatement ps=cn.prepareStatement(insert into usersorder v

15、alues(?,?,?,?,?);ps.setString(1,users.getUserName();/ps.execute();catch(Exception e)eturn false;return true;,在addInfo()方法中,我们传递的是users对象,所以在调用该方法时,也必须传递users对象给它,当然这是在users对象不为空的情况下才这么使用。,DynaActionForm类,DynaActionForm的目的就是减少ActionForm的数目,利用它你不必创建一个个具体的ActionForm类,而是在配置文件中配置出所需的虚拟ActionForm。例如,在下表中通

16、过指定的type为.DynaActionForm来创建一个动态的ActionFormLoginActionForm。,动态的ActionForm的使用方法跟普通的ActionForm相同,但是要注意一点。普通的ActionForm对象需要为每个属性提供getter和setter方法,以上面的例子而言,我们需要提供getUserName()和setUserName()方法取得和设置userName属性,同样地有一对方法用于取得和设置password属性和actionClass属性。如果使用DynaActionForm,它将属性保存在一个HashMap类对象中,同时提供相应的get(name)和s

17、et(name)方法,其中参数name是要访问的属性名。例如要访问DynaActionForm中userName的值,可以采用类似的代码:String userName=(String)form.get(“userName”);由于值存放于一个HashMap对象,所以要记得对get()方法返回的Object对象做强制性类型转换。正是由于这点区别,如果你在Action中非常频繁地使用ActionForm对象,建议还是使用普通的ActionForm对象。,Struts视图组件,Struts框架的视图负责向客户显示动态的网页内容。Struts框架的视图主要由JSP网页构成。此外,Struts框架还提

18、供了一系列的客户化标签和ActionForm Bean,这些组件提供对国际化、接收用户输入的表单数据、表单验证和错误处理等的支持。,譬如,一个用户的用户名字段的输入元素在JSP中可以这样来写:/,但是这样的代码会让页面美工设计人员看起来很头疼,如果采用Struts标签建立表单的话,就显得方便多了,如下:,Struts框架明确了控制器的角色,所有请求需要先转发给控制器,再由控制器来负责请求转发。由控制器来负责请求转发有以下一些优点:,控制器具有预处理请求功能,它能够选择正确的子应用模块来处理请求,并且把子应用模块的ModuleConfig和MessageResources对象存放在request

19、范围内。控制器具有预处理请求功能,它能够选择正确的子应用模块来处理请求,并且把子应用模块的ModuleConfig和MessageResources对象存放在request范围内。JSP网页之间直接相互转发违背了MVC的分层原则,按照MVC设计思想,控制器负责处理所有请求,然后选择适当的视图组件返回给用户,如果直接让JSP相互调用,控制器就失去了流程控制作用。,Struts框架提倡先把请求转发给控制器,再由控制器来负责包含其他Web组件。IncludeAction类提供了包含其他Web组件的功能。与ForwardAction一样,Web组件通过IncludeAction类来包含另一个Web组件

20、,可以充分利用Struts控制器的预处理功能。,Struts配置文件中,元素的paramter属性指定需要包含的Web组件。,LookupDispatchAction类是DispatchAction的子类,在该类中也可以定义多个业务方法。通常LookupDispatchAction主要应用于一个表单中有多个提交按钮的情况,而这些按钮又有一个共同的名字的场合,这些按钮的名字和具体的ActionMapping的parameter属性值相对应。,一个DEMO,SwitchAction类用于子应用模块之间的切换。对于请求访问SwitchAction的URL,需要提供两个参数:,prefix:指定子应用

21、模块的前缀,以“/”开头,默认子应用模块的前缀为空字符串“”。page:指定被请求Web组件的URI,只需指定相对于被切换后的子应用模块的相对路径。,配置SwitchAction类如下所示:,实践项目,一、程序的实现要求如下:(1)对用户提交的表单信息进行验证,例如用户提交的姓名是否为空,或是否太短(一般来说,用户姓名的长度不可能为1,所以我们可以判断是否小于2)。(2)对用户提交的信息进行中文乱码处理。(3)用户进行第一次提交的时候,并不把数据添加到数据库中,而是将所有信息返回给用户,然后又用户判断所提交的信息是否理想,如果不理想可以返回重新提交,如果理想则可进行最后的确定,从而将数据保存至

22、数据库中。,二、实现步骤,(1)当用户在index.jsp页面中点击“提交”按钮时,是将请求提交给了HelloAction,HelloAction得到请求后,将填充HelloActionForm的数据,并将其保存至request对象中,最后将请求转发给ok.jsp页面。(2)在ok.jsp页面中,通过以下代码,取出HelloActionForm对象,获得用户提交的数据,最后再将Users对象保存在session对象里。(3)如果用户确定提交的数据无误之后,可再点击“确定提交”按钮将数据保存至数据库。此次提交是将请求提交给了DBAction,在DBAction中取出Users对象并调用DBConnection Bean将数据保存至数据库。在DBAction中存在两种请求转发的可能,如果数据成功添加到数据库,将会把请求转发到成功页面,如果添加失败则将请求转发至错误页面。,本章总结,模型的概念与理解 业务对象及其应用 编写ActionForm类 熟悉Struts标签建立表单 各种用户注册程序 各种表单信息提交程序,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号