Struts框架----进度1
一、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的更多相关文章
- Struts框架的核心业务
Struts的核心业务 Struts核心业务有很多,这里主要介绍了比较简单一些的: 请求数据的处理,和数据自动封装,类型自动转换 1.Struts中数据处理 1.1.方式1:直接过去servletap ...
- Struts框架
Struts是最早的Java开源框架之一,它是MVC设计模式的一个优秀实现. Struts定义了通用的Controller(控制器),通过配置文件(通常是 Struts -config.xml) Ec ...
- 使用Struts框架,实现用户登陆功能
前言:本篇文章是本人这周学习的一个小结,在自我总结的同时,希望也能够给其他同学带来一点帮助.本文主要知识是参照书本上的知识点以及网上其他博客文章,在上机操练后的所得,具体源码主要来自http://bl ...
- Struts框架2ActionError类 内部资料 请勿转载 谢谢合作
ActionError类从不独立进行错误处理,它们总是被存储在ActionErrors对象中.ActionErrors对象保存ActionError类的集合以及它们特定的属性值,我们可以使用自己定义的 ...
- Struts框架 内部资料 请勿转载 谢谢合作
Struts框架 struts框架具有组件的模块化,灵活性和重用性的优点,同时简化了基于MVC的web应用程序的开发. 本章详细讨论struts架构.我们将看到struts是如何清晰地区分控制,事务逻 ...
- Eclipse/JavaWeb (一)三大框架之struts框架 持续更新中...
最近主要把javaweb的三大框架过一遍. (一)发展历史 传统的Java Web应用程序是采用JSP+Servlet+Javabean来实现的,这种模式实现了最基本的MVC分层,使得程序分为几层,有 ...
- Struts框架——(三)动态ActionForm
一.DynaActionForm的引入意义 使用ActionForm把表单数据单独封装起来,而且提供了自动的数据验证,简化了代码的编写,给我们带来了极大的方便. 但是,ActionForm也存在一些明 ...
- 启动tomcat后struts框架报异常严重: Exception starting filter struts2 Unable to load configuration.
启动tomcat后struts框架报异常严重: Exception starting filter struts2 Unable to load configuration. 出现此异常是因为,str ...
- struts框架学习过程中的问题
1,错误: java.lang.NullPointerException: Module 'null' not found.错误原因,struts运行需要的.jar文件拷贝不足,应该把它们加入到cla ...
随机推荐
- 【转载】IIS网站如何同时解析带www和不带www的域名
针对公网上线的网站系统,很多网站的域名会同时含有带www和不带www的域名解析记录,如果需要同时解析带www和不带www的域名信息,则需要在相应的域名解析平台(如阿里云域名解析平台.腾讯云域名解析平台 ...
- 使用node建立本地服务器访问静态文件
最终目录结构 demo │ node_modules └───public │ │ index.html │ │ index.css │ └───index.js └───server.js 一.使用 ...
- Android studio如何连接三星手机
打开Android studio,选择Trouble Shoot device connections: 这个菜单项会自动扫描本地已经用USB线连接的设备: 已经成功扫描出了我的Galaxy C7 P ...
- Flask之Local、LocalStack和LocalProxy
在我们使用Flask以及Werkzeug框架的过程中,经常会遇到如下三个概念:Local.LocalStack和LocalProxy.尤其在学习Flask的Request Context和App Co ...
- thefuck安装和使用(ubuntu)
系统环境(已测试可用): ubuntu 18.04 lts (server或desktop),ubuntu 19.04(server或desktop) sudo apt update sudo apt ...
- Linux命令——mesg
参考:图解Linux命令之--mesg命令 Linux mesg命令 前言 在看一个脚本~/.profile 的时候发现了mesg命令以及一个奇怪用法 ~/.profile # ~/.profile: ...
- 【OF框架】框架规范介绍
一.目录规范 二.命名规范 三.其它规范
- BCB 如何让Application收到SendMessage发送来的消息
一般,都是通过添加一个ApplicationEvent组件就可以接收到PostMessage发来的消息,那么如何收到SendMessage发来的消息呢? https://stackoverflow.c ...
- 回归分析特征选择(包括Stepwise算法) python 实现
# -*- coding: utf-8 -*-"""Created on Sat Aug 18 16:23:17 2018 @author: acadsoc"& ...
- 并发编程大师系列之:CountDownLatch和Join
业务场景描述:假设一条流水线上有三个工作者:worker1,worker2,worker3.有一个任务的完成需要他们三者协作完成,worker3可以开始这个任务的前提是worker1和worker2完 ...