软件实现-Java.ppt_第1页
软件实现-Java.ppt_第2页
软件实现-Java.ppt_第3页
软件实现-Java.ppt_第4页
软件实现-Java.ppt_第5页
已阅读5页,还剩211页未读 继续免费阅读

下载本文档

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

文档简介

1、Java软件工程与项目案例教程(五),主要内容,1、MVC与Struts 2、Hibernate技术 3、Spring技术,第5章 软件实现,在完成系统分析和设计之后,进入软件实现环节。软件实现的目标是:利用已有的资产和构件,遵循程序开发规范,按照系统详细设计说明书中数据结构、算法和模块实现等方面的设计,用面向对象的技术,实现目标系统的功能、性能、接口、界面等要求。 在eGov电子政务系统中,我们基于Struts-Spring-Hibernate框架完成了软件实现步骤。,5.1 Struts-Spring-Hibernate概述,大部分的Web应用在职责上至少能被分成3层:表示层(Presen

2、tation Layer)、业务层(Business Layer)和持久层(Persistence Layer)。每个层在功能上都应该是十分明确的,而不应该与其他层混合。每个层要相互独立,通过一个通信接口而相互联系。 这里讨论一个使用3种开源框架的策略:表示层用Struts;业务层用Spring;而持久层则用Hibernate,如图5-1所示。,5.1 Struts-Spring-Hibernate概述,图5-1 Struts-Spring-Hibernate架构,5.2 Struts技术,5.2 Struts技术 5.2.1 struts 概述,Struts 1的主要缺点如下: (1)支持的

3、表示层技术单一 Struts 1只支持JSP视图技术,当然,可以少量支持Velocity等技术。 (2)Struts与Servlet API严重耦合,难于测试 比如:对Struts 1的Action的execute进行测试,该方法有4个参数:ActionMapping、ActionForm、HttpServletRequest和HttpServletResponse,初始化这4个参数比较困难,尤其是HttpServletRequest和HttpServletResponse两个参数,因为这两个参数通常是由容器进行注入的。如果脱离Web服务器,Action的测试是很困难的。 (3)Struts

4、1的侵入性太大 一个Action中包含了大量的Struts API,比如ActionMapping、ActionForm、ActionForward等。这种侵入式的设计最大的弱点在于:切换框架会相当困难,代码复用较低,不利于重构。 Struts 2在另一个MVC框架WebWork的优良基础设计之上,进行了一次巨大的升级。注意:Struts 2不是基于Struts 1,而是基于WebWork的。Struts 2针对Struts 1的不足,提出了自己的解决方案。,5.2 Struts技术,5.2.2 MVC与struts 映射,Struts的体系结构实现了Model-View-Controller

5、设计模式的概念,它将这些概念映射到Web应用程序的组件和概念中。 1控制器层(Controller) 与Struts 1使用ActionServlet作为控制器不同,Struts 2使用了Filter技术,FilterDispatcher是Struts框架的核心控制器,该控制器负责拦截和过滤所有的用户请求。如果用户请求以action结尾,该请求将被转入Struts框架来进行处理。Struts框架获得了*.action请求后,将根据*.action请求的前面名称部分决定调用哪个业务控制action类。例如,对于test.action请求,调用名为test的action来处理该请求。,5.2 St

6、ruts技术,Struts应用中的action都被定义在struts.xml文件中,在该文件中配置action时,主要定义了该action的name属性和class属性,其中name属性决定了该action处理哪个用户请求,而class属性决定了action的实现类。例如:。 用于处理用户请求的action实例,并没有与Servlet API耦合,所以无法直接处理用户请求。为此,Struts框架提供了系列拦截器,该系列拦截器负责将HttpServletRequest请求中的请求参数解析出来,传入到Action中,并回调Action的execute方法来处理用户请求。,2显示层(View) St

7、ruts 2框架改变了Struts 1只能使用JSP作为视图技术的现状(当然可以少量支持Velocity等技术),它允许使用其他的视图技术,如FreeMarker、Velocity等作为显示层。 当Struts 2的控制器调用业务逻辑组件处理完用户请求后,会返回一个字符串,该字符串代表逻辑视图,它并未与任何的视图技术关联。 当我们在struts.xml文件中配置action时,还要为action元素指定系列result 子元素,每个result 子元素定义上述逻辑视图和物理视图之间的映射。一般情况下,我们使用JSP技术作为视图,故配置result子元素时没有type属性,默认使用JSP作为视图

8、资源。例如:/product/register.jsp。,5.2 Struts技术,如果需要在Struts 2中使用其他视图技术,则可以在配置result子元素时,指定相应的type属性即可。例如,type属性指定值可以是velocity。 Struts显示层包括了一个便于创建用户界面的定制标记库。这些标记的使用将在后面讨论。另外,我们还会讲解国际化支持、表达式语言等内容。,3模型层(Model) 模型层指的是后端业务逻辑处理,它会被action调用来处理用户请求。当控制器需要获得业务逻辑组件实例时,通常并不会直接获取业务逻辑组件实例,而是通过工厂模式来获得业务逻辑组件的实例;或者利用其他Io

9、C容器(如Spring容器)来管理业务逻辑组件的实例。我们在后面会详细展开这些技术。 基于MVC的系统中的业务逻辑组件还可以细分为两个概念:系统的内部状态以及能够改变状态的行为。我们可以把状态信息当做名词(事物),把行为当做动词(事物状态的改变),它们使用JavaBean、EJB或Web Service实现。,5.2 Struts技术,5.2.3 Struts 2的工作流程和配置文件,1Struts 2的工作流程 Struts 2的工作流程是WebWork的升级,而不是Struts 1的升级,如图5-2所示 Struts 2的工作流程步骤如下: 浏览器发送请求,例如请求/regist.acti

10、on、/reports/myreport.pdf等。 核心控制器FilterDispatcher根据请求决定调用合适的Action。 WebWork的拦截器链自动对请求应用通用功能,例如验证、工作流或文件上传等功能。,5.2 Struts技术,回调Action的execute方法,该execute方法先获取用户请求参数,然后执行某种业务操作,既可以将数据保存到数据库,也可以从数据库中检索信息。实际上,因为Action只是一个控制器,它会调用业务逻辑组件(Model)来处理用户的请求。 Action的execute方法处理结果信息将被输出到浏览器中,可以是HTML页面、图像,也可以是PDF文档或

11、者其他文档。Struts 2支持的视图技术非常多,既支持JSP,也支持Velocity、FreeMarker等模板技术。 要想更详细地掌握Struts的核心技术和流程,就要先理解Struts的配置文件。,图5-2 Struts 2的体系概图,5.2 Struts技术,2Struts 2的配置文件 Struts 2的配置文件有两份,包括配置Action的struts.xml文件和配置Struts 2全局属性的perties文件。接下来我们分别对它们进行讨论。 (1)struts.xml配置文件 首先我们了解一下Struts 2框架自带的一些配置文件。在Struts 2的jar

12、包中,我们会看到有一个struts-default.xml文件。这个struts-default.xml文件是Struts 2框架的默认配置文件,Struts 2框架每次都会自动加载该文件。struts-default.xml文件定义了一个名字为struts-default的包空间,该包空间里定义了Struts 2内建的Result类型,配置了大量的核心组件,以及Struts 2内建的系列拦截器、由不同拦截器组成的拦截器栈和默认的拦截器引用等。,另外,Struts 2框架允许以一种“可插拔”的方式来安装插件,它们都提供了一个类似Struts2-xxx-plugin.jar的文件,例如后面要用到

13、的Spring插件,它提供了Struts2-spring-plugin2.06.jar文件,只要将该文件放在Web应用的WEB-INF/lib路径下,Struts 2框架将自动加载该框架。,5.2 Struts技术,对于绝大部分Struts 2应用而言,我们无须重新定义上面这些配置文件。我们所要关注和管理的是下面的struts.xml配置文件。,Struts框架的核心配置文件就是struts.xml配置文件。在默认情况下,Struts 2框架将自动加载放在WEB-INF/classes路径下的struts.xml文件。该文件主要负责管理应用中的Action映射、该Action包含的result

14、定义等,以及一些其他相关配置。 以下是项目中strruts.xml的实例。 ,5.2 Struts技术, /jsp/authplot.jsp /jsp/manager.jsp /jsp/authplot.jsp /jsp/authmanager.jsp /index.jsp ,5.2 Struts技术, /index.jsp /jsp/manager.jsp /jsp/auditing.jsp /jsp/auditings.jsp /jsp/myissue.jsp /jsp/view.jsp /jsp/list.jsp /jsp/updatenews.jsp ,5.2 Struts技术,(2)

15、perties配置文件 除了struts.xml核心文件外,Struts 2框架还包含一个perties文件,该文件通常放在Web应用的WEB-INF/classes路径下。它定义了Struts 2框架的大量属性,开发者可以通过改变这些属性来满足个性化应用的需求。,5.2.4 创建Controller组件,Struts的核心是Controller组件。它是连接Model和View组件的桥梁,也是理解Struts架构的关键。Struts 2的控制器由两个部分组成:FilterDispatcher和业务控制器Action。,Struts的核心是Control

16、ler组件。它是连接Model和View组件的桥梁,也是理解Struts架构的关键。Struts 2的控制器由两个部分组成:FilterDispatcher和业务控制器Action。,5.2 Struts技术,1FilterDispatcher 任何MVC框架都需要与Web应用整合,这就离不开web.xml文件,只有配置在web.xml 文件中Filter/Servlet才会被应用加载。对于Struts 2框架而言,需要加载FilterDispatcher。因为Struts 2将核心控制器设计成Filter,而不是一个Servlet。因此为了让Web应用加载FilterDispatcher,需

17、要在web.xml文件中配置FilterDispatcher。 配置FilterDispatcher的代码片段如下:, struts org.apache.struts2.dispatcher.Filter Dispatcher ,5.2 Struts技术, actionpackages org.apache.struts2.showcase.person configProviders lee.MyConfigurationProvider ,5.2 Struts技术,正如上面看到的,当配置Struts 2的FilterDispatcher类时,可以指定一系列的初始化参数。为该Filter配

18、置初始化参数时,其中有3个初始化参数有特殊意义: (1)Config:该参数的值是一个以英文逗号(,)隔开的字符串,每个字符串都有一个XML配置文件的位置。Struts 2框架将自动加载该属性指定的系列配置文件。 (2)Actionpackages:该参数的值也是一个以英文逗号(,)隔开的字符串,每个字符串都是一个包空间,Struts 2框架将扫描这些包空间下的Action类。 (3)Configproviders:如果用户需要实现自己的Configurationprovider类,则可以提供一个或多个实现了Configurationprovider接口的类,然后将这些类的类名设置成该属性的值

19、,多个类名之间以英文逗号(,)隔开。,除此之外,还可在此处配置Struts 2常量,每个元素配置一个Struts 2常量,其中子元素指定了常量name,而子元素指定了常量value。 在web.xml文件中配置了该Filter,还需要配置该Filter拦截的URL。通常,我们让该Filter拦截所有的用户请求,因此使用通配符来配置该Filter拦截的URL。,5.2 Struts技术,下面是配置该Filter拦截URL的配置片段。 struts / 2Action的开发 对于Struts 2应用而言,Action是应用系统的核心,我们也称Action为业务控制器。开发者需要提供大量的Actio

20、n类,并在strust.xml文件中配置Action。 (1)实现Action类,5.2 Struts技术,相对于Strust 1而言,Struts 2采用了低侵入式的设计,Struts 2的Action类是一个普通的POJO(通常应该包含一个无参数的execute方法),从而带来很好的代码复用性。 例如,对于用户登录模块LoginAction类的代码如下: package com.ascent.action; import com.ascent.po.Usr; import com.opensymphony.xwork2.ActionContext;,public class LoginAc

21、tion extends BaseAction public String username; public String password; public String getPassword() return password; public void setPassword(String password) this.password = password; public String getUsername() return username; ,5.2 Struts技术,public void setUsername(String username) this.username =

22、username; public String execute() if(this.getUsername()!=null ,5.2 Struts技术,注意:上面的LoginAction类继承了BaseAction类,它是我们开发的一个帮助类,是为了提供对Spring集成支持的工具类。我们在介绍Spring时会帮助读者更好地理解它,有兴趣的读者可参考光盘里的源代码。,上面的Action类只是一个普通类,这个Java类提供了两个属性:username和password,这两个属性分别对应两个HTTP请求参数。 Action类里的属性,不仅可用于封装请求参数,还可用于封装处理结果。例如,在前面的A

23、ction代码中看到的,如果希望将服务器提示的登录成功或失败在下一个页面输出,那么我们可以在Action类中增加一个tip属性,并为该属性提供对应的setter和getter方法。,系统不会严格区分Action里哪个属性是用于封装请求参数的属性,哪个属性是封装处理结果的属性。对系统而言,封装请求参数的属性和封装处理结果的属性是完全平等的。如果用户的HTTP请求里包含了名为tip的请求参数,系统会调用Action类的void setTip(String tip)方法,通过这种方式,名为tip的请求参数就可以传给Action实例;如果Action类里没有包含对应的方法,则名为tip的请求参数无法传

24、入该实例。,5.2 Struts技术,同样,在JSP页面中输出Action属性时,它也不会区分该属性是用于封装请求参数的属性,还是用于封装处理结果的属性。因此,使用Struts 2的标签既可以输出Action的处理结果,也可以输出HTTP请求参数值。,为了让用户开发的Action类更规范,Struts 2提供了一个Action接口,这个接口定义了Struts 2的Action处理类应该实现的规范。它的里面只定义了一个execute方法,该接口的规范规定了Action类应该包含这样一个方法,该方法返回了一个字符串。除此之外,该接口还定义了5个字符串常量,分别是error、input、login、

25、none和success,它们的作用是统一execute方法的返回值。例如,当Action类处理用户请求成功后,有人喜欢返回welcome字符串,有人喜欢返回success字符串,这样不利于项目的统一管理。Struts 2的Action定义上面的5个字符串分别代表了统一的特定含义。,另外,Struts 2还提供了Action类的一个实现类:ActionSupport,该Action是一个默认的Action类,该类里已经提供了许多默认方法,这些默认方法包括获取国际化信息的方法、数据校验的方法、默认的处理用户请求的方法等。实际上,ActionSupport类是Struts 2默认的Action处理

26、类,如果让开发者的Action类继承该Action类,则会大大简化Action的开发。,5.2 Struts技术,(2)Action访问Servlet API Struts 2的Action并未直接与任何Servlet API耦合,这是Struts 2的一个改进之处,因为这样的Action类具有更好的重用性,并且能更轻松地测试该Action。 然而对于Web应用的控制器而言,不访问Servlet API几乎是不可能的,例如获得HTTP Request参数、跟踪HTTP Session状态等。为此, Struts 2提供了一个ActionContext类,Struts 2的Action可以通过该

27、类来访问Servlet API,包括HttpServletRequest、HttpSession和ServletContext这3个类,它们分别代表JSP内置对象中的request、session和appliaction。,表5-5中所列的是ActionContext类中包含的几个常用方法。 表5-5 ActionContext类中包含的常用方法,5.2 Struts技术,5.2 Struts技术,虽然Struts 2提供了ActionContext来访问Servlet API,但这种访问毕竟不能直接获取Servlet API实例。为了在Action中直接访问Servlet API,还提供了如

28、下系列接口,见表5-6。,表5-6 系列接口,5.2 Struts技术,另外,为了直接访问Servlet API,Struts 2提供了一个ServletActioncontext类。借助于这个类的帮助,开发者也能够在Action中直接访问Servlet API,却可以避免Action类需要实现上面的接口。这个类包含了如下几个静态方法,见表5-7。,表5-7 静态方法,5.2 Struts技术,在eGov项目中,AuthAction就使用了Servlet API,如下所示。 package com.ascent.action; import java.util.ArrayList; impor

29、t java.util.List; import java.util.Map; import com.ascent.po.Authorization; import com.ascent.po.Department; import com.ascent.po.News; import com.ascent.po.Userauth; import com.ascent.po.Usr; import com.opensymphony.xwork2.ActionContext;,5.2 Struts技术,public class AuthAction extends BaseAction publi

30、c String typ; public String pars; public String id; public String name; public String gid; public String sid; public String gname; public String sname; public String dept;,public String getGname() return gname; public void setGname(String gname) this.gname = gname; ,5.2 Struts技术,public String getSna

31、me() return sname; public void setSname(String sname) this.sname = sname; public String getGid() return gid; public void setGid(String gid) this.gid = gid; public String getSid() return sid; public void setSid(String sid) this.sid = sid; ,5.2 Struts技术,public String getId() return id; public void set

32、Id(String id) this.id = id; public String getName() return name; public void setName(String name) = name; public String getPars() return pars; public void setPars(String pars) this.pars = pars; ,5.2 Struts技术,public String getTyp() return typ; public void setTyp(String typ) this.typ = typ;

33、public String getDept() return dept; public void setDept(String dept) this.dept = dept; ,5.2 Struts技术,/* * 查找用户权限 * */ public String auth() String sql = select a from Authorization a,Usr u,Userauth ua +where u.id=? and ua.userId=u.id and ua.authId=a.id; Map session = ActionContext.getContext().getSe

34、ssion(); Usr user = (Usr) session.get(user); Integer value = new Integer1; value0 = user.getId(); List list = newsService.selectSQL(sql,value); ActionContext.getContext().put(auth,list); return qxx; ,5.2 Struts技术,/* * 查找应该显示在首页的头版头条和综合新闻 * */ public void index() Map session = ActionContext.getContex

35、t().getSession(); String sql = from News n where (n.status=1 and n.typ=1) or + (n.typ=2 and n.statu=2 and n.status=1) order by n.id + desc; List list = newsService.selectSQL(sql,null); if(list.size()0) News news = (News) list.get(0); session.put(typ1,news); else session.put(typ1,null); ,5.2 Struts技术

36、,sql = from News n where n.status=1 and n.typ=2 and +n.statu!=2 order by n.id desc; list = newsService.selectSQL(sql,null); List li = new ArrayList(); if(list.size()6) for(int i=0;i6;i+) li.add(list.get(i); session.put(typ2,li); else session.put(typ2,list); ,5.2 Struts技术,/* *用户分配权限之前的寻找 */ public St

37、ring plot() /部门集合 String sql = from Department; List list = newsService.selectSQL(sql, null); ActionContext.getContext().put(dept,list); /未分配权限的用户集合 Department dt = (Department) list.get(0); sql = from Usr u where u.deptid=? and u.id not in + (select ua.userId from Userauth ua,Authorization a where

38、+ ua.authId=a.id and a.columnId=?);,5.2 Struts技术,Integer value1 = dt.getId(),Integer.parseInt(this.getTyp(); list = newsService.selectSQL(sql, value1); ActionContext.getContext().put(user1,list); /栏目管理的权限的用户集合 sql = select u from Usr u,Userauth ua,Authorization a where +u.id=ua. userId and u.deptid=

39、? and a.columnId=? and +a.auth=1 and ua. authId=a.id; list = newsService.selectSQL(sql, value1); ActionContext.getContext().put(guser,list); /栏目审核的权限的用户集合 sql = select u from Usr u,Userauth ua,Authorization a where +u.id=ua. userId and u.deptid=? and a.columnId=? and +a.auth=2 and ua. authId=a.id; l

40、ist = newsService.selectSQL(sql, value1); ActionContext.getContext().put(suser,list); return SUCCESS; ,5.2 Struts技术,/* * 根据部门查询用户 * return */ public String deptUser() String par = this.getPars().split(,); String sql = from Usr u where u.deptid=? and u.id not in +(select ua.userId from Userauth ua,Au

41、thorization a +where ua. authId=a.id and a.columnId=?); Integer value = Integer.parseInt(par0),Integer.parseInt(par1); List list = newsService.selectSQL(sql, value); this.setId(); this.setName(); for(int i=0;ilist.size();i+) Usr user = (Usr) list.get(i); if(i=0) id = user.getId()+; name = user.getNi

42、ckname(); ,5.2 Struts技术,else id = id+,+user.getId(); name = name+,+user.getNickname(); /* * 根据部门查询用户 * return */,5.2 Struts技术,public String deptUser() String par = this.getPars().split(,); String sql = from Usr u where u.deptid=? and u.id not in +(select ua.userId from Userauth ua,Authorization a +w

43、here ua. authId=a.id and a.columnId=?); Integer value = Integer.parseInt(par0),Integer.parseInt(par1); List list = newsService.selectSQL(sql, value); this.setId(); this.setName(); for(int i=0;ilist.size();i+) Usr user = (Usr) list.get(i); if(i=0) id = user.getId()+; name = user.getNickname(); else i

44、d = id+,+user.getId(); name = name+,+user.getNickname(); ,5.2 Struts技术,Integer va = Integer.parseInt(par0),Integer.parseInt(par1); sql = select u from Usr u,Userauth ua,Authorization a where +u.id=ua. userId and u.deptid=? and a.columnId=? and +a.auth=1 and ua. authId=a.id; list = newsService.select

45、SQL(sql, va); this.setGname(); this.setGid(); for(int i=0;ilist.size();i+) Usr user = (Usr) list.get(i); if(i=0) gid = user.getId()+; gname = user.getNickname(); else gid = gid+,+user.getId(); gname = gname+,+user.getNickname(); ,5.2 Struts技术,sql = select u from Usr u,Userauth ua,Authorization a whe

46、re +u.id=ua. userId and u.deptid=? and a.columnId=? and +a.auth=2 and ua. authId=a.id; list = newsService.selectSQL(sql, va); this.setSname(); this.setSid(); for(int i=0;ilist.size();i+) Usr user = (Usr) list.get(i); if(i=0) sid = user.getId()+; sname = user.getNickname(); else sid = sid+,+user.getI

47、d(); sname = sname+,+user.getNickname(); return de; ,5.2 Struts技术,public String addPlot() String gid = this.getGid().split(,); String sid = this.getSid().split(,); String gsql = from Authorization a where a.columnId=? and a.auth=1; String ssql = from Authorization a where a.columnId=? and a.auth=2;

48、Integer value = Integer.parseInt(this.getTyp(); List glist = newsService.selectSQL(gsql,value); List slist = newsService.selectSQL(ssql,value); Authorization ga = (Authorization) glist.get(0); Authorization sa = (Authorization) slist.get(0);,String sql = select ua from Usr u,Userauth ua,Authorizatio

49、n a +where u. deptid=? and u.id=ua.userId and a.columnId=? +and a.auth=1 and a.id=ua. authId; Integer v = Integer.parseInt(this.getDept(), Integer.parseInt(this.getTyp(); List list = newsService.selectSQL(sql, v); for(int i=0;ilist.size();i+) Userauth ua = (Userauth) list.get(i); newsService.deleteO

50、bject(ua); ,5.2 Struts技术,sql = select ua from Usr u,Userauth ua, Authorization a where + u.deptid=? and u.id=ua.userId and a.columnId=? and + a.auth=2 and a.id=ua.authId; list = newsService.selectSQL(sql, v); for(int i=0;ilist.size();i+) Userauth ua = (Userauth) list.get(i); newsService.deleteObject

51、(ua); ,for(int i=0;igid.length;i+) if(gid0!=null ,5.2 Struts技术,for(int i=0;isid.length;i+) if(sid0!=null ,5.2 Struts技术,5.2.5 创建Model组件,Struts中的Model指的是业务逻辑组件,它可以使用JavaBean技术。,1JavaBean概述 你用到的应用程序的需求文档很可能集中于创建用户界面,然而你应该保证每个提交的请求所需要的处理也要被清楚地定义。通常说来,Model组件的开发者侧重于创建支持所有功能需求的JavaBeans类。它们通常可以分成下面讨论的几种类型

52、。然而,首先对“范围”概念做一个简短的回顾是有用的,因为它与Beans有关。,(1)JavaBeans和范围 在一个基于Web的应用程序中,JavaBeans可以被保存在一些不同“属性”的集合中。每一个集合都有集合生存期和所保存的Beans可见度的不同规则。总地说来,定义生存期和可见度的这些规则被叫做Beans的范围。JSP规范中使用以下术语定义可选的范围(括号中定义的是Servlet API中的等价物)。,5.2 Struts技术,page:在一个单独的JSP页面中可见的Beans,生存期限于当前请求。(service()方法中的局部变量) request:在一个单独的JSP页面中可见的Be

53、ans,也包括所有包含于这个页面或从这个页面重定向到的页面或Servlet。(Request属性) session:参与一个特定的用户session的所有JSP和Servlet都可见的Beans,跨越一个或多个请求。(Session属性) application:一个Web应用程序的所有JSP页面和Servlet都可见的Beans。(Servlet context属性),同一个Web应用程序的JSP页面和Servlets共享同样一组Bean集合是很重要的。例如,一个Bean作为一个Request属性保存在一个Servlet中,就像这样: MyCart mycart = new MyCart(.

54、); request.setAttribute(cart, mycart);,5.2 Struts技术,将立即被这个Servlet重定向到的一个JSP页面使用一个标准的行为标记看到,就像这样:,(2)系统状态Beans 系统的实际状态通常表示为一组一个或多个的JavaBeans类,其属性定义当前状态。例如,一个购物车系统包括一个表示购物车的Bean,这个Bean为每个单独的购物者维护,这个Bean中包括一组购物者当前选择购买的商品。同时,系统也包括保存用户信息(包括他们的信用卡和送货地址)、可提供商品的目录和他们当前库存水平的不同的Beans。,对于小规模的系统,或者对于不需要长时间保存的状态

55、信息,一组系统状态Beans可以包含所有系统曾经经历的特定细节的信息。或者,系统状态Beans表示永久保存在一些外部数据库中的信息(例如,CustomerBean对象对应于表Customers中特定的一行),在需要时从服务器的内存中创建或清除。在大规模应用程序中,Entity EJBs也用于这种用途。,5.2 Struts技术,(3)商业逻辑Beans 你应该把应用程序中的功能逻辑封装成为此目的设计的JavaBeans的方法调用。这些方法可以是用于系统状态Beans的相同类的一部分,或者可以是在专门执行商业逻辑的独立类中。在后一种情况下,你通常需要将系统状态Beans传递给这些方法作为参数处理

56、。,为了代码最大的可重用性,商业逻辑Beans应该被设计和实现为它们不知道自己被执行于Web应用环境中。如果你发现在Bean中必须import一个javax.servlet.* 类,你就把这个商业逻辑捆绑在了Web应用环境中,这时候需要考虑重新组织事物使Action类把所有HTTP请求处理为对商业逻辑Beans属性set方法调用的信息,然后可以发出一个对execute()的调用。这样的一个商业逻辑类可以被重用在Web应用程序以外的环境中。,取决于应用程序的复杂度和范围,商业逻辑Beans可以是与作为参数传递的系统状态Beans交互作用的普通的JavaBeans,或者使用JDBC调用访问数据库的

57、普通的JavaBeans。而对于较大的应用程序,这些Beans经常是有状态或无状态的EJB。 项目中使用了基于Spring的JavaBean,我们会在学习Spring及Hibernate时再详细介绍。,5.2 Struts技术,5.2.6 创建View组建,这里我们侧重于创建应用程序中View组件,主要是使用JSP技术建立,当然Struts 2也支持其他View技术。 在JSP中,我们会大量使用标签。Struts 1.x将标签库按功能分成HTML、Tiles、Logic和Bean等几部分,而Struts 2.0的标签库(Tag Library)严格上来说没有分类,所有标签都在URI为“/struts-tags”命名空间下。不过,我们可以从功能上将其分为两大类:一般标签和UI标签。,如果Web应用使用了Servlet 2.3以前的规范,Web应用不会自动加载标签文件,因此必须在web.xml文件中配置加载Struts 2标签库。 配置加载Struts 2标签库的配置片段如下:,5.2 Struts技术, /s /WEB-INF/struts-tags.tld ,在上面配置片段中,指定了Struts

温馨提示

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

评论

0/150

提交评论