《Struts核心组件及运行机制》由会员分享,可在线阅读,更多相关《Struts核心组件及运行机制(30页珍藏版)》请在金锄头文库上搜索。
1、02Struts核心组件及运行机制中科软培训部回顾l什么是MVC?lStruts是怎么去实现MVC的?lStruts基本组件有那些?l基本组件之间有什么关系?lStruts标签的运行机制是什么?lStruts标签库的分类;l什么时候用什么标签;重点l了解Struts的核心组件及运行机制l掌握如果扩展ActionServlet和RequestProcessorl了解DTO对象l掌握ActionForm的配置和使用;l掌握ActionForm与Action的邦定;l掌握ActionForm的数据验证;l掌握ActionForm的动态现实;Struts运行机制lStruts架构从本质上是MVC设计模
2、式的具体实现 l表示层一般使用视图组件实现、控制层使用控制器组件实现,而应用逻辑层则使用模型组件实现。作为表示层和应用逻辑层之间的中介,控制器处于视图及模型之间,起到了桥梁的沟通作用 l在Struts框架中对应着每一层一般都提供了相应的实现组件表示层表示层控制层控制层逻辑层逻辑层数据库数据库对应的实现组件l与控制器组件相关的类主要包括:与控制器组件相关的类主要包括:ActionServlet:Struts架构的中央控制器架构的中央控制器,用于接受浏览器客户端用户请求以及状态改变,并依据处理结果选择表示层不同视图的重定向。RequestProcessor:包含了Struts控制器在处理servl
3、et请求时所遵循的控制逻辑。Action:控制器的一部分,用于模型交互,执行状态改变或状态查询,以及告诉ActionServlet 下一个选择的视图。ActionForm:用于保存于表单数据相关的状态数据的改变。ActionMapping:用于控制在状态数据改变后的事件处理的方式。 ActionForward:用户指向或者视图选择。l与视图组件相关的工具主要包括与视图组件相关的工具主要包括Struts架构中提供的强大标记库,常用的架构中提供的强大标记库,常用的标记库功能如下所示:标记库功能如下所示:struts-html.tld标记库:扩展HTML Form的JSP标记struts- bean
4、.tld标记库:扩展扩展处理JavaBean的JSP标记struts-logic.tld标记库:扩展测试属性值的JSP标记l与模型组件相关的工具主要包括:与模型组件相关的工具主要包括:开发者提供的其他数据服务和API,例如:JavaBean等控制器组件lStruts 架构中控制器组件所承担的主要功能包括:接受浏览器客户端的处理请求根据用户的不同请求,调用对应的模型组件来执行相应的业务逻辑获取模型组件业务逻辑的处理结果根据当前的状态数据及业务逻辑的处理结果,选择合适的视图组件呈现在浏览器客户端。l在Struts框架中,整个控制工作是在一系列的相关组件的配合下共同完成的ActionServletl
5、在Struts架构中Controller组件的核心控制器组件是ActionServletl是类型的servletl所有客户端提交的用户请求都由它进行处理负责接收客户端请求后将之分发到相应的Action Bean处理,再根据处理的结果将不同的显示请求重定向到响应页面。实际上,ActionServlet完全是在幕后工作,它将其他组件绑定在一起。该类继承自javax.servlet.http.HttpServlet,有标准的生命周期中所用到的方法.另外在ActionServlet类添加了一个特殊的process方法.process()方法的作用是处理接收的请求并作出相应代码参见ActionServl
6、et.java 第1184行lActionServlet接收到Servlet容器的新的客户端请求后,它采取的具体的处理过程如下:根据请求的种类执行相应的doGet或doPost方法,然后在doGet和doPost中调用process方法Process方法首先会获得RequestProcessor类的对象,然后调用该类的process方法进行处理.实际上控制器所执行的控制逻辑就包含在RequestProcessor这个类中,而不是在ActionServlet中.ActionServlet处理业务的过程是借助RequestProcessor这个类的功能来实现的RequestProcessor类Re
7、questProcessor类l一个应该模块对应一个RequestProcessor类;lActionSerlvet接收请求后调用RquestProcessor类的process方法,并把request和response传给它;l根据配置文件创建ActionMapping对象lRquestProcessor类的process方法从struts-config.xml文件中根据请求URI查询匹配的子元素,然后根据子元素中的“name”属性在配置文件中查找匹配的子元素,确定下一步要用到的ActionForm Bean类lRquestProcessor类的process方法调用ActionForm B
8、ean类的setXXX方法,将表单中的数据填充到FormBean类的相应的属性中,然后根据子元素中的validatevalidate属性的值,判断是否调用FormBean类的validatevalidate方法校验表单的数据l查找匹配的子元素中的“type”属性寻找相应的可用的ActionBean类的对象,如果找不到就新创建一个l将FormBean类的对象,ActionMapping对象,request对象,reponse对象一起传给Action类的execute()方法lAction类的execute()方法执行完毕,返回一个表明相应页面的ActionForward对象. RequestPr
9、ocessor类根据ActionForward对象进行调整RequestProcessorRequestProcessor类的类的processprocess方法调用的方法列表方法调用的方法列表lprocessMultipart()预处理request的请求方式以及分析请求的contentType属性lprocessPath()得到请求的url,分析后选择合适的Action组件;lprocessLocale()得到请求的locale,适当时候存放到session中;lprocessContent()通过ControllerConfig对象的contentType属性设置字符编码;lproces
10、sNoCache()-通过ControllerConfig对象的nocache属性设置页面缓存机制;lprocessPreprocess()这是一个空方法,直接返回true,一般用来扩展用的;lprocessMapping()匹配用户请求的URL只否有相应的ActionMapping对象;lprocessRoles()判断用户是否配置了安全角色;lprocessActionForm()查找ActionMapping对象邦定的ActionForm,并实例化;lprocessPopulate()如果找到ActionForm就把request中的表单值填到actionForm;lProcessVal
11、idate()如果ActionMapping中validate属性为true.就调用表单的validate方法进行数据验证;lprocessForward()调用requestDispatcher的forward()方法进行页面跳转;lprocessInclude()-调用requestDispatcher的include()方法进行页面输出;lprocessActionCreate()创建一个action的实例存放到缓存中;lprocessActionPerform()调用action的execute()方法;lprecessActionForward()根据action的execute()
12、的返回值进行页面跳转;扩展RequestProcessor处理文字编码问题l我们可以去重写requestProcessor类的processPreprocess方法去处理编码;l并在struts-config.xml文件里面配置例:MyRequestProcesser类publicpublic classclass MyRequestProcessor extendsextends RequestProcessor protected protected booleanboolean processPreprocess(HttpServletRequest request, HttpServl
13、etResponse response) try try request.setCharacterEncoding(GBK); catchcatch (UnsupportedEncodingException e) e.printStackTrace(); return return supersuper.processPreprocess(request, response); DTO数据传输对象DTO:Data Transfer Object作用:用于model层和view层之间传递数据l减少数据的冗余,提高传输效率.l有助于实现各个层之间的独力性.Struts框架中的DTOActionF
14、orm Bean是Struts提供的DTO,用于视图层和控制层之间传递HTML表单数据;l在action中直接得到ActionForm Bean实体得到数据;ActionForm的生命周期接收控制器的请求从request或session范围中取出ActionForm对象,如果不存在就new一个调用ActonForm对象的reset方法将FormBean对象保存在scope指定的范围内将用户的表单数据封装在FormBean中如果中的validate属性为true,调用FormBean的validatte()方法如果校验失败,将请求转发给的input属性所指定的web组件,并将FormBean保存
15、在指定的范围中如果校验成功调用Action的execute方法并将FormBean传递给该方法将请求转发给action指定的web组件,并将FormBean保存在指定的范围中创建ActionForml创建一个与HTML中表单一一对应的JavaBean;lJavaBean继承类;l重写reset()方法;l重写validate()方法;Validate()方法当Struts的配置文件满足以下两个条件,Struts控制器就会调用ActionForm的validate()方法;1.为ActionForm配置了Action映射,即元素里面name和元素里面的name相匹配;2.元素的validate属
16、性为true;3.方法返回ActionErrors对象,如果该对象为空或不包含任何ActionMessage对象,那么就表示验证通过;反之把ActionErrors存到request中并返回input页面;表单数据验证l重写ActionForm的validate方法;l在validate方法里根据ActionForm中填充的属性值判断是否适合程序的要求;l返回一个ActionErrors对象;lActionErrors对象是一个MAP集合,存放的全都是ActionMessage对象;lActionMessage对象的错误提示配合Resource bundle文件使用;l如果ActionErro
17、rs集合里没有ActionMessage对象,则通过数据验证,执行Action的execute方法,否则返回ActionMapping对象用的input页面,并通过标签显示ActionMessage中的错误提示;例:ActionFormBean的validatepublic ActionErrors validate(ActionMapping mapping, HttpServletRequest request) ActionErrors errors = new ActionErrors();if(userName=null|userName.equals()errors.add(use
18、rName,new );if(userPwd=null|userPwd.equals()errors.add(userPwd,new );if(address=null|address.equals()errors.add(address,new );else if (address.length()4)errors.add(address,new ActionMessage(errors.tip.address.length,4);if(phone=null|phone.equals()errors.add(phone,new);else if(phone.length()!=11)erro
19、rs.add(phone,new );elsetry Double.parseDouble(phone); catch (NumberFormatException e) errors.add(phone,new );if(age90)errors.add(age,new ActionMessage(errors.tip.age.format,16,90);return errors;Reset()方法不管ActionForm存在于那个scope,实例化之后ActionForm就会调用reset方法;Reset()方法用于恢复ActionForm的默认值,例如把boolean设置成true或f
20、alse,把String设置为空;例:ActionFormBean的reset()public void reset(ActionMapping mapping, HttpServletRequest request) userName=null;userPwd=null;address=null;phone=null;age=0;配置ActionForm在struts配置文件的元素中配置ActionForm,如:Name:为实例化后的ActionForm取名;Type:ActionForm的类路径;访问ActionForml通过Struts HTML标签库访问;l从request或sessi
21、on范围内取出ActionForm实例;l在Action的execute()方法中直接访问;处理表单跨页l通过struts-config.xml配置多个action邦定一个ActionForm;lActionForm配置一个属性用于区分页面索引-page;lActionForm对象必须保存在session范围内;l根据条件重写reset和validate方法;动态ActionFormActionFrom和DynaActionForm的区别lActionForm对于大型的Struts应该必须以编程方式创建大量的ActionForm,如果HTML表单字段发生变化,就必须改源代码;lStruts1.
22、1 对此做出了改进,引入了动态ActionForm的概念,DynaActionForm类以及其子类实现了动态ActionForm,而必须主意的是DynaActionForm本身是ActionForm的子类;配置动态ActionForm动态ActionFormp完全支持在Struts-config.xml文件中完成ActionForm的全部配置;动态ActionForm标签:name指定ActionForm的实例名称;type指定;:name指定动态ActionForm Bean的成员属性名;type指定该属性的数据类型;initial指定初始化值,相当于reset操作;Type属性指定的JAV
23、A类型如果表单的字段值是java基本类型,在配置时应该用上面相应的封装类来代替例:动态ActionForm的配置动态ActionForm的访问Action和Struts HTML标签都可以访问动态ActionForm,如果是标准的ActionForm,在Action的execute方法中可以使用getter和setter方法操作,但是DynaActionForm把所有的数据都封装到一个MAP集合中,所有动态ActionForm提供的是一个用于访问所有属性的通用方法:public Object get(String name)public void set(String name,Object
24、value)l其实有人在想,动态的ActionForm怎么去实现数据验证?我们将结合下一个知识点,struts的验证框架一起来实现;例:在Actiom中访问动态ActionForm对象DynaActionForm daf = (DynaActionForm) form;String userName = (String) daf.get(userName);String userPwd = (String) daf.get(userPwd);总结:lActionForm在MVC中的位置;lActionForm的运行机制;lActionForm配置及使用;lActionForm的reset和validate方法;l动态ActionForm的配置和使用;