第9章 销售业务员子系统.docx
- 文档编号:5386112
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:29
- 大小:503.89KB
第9章 销售业务员子系统.docx
《第9章 销售业务员子系统.docx》由会员分享,可在线阅读,更多相关《第9章 销售业务员子系统.docx(29页珍藏版)》请在冰豆网上搜索。
第9章销售业务员子系统
第9章销售业务员子系统
学习目标
本章讲述JSP自定义标签封装分页显示的过程,要求通过相关知识的学习和销售业务员子系统功能的实现,熟练掌握自定义标签库(JSPTagLibrary)基本技术,为后续章节打下牢固的基础。
本章的学习要求有以下几点:
●理解销售业务员子系统的设计要求
●理解销售业务员子系统的总体结构
●掌握JSP自定义标签相关技术
●能够运用JSP自定义标签技术实现相关功能
框架内容
本章主要包括以下内容:
图9-1销售业务员子系统结构图
销售业务员子系统采用MVC设计模式,在应运JSP+Servlet+JavaBean这一组合技术的基础上,结合JSP自定义标签技术封装前台页面分页显示逻辑,阐明了JSP自定义标签的编写以及部署,体现了JSP自定义标签灵活处理显示逻辑的特点。
9.1JSP自定义标签
在销售业务员子系统的分页显示中使用了JSP自定义标签技术,该技术也是讲述的重点,这些自定义标签是Tag和SimpleTag两个标签接口的实现类,通过使用JSP自定义标签,增强了JSP页面逻辑显示的灵活性。
下面详细介绍JSP自定义标签技术的相关知识。
9.1.1自定义标签
自定义标签是JSP中的一项重要机制。
使用自定义标签技术,开发人员可以向JSP中添加自己定义的标记,并在标记中封装复杂的功能,从而使JSP的开发更加方便和模块化。
1.自定义标签类的介绍
在JSP2.0规范中,有Tag和SimpleTag两种自定义标签接口,它们都继承了javax.servlet.jsp.tagext.JspTag接口。
Tag标签接口是JSP2.0规范以前定义的标签接口,编写JSP2.0规范以前的标签都必须实现该接口,有一个直接的子接口是BodyTag。
SimpleTag标签接口是JSP2.0技术规范新增加的接口,代表了简单的标签,有一个实现类是SimpleTagSupport。
JSP2.0技术规范中标签库的类和接口的继承与实现关系如图所示:
图9-2JSP标签结构图
从图9-2可知JspTag是标签接口的根接口,它是在JSP2.0中新增的。
它有两个直接的子接口分别是SimpleTag和Tag。
(1)Tag接口的子接口BodyTag主要用于开发带有标签体的标签。
如果开发带标签体的标签,可以直接继承BodyTag的实现类BodyTagSupport;
(2)标签处理器是由网络容器调用的,用来处理运行包含标签的JSP页面。
JSP规范以前的标签处理器必须实现Tag或BodyTag接口,这些接口可以携带Java对象并产生一个标签处理器。
对新创建的处理器,可以使用TagSupport及BodyTagSupport类作为基类,这些类和接口在javax.servlet.jsp.tagext包中。
Tag及BodyTag接口定义的处理器方法由JSP页面的servlet任何时候调用,当遇到标签的起始处时,JSP页面的servlet调用方法来初始化处理器,接着调用处理器的doStartTag方法,当遇到标签的终止处时,处理器的doEndTag方法被调用。
另外的一些方法在标签相互通信时使用。
标签处理器用API接口来与JSP页面通信。
其API入口点是JSP内置对象pageContext(javax.servlet.jsp.PageContext)。
通过API,处理器可以返回其它隐含对象(request,session,application).,该对象中保存了标签处理完成的属性值,通过使用[setter|getter]方法来获取处理完成后的属性值。
如果标签嵌套,标签处理器也要访问相应的标签。
下面是对各接口和类的描述:
Tag接口定义了JSP2.0规范以前的所有的标签处理需要的基本方法。
这些方法包括对标签属性的setter方法,用于获取标签所在JSP页面上下文对象的方法。
此外,还定义了标签开始执行时调用的doStartTag()方法和终止执行时调用的doEndTag()方法。
BodyTag接口:
它是Tag接口的子接口,这个接口有两个标签处理器操作标签体的方法:
setBodyContent()方法用于传送一个BodyContent对象;doInitBody()方法提供了在处理标签体主体部分之前的处理方法。
SimpleTag接口:
JSP2.0规范中定义的简单标签,应用开发这一性质的标签时,只需实现该接口的实现类SimpleTagSupport。
2.开发扩展标签的基本步骤
1.开发扩展标签的扩展类。
每一个扩展标签都需要一个控制类来实现。
2.建立一个TLD(TagLibraryDescriptor)文件,指定标记库中哪一个标记与哪一个应用程序匹配。
这是一种很简单的XML文件,TLD文件描述和说明了属性、信息和标记处理器文件位置等信息。
JSP容器使用这一文件来映射被调用标记库的位置和用法。
3.在JSP页面中使用标记。
在JSP页面中首先声明标记库,然后再使用它。
3.自定义标签描述文件的元素
标签库中的每个标签都有一个给定的名称,标签创建的脚本变量信息和标签属性信息。
脚本变量信息可以直接在TLD中给出或通过标签的额外信息获取。
每一属性都包含说明是否需要该属性,它的值是否可以通过请求表达式来决定,及其属性类型。
下表列出了标签的子元素信息:
表9-1标签描述文件的元素
元素
描述
name
标签唯一名称
tag-class
标签处理器类名
tei-class
可选子类javax.servlet.jsp.tagext.TagExtraInfo
body-content
内容类型
display-name
可选的用来显示的名字
small-icon
可由工具使用的可选的small-icon
description
可选的描述信息
variable
可选的脚本变量信息
attribute
标签属性信息
9.2.2开发带标签体的标签(BodyTagSupport)
BodyTagSupport类是BodyTag接口的实现类,标签处理类继承BodyTagSupport类,标签处理器实现一些方法,使得自定义操作可以使用标签主体信息。
标签的内部可能包含有任何在JSP文件中可能存在的元素,如果对这些内容有兴趣,可以使用包含内容处理的扩展标签BodyTagSupport。
BodyTagSupport为了能够处理标签内部的内容,需要在标签内容开始时、结束时和中间进行一系列的操作。
下面是开发包含内容处理的扩展标签的步骤。
1.开发IfTag.java标签处理类
销售业务员子系统中定义了在页面中判断标签体是否能够输出内容的标签组件IfTag。
IfTag继承了BodyTagSupport类。
下面是IfTag的代码实现:
publicclassIfTagextendsBodyTagSupport{
privatebooleanvalue;
/*设置属性的值*/
publicvoidsetValue(booleanvalue){
this.value=value;
}
/**
*doStartTag方法,如果value为true,那么
*就计算tagbody的值,否则不计算body的值。
*/
publicintdoStartTag()throwsJspTagException{
if(value){
returnEVAL_BODY_INCLUDE;
}else{
returnSKIP_BODY;
}
}
/*覆盖doEndTag方法*/
publicintdoEndTag()throwsJspTagException{
try{
if(bodyContent!
=null){
bodyContent.writeOut(bodyContent.getEnclosingWriter());
}
}catch(java.io.IOExceptione){
thrownewJspTagException("IOError:
"+e.getMessage());
}
returnEVAL_PAGE;
}
}
IfTag标签库扩展了BodyTagSupport。
在IfTag中获取属性value的值,value属性保存着从JSP页面得到的boolean型参数值。
doStartTag()方法返回判断value属性的值:
如果为true,则返回EVAL_BODY_INCLUDE,表明该JSP容器执行标签可能有的主体部分,则doEndTag()方法中由bodyContent.getEnclosingWriter()得到JSPWriter对象,并通过bodyContent的writeOut()方法把标签中的内容输出到JSP页面;否则跳过或忽略标签可能有的主体部分。
doEndTag()这个方法返回EVAL_PAGE;,表明当标签执行完成后,JSP剩余的内容继续被执行。
2.编写IfTag标签的描述文件IfTag.tld
xmlversion="1.0"encoding="ISO-8859-1"?
>
xsi="http: //www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation="web-jsptaglibrary_2_0.xsd"version="2.0"> IfTag.tld文件定义了名为ifTag的标签库,在这个库中定义了一个名为ifout的标签,该标签有一个名为value的属性。 3.web.xml文件部署ifTag标签库 如果在WEB应用中用到ifTag标签时,需要在web.xml文件中添加 4.JSP文件中引用该标签 在JSP文件中需要使用<%@taglib%>指令来声明对标签库的引用,分野显示控制类中存在flag标记,当flag为false时,表示查询的结果集中不存在数据;当flag为true时,表示查询的结果集中存在数据。 因此通过ifTag标签可以判断是否显示分页数据。 flag为false时不显示,为true时显示。 具体代码片断例如: <%--引用标签--%> <%@tagliburi="ifTag"prefix="mf"%> <%--使用标签--%> ifoutvalue="<%=pagectl.flag%>"> 每页<%=pagectl.rowsPerPage%>行 共<%=pagectl.totalRow%>行 当前<%=pagectl.currentPage%>页 共<%=pagectl.totalPage%>页 ifout> 9.2.3开发简单化的标签(SimpleTagSupport) SimpleTagSupport类是SimpleTag接口的实现类,标签处理类继承SimpleTagSupport类后,只实现一个doTag()方法,便可以开发自定义标签。 体现出开发SimpleTag接口标签的简单化。 1.开发PageTag.java标签处理类 销售业务员子系统中定义了在页面中操作分页控制的标签组件PageTag。 PageTag继承了SimpleTagSupport类。 下面是PageTag的代码实现: publicclassPageTagextendsSimpleTagSupport{ privatePageControlpagectl=null; publicvoidsetPagectl(PageControlpagectl){ this.pagectl=pagectl; } publicvoiddoTag()throwsJspException,IOException{ JspContextctx=getJspContext(); JspWriterout=ctx.getOut(); Stringstyle="style=\"background-color: transparent;BORDER-TOP-WIDTH: 0px;" +"PADDING-RIGHT: 0px;PADDING-LEFT: 0px;BORDER-LEFT-WIDTH: 0px;" +"BORDER-BOTTOM-WIDTH: 0px;PADDING-BOTTOM: " +"0px;cursor: hand;BORDER-right-WIDTH: 0px;\"";//注意转移字符\" intprev=pagectl.currentPage-1; intnext=pagectl.currentPage+1; out.println(" +" submitForm2('prev','"+prev+"')\">" +" submitForm2('next','"+next+"')\">"); out.print(" 转到第 submitForm2('goto');\">" +""); for(inti=1;i<=pagectl.totalPage;i++){ out.print(" } out.print("页"); } } PageTag标签库扩展了SimpleTagSupport。 在PageTag中获取页面中分页显示的值对象pagectl,这个值保存着从JSP页面得到的PageControl类型参数值。 doTag()方法通过获取JspWriter输出对象out,通过out把分页控制显示在JSP页面中。 2.编写PageTag标签的描述文件PageTag.tld xmlversion="1.0"encoding="UTF-8"? > xsi="http: //www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation="web-jsptaglibrary_2_0.xsd"version="2.0"> PageTag.tld文件定义了名为PageTag的标签库,在这个库中定义了一个名为PageTag的标签,该标签有一个名为pagectl的属性。 3.在web.xml文件中部署PageTag标签库 如果在WEB应用中用到Multiply标签时,与ifTag标签部署一样,需要在web.xml文件中添加 4.在JSP文件中引用该标签 在JSP文件中需要使用<%@taglib%>指令来声明对标签库的引用,例如: <%@tagliburi="MultiplySimpleTag"prefix="mytag"%> Multiplypagectl="<%=pagectl%>"/> 9.2销售业务员子系统分析与设计 从业务流程来看,销售业务员子系统是控制订单的枢纽,具有承上启下的作用。 下面将分析销售业务员子系统的各项功能,然后设计相应的类体系结构。 9.2.1销售业务员子系统用例模型 销售业务员子系统的主要功能是管理订单,它能够对订单进行接收、分配和发货,提供对订单状态和历史订单的查询,及个人销售业绩的统计,使系统销售合理运行。 1.用例图 销售业务员子系统的主要使用者是销售业务员,主要用例包括接收订单、分配订单、发货、查询当前订单、查询历史订单。 图7-3中给出了销售经理子系统的用例视图。 图9-3销售业务员子系统用例图 2.用例描述 上述用例图从总体上描述了销售业务员子系统应该具备的功能,下面详细描述用例图中的各个用例。 (1)接收订单用例 接收订单用例用来决定订单是否可以接收,即把订单的状态由1演变为2,其操作步骤如图9-4所示。 当销售业务员在主页中选择了“接收订单”菜单项后,系统将检索处于等未接收订单并以列表形式显示出来,同时,在每一个查询出来的订单信息后面提供订单内容连接,如果销售业务员点击订单内容连接,系统将进入此订单所包含的订单条目信息页面(包括客户信息),订单条目信息页面为销售业务员提供了3种操作,一种是检查当前订单中的商品在库存中是否有货,第2种是接收订单,第3种是删除此订单。 如果销售业务员选择接收订单操作,系统首先判断此订单是否已经被接收、此订单的客户信息及状态时候有效,如果判断结果正常,则系统根据订单中商品的订购情况修改商品表,订单表和客户表中相关的数据,最后将接收结果显示出来。 图9-4接收订单活动图 (2)分配订单用例 分配订单用例用来决定订单是否可以分配,即把订单的状态由2演变为3,其操作步骤与接收订单相似。 当销售业务员在主页中选择了“分配订单”菜单项后,系统将检索处于等未分配订单并以列表形式显示出来,同时,在每一个查询出来的订单信息后面提供订单内容连接,如果销售业务员点击订单内容连接,系统将进入此订单所包含的订单条目信息页面(包括客户信息),订单条目信息页面为销售业务员提供了2种操作,一种是检查当前订单中的商品在库存中是否有货,第2种是分配订单。 如果销售业务员选择分配订单操作,系统首先判断此订单是否已经被分配、此订单的客户信息及状态时候有效,如果判断结果正常,则系统根据订单中商品的订购情况修改商品表,订单条目表和订单表中相关的数据,最后将分配结果显示出来。 (3)发货用例 发货订单用例用来决定订单是否可以发货,即把订单的状态由4演变为5,其操作步骤与接收订单相似。 当销售业务员在主页中选择了“发货”菜单项后,系统将检索处于等未发货订单并以列表形式显示出来,同时,在每一个查询出来的订单信息后面提供订单内容连接,如果销售业务员点击订单内容连接,系统将进入此订单所包含的订单条目信息页面(包括客户信息),订单条目信息页面为销售业务员提供了2种操作,一种是发货,第2种是返回订单列表。 如果销售业务员选择发货操作,系统首先判断此订单是否已经被发货、此订单的客户信息及状态时候有效,如果判断结果正常,则系统根据订单中商品的订购情况修改客户表和订单表中相关的数据,最后将发货执行的结果显示出来。 (4)查询历史订单用例和查询当前订单用例 查询历史订单和查询订单状态用例可以根据销售业务员登录ID号查询订单状态分别为>=5或<=4的订单信息。 当客户在主页中选择了“查询历史订单”或“查询订单状态”菜单项后,系统提示输入查询的时间范围。 当客户输入并提交了查询时间范围后,系统将查询该时间段内符合条件的订单信息,然后以列表形式显示出来。 9.2.2销售业务员子系统类体系结构 销售业务子系统的核心是由类构成的,类与类之间是有关系的,根据类之间的关系可以将系统中的类组织成一个完整的体系结构。 1.类图 根据客户订购子系统中类的体系结构,进一步细化图中的控制类、实体类和业务逻辑类,可以得到图8-5所示的客户订购子系统类图(图中省略了与登录有关的类)。 下面介绍图8-5中类的主要作用。 图9-5销售业务员子系统类图 (1)在图9-5中,SalesOrder、Vw_salesitems、Product和SalesItems
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第9章 销售业务员子系统 销售 业务员 子系统