Struts例子的设计分析
原作者:Ted Husted 翻译:hatpdb
声明:这是一个演示如何建立一个struts应用程序的框架例子。这种规范与细节的实现来源于一个一个的工程。可能与你所从事的项目框架非常不同,但是也许有些共通之处。为了写更多的项目与软件,看一个例子也许理解这个标题,包括在Tom DeMarco的《结构分析与系统描述》(ISBN 0138543801),Steve McConnell的《实现代码》(ISBN 1556154844)。
Example Application - Sample 描述
问题定义
解决方案
需求分析
核心任务
其他要求
屏幕流例子
欢迎页
注册页
登陆页
菜单项
帐号
帐号描述
退出页
产品选择
应用程序接口
--------------------------------------------------------------------------------
1.0 问题定义
许多人们有许多邮件服务器上的邮件帐号,但是有些人不能够很好的治理这些多个帐号。私人和公众邮件服务器的登陆入口通常只是答应自己的用户能够登陆。
--------------------------------------------------------------------------------
2.0 解决方案
这些问题可以通过网站的登陆程序来解决。这个程序能够答应用户通过网络注册一系列的任何网络邮件服务器的邮件帐号与帐号的描述信息,同时也能够重新察看他们。
--------------------------------------------------------------------------------
3. 0 需求分析
3.1 核心任务
用用户名与用户密码注册一个新帐号
通过浏览器登陆进入已经注册的帐号
添加一个邮件帐号描述
察看一个邮件帐号的描述
退出登陆
3.2 其他需求
授权邮件服务器可以可以创建多个帐号。
帐号信息页面不能显示给没有授权的用户。
为了达到有广泛的用户群,这个程序应该能够满足使用不同语言的用户。
我们应当能够修改浏览的页面而不用重新编译应用程序。
--------------------------------------------------------------------------------
4.0 视图流程
4.1欢迎页面
注册一个新帐号{ Register }
登陆已经注册的帐号{ Login }
4.2 注册
显示注册属性表单;选项:保存,重设,和取消。
表单域: Username, PassWord, Password (confirm), Full Name, From Address, Reply To Address.
保存: 验证表单属性; 返回对用户的建议或者是存储显示登陆成功后的菜单
验证: 密码与重复密码必须相符合; 邮件的来源与回复地址都必须符合邮件地址的书写规则(必须包含@符号),回复地址是可选项,其他的都不能够为空同时还要符合其他的验证规则,用户名必须唯一。
假如注册成功: { Menu }
假如注册失败: { Register }
重置: 恢复编辑的内容
取消: 跳转到到 { Login. }
4.3 登陆
对登陆的用户显示表单信息,并且可以选择“保存”或者“重置”等的操作。
表单: 用户名(Username), 用户密码(Password)。
保存: 验证登陆信息,二者都是必须的,同时必须与注册时的信息相同(大小写敏感)。
取消: 取消编辑
4.4 主菜单
添加/编辑(Add/Edit)帐号描述 { Account }.
退出 { Welcome }.
4.5 帐号
显示表单编辑用户注册信息 (看 Register 视图)。
列表显示帐号的描述信息;可选项“编辑”或者“删除”帐号的描述信息 { Subscription }.
列表必须包含主机名字与其他属性(假如有多余的空间)
选择“添加”(Add)新的帐号描述信息{ Subscription }.
4.6 帐号描述信息 - 添加(Add),编辑(Edit),删除(Delete)
显示帐号描述属性的表单;可选项操作“添加”,“编辑”,“删除”(Add, Edit, Delete)。
可选项“添加”(Add),“编辑”(Edit) 执行任务:保存,重置,取消(Save, Reset, Cancel)。
可选项“删除”(Delete) 执行任务:“确认”,“取消”( Confirm, Cancel)。
表单域: 邮件主机(Mail Server), 用户名(Mail Username), 密码(Mail Password), 邮件服务器类型(Mail Server Type).
保存: 验证帐号描述属性;返回对用户的建议或者显示已经更新的帐号。
验证表单域:自动连接也许返回为空(false),所有其他的属性必须为非空。
假如保存成功:{ Account }。
假如保存失败:{ Subscription }。
重置:取消编辑。
取消:返回 { Account } 视图。
确认(删除):确认删除记录;显示更新的信息{ Account. }。
4.7 退出
让用户的登陆信息失效;返回到欢迎页面。
--------------------------------------------------------------------------------
5. 0 产品选择
我们选择Java的Struts框架来实现这个项目。
它的设计被描述为编写轻易,可扩展的Web应用程序;
由于采用MVC模式,使应用程序轻易维护;
采用jsp来实现显示部分,所有的修改操作都不需要重新编译程序;
支持用户通过Web程序自定义操作;
支持国际化应用程序。
--------------------------------------------------------------------------------
6.0 应用程序接口
6.1 属性
标签 组件 属性 类型 规则 域Domain
Username User username String !null unique
Password User password String !null
Full Name User fullname String !null
From Address
User fromAddress String !null *@*
Reply To Address
User replyToAddress String
- User subscriptions Hashtable
Mail Server
Subscription host String !null unique
Mail Username
Subscription username String !null
Mail Password Subscription password String !null
Mail Server Type Subscription type String "imap","pop3"
Password (repeat) registrationForm password2 String !null
--------------------------------------------------------------------------------
6. 3 表单组件(Form Beans)
<form-beans>
<!-- Logon form bean 登陆表单组件-->
<form-bean name="logonForm"
type="org.apache.struts.example.LogonForm"/>
<!-- Registration form bean 注册表单组件-->
<form-bean name="registrationForm"
type="org.apache.struts.example.RegistrationForm"/>
<!-- Subscription form bean 帐号描述组件-->
<form-bean name="subscriptionForm"
type="org.apache.struts.example.SubscriptionForm"/>
</form-beans>
--------------------------------------------------------------------------------
6.4 动作映射(Action Mappings)
6.4.1 核心执行任务映射例子
根据用户名与密码创建一个帐户
链接到“editRegistration.do?action=Create”
提交表单到“actoin=saveRegistration.do”
日志信息到帐户
打开“login.jsp” -- 输入信息文件为“login.do ”
提交输入表单从“action="logon.do" ”
添加邮件帐户的描述信息
链接到"/editSubscription.do?action=Create&user={user}"
username = Username
提交输入表单到"action="saveSubscription.do"
请参考linkUser 用户自定义标记.
编辑帐号描述信息
链接到"editSubscription.do?action=Edit&username={user}&host={host}"
username = Username
host = Mail Server
让改变与提交的到"saveSubscription.do"
用隐藏表单域:"action=Edit"
请参考linkSubscription 自定义标签。
删除帐号描述信息
链接到"editSubscription.do?action=Delete&username={user}&host={host}"
username = Username
host = Mail Server
让用户确认是否删除,假如删除提交到 action="saveSubscription.do"
用隐藏表单域:"action=Delete"
请参考linkSubscription 自定义标签。
退出
链接到"/logoff.do"
页面不许对没有授权的用户显示。
请参考 checkLogin 自定义标签。
--------------------------------------------------------------------------------
6.4.1 动作配置(Actual Configuration)
<action-mappings>
<!-- Process a user logon 处理用户登陆-->
<action path="/logon"
type="org.apache.struts.example.LogonAction"
name="logonForm"
scope="request"
input="/logon.jsp">
</action>
<!-- Edit user registration 编辑用户的注册信息-->
<action path="/editRegistration"
type="org.apache.struts.example.EditRegistrationAction"
name="registrationForm"
scope="request"
validate="false">
<forward name="sUCcess" path="/registration.jsp"/>
</action>
<!-- Save user registration 保存用户的注册信息-->
<action path="/saveRegistration"
type="org.apache.struts.example.SaveRegistrationAction"
name="registrationForm"
scope="request"
input="/registration.jsp"/>
<!-- Edit mail subscription 编辑邮件帐号描述-->
<action path="/editSubscription"
type="org.apache.struts.example.EditSubscriptionAction"
name="subscriptionForm"
scope="request"
validate="false">
<forward name="failure" path="/mainMenu.jsp"/>
<forward name="success" path="/subscription.jsp"/>
</action>
<!-- Save mail subscription 保存邮件帐号描述-->
<forward name="success" path="/editRegistration.do?action=Edit"/>
</action>
<!-- Process a user logoff 处理用户退出-->
<action path="/logoff"
type="org.apache.struts.example.LogoffAction">
<forward name="success" path="/index.jsp"/>
</action>
</action-mappings>
--------------------------------------------------------------------------------
6.3 自定义标签
6.3.1 应用程序标签
这个应用程序使用如下的自定义标签用“app”作为标示名:
App 标签- <%@ taglib uri="/WEB-INF/app.tld" prefix="app" %>
标签名称 描述
CheckLogin 检查是否有合法的用户登陆进入当前会话,假如没有用户的会话信息将会跳转到登陆页面。
LinkUser 产生URL编码对路径,包括用户选择的查询参数。
LinkSubscription 产生URL编码对路径,包括用户选择的查询参数。
--------------------------------------------------------------------------------
CheckLogin
属性名称 描述
没有属性
--------------------------------------------------------------------------------
LinkUser
属性名称 描述
page 包装用户信息到请求路径,例如:"/editSubscription.do?action=Create".
包装用户帐号信息到请求路径,例如:用户名为“user”:
<a href="/struts-example/editSubscription.do?action=Create&username=user">
--------------------------------------------------------------------------------
LinkSubscription
属性名称 描述
page 用户户的动作描述值,例如:"/editSubscription.do?action=Edit".
包装户户的动作描述值以及用户帐号信息到请求路径,例如:用户名为“user”和描述帐号为"mail.yahoo.com"":
<a href="/struts-example/editSubscription.do?action=Edit&username=user&host=mail.yahoo.com">
--------------------------------------------------------------------------------
6.3.2 Struts自定义标签
本应用程序使用以下Struts定义的标签库以及描述名:
Bean tags - <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
Html tags - <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
Logic tags - <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
--------------------------------------------------------------------------------
6.4 页面的缺省动作
页面 组件 动作
index.jsp None page="/editRegistration.do?action=Create"
page="/logon.jsp"
logon.jsp logonForm action="logon.do"
mainMenu.jsp user (session) page=/editRegistration.do?action=Edit"
page="/logoff.do"
registration.jsp user (session)
registrationForm action="saveRegistration.do"
page="/editSubscription.do?action=Delete"
page="/editSubscription.do?action=Edit"
page="/editSubscription.do?action=Create"
subscription.jsp user (session)
subscriptionForm action="saveSubscription.do"
--------------------------------------------------------------------------------
6.5 国际化
请参考< classes/org/apache/struts/example/ApplicationResource.properties >.
应用程序使用这个文件包含所有的错误描述,文字信息。
其他语言能够通过翻译这个文件来支持。
应用程序会自动选择这个属性文件来定位用户所使用的语言。
--------------------------------------------------------------------------------
Ted Husted 是一个自由软件者顾问于开发者培训,代码重构,和秘密的支持,要想获得更多的信息请访问网站 Husted dot Com 。
--------------------------------------------------------------------------------