在本系列的的第一篇中我们大致浏览了Struts框架框架的功能以及框架中应用到的各个模块而本文我将利用Struts 为大家演示建立一个简单的应用在第三篇文章中将介绍如何利用Struts的标签在JSP中访问ApplicationResource文件中的信息
我们在这篇文章将会一步一步的讲解Struts的应用以这样的形式打开Struts一道道神秘的大门通过这样的过程相信也能激起你在应用开发中如何应用Struts的灵感如果你对Struts的一些术语不是很清楚的话可以参考本系列前一篇对Struts作大体介绍的文章
再次重复一遍本文需要读者有如下几方面的知识和经验JSPServlets自定义标签库(Custom Tag libraries)和XML此外在本文中我还会用到Jakarta项目组其他一些好东东比如Tomcat(实现Java Servlet和JSP官方标准的Servlet容器通俗的讲就是一个JSP的Web Server啦)和Ant(基于Java的自动编译发布工具这可是好东东啊)
作为一名一直使用前沿技术开发了诸多应用的技术人员我一直坚信掌握新技术理解该技术开发的逻辑是至关重要的但这往往就是陷住我们学习步伐的泥潭正因如此我打算将利用Struts开发的一套完整流程作为我们教学的案例该流程的这个案例可谓麻雀虽小五髒据全你完全可以将这个流程应用到你手头那些复杂庞大的项目中至少在我们的大项目中应用这个流程效果不错
有开发复杂商业应用的开发人员都知道客户的需求总是在不停变幻所以如果有一套规范的开发流程来遵循当客户提出新的需求时我们至少可以明确哪些无理需求其实是合理可行的好接下里我将在我的这个例子中向各位展示和应用整个流程
本文中的示例代码是StrutsSample应用中的一部分包括buildxml的完整代码可以到此处下载
Struts开发过程
从Struts发布的版本号可以看出Struts是个新玩意她有好几个部分组成明智的你如果搞清楚了何时该开发完成合适的部分那将会更好的利用我们的开发时间从我所开发的几个利用Struts应用中我大致总结出如下这个比较有效的开发步骤
明确应用需求
由用户输入和获取数据的角度出发明确和设计出每一个用户界面
确定用户界面的进入路径
由应用逻辑信息确定动作映射表(ActionMapping)
由设计完成的用户界面开发其所用到的类和应用函数
由用户界面中的数据信息开发ActionForm和相应的数据校验方法
ActionMapping中将会被调用相应的Action或转到相应的JSP页面这一步我们先开发这些Action
开发商业应用逻辑就是相应的JavaBeanEJB或其他东东
开发由ActionMapping定义的系统工作流程完成对应的JSP页面
完成系统配置文件strutsconfigxml和webxml
编译/测试/发布
明确应用需求
开发任何应用系统的第一步就是收集用户需求信息不管一个用户逻辑初看上去多么合理但总有可能在开发时才发现它比看上去要难得多所以建议拟一份明确的用户需求列表这不只是出于开发的目的还能通过该表分析用户需求以确定哪些地方可能需要花更多的精力
在我们这个StrutsSample项目中应用需求就是
作为一个展示Struts框架应用的完整例子本示例完成的功能是用户登录目的只为明确Struts的应用本示例将不会涉及到一般复杂应用系统中可能应用的安全数据库EJB开发等等相关技术
设计用户界面
这个应用中包括如下三个用户界面
)登录界面用于用户名和密码输入
)当登录用户为合法用户时的欢迎界面
)当登录失败时的错误提示界面
确定用户界面的进入路径
)登录界面作为这个应用的默认页面
)欢迎界面只有当成功登录后才能进入
)任何可能发生错误的页面能可以进入错误提示界面
由应用逻辑信息确定ActionMapping
ActionMapping为整个应用确定的线路图在配置文件strutsconfigxml对ActionMapping进行定义通过转发请求(forward)来理顺应用的处理流程确定应用中每个用户请求对应的动作
通常我们在开发过程中就逐步确定了ActionMapping所需的信息开发代码的过程就是在由草稿开始一步步完善strutsconfigxml的过程当Action类处理完用户请求后其返回的的forward就是在ActionMapping中定义的一个一个Action返回的forward完全有多种可能尽管一个Action一般只定义其相关的几个forward那么如果有多个Action都可能返回的同一个forward那么就可以将其定义为全局转发(global forward)这类似于C中的头文件中全局变量如果在strutsconfigxml描述信息中某一个forward并不是在当前Action描述中定义的而是全局定义的那么这个全局的将起作用同样一个Action中当前定义的forward将覆盖全局定义在我们所给的这个简单实例中我们定义了全局forward――error当某Action返回的forward是error这个映射那么Errorpagejsp页面将会显示给用户尽管当前Action并没有对其定义
我们继续不断的开发项目日渐完善项目相关的配置文件也会越来越详细在下面的例子中我们将以StrutsSample中用到的strutsconfugxml文件为例学习global forward和一个Action中相关映射的定义下面定义了一个名为login的Action其为comoreillyactionsLoginAction的实例当Action处理用户登录成功后将一个名为success的forward返回用户也就会看到Welcomejsp页面如果登录失败Action将返回对应的forward以再显示Loginjsp给用户而如果处理过程中发生其他错误Action将返回全局定义的forward――error用户也就会看到错误提示页面Errorpagejsp
type=comoreillyactionsLoginAction
name=loginForm
scope=request
input=/Loginjsp>
success path=/Welcomejsp/>failure path=/Loginjsp/>mappings>
在前一篇文章中我们曾说过strutsconfigxml就是MVC模式的的Controller在确定strutsconfigxml中的配置信息时应该多花些时间精力在上面以保证每一个Action定义及其相关定义是符合应用的需求的如果在项目开始没有详细的设计其定义当将所有代码和配置集成到一起的时候我们将不可避免的将各部分的代码和配置完全重新组织一遍
我们当前的例子StrusSample因为只是处理用户登录所以只需要一个Action一个应用系统中所要用到的Action的多少完全依应用的大小而定一旦整套Action的映射完全的定义出来后我们就可以一个一个开发其具体实现的Action和ActionForm类并逐渐将完成的部分一点一点集成起来
由设计完成的用户界面开发其所用到的类和应用函数
所有ActionForm的实现类都是orgapachestrutsActionForm的子类一个ActionForm是与页面上的输入表单相关联的而且ActionForm的实现还可以对用户输入数据的合法性进行验证作为一个Java BeanActionForm有Set和Get方法当一个页面中表单被提交时系统将自动调用Set方法将数据放入ActionForm中而Get方法将为在Action中操作这些数据所提供一般来说处理表单中的所有数据并进行合法性验证都完全可以交由ActionForm来完成在应用中就我个人而言倾向于将ActionForm和Action划分到不同的包中因为当一个页面中要用到几对ActionFrom和Action时都放在一个包内会混淆的下面的代码就是实例中登录页面用到的ActionForm的代码
<