`
wangjinshan1314
  • 浏览: 8331 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

struts1.x PK struts2

阅读更多
Struts1.x与struts2总结

合格的程序员是必须有思想,有着灵魂的构架人才


Strus1:

   一:在struts1.x中提供了如下的服务
       A:作为控制器层的servlet,提供了大量的标签库
       B:提供了国际化的验证框架
       C::提供了jdbc的实现,来定义数据源与数据库的链接!
       D:xml语法分析工具,文件下载服务,注册机制
   二:在谈strut1.x之前,我们先谈谈mvc的设计模式:


                       
       1:视图是呈现给用户并与用户交互的界面
       2:模型:模型是应用程序的主题部分
       3:控制器:控制器接受用户的输入并调用模型与视图来完成用户的请求

   三:struts1.x框架的控制器组件主要包括:
        1:ActionServlet:充当struts1.x框架的中央处理器

<servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>3</param-value>
    </init-param>
    <init-param>
      <param-name>detail</param-name>
      <param-value>3</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>


        2:requestProcessor:充当每个应用模块的请求处理器
        3:aciton:负责处理某一项具体的业务

   四:ActionServlet类和其初始化过程
           Org.apache.struts.action.ActionServlet类是struts1.x框架的核心控制器组件,所有的请求都是actinServet来处理,然后actionServlet把请求转发给其他组件。在应用的生命周期中,只允许创建一个ActionServlet实例(属于单实例的),但是一个actionServelt可以同时相应多个用户的请求
          ActionServlet的init()方法
        initInternat(){初始化struts1.x框架的内在消息资源}>>>>>>>initOther(){从web.xml中加载actionServlet的初始化参数}>>>>>>initServlet(){从web.xml中加载actionServlet的URL映射信息。同时注册web.xml和strts配置文件所有使用的dtd文件}>>>>>>>initModuleConfig(){加载struts的配置文件}>>>>>>initModuleMessageResources(){加载并初始化默认的子应用模块的消息资源,并创建MessAgeResource对象}>>>>>>initModuleDataSources(){加载并初始化默认的子应用模块的数据源}>>>>initModulePlugIns(){加载并初始化默认的应用模块的所有插件}
        actionservlet的process()方法
       在用户请求后,服务器会根据用户的get或者post请求调用相应的doget或者doPost()方法:但是都会在里面调用ActionServlet类中的process()方法>>>>>
在process()方法中,第一步org.apche.struts.util.moduleUtils类的selectModule()方法来防止选择请求的子应用模块,再把moduleConfig对象和messageReources对象存储在request范围中>>>>第二步:获得RequestProcessor类的实例调用process()方法!

     五:actionForward对象
        在Action类的execute()方法返回ActionForward对象两种方式
             1:在execut方法中创建一个Actionforward类的实例
Return new ActionFowrward(“success”,”success.jsp”,”true”);
        第一个参数是:逻辑名
        第二个参数是:转发地址
        第三个参数是:是否重定向
     2:在execute方法中使用ActionMapping实例的findForward()方法
    Return mapping.findForward(“success”);

六:在strut1.x中处理编码的问题:
     1:在每个request中设置request.setCharacterEncoding(“utf-8”);
     2:可以重写子处理器RequestProcessor类中的processPreprocess()方法
        例如:在struts-config.xml中配置
          <contrller processClass=”com.shan.struts.action.MyRequestProcessor”/>
        写一个类来继承RequestProcessor类实现processPreprocess方法
   再设置request.setCharacterEncoding(“utf-8”);
    3:使用过滤器来设置。写过一类继承filter接口
       在web.xml中配置filter属性即可
七:令牌机制:(可以处理web应用中的重复提交问题)
   //this.saveToken();创建一个新的令牌
   //this.isTokenValid(request,true);检查令牌是否匹配,匹配返回true
   //this.resetToken(request)
  
八:UML语言,类之间存在四种关系
        A:关联(Association)
        B:依赖:(Dependency)
        C:累积(Aggregation)
        D:一般化(Generalization)
九:struts数据源的介绍:要使用struts的dbcp,需要两个jar:分别是:commons-pool.1.4.jar和commons-dbcp-1.2.jar
十:使用JNDI配置数据源
       //实例化上下文对象
         Context  initContext=new InitialContext();
          Context envcontext=(Context);
initContext.lookup(“java:/comp/env);
    ///通过JNDI查找数据源
  DataSource ds=(DataSource)ctx.lookup(“jdbc/InvertoryDB”);
//通过数据源获取链接
Connection con=ds.getConnection();
     十一:使用tomat服务器配置数据源
                1:修改comtext.xml配置文件
                2:修改web应用的web.xml配置文件
  
     十二:ActionForm中的方法:(validate()方法和reset方法)
     A:validate()方法:要执行该方法必须要满足两个条件:struts-config.xml配置文字中的actionForm配置了Action映射:即<form-bean>的元素name属性<action>元素的name属性匹配>>>>>><action>元素validate属性指定为true,默认情况下是false
2:reset方法 :是恢复actionForm的属性的默认值

十三:struts1.x{struts标签在我看来不是那么的好用,以此在此忽略掉了啊
十四:常用的action方法
           A:org.apache.struts.actions.forwardAction
           B: org.apache.struts.actions.IncludeAction
           C: org.apache.struts.actions.DispatchAction
           D: org.apache.struts.actions.lookupDispatchAction
           E: org.apache.struts.actions.mappingDispatchAction
           F: org.apache.struts.actions.SwitchAction
十五:struts1.x的插件的扩展
   A:控制器的扩展点:扩展ActionServlet类,requestProcess类和action类
   B:一般扩展点:struts插件(plugin),扩展struts配置类
   C:validator扩展点:扩展验证框架
   D:tiles扩展点:扩展Tiles页面
  在struts可以包括一个或者多个插件,在struts启动时,每个插件的调用init()方法初始化,并调用被关闭时,struts会自动调用每个插件的destroy方法:》》》》》validator:可以自动实现表单数据的封装和 ,可以自动类型转换和数据验证》》》》》validator依赖的两个Jar文件时:jakarta——oro.jar》commons_validator.jar


Sruts2


一:struts2的发展史?
Struts2虽然是在Struts1的基础上发展起来的,但是实质上是以WebWork为核心的。Struts2为传统的Struts1注入了WebWork的先进的设计理念,统一了Struts1和WebWork两个框架。Struts1分化出来的另外一个框架是Shale。这个框架远远超出了Struts1原有的设计思想,与原有的Struts1关联很少,使用了全新的设计思想。Shale更像一个新的框架而不是Struts1的升级。 本文下面的内容将主要讨论Struts2。
    
二:struts2与struts1.x有什么不同?Struts1.x的优缺点,strus2的优势?
struts 1 的优点
1.实现MVC模式,结构清晰
2.有丰富的Tag可用
3.页面导航
4.提供Exception处理机制
5.支持I18N

struts 1的缺点
1.需要配置forword:每一次到视图层(每次修改配置之后,要求重新部署整个项目)
2.测试不方便(Struts的每个Action都同Web层耦合在一起,这样它的测试依赖web容器)
3.转型的转换(转换类型是不可配置的,类型转换时的错误返回给用户也是非常困难的)
4.对Servlet的依赖性过强(Struts处理Acton时必须依赖ServetRequest和ServletResponse,所以它摆脱不了Servlet容器)
5.对Action执行控制困难:Struts创建一个Action,如果想控制它的顺序将会非常困难,甚至要重新去写Servelt来实现这个功能的需求。

    相对strut1。。。对于strut2来说
(1)Action类
      Struts 1.x要求Action类要扩展自一个抽象基类。Struts 1.X的一个共有的问题是面向抽象类编程而不是面向接口编程
      Struts 2的Action类实现一个Action接口,连同其他接口一起实现可选择和自定义的服务。
(2)线程模型
      Struts 1.x Action类是单列类,因为只有一个实例来控制所有的请求。单列类策略造作了一定的限制,并且给开发带来了额外的烦恼。
     Struts 2 Action对象为每一个请求都实例化对象,并且不会导致性能和垃圾回收问题。
(3)Servlet依赖
     Struts 1.x的action类依赖ServletAPI,当Action被调用时,以HttpServletRequest和HttpServletRequest作为参数转给execute方法
     Struts 2的Action 和容器无关。Servlet上下文被表现为简单的Maps,可以Action被独立测试   (4)易测试
    测试Struts 1.x的Action类依赖于ServletAPI,这使得测试要依赖于容器。
   第三方的扩展,如Struts TestCase
   Struts 2的Action可以通过初始化,设置性,调用方法来测试。依赖注入的支持也使得测试变得更简单
(5)表达式语言
    Struts 1.x 整合JSTL。所以它使用JSTL的表达式。但是对对象和索引的支持很弱。
   Struts 2 使用JSTTL,但是也支持一个更强大和灵活的表达式语言----OGNL
(6)类型转换
  Struts 1.X的ActionForm 属性经常都是String。Struts 1.x使用Commons-Beanutils来进行类型转换,转换每一个类,而不是为每一个实例配置
Struts 2 使用OGNL 进行类型转换。提供基本和常用对象的转换器


 


三:添加struts2框架的必须步棸?
     添加必须的jar包
struts2-core-2.1.8.1.jar    struts2核心包
struts2-json-plugin-2.1.8.1.jar  struts2的json插件--var s = {name:"zhangs",age:"18"}
struts2-spring-plugin-2.1.8.1.jar 与spring集成插件
xwork-core-2.1.6.jar   struts2的构建基础jar
struts2-convention-plugin-2.1.8.1.jar struts2的注解信息--不再使用xml文件配置,而使用注解
commons-io-1.3.2.jar   通用输入输出包
commons-fileupload-1.2.1.jar  通用上传组件
commons-logging-1.0.4.jar  通用日志记录
freemarker-2.3.15.jar   struts2中的通用模板框架
ognl-2.7.3.jar    struts2中的表达式、
json-lib-2.1.jar   json的支持

四:架构struts2框架
     首先配置web.xml的文件
    <filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>

<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
通过过滤器的方式来把struts2配置近来
  在配置的过程中
引入struts2所有需要的jar包
其中中重要的包有:freemarker-2.3.15.jar---ognl.*.jar .struts2.*.jar  wwork_core.*.jar
如果需要文件上传和下载。需要引入的jar包为commons-fileupload.jar .commons-io.jar
再就是在根目录下配置struts.xml文件
在配置struts.xml的文件中。其根节点有:
        <bean class=""></bean>-------
        <constant name="" value=""></constant>--------用来配置常量(struts.perproties文件中)
        <include file=""></include>----引入其他的配置文件
       <package name=""></package>--bao
  一:在struts2中最大的区别是如何一个pojo都可以是一个action类,不需要继承每个接口,但是struts2中也给我们提供了一个类方便玩么的开发。ActionSupport类
   A:在写普通的属性的时候,可以写在action类中,也可以引入实体类,该实体类不需要实例化,系统会自动给我们实例化。为了方便开发,如果引入的实体类的时候。实现了moderdriver来便于开发(在视图层,只需要写属性名即可)
B:在获得系统上下文,或者获得当前的回话,可以使用AcionContext该类来实现 。
在获得该实例的过程中,可以静态的获得context。获得相关的实例,也可以通过实现RequestAware,SessionAware接口来获得!
C:在struts2中同样也提供了啊,嵌入式的

HttpServletRequest   request = ServletActionContext.getRequest(); HttpSession session =request.getSession();
ServletContex application= = ServletActionContext.getServletContext();
也可以实现implements ServletRequestAware,ServletContextAware接口


D:package标签的配置需要注意的问题啊!
<package name=”” extends=”struts-default” namespace=””>
   Name可以任意取,但是不可以重复,extends是默认的继承。。。。而namespace默认是/,通常情况下,命名是唯一的!
  <default-action-ref name="error_404"></default-action-ref>是定义404错误的!
--------------------》
<action name="error_404">
<result>/error_404.jsp</result>
</action>
在用户错误的页面下,可以放回404错误!
<exception-mapping result="error_500" exception="java.lang.Exception"></exception-mapping>
<result name="error_500">/error_500.jsp</result>
505错误的定义:都可以定义成局部的或者是全局的啊!
在定义<action>中要注意的是:
<action name="news_*"  class="org.svse.web.action.NewsAction"  method="{1}">
  可以在一个action中定义多个处理方法。通过news_*。Action来请求数据处理!
也可以在测试的过程中用户news!*.action来请求处理数据。
在action中要注意的是
<result-types>
            <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
            <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
            <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
            <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
            <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
            <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
            <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
            <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
            <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
            <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
        </result-types>
几种result的设置类型:最常用的有stream(文件的下载的时候用到),redirectAction(重定向一个新的action),redirect(重定向)。
 
拦截器的功能和使用,在struts2中,大量使用到了拦截器:在使用拦截器的时候,一般是Interceptor这个类。来做拦截器,但是struts2也给我们提供了abstractInterceptor来对拦截,并且重写了MethodFilterInterceptor(excludeMethods, excludeParams)对方法的拦截。但是要注意的时候,在配置拦截器时,要在相应的xml。的包中进行配置,而且在配置的同时。可以使用的拦截器,和拦截站来配置,如果一个action中实现了自定义的拦截器,也要显示的实现struts2的默认的拦截器,因为在struts2中,都是通过拦截器来实现数据的验证,封装,传输,和文件的上传或者下载!

类型转换,在struts2中,前辈们已经给我们写好了很多的内置的转换器,有的时候遇到特殊的情况下,我们也能很好的自定义转换器,只需要继承DefaultTypeConverter类(该类是想重写了TypeConverter该类)或者继承struts2前辈们的StrutsTypeConverter方法就可以完成类型转换,但是要注意的是在继承DefaultTypeConverte。重写一个方法(public Object convertValue(Map<String, Object> context, Object value,
Class toType) {}
该方法是toType,表示向那边转换,value是需要转换的数据。Context是关联上下文


在strutsTypeConverter中要重写两个方法(
public Object convertFromString(Map context, String[] values, Class toClass) {}
public String convertToString(Map context, Object o) {}
这样可以轻松的理解从哪里转向哪里?方便程序员的理解和开发


在转换器配置时PointAction-conversion.properties(配置局部的)
在配置局部的好似好,配置文件的命名要按规范来命名:action类-conversion.properties
  文件中是#point=org.svse.converter.PointConverter。是属性,对应其配置
xwork-conversion.properties(配置全局的)
而全局的是
org.svse.entity.Point=org.svse.converter.PointConverter2,是类对应其配置类


OGNL标签的使用(struts的OGNL是一大亮点,他比jstl更强大更好用,结合了struts2的标签,相对于struts1.x是一个里程碑)
在struts2中,ognl功能很强大。
            |
                     |--application
                     |
                     |--session
       context map---|
                     |--value stack(root)
                     |
                     |--request
                     |
                     |--parameters
                     |
                     |--attr (searches page, request, session, then application scopes)
                     |
其机构如上所示,如果是value stack中的数据,可以直接通过name属性来访问,如果是其他作用域中的数据,可以使用#name属性来访问



struts1与struts2各有哪些优点和缺点?
类:
• Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。
• Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。
线程模式:
• Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。
• Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)
Servlet 依赖:
• Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。
• Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。
可测性:
• 测试Struts1 Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器)。一个第三方扩展--Struts TestCase--提供了一套Struts1的模拟对象(来进行测试)。
• Struts 2 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。
捕获输入:
• Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经常创建多余的类捕获输入。动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存在的JavaBean(仍然会导致有冗余的javabean)。
• Struts 2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过 web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种 ModelDriven 特性简化了taglib对POJO输入对象的引用。
表达式语言:
• Struts1 整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。
• Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--"Object Graph Notation Language" (OGNL).
绑定值到页面(view):
• Struts 1使用标准JSP机制把对象绑定到页面中来访问。
• Struts 2 使用 "ValueStack"技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。
类型转换:
• Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。
• Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。
校验:
• Struts 1支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。
• Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性
Action执行的控制:
• Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。
• Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics