一、Struts的理解

1.struts是一个按MVC模式设计的web层框架,其实它就是一个大的Servlet:ActionServlet,或者是ActionServlet的子类。在web.xml文件中配置过滤器来让符合条件的请求交给这个ActionServlet来处理,比如以action为后缀的url请求等。Servlet再参照配置文件(一般为/WEB/INF/struts-config.xml【这个文件可以按照模块进行配置,解决配置文件过度膨胀的问题】)将这个请求分别分配给不同的action去处理。

2.ActionServlet把请求交给action去处理之前,会将请求参数封装成一个formbean对象(这个类中的每个属性对应一个请求参数),封装成一个什么样的formbean?OGNL类型转换:由于java是一个强类型的语言,所以对于http的请求字符串需要进行类型转换?

3.ActionServlet把formbean对象传递给action的execute方法之前,可能会调用formbean的validate方法进行校验,只有通过校验通过之后,才将这个formbean对象传递给action的execute方法,否则直接返回一个错误页面,这个错误页面由input属性指定。输入校验机制:校验规则文件(XXXAction-validation.xml例如RegistAction-validation P308)中规定用户输入数据的合法性。多用正则表达是进行配置。客户端校验?服务器端校验?

4.action执行完之后要返回显示的结果视图(逻辑视图),这个结果视图使用一个ActiongForword对象来表示的,actionforword对象通过struts-congfig.xml配置文件中配置关联到对应的jsp页面(物理视图),因为程序中使用的是在struts-congfig.xml配置文件为jsp页面设置的逻辑名,这样可以实现actiong程序代码和返回的jsp页面名称解耦。

二、struts优缺点

1.优点

①实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现

②有丰富的tag可以用,Struts的标记库(Taglib),提高开发效率

③页面导航

  使系统的脉络更加清晰。通过配置一个文件,即可把我整个系统各部分之间的联系,这样对于后期的维护有着很大帮助。

④提供Exception处理机制

⑤数据库连接池管理

⑥支持I18N

2.缺点

①转到展示层时,需要配置forward,如果有是十个展示层的jsp,需要配置十次struts,而且还不包括有时候目录、文件变更,需要重新改修改forward,每次修改配置之后需要重新部署整个项目,而tomcate这样的服务器还必须重新启动服务器。

②Struts的Action必须是thread-safe方式,它仅仅允许一个实例去处理所有的请求,所以action用到的所有的资源都必须统一同步,这个引起了线程安全的问题。

③测试不方便Struts的每个Action都和WEb层耦合在一起,这样他的测试依赖于web容器,单元测也很难实现。单元测试也很难实现。不过一个Junit的扩展工具Struts TestCase可以实现单元测试。

④类型的转换。Struts的formbean把所有的数据都作为String类型,他可以使用工具Commons-Beanutils进行类型转换,但是他的转化都是在class级别,而且转化的类型是不可配置的。类型转化时的错误信息返回给用户也是非常困难的。

⑤对Servlet的依赖性过强,Struts处理Action时必须依赖ServletRequest和ServletREsponse,摆脱不了servlet容器。

⑥前端表达式语言方面Struts继承了JSTL,所以它主要使用JSTL的表达式语言来获得数据。可是JFTL的表达式语言在集合和索引属性方面处理的很弱。

⑦对Action执行的控制困难,Struts创建了一Action,如果想控制它的执行顺序将会非常困难。甚至要去重写Servlet来实现这个功能。

⑧对Actiong执行前后的处理,Struts处理Action的时候是基于class的hierarchies,很难再action处理前后进行操作。

⑨对事件支持不够,在struts中,实际一个表单Form对应一个Action类(DispatchAction),换句话说:在Struts中实际是一个表单只能对应一个事件,struts这种事件方式称为application event,application event和component event相比是一种粗粒度的事件。

三、struts1和struts2的区别

①都是MVC的WEB框架

②struts1在用户上面多于struts2(很早以前吧)

③Struts1的前端控制器是一个Servlet,名称为ActionServlet,Struts2的前端控制器是一个filter,在struts2.0中叫FilterDispatcher,在Struts2.1中叫StrutsPrepareAndExecteFilter。

④struts1的action需要继承Actiong类,、Struts2的action可以不继承任何类;struts1对同一个路径的所有请求共享一个Action实例,Struts2对一个路径的每个请求分别使用一个独立的ACtion实例,所以对于struts2的Action不用考虑线程安全的问题(对用户的每一次请求都会产生一个action )。

⑤strts1中使用formbean封装请求参数,在struts2中直接使用action的属性来封装请求参数。

⑥struts1中的多个业务方法放在一个Action中时(继承DispatchAction),要么都校验,要么都不校验;对于struts2,可以指定支队某个方法进行校验,当一个Action继承了ActionSupport且在这个类中只编写了validateXxx()方法,那么只对Xxx()方法进行校验。

⑦ Struts2的视图地址是可以动态的。

Struts框架----进度1的更多相关文章

  1. Struts框架的核心业务

    Struts的核心业务 Struts核心业务有很多,这里主要介绍了比较简单一些的: 请求数据的处理,和数据自动封装,类型自动转换 1.Struts中数据处理 1.1.方式1:直接过去servletap ...

  2. Struts框架

    Struts是最早的Java开源框架之一,它是MVC设计模式的一个优秀实现. Struts定义了通用的Controller(控制器),通过配置文件(通常是 Struts -config.xml) Ec ...

  3. 使用Struts框架,实现用户登陆功能

    前言:本篇文章是本人这周学习的一个小结,在自我总结的同时,希望也能够给其他同学带来一点帮助.本文主要知识是参照书本上的知识点以及网上其他博客文章,在上机操练后的所得,具体源码主要来自http://bl ...

  4. Struts框架2ActionError类 内部资料 请勿转载 谢谢合作

    ActionError类从不独立进行错误处理,它们总是被存储在ActionErrors对象中.ActionErrors对象保存ActionError类的集合以及它们特定的属性值,我们可以使用自己定义的 ...

  5. Struts框架 内部资料 请勿转载 谢谢合作

    Struts框架 struts框架具有组件的模块化,灵活性和重用性的优点,同时简化了基于MVC的web应用程序的开发. 本章详细讨论struts架构.我们将看到struts是如何清晰地区分控制,事务逻 ...

  6. Eclipse/JavaWeb (一)三大框架之struts框架 持续更新中...

    最近主要把javaweb的三大框架过一遍. (一)发展历史 传统的Java Web应用程序是采用JSP+Servlet+Javabean来实现的,这种模式实现了最基本的MVC分层,使得程序分为几层,有 ...

  7. Struts框架——(三)动态ActionForm

    一.DynaActionForm的引入意义 使用ActionForm把表单数据单独封装起来,而且提供了自动的数据验证,简化了代码的编写,给我们带来了极大的方便. 但是,ActionForm也存在一些明 ...

  8. 启动tomcat后struts框架报异常严重: Exception starting filter struts2 Unable to load configuration.

    启动tomcat后struts框架报异常严重: Exception starting filter struts2 Unable to load configuration. 出现此异常是因为,str ...

  9. struts框架学习过程中的问题

    1,错误: java.lang.NullPointerException: Module 'null' not found.错误原因,struts运行需要的.jar文件拷贝不足,应该把它们加入到cla ...

随机推荐

  1. vue 鼠标移入移出事件执行多次(尤其ie)

    来自:https://www.cnblogs.com/myfirstboke/p/9150809.html  侵删 <p @mouseover="over($event)" ...

  2. dubbo和mq的使用场景

    MQ:消息队列.生产者消费者模式,可用于对消息实时性要求不高的场景.多进程之间间接调用关系 Dubbo:RPC实现.多进程之间直接调用关系 dubbo 1,rpc的分布式集群支持:负载均衡是对外提供一 ...

  3. LNMP环境中的数据库迁移为独立的服务器

    环境: centos 6.5 ip:192.168.0.118  nginx.php.mysql centos 6.5 ip:192.168.0.117 mysql 现在我们需要把数据库迁移到192. ...

  4. Linux之python3编译安装

    一,前言 centos7默认是装有python的,咱们先看一下 [root@glh ~ 20:18:03]#python Python 2.7.5 (default, Jul 13 2018, 13: ...

  5. 定制ubuntu镜像

    使用ubuntu server 18.04 lts版镜像 作为源镜像定制目标镜像, 工具cubic, 定制目标镜像, 使得一些服务装机后即可使用,例如redis, mysql, monggodb ,s ...

  6. [TCP/IP][distributed] proxy protocol 是什么

    问题描述: 在Web分布式系统中,一般会搭建复杂的load blance系统来提供高性能的web服务. load blance有4层网络的,也有7层网络的.再经过这样的分布式网络之后,后面真正提供服务 ...

  7. 管理Linux软件——apt

    参考:Ubuntu的apt命令详解 apt命令是一个功能强大的命令行工具,它与Ubuntu的高级打包工具(APT,Advanced Packaging Tool )配合使用,可以执行安装新软件包,升级 ...

  8. 每日一题-——LeetCode(121)买卖股票的最佳时机

    题目描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格.如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润.注意你不能在买入股票前卖出股票 ...

  9. Java stackoverflowerror异常与outofmemoryerror异常区别

    1.stackoverflow: 每当java程序启动一个新的线程时,java虚拟机会为他分配一个栈,java栈以帧为单位保持线程运行状态:当线程调用一个方法是,jvm压入一个新的栈帧到这个线程的栈中 ...

  10. 文件读写(一)利用File静态类 System.IO.FileInfo、DirectoryInfo、DriveInfo

    提供用于创建.复制.删除.移动和打开单一文件的静态方法,并协助创建 FileStream 对象. 一.读文件: 1.返回字符串:File.ReadAllText() string readText = ...