今天主要是研究一个基本的Struts应用,helloapp的例子,这个应用基本的东东就是:接受用户输入的姓名,然后输出Hello+姓名,开发应用涉及以下的步骤:
1) 分析应用需求.
2) 把基于MVC设计模式的Struts框架运用到应用中.
3) 创建视图组件,包括HTML表单(hello.jsp)和ActionForm(HelloForm.java).
4) 创建application,properties本地资源文件.
5) 数据验证,包括表单验证和业务逻辑验证.
6) 创建控制器组件,HelloAction.java.
7) 创建包含被各个模块共享的常量数据的JAVA文件,Constants.java.
8) 创建配置文件.Web.xml和struts-config.xml.
9) 编译,发布和运行helloapp应用.
在开发应用时,首先从分析需求入手,列举该应用的具体功能,以及限制条件.这个应用
具体需求:
1) 接受用户输入的姓名,然后返回Hello+姓名.
2) 如果用于没有输入姓名久提交表单,将返回出错信息,提示用户输入姓名.
3) 如果用户输入姓名为Monster将返回出错信息.拒绝访问.
4) 为了演示模块组件的功能,应用使用模型组件来保存用户输入的姓名.
Struts框架的应用的各个模块构成主要有:
1) 模型包括一个JavaBean它有一个username属性,代表用户输入的名字,提供了get/set方法.还有一个save方法负责把属性保存到持久化存储系统中.
2) 视图包括一个JSP文件hello.jsp它提供用户界面,接受用户输入的姓名,视图还包括一个ActionForm,保存数据,并且进行验证.
3) 控制器包括一个Action类HelloAction,它完成三个任务,一是进行业务逻辑验证,二是调用模型组件的save方法保存输入的姓名,三是决定将合适的视图组件返回给用户.除了创建模型,视图和控制器组件,还需要创建Struts的struts-config.xml文件它可以把这些组件组装起来,使它们协调工作.此外还需要创建一个整个Web应用的配置文件web.xml.好了前面的一些理解的话题说到这里,我感觉原理我已经懂了.下面言归正传开始研究整个Web应用的创建,我逐步来研究.
创建视图组件:视图组件主要包括一个JSP文件和一个ActionForm,首先创建一个JSP文件提供用户界面,能够接受用户输入的姓名,此外本应用所有的输出结果也都是用这个hello.jsp显示给用户.hello.jsp中使用来自Struts的标签库.至于引入标签库我就不多说了感觉没什么难度在以前学JSP的时候已经完全理解了.<html:errors>用于显示Struts框架中其他组件产生的错误信息.<html:form>用于创建HTML表单.它能够把表单的字段和ActionForm的属性关联起来.<html:text>该标签是<html:form>的子标签,用于创建HTML表单的文本框.<bean:message>用于输入本地化的文本内容,它的key属性指定消息key,与消息key匹配的文本内容来自于专门的本地资源文本文件.<bean:write>用于输入Bean的属性.name指定bean的名字,property指定要输出的属性.<logic:present>用于判断Bean在特定的范围内是否存在,只有存在才会执行标签主体中的内容.用name指定要判断的Bean然后用scope来指定范围.JSP创建完成了下面创建本地资源文件,使用<bean:message>标签输出内容.这个文件就是一个application.properties文件,就是一个类似hashtalbe一个key一个value.就是消息key/消息文本的格式.用<bean:message key=”key”>使用.下面说说创建ActionForm,当用户提交了HTML表单后,Struts框架将自动把表单数据组装到ActionForm中,ActionForm和HTML表单的字段一一对应,validate()方法用于表单验证,reset()方法用于把属性重新设置为默认值.数据验证几乎所有的用户交互的数据都需要验证,Struts的数据验证是现成的,主要分两种类型表单验证和逻辑验证.当用户提交了HTML表单后,Strust自动把数据组装到ActionForm,接下来自动调用validate方法进行验证.如果validate方法返回ActionErrors对象为null,或者不包括任何ActionMessage对象,就表示没错误数据验证通过.如果有就把ActionErrors对象保存在request范围内的ActionErrors对象中包含的错误信息显示出来,提示用户修改错误.
创建控制器组件:控制器组件包括ActionServlet和Action类,ActionServlet类是Struts自带的,它是整个框架的控制灵魂,通常不需要扩展,Struts提供了可扩展的Action,使用来处理特定的HTTP请求的.Action类的工作机制是所有的Action都是org.apache. struts.action.Action的子类.Action子类应该覆盖父类的execute()方法.四个参数分别是:ActionMapping包含了这个Action的配置信息,和struts-config.xml文件中的action元素对应.ActionForm包含了用户的表单数据,当Struts框架调用execute()方法的时候ActionForm中的数据已经通过了表单验证.还有请求和应答对象参数.Action类的execute方法返回一个ActionForward对象,它包含了请求转发路径信息.至于访问本地化文本在Aciont类中首先通过execute()方法获得MessageResources对象.通过getResources方法参数是一个request.该方法返回当前默认的MessageResources对象,它封装了Resource Bundle的文本内容.可以这样获取属性对象Struts tltie=message.getMessage(“key”).业务逻辑验证主要是用Action的execute()方法如果用户输入的姓名是Monster,将创建包含错误信息的ActionMessage对象,然后调用Action基类定义的saveErrors()方法,它负责把ActionMessage对象保存在request范围内.最后返回ActionForward对象,Struts会根据ActionForward对象包含的转发信息把请求转发给适当的视图组件,视图组件通过标签<html:errors>标签把request范围内的ActionMessages对象中包含错误信息显示出来.提示用户修改错误.一个ActionMessages对象包含多个ActionMessage对象,ActionErrors继承于ActionMessages,ActionError继承于ActionMessage对象.接下来说说访问模型组件的方法.HelloAction类创建了一个模型组件PresonBean对象,并且调用它的saveToPrsistent
Store()方法来保存userName属性.把属性保存到本地资源文本文件中!保存之后就要向视图组件传递数据了Action类把数据保存在request或者session范围内,以便向视图组件传递信息request.setAttribute(Constants.PERSON_KEY,pd)把PersonBean对象保存到一个request对象范围内.request.removeAttribute(mapping,getAttribute())从request范围内删除ActionForm,由于后续的请求转发目标组件不再需要HelloForm,所以可以删除.最后通过Action类把流程转发给合适的视图组件.return (mapping.findForward(“Action映射配置名称”));好了控制器的创建已经搞定了.
创建模型组件:本例的模型是一个PersonBean是一个非常简单的JavaBean,它包括一个userName属性,以及相关的get/set方法.还有一个业务方法saveToPresistentStore().本例中并没有真正实现这个方法,在实际应用中这个方法可以把JavaBean属性保存在持久化存储系统中,如数据库或文件系统.
创建存放常量的JAVA文件:HelloAction按照request.setAttirbute(类名.常量,对象)的方法设置request共享的值,把一些常量定义在.java文件种可以提高Action类的独立性.当属性key常量的值发生改变的时候,只需要修改.java文件,不需要该Action.
创建配置文件:对于Struts应用它的配置文件web.xml应该对ActionServlet类进行配置,此外,还应该生命Web应用所使用的Struts标签库.感觉没什么就是配置标签库和配置action映射ActionServlet地址.配置confgi映射struts-config.xml地址.在加上一个servlet-mapping的*.do请求转给action就OK了!然后重点研究的是创建Struts框架配置文件.Struts框架允许把应用划分多个组件,提高开发速度.而Struts框架的配置文件可以把这些组件组装起来,决定如何使用它们.<form-bean>元素配置一个ActionForm,name属性是名称,type是它对应的类.<action>元素是path属性指定请求访问的Action路径,type属性指定Action的完整类名,name属性指定需要传递给Action的ActionForm.scope指定ActionForm的存放范围,validate属性指定是否执行表单验证也就是是否实行ActionForm中的validate()方法.input属性指定当表单验证失败的时候转发的路径.<cation>元素还包含一个子元素<forward>它定义了一个请求转发的路径也就是Action处理结果要转发给的路径在这里设置.Action的execute方法返回值是一个ActionForward方法这个方法返回的参数是一个<forward>元素映射的JSP文件.<message-resources>元素定义了一个本地资源文本文件.parameter属性指定一个properties文件.记住路径不用加扩展名.
发布和运行helloapp应用:这个简单就是在Tomcat中发布和一般的Web应用类似,记住把Struts包和tld标签库包都copy进去就OK了.有一个重点的东东就是可以把一个Web工程打包成一个war包文件,在DOS下转到helloapp的根目录输入jar cvf helloapp.war *.*即可,这样也是一样可以发布的.
服务器端装载hello.jsp的流程:
1)<bean:message>标签从本地资源文件中读取文本输出到网页上.
2)<html:form>标签在request范围中查找HelloForm,如果存在这样的实例就把HelloForm对象中的userName属性复制给HTML表单的userName文本框,由于此时还不存在HelloForm对象,所以忽略这项操作.
3)把hello.jsp视图呈现给客户.
表单验证流程:
1) Servlet容器在web.xml中寻找<url-pattern>属性为” *.do “的<servlet-mapping>元素.
2) 根据以上<servlet-mapping>元素的<servlet-name>属性,也就是action在web.xml文件中寻找到匹配的<servlet>元素.
3) 把请求转发给以上<servlet>元素指定的ActionServlet,ActionServlet依据用户的请求路径,在Struts配置文件中检查path属性一样的元素没有.do.
4) ActionServlet根据<action>元素的name属性创建一个ActionForm对象,把客户端的提交的数据传给它,在把ActionForm保存在<action>元素的scope属性设置的范围内.
5) <cation>元素的validate设置为true所以调用ActionForm的validate()方法验证表单.
6) validate()方法返回一个ActionErrors对象里面包含一个ActionMessage对象,这个ActionMessage封装了错误信息.
7) ActionServlet把ActionForm的validate()方法返回的ActionErrors对象保存在request范围内,然后根据<cation>的input属性把对象发送给相应的JSP.
8) hello.jsp的<html:errors>标签从request范围内读取ActionErrors对象,在从ActionErrors对象中读取ActionMessage对象,把包含的错误信息显示在网页上.
以上是我根据自己的理解阐述了这个简单的应用,至于具体的应用因为本Blog没提供下载空间所以不能发布上来.希望通过上面的阐述能让大家对一个Struts应用有一个初步的了解,如果不懂也没关系,接下来的几天我会继续深入的把Struts的具体的组件介绍出来,如果感觉我写的来烂别给我丢鸡蛋哦HOHO! (网友们的支持,是我继续写技术文章的动力!)
posted on 2005-10-22 15:02
我心依旧 阅读(2184)
评论(4) 编辑 收藏