struts源码讲解.doc_第1页
struts源码讲解.doc_第2页
struts源码讲解.doc_第3页
struts源码讲解.doc_第4页
struts源码讲解.doc_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

struts1是基于当前的一些相关标准的开发技术(servlet,xml)基础之上,提供了一个开发框架的开放源码项目。使用struts1的好处: 1.良好的架构和设计 2.可重用,模块化,扩展性好 3.Open source开源的 4.它提供了丰富的标签库,使页面能更加灵活的使用。 struts1的缺点: 1.它太过于依赖web容器,当配置文件改动一次就要重新启动。 2.它的配置文件太过于复杂。 3.ActionForm无法进行测试. 4.Action测试太过于依赖servlet api,所以在测试的时候要用到模拟对象. sturst1初始化 Struts1 = jsp + servlet + tag (MVC Model 2)Struts主要有三个核心的类,分别是ActionServlet,ModuleConfig,RequestProcessor。ActionServlet就是控制器,ModuleConfig封装着Struts应用程序的配置信息,RequestProcessor负责处理每一个HTTP请求。Struts的核心类就是org.apache.struts.action.ActionServlet,它继承于 javax.servlet.http.HttpServlet,当我们配置Struts时就要在web.xml文件中配置这个Servlet类。当 ActionServlet初始化时,就调用init()方法。1.启动 加载多个配置文件 ctrl+shift+T(jar) ctrl+shift+R(源文件resource) ctrl+O(快速查询方法) *init() initInternal()读取资源文件(国际化) 初始化Struts框架内在的消息资源,如与系统日志相关的日志、警告和错误消息。 MessageResources类的getMessageResources()方法 在getMessageResources()方法中,通过工厂类调配资源文件 initOther() 由于从form传输过来的都是String类型的值,所以我们要把它们转换成相应的类型。在这里我们可以学到几个技巧: 技巧一:判断是否是一个Array 类的方法 isArray() 技巧二:判断type是否是 List的一个父类或者父接口,或者与List为同一个类 要注意如果List是另一个 primitive的TYPE类,那么type必须也是这个类才会 返回true,否则都是 false。注意long.TYPE与Long.class是不同的 查找在web.xml中config参数和convertnull参数的配置 config默认配置路径为WEB-INF/struts-config.xml (struts1配置文件) initServlet() 这个方法主要是通过digester类解析web.xml,对String servletMapping 属性进行初始化。对于 digester说明如下:这是一个基于DOM的SAX实现的类,它是事件触发的,根据xml文件的结 构, 每次读到一个节点元素就会触发一个事件。 它可以直接把xml文件解析为一个java对象。 这是一个比较少见的方法。首先通过this.servletName = getServletConfig(). getServletName()获取servlet的名称,然后根据if (servletName.equals(this.servletName) this.servletMapping = urlPattern;来判断当前读到的servlet名称是否是我们运行的servlet的名称,如果是,就把url- pattern作为我们的servletMapping。 从web.xml中加载ActionServlet的初始化参数如servlet-name,加载DTD文件并把 其放入HashMap缓存,读取并解析web.xml的内容, 另外会将当前的ActionServlet放入到创建的Digester对象的栈中。 initChain() 读取web.xml中命令链文件初始值chainConfig 如果没有,则用默认的org/apache/struts/chain/chain-config.xml 将当前ActionServlet加入到上下文ServletContext()中 获取ModuleConfig实例,这个方法使用由initOther()方法获取的config值为要解析的xml路径,用来初始化 ModuleConfig。Struts中的MessageResource、PlugIn、数据源等, 都是通过ModuleConfig来实现的; 调用initModuleMessageResources(moduleConfig),用户资源文件的初始化; 调用initModulePlugIns(moduleConfig),用户插件的初始化; 调用initModuleFormBeans(moduleConfig); initModuleForwards(moduleConfig); initModuleExceptionConfigs(moduleConfig); initModuleActions(moduleConfig), 把struts配置文件中的其他配置存储到servletContext中; 调用moduleConfig.freeze(),固定组件配置; 通过while循环,解析以config/开头的其他struts配置文件,遍历web.xml中 servletConfig配置的initParameterNames,如发现以config/ 开始的parameter, 则根据此值初始化其它的ModuleConfig; 调用initModulePrefixes(this.getServletContext() 初始化其他模块并存储 到此,ActionServlet初始化工作就算完成 附:mons的通用组件 commons-digester 解析XML 是XML文件与对象之间的转化器 commons-chain 组织复杂流程的处理,是个责任链模式 一次请求的流程 1.以.do结尾的URL被ActionServlet拦截,执行service方法 2.根据请求传递的方法GET/POST选择执行doGet()或doPost()方法 3.在doGet()/doPost()方法中,调用process()方法 在struts1.8之前 是在process()方法中获得RequestProcessor的实例 5.RequestProcess的实例调用process()方法,处理请求 6.在RequestProcess类中,创建和验证Form都是在一个方法里面写的,由此我们可以看出它的耦合度非常高。 首先通过processMultipart()处理请求。 若传送方法为get,不做处理,直接返回到process()方法 若传送方法为post,做简单处理后返回process()方法 其次通过processPath()方法获取path 若path为null,返回上一层调用 path不为null,接着进行其它处理 包括对Locale,Content,NoCache,Preprocess,CachedMessages,Mapping, Roles,ActionForm,Populate,Validate,Forward,Include的处理。 然后创建Action实例,并执行Action返回ActionForward,最后处理 ActionForward。 正是由于耦合度非常高,所以就出现了责任链模式,用责任链模式来代替了RequestProcess类。这样的话 在处理的过程中,采用责任链模式分别由对应的Command类进行处理, 并随时可能由于异常等原因返回。在这里我学到了责任链模式对外扩展是开放,对内修改是封闭的。 7.一次请求到此结束,会根据ActionForward执行下一个流程 或 直接转往JSP生成 HTML发送到浏览器。通过源码我们可以看出struts1的好处和缺点。使用struts1的好处: 1.良好的架构和设计 2.可重用,模块化,扩展性好 3.Open source开源的 4.它提供了丰富的标签库,使页面能更加灵活的使用。 struts1的缺点: 1.它太过于依赖web容器,当配置文件改动一次就要重新启动。 2.它的配置文件太过于复杂。 3.ActionForm无法进行测试. 4.Action测试太过于依赖servlet api,所以在测试的时候要用到模拟对象. 它的一些常识: 1.它的默认配置名:struts-config.xml. 2.Action类中最重要的方法: execute(). 3.它的验证方式有两种:在服务器端验证(在FormBean里面重写Validate方法),在客户端验证(通过配置文件来进行验证)。 4.在服务器启动时会执行init()来进行初始化一些信息。 5.它的乱码问题可以通过过滤器来解决。 6.struts1所需要用到的jar包可能会和tomcat中的jsp-api.jar,servlet-api.jar包冲突,最好的解决方案是将这两个jar包放到 重新建的一个包中去,然后再引用这个包中的jar。 7.在使用validate框架时from类一定要继承ValidatorFrom这个类。 Struts Validator框架采用两个基于XML的配置文件来配置验证规则。 这两个文件为validator-rules.xml和validation.xml。 struts的标签库的标签主要分为几类: 1.html标签库 这个标签库的大部分标签和HTML中的标签一一对应的。 html标签库的目的是将jsp页面和Action通过ActionForm连接起来。 2.bean标签库 这个标签库主要用来向客户端输出文本信息(比如说国际化的一些信息等)。 3.logic标签库 为了避免在JSP页面中直接使用Java代码进行逻辑判断和循环操作. 4.nested标签库 这个标签库中的标签有来显示form或对象中的“nested”属性 5.tiles标签库:这个标签库的标签允许我们为视图层建立布局。 struts的自定义标签使用过程: 1.先写一个标签类这个类继承了SimpleTagSupport这个类,实现doTag()方法。 2.然后再写一个以.tld为后缀的标签库配置文件里面进行配置一些属性包括(标签类、URI等一些东西) 如果有属性里面还需要添加attribute这个属性。 3.在页面上通过导入标签库 使用的时候注意前缀和在.tld中配置的标签名及属性 struts1中DynaValidatorForm的使用 如果在Action类中使用它,可以这样子:DynaValidatorForm loginForm=(DynaValidatorForm)form; 客户端数据验证与服务端数据验证的区别:Struts中客户端验证跟服务器端验证有区别.客户端验证直接写一个action文件便可实现,而服务器端验证必须通过客户端程序去调用服务器端相应的 WebServices,实现业务逻辑.它们的本质区别是,就是客户端数据校验是在客户端上进行的,而服务器端校验是在服务器上进行的,在速

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论