ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
上篇我们以[登录为例](http://blog.csdn.net/lovesummerforever/article/details/17348871)讲解了struts配置,实现了使用struts框架进行登录的示例。一些名词已经在脑海中飘荡了。 **ActionServlet**:struts的控制器,负责截取URL或分发。提供Model(模型层)和View(视图层)使用,因此可将它看作是模型和视图之间的中介。 **ActionForm**:用于封装用户的请求参数,而请求参数是通过JSP页面的表单域传递过来的。 **Action**:用户请求和和业务逻辑的桥梁,每个Action作为业务逻辑的代理,可以调用业务逻辑。 一些问题是有必要再次提起的。 **使用基本的MVC和使用struts框架区别,使用struts好处在哪里?** 我们知道我们不适用框架的时候,在MVC中典型的控制器是servlet,servlet可以获取参数和逻辑模型的调用和转向功能。而struts对它做了封装,为什么要进行封装?当我们请求到一个servlet,我们在这个servlet中取得参数、调用业务逻辑、转向,我们在servlet中写死了转向页面,当我们想要换一个转向页面的时候就需要改动代码了,改动代码后还要重新进行编译。 而且从表单中传递过来的数据全是字符串形式,我们还需要根据实际的需求把字符串转换为我们需要的类型,如果很多地方需要转换,并且每次使用每次都要进行转换,有没有一种机制,把表单中的字符串拿过来自动转换为相应的类型呢?不需要我们再进行手动转换呢? 基于上述的不便,转向不灵活,表单中的字符串每次都要进行转换等一系列的原因,struts把这些做了封装。提取出重复的操作,转向信息放到了配置文件中,这样更加灵活了。 在上述问题中,阐述了struts对表单的封装,在web应用程序开发过程中,开发人员需要大量的时间来处理表单问题,有的时候是通过表单提交一些新的问题,有的是通过表单修改数据,所有这些表单在处的处理在传统web开发中是非常复杂的。本篇重点说说struts中的表单处理器ActionForm。 **ActionForm** **问题的提出** 在传统的web应用程序开发中,繁杂的表单处理给开发工作人员带来了巨大的困难,在传统的开发语言中,没有组建可以自动收集用户输入的表单内容,开发人员不得不在程序中手动提取表单的值。例如在表单中有这样的一个文本输入域:<inputtype=”text” name=”password”> 要在程序中取得这个文本输入域的值,只能用这样的方法:request.getParameter(“password”);这样的处理方法在表单比较小的时候是可以使用的,但是当表单输入项较多的时候就不得不大量重复类似上面的处理。 **问题的解决** 在Struts中就是使用ActionForm来解决这个问题,对于每一个用户的表单,需要提供一个ActionForm,这个ActionForm自动把客户提交的表单保存在这个ActionForm中,然后把这个ActionForm传递给Action,从而在Action中可以通过这个ActionForm取出用户信息,然后根据这些信息完成对应的业务逻辑处理。 例如在Struts中用struts的html标签表述成下述形式: <html:text property=”password”/> 在这种情况下表单提交后,struts框架会自动把表单中的这个输入项赋值到ActionForm中的password属性中,从而把表单中的内容保存在ActionForm中,整个过程由struts自动完成,不需要开发人员干涉。我们在创建ActionForm时要遵循以下规范: (1)每个ActionForm都要继承org.apache.struts.action.ActionForm类,而且需要为每一个表单提供一个ActionForm。 (2)ActionForm中每个属性要与表单中的输入项一一对应。 (3)AcitonForm每个属性都要提供的getter方法和setter方法。Struts框架就是通过这些方法来保存表单的值,然后在Action中通过这些方法取得表单的值。 (4)如果表单需要验证,就需要在ActionForm中提供validate方法,这个方法中提供对表单的具体验证逻辑。这个方法不仅实现了数据验证同时实现了数据缓冲的作用,在validate方法中验证用户提交表单的有效性,当表单验证失败时会自动返回用户输入页面,这时候用户输入的值都保存在ActionForm中,返回页面时struts框架会取出AcitonForm中的数据并输出到对应的用户输入项中,保证了用户开始输入的表单信息。 **问题的提出** 以上所说的是静态ActionForm,当我们为每个表单都创建一个AcitonForm的时候,会导致ActionForm数量过多。每个ActionForm过强的聚合性也会使代码难以维护和重用。怎么样不用去创建过多的ActionForm?而且当提交表单的属性名字相同时,不用再重复创建AcitonForm(例如登录和注册)? **问题的解决** Struts中可以使用动态ActionForm来解决上述问题。动态ActionForm不需要创建自己的ActionForm,需要在创建自己Action的时候直接把execute方法中传递过来的form对象转化为DynaActionForm。 我们需要更改struts-config.xml中form-beans配置: ~~~ <form-beans> <form-bean name="dynaForm" type="org.apache.struts.action.DynaActionForm"> <form-property name="username" type="java.lang.String" /> <form-property name="age" type="java.lang.Integer"/> </form-bean> </form-beans> ~~~ Action中使用get方法取得表单中的值。 ~~~ /** * 测试动态ActionForm. * @author summer * */ public classDynaActionFormTestAction extends Action { @Override publicActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequestrequest, HttpServletResponse response) throwsException { DynaActionFormdaf = (DynaActionForm)form; //取出map中key值为name,value为类名. Stringusername = (String)daf.get("username"); Integerage = (Integer)daf.get("age"); System.out.println("username"+username); System.out.println("username"+age); returnmapping.findForward("success"); } } ~~~ 静态ActionForm方式,使用get/set方法,而动态ActionForm方式,使用map的getkey方式,其中key就是标签name的值。 使用动态ActionForm优点:若更改表单和ActionForm时不需要重新编译,而静态的需要更改静态的ActionForm.java文件,必须重新编译。缺点:静态返回的是对应的值,动态ActionForm返回的是对象,我们还要把这个对象进行强制转换。 下一篇[MVC向struts MVC框架演变过程](http://blog.csdn.net/lovesummerforever/article/details/18963959)