struts1 方面的知识

一、Struts 1的基本框架
Struts 1框架以ActionServlet作为核心控制器,整个应用由客户端请求驱动。
 
当客户端向Web应用发送请求时,请求将被Struts 1的核心控制器ActionServlet拦截,ActionServlet根据请求决定是否需要调用业务逻辑控制器处理用户请求(实际上,业务逻辑控制 器还是控制器,它只是负责调用模型来处理用户请求),当用户请求处理完成后,其处理结果通过JSP呈现给用户。
 
对于整个Struts 1框架而言,控制器就是它的核心,Struts 1的控制器由两个部分组成:核心控制器和业务逻辑控制器。其中核心控制器就是ActionServlet,由Struts 1框架提供;业务逻辑控制就是用户自定义的Action,由应用开发者提供。
 
对于大部分用户请求而言,都需要得到服务器的处理。当用户发送一个需要得到服务器处理的请求时,该请求被ActionServlet拦截 到,ActionServlet将该请求转发给对应的业务逻辑控制器,业务逻辑控制器调用模型来处理用户请求;如果用户请求只是希望得到某个URL资源, 则由ActionServlet将被请求的资源转发给用户。
 
二、struts1.的优缺点:
1.优点:
Struts1是一个基于Sun J2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的。
 
1,struts能充分满足应用开发的需求简单、易懂、敏捷迅速,容易被人采用,功能强大。
 
2,通过采用模型-视图-控制器(MVC)设计模式,使用struts可以开发使用 JAVA Servlets和javaServer Pages的高性能、面向事务的WEB应用程序。
 
3,struts提供的模型2体系结构,视图层-事务处理层-数据模型层(mvc),通过明确的应用程序分工 使得事务逻辑和显示逻辑彼此相互独立,视图层(html,JSP)将用户所需要的任何数据向事务处理层(servlet)发送请求,事务处理层将根据请求处理相关事务(包括处理请求,验证数据等),将用户所需要的数据提交到数据模型层,数据模型层从数据库取得数据再反馈给事务处理层,由事务处理层传递给视图层显示数据信息。
 
4,struts提供强大的自定义标签库(taglib),编程人员可以根据需要编写各种类型的标签。
 
 5,struts本身自带的validator框架,tiles和jstl标记库标记,更能为编程人员提供方便,提高编程效率。 更能使整个项目结构性良好、清晰,便于维护。
 
 6,struts能很好的与 hibernate、spring整合同时 Struts把Servlet 、JSP、自定义标签和信息资源(message resources)整合到一个统一的框架中, 极大的节省了时间,提高了开发效率.
 
2.缺点:
1).单元测试困难:
HttpServletRequest和HttpServletResponse是由Servlet容器负责实例化的,因此Acton类的测试就要依赖于
Web容器,单元测试很难实现。当然,也可以使用第三方的测试工具------JUnit的扩展工具StrutsTestCase来
对Action进行单元测试,但是测试相对来说比较困难这是不争的事实!
 
2) Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理求。单例策略限制了Struts1
Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。
 
3). 对Servlet的依赖性太大
 
4). Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作
ActionForm,开发者经常创建多余的类捕获输入。动态Bean(DynaBeans)可以作为创建传统ActionForm的选
择,但是,开发者可能是在重新描述(创建)已经存在的JavaBean(仍然会导致有冗余的javabean)
 
5)每配置一下 struts-config,须重新启动tomcat,而且配置烦所,页面转向过多, 导致forword配置过多使得 struts-config文件内容过多,寻找东西比较困难
 
6)到了struts3.0的时候,发现建一个action就必须要有相应的actionform与之对应。导致没必要有actionform的action都要建立actionform。要不然web页面是提交不到action的。
 
三、struts1.的流程:
1.Web Server启动装载Web应用时,容器先将ActionServlet装载进虚拟机并实例化,接着调用init()方法在init()
中ActionServlet去解析struts-config.xml文件,将其中的元素信息封装到相应的对象中,对象被存放到Struts
框架维护的集合中.
 
2. 当客户端发出请求的URL以指定后缀结尾,那么这些请求将被ActionServlet拦截.
 
3. ActionServlet接拦截请求后,首先构造一个RequestProcessor对象(单例),然后调用其
process(request,response)方法,将请求委托给RequestProcessor来处理.
 
4.RequestProcessor将请求URL中的servletPath截取后缀后,然后根据这个path到HashMap中查找对应
ActionMapping对象,若没有找到,返回错误信息到客户端,若找到也就能获得属性type指定的Action.
注意:如果Action没有配置ActionForm就不会执行4,7(4,7指的是这里写的).
 
5. 根据<action>元素中属性scope指定的范围去查找是否存在配置的ActionForm对象,若找到该对象,就不会去
构造一个新的ActionForm对象,若没有找到,先构造一个新的ActionForm对象,然后将该对象放置到scope指定
的范围中.
 
6. 调用ActionForm的reset()方法,调用此方法进行属性的初始化(基本数据类型设置为0,布尔型设置为
false,String设置为null).
注意: 此方法要用户自己去实现,但是若ActionForm对象存放在request中可以不实现该方法,若存放在session中
最好实现该方法,对所有的属性进行初始化.
 
7. 调用ActionForm的setXXX()方法,调用此方法就将提交表单中的字段信息封装到ActionForm的属性中.
 
8. 如果<action>元素中的属性validate为true,那么就调用validate()方法进行表单字段的验证,该方法由用户提
供实现.若设置false就不调用该方法.
注意:该方法并返回一个ActionErrors对象(内置一个集合),若集合中含有ActionMessage对象(封装错误消息)验
证就不通过,接着跳转到属性input指定的jsp.若返回null或者ActionErrors对象内置的集合中不含
ActionMessage对象,验证就通过.
 
9. RequestProcessor首先判断在放置Action缓存(HashMap)中是否已经存在一个Action对象,若没有就构造一个新的
Action对象,并放置到Action缓存中.
注意: Action缓存是一个HashMa,存放形式:(className,Action对象引用),className就是<action>元素中属性
type指定的值.
 
10. 调用Action的execute()方法,此方法类似Servlet中的service方法,返回结果为一个ActionForward对象,根据返
回的ActionForward对象,而回答用户的请求.
 
四、struts1的MVC模式实现
(1)Model部分
 
Struts 1的Model部分主要由底层的业务逻辑组件充当,这些业务逻辑组件封装了底层数据库访问、业务逻辑方法实现。实际上,对于一个成熟的企业应用而 言,Model部分也不是一个简单的JavaBean所能完成的,它可能是一个或多个EJB组件,也可能是一个WebService服务。总 之,Model部分封装了整个应用的所有业务逻辑,但整个部分并不是由Struts 1提供的,Struts 1也没有为实现Model组件提供任何支持。
 
(2)View部分
 
Struts 1的View部分采用JSP实现。Struts 1提供了丰富的标签库,通过这些标签库可以最大限度地减少脚本的使用。这些自定义的标签库可以输出控制器的处理结果。
 
虽然Struts 1提供了与Ties框架的整合,但Struts 1所支持的表现层技术非常单一:既不支持FreeMarker、Velocity等模板技术,也不支持JasperReports等报表技术。
 
(3)Controller部分
 
Struts 1的Controller由两个部分组成。
 
系统核心控制器:由Struts 1框架提供,就是系统中的ActionServlet。
 
业务逻辑控制器:由Struts 1框架提供,就是用户自己实现的Action实例。
 
Struts 1的核心是控制器(ActionServlet)。该控制器由Struts 1框架提供,继承HttpServlet类,因此可以配置成一个标准的Servlet,该控制器负责拦截所有HTTP请求,然后根据用户请求决定是否需要 调用业务逻辑控制器,如果需要调用业务逻辑控制器,则将请求转发给Action处理,否则直接转向请求的JSP页面。
 
业务逻辑控制器负责处理用户请求,但业务逻辑控制器本身并不具有处理能力,而是调用Model来完成处理。
 
Struts 1提供了系统所需要的核心控制器,也为实现业务逻辑控制器提供了许多支持。因此,控制器部分就是Struts 1框架的核心。
 
五、Struts1 Tiles框架
tiles标签库的主要作用是为了统一团队开发中每个开发人员所开发出来的界面风格,同一站点的所有Web页面保持一致的外观,比如有相同的布局、页头、页尾和菜单。 
 
 tiles是struts1.的五大标签库之一,使用Tiles框架大大提高了视图层程序代码的可重用性、可扩展性和可维护性,也增加了开发视图的难度和复杂度,在使用Tiles框架之前一定要结合Web应用的规模。
 
Tiles框架为创建Web页面提供了一种模板机制,它能将网页的布局和内容分离。它允许先创建模板,然后在运行时动态地将内容插入到模板中。Tiles框架建立在JSP的include指令的基础上,但它提供了比JSP的include指令更强大的功能。
 
Tiles框架具有如下特性:
创建可重用的模板
动态构建和装载页面
定义可重用的Tiles组
支持国际化
 
他的主要流程是:
 
1:建了一个页面模板,把最基本的布局设置为一个模板,所有的页面都在此模板的基础上
 
   扩展,也就是所谓的"页面继承",这样就能很好的保证用户界面的一致性! 
2:先建立一个模板的JSP页面(大体框架),配置tiles的xml文件,并且在一个总的页面
 
  上把每一块最初所显示的页面设置好,struts-config.xml文件的配置与以前用的基本一致,
 
  最大的区别是:没有使用tiles框架时,action配置中forward里的path是一个JSP页面
 
  的URL,但是使用tiles后,其path的值就变成了一个字符串,根据该字符串到tile配置 
    文件中找到指定的definition,然后更改原来模板的显示 
 
六、Struts1 Validate框架
1. 使用客户端验证比使用服务端验证的好处有以下几点:
                1.容易维护. 由于验证信息可以放在一个配置文件中.
                2.标准化. 由于很多的验证都是相同的,如用户名和密码都要求使用字母,数字,下划线组成.
                3.避免重造轮子. 一现些简单的验证,想要正确的实现它却很困难.
                4.最主要的一个原因,就是验证在客户端,而不在服务端,这也节省了数据的传送面浪费时间.
 
2.流程:
 
       1).在struts-config.xml文件中配置验证框架插件
 
       2).在validator-rules.xml文件中声明Validator框架的预定义验证,将这个文件WEB-INF
 
目录中也可以在这个文件中找到源代码,从而进行扩展,满足客户的特定需求
 
       3).在validator.xml文件定义了要验证的对象。实际上,在这个文件中,包含了一个或
 
多个ActionForm的子类及其要验证的属性和验证规则。因此,这个文件就相当于
 
validate方法。在Validator框架中,可以有多个定义验证对象的xml文件(可以将
 
不同的ActionForm的子类分散到不同的xml文件中),中间用逗号(,)隔开
 
3.注意事项:
 
  1).要想使用Validator框架验证数据,Form类就必须从ValidatorForm继承,因为
 
ValidatorForm已经覆盖了ActiomForm的validate方法
 
2).不管是否使用Validator框架进行验证,对于JSP代码来说是完全一样的。仍然是使用
 
<html:errors>元素来显示错误信息。但要注意,在使用Validator框架时,<html:errors>
 
元素的property属性的值就是所对应ValidatorForm的子类的属性名
 
3).在validation.xml中,在<form-validation>元素中有一个<formset>子元素,这个元素可
 
以定义多个<Form>元素,这个元素用来定义要验证的ValidatorForm类的子类。其中
 
name属性值就是<form-bean>元素中的name属性值
 
4).<field>元素用来定义某个属性的约束条件,depends就是该属性的约束条件!
 
5).<msg>元素用来定义出错信息在属性文件中的Key(所有的出错信息都在属性文件中)
 
       <arg>元素用来向出错信息中的参数传递参数值。<var>元素用来定义变量名和变量值
 
七、struts的标签库简介
struts的标签库有五个:
 1、HTML标签库:这个标签库的大部分标签和HTML中的标签一一对应的。
                html标签库的目的是将jsp页面和Action通过ActionForm连接起来。
 
 2、Bean标签库:Bean标签库中的定制标签主要用来向客户端输出文本信息。
                一般我们会用<bean:write name="classes" property="className" />
 
 3、Logic标签库:进行逻辑判断和循环操作.
                 一般我们会用<logic:iterate id="classes" name="list" type="com.lxitedu.classes.pojo.Classes">
                 id与Bean中bean:wirte 对应的name 必须是相同的。
 
 4、Nested标签库:这个标签库中的标签有来显示form或对象中的“nested”属性。
 
 5、Tiles标签库:这个标签库的标签允许我们为视图层建立布局。
 
taglib指令的uri属性除了使用在.tld文件中定义的uri值来定位标签库外,
还可以直接使用.tld文件的相对路径来定位。在使用MyEclipse将一个Web工程加入Struts特性后,
会自动在WEB-INF目录中加入如下五个文件:
1.struts-bean.tld:用于声明Bean标签库中标签的tld文件。
2.struts-html.tld:用于声明HTML标签库中标签的tld文件。
3.struts-logic.tld:用于声明Logic标签库中标签的tld文件。
4.struts-tiles.tld:用于声明Tiles标签库中标签的tld文件。
5.struts-nested.tld:用于声明Nested标签库中标签的tld文件。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值