第9章 销售业务员子系统Word下载.docx
《第9章 销售业务员子系统Word下载.docx》由会员分享,可在线阅读,更多相关《第9章 销售业务员子系统Word下载.docx(29页珍藏版)》请在冰豆网上搜索。
如果标签嵌套,标签处理器也要访问相应的标签。
下面是对各接口和类的描述:
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"
?
>
taglibxmlns="
xmlns:
xsi="
http:
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="
web-jsptaglibrary_2_0.xsd"
version="
2.0"
<
description>
IfTaglibraryforPageControl.<
/description>
<
tlib-version>
1.0<
/tlib-version>
short-name>
ifTag<
/short-name>
uri>
/ifTag<
/uri>
tag>
name>
ifout<
/name>
tag-class>
com.tag.IfTag<
/tag-class>
body-content>
jsp<
/body-content>
<
attribute>
value<
required>
true<
/required>
rtexprvalue>
/rtexprvalue>
/attribute>
/tag>
/taglib>
IfTag.tld文件定义了名为ifTag的标签库,在这个库中定义了一个名为ifout的标签,该标签有一个名为value的属性。
3.web.xml文件部署ifTag标签库
如果在WEB应用中用到ifTag标签时,需要在web.xml文件中添加<
taglib>
元素,代码如下:
jsp-config>
taglib-uri>
ifTag<
/taglib-uri>
taglib-location>
/WEB-INF/tlds/ifTag.tld<
/taglib-location>
/jsp-config>
4.JSP文件中引用该标签
在JSP文件中需要使用<
%@taglib%>
指令来声明对标签库的引用,分野显示控制类中存在flag标记,当flag为false时,表示查询的结果集中不存在数据;
当flag为true时,表示查询的结果集中存在数据。
因此通过ifTag标签可以判断是否显示分页数据。
flag为false时不显示,为true时显示。
具体代码片断例如:
%--引用标签--%>
%@tagliburi="
ifTag"
prefix="
mf"
%>
%--使用标签--%>
mf:
ifoutvalue="
%=pagectl.flag%>
"
每页<
%=pagectl.rowsPerPage%>
行
共<
%=pagectl.totalRow%>
当前<
%=pagectl.currentPage%>
页
%=pagectl.totalPage%>
/mf:
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:
PADDING-LEFT:
BORDER-LEFT-WIDTH:
BORDER-BOTTOM-WIDTH:
PADDING-BOTTOM:
0px;
cursor:
hand;
BORDER-right-WIDTH:
\"
;
//注意转移字符\"
intprev=pagectl.currentPage-1;
intnext=pagectl.currentPage+1;
out.println("
tdheight='
24'
align='
center'
第"
+pagectl.currentPage+"
/"
+pagectl.totalPage+"
页,"
inputtype=button"
+style+"
value='
[上一页]'
onClick=\"
javascript:
submitForm2('
prev'
'
+prev+"
'
)\"
+"
+style+"
[下一页]'
next'
+next+"
);
out.print("
&
nbsp;
转到第<
selectname=\"
topage\"
onChange=\"
goto'
+"
option>
----<
/option>
for(inti=1;
i<
=pagectl.totalPage;
i++){
out.print("
optionvalue=\"
+i+"
)>
}
/select>
页<
/td>
}
PageTag标签库扩展了SimpleTagSupport。
在PageTag中获取页面中分页显示的值对象pagectl,这个值保存着从JSP页面得到的PageControl类型参数值。
doTag()方法通过获取JspWriter输出对象out,通过out把分页控制显示在JSP页面中。
2.编写PageTag标签的描述文件PageTag.tld
UTF-8"
PageControlTaglib<
jsp-version>
2.0<
/jsp-version>
Pagelib<
/pageTag<
small-icon>
/small-icon>
PageControlSimpleTag<
PageTag<
com.tag.PageTag<
empty<
pagectl<
PageTag.tld文件定义了名为PageTag的标签库,在这个库中定义了一个名为PageTag的标签,该标签有一个名为pagectl的属性。
3.在web.xml文件中部署PageTag标签库
如果在WEB应用中用到Multiply标签时,与ifTag标签部署一样,需要在web.xml文件中添加<
PageTag<
/WEB-INF/tlds/PageTag.tld<
4.在JSP文件中引用该标签
指令来声明对标签库的引用,例如:
MultiplySimpleTag"
mytag"
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