一、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. iOS 动画基础-显式动画

    摘要 显式动画 属性动画 CABasicAnimation *animation = [CABasicAnimation animation];         [self updateHandsAn ...

  2. shim和polyfill 区别解释

    polyfill 是 shim 的一种.shim 是将不同 api 封装成一种,比如 jQuery 的 $.ajax 封装了 XMLHttpRequest 和 IE 用 ActiveXObject 方 ...

  3. LCD驱动的学习

    简介: LCD是基于液晶的. LCD(liquid crystal display)按驱动方式分类可以分为静态驱动,简单矩阵驱动,主动矩阵驱动.其中,简单矩阵又可以分为扭转向列型(TN)和超转向列型( ...

  4. 记一次B类地址子网划分

    说明:一般内网地址,没有要求严格的划分之类的.需要按要求严格划分一般都是公网地址 温馨提醒:由于笔者功底不是很深厚,只能说我们保证把数算对用相对简单的方法 现有一个公网ip,B类地址130.3.0.0 ...

  5. Linux命令——pgrep

    参考:Linux pgrep Command Tutorial for Beginners (10 Examples) Linux命令——ps.pstree bash基础——grep.基本正则表达式. ...

  6. ArrayList之foreach循环删除倒数第二个元素,不触发fail-fast机制

    今天一朋友问了个问题,对于如下一段代码,运行后会有怎样的结果? public class ArrayListTest { public static void main(String[] args) ...

  7. 用js刷剑指offer(二叉搜索树的后序遍历序列)

    题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 牛客网链接 js代码 function Verif ...

  8. windows10下安装tensorflow2.0-GPU和Cupy(不用搞CUDA+cudnn)

    0.前言 今年暑假买了个1660ti的游戏本学python,后来发现跑一些数据量比较大的代码和深度学习的时候太慢了,遂想装一下GPU版本,看了网上的资料搞了好几天,又是CUDA又是cudnn的,网速慢 ...

  9. What is URL Encoding and How does it work?

    Introduction A URL (Uniform Resource Locator) is the address of a resource in the world wide web. UR ...

  10. jquery仿排列顺序,变换颜色更换class

    ps:箭头是字体图标,需要的可以去阿里字体下载,也可自己替换图片 点击之后的 代码部分 <ul class="Ep_sxxz"> <span class=&quo ...