struts是基于当前的一些相关标准的开发技术(servlet,xml…)基础之上,
提供了一个开发框架的开放源码项目。
使用struts1的好处:
1.良好的架构和设计
2.可重用,模块化,扩展性好
3.Open source
4.它提供了丰富的标签库,使页面能更加灵活的使用。
struts1的缺点:
1.它太过于依赖web容器,当配置文件改动一次就要重新启动。
2.它的配置文件太过于复杂。
3.ActionForm无法进行测试.
4.Action测试太过于依赖servlet api,所以在测试的时候要用到模拟对象.
sturst1初始化
Struts1 = jsp + servlet + tag (MVC Model 2)
1.启动
加载多个配置文件 ctrl+shift+T(jar) ctrl+shift+R(源文件resource) ctrl+O(快速查询方法)
*init()
initInternal()读取资源文件(国际化)
MessageResources类的getMessageResources()方法
在getMessageResources()方法中,通过工厂类调配资源文件
initOther()
查找在web.xml中config参数和convertnull参数的配置
config默认配置路径为WEB-INF/struts-config.xml (struts1配置文件)
initServlet()
从web.xml中加载ActionServlet的初始化参数如servlet-name,加载DTD文件并把
其放入HashMap缓存,读取并解析web.xml的内容,
另外会将当前的ActionServlet放入到创建的Digester对象的栈中。
initChain()
读取web.xml中命令链文件初始值chainConfig
如果没有,则用默认的"org/apache/struts/chain/chain-config.xml"
将当前ActionServlet加入到上下文ServletContext()中
获取ModuleConfig实例,Struts中的MessageResource、PlugIn、数据源等,
都是通过ModuleConfig来实现的;
调用initModuleMessageResources(moduleConfig),用户资源文件的初始化;
调用initModulePlugIns(moduleConfig),用户插件的初始化;
调用initModuleFormBeans(moduleConfig);
initModuleForwards(moduleConfig);
initModuleExceptionConfigs(moduleConfig);
initModuleActions(moduleConfig),
把struts配置文件中的其他配置存储到servletContext中;
调用moduleConfig.freeze(),固定组件配置;
通过while循环,解析以"config/"开头的其他struts配置文件,遍历web.xml中
servletConfig配置的initParameterNames,如发现以"config/" 开始的parameter,
则根据此值初始化其它的ModuleConfig;
调用initModulePrefixes(this.getServletContext()) 初始化其他模块并存储
到此,ActionServlet初始化工作就算完成
附:org.apache.commons的通用组件
commons-digester 解析XML 是XML文件与对象之间的转化器
commons-chain 组织复杂流程的处理,是个责任链模式
一次请求的流程
1.以.do结尾的URL被ActionServlet拦截,执行service方法
2.根据请求传递的方法GET/POST选择执行doGet()或doPost()方法
3.在doGet()/doPost()方法中,调用process()方法
4.在process()方法中获得RequestProcessor的实例
5.RequestProcess的实例调用process()方法,处理请求
6.在RequestProcess的process()方法中,
首先通过processMultipart()处理请求。
若传送方法为get,不做处理,直接返回到process()方法
若传送方法为post,做简单处理后返回process()方法
其次通过processPath()方法获取path
若path为null,返回上一层调用
path不为null,接着进行其它处理
包括对Locale,Content,NoCache,Preprocess,CachedMessages,Mapping,
Roles,ActionForm,Populate,Validate,Forward,Include的处理。
然后创建Action实例,并执行Action返回ActionForward,最后处理
ActionForward。
在处理的过程中,采用责任链模式分别由对应的Command类进行处理,
并随时可能由于异常等原因返回。
7.一次请求到此结束,会根据ActionForward执行下一个流程 或 直接转往JSP生成
HTML发送到浏览器。
它的一些常识:
1.它的默认配置名:struts-config.xml.
2.Action类中最重要的方法: execute().
3.它的验证方式有两种:在服务器端验证(在FormBean里面重写Validate方法),在客户端验证(通过配置文件来进行验证)。
4.在服务器启动时会执行init()来进行初始化一些信息。
5.它的乱码问题可以通过过滤器来解决。
6.struts1所需要用到的jar包可能会和tomcat中的jsp-api.jar,servlet-api.jar包冲突,最好的解决方案是将这两个jar包放到
重新建的一个包中去,然后再引用这个包中的jar。
7.在使用validate框架时from类一定要继承ValidatorFrom这个类。
Struts Validator框架采用两个基于XML的配置文件来配置验证规则。
这两个文件为validator-rules.xml和validation.xml。
struts的标签库的标签主要分为几类:
1.html标签库 这个标签库的大部分标签和HTML中的标签一一对应的。
html标签库的目的是将jsp页面和Action通过ActionForm连接起来。
2.bean标签库 这个标签库主要用来向客户端输出文本信息(比如说国际化的一些信息等)。
3.logic标签库 为了避免在JSP页面中直接使用Java代码进行逻辑判断和循环操作.
4.nested标签库 这个标签库中的标签有来显示form或对象中的“nested”属性
5.tiles标签库:这个标签库的标签允许我们为视图层建立布局。
struts的自定义标签使用过程:
1.先写一个标签类这个类继承了SimpleTagSupport这个类,实现doTag()方法。
2.然后再写一个以.tld为后缀的标签库配置文件里面进行配置一些属性包括(标签类、URI等一些东西)
如果有属性里面还需要添加attribute这个属性。
3.在页面上通过<%@taglib uri="" prefix="" %>导入标签库 使用的时候注意前缀和在.tld中配置的标签名及属性
struts1中DynaValidatorForm的使用
<form-beans>
<form-bean name="LoginForm" type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="userName" type="java.lang.String" />
<form-property name="password" type="java.lang.String" />
</form-bean>
</form-beans>
如果在Action类中使用它,可以这样子:DynaValidatorForm loginForm=(DynaValidatorForm)form;
客户端数据验证与服务端数据验证的区别:
Struts中客户端验证跟服务器端验证有区别.客户端验证直接写一个action文件便可实现,
而服务器端验证必须通过客户端程序去调用服务器端相应的 WebServices,实现业务逻辑.
它们的本质区别是,就是客户端数据校验是在客户端上进行的,而服务器端校验是在服务器上进行的,
在速度上客户端要快很多,但也有缺陷,就是当有黑客攻击的时候,他完全可以绕过客户端直接和服务器交互。
我看到过有人介绍这方面的知识时说,一个有经验的黑客至少能有100种以上的方法绕过客户端之间访问服务器,
而且服务器如果是用JDBC写的话,还要防止sql的注入。不然很容易让黑客攻击。
1、如果注册的时候输入了密码它还显示在页面的话,就用redisplay在输入框不显示它。
2、如果试用框架验证继承ValidatorForm的话,不需要验证的类就可以在action配置里面加个Validator属性="false";
Struts有三个核心的类,分别是ActionServlet,ModuleConfig,RequestProcessor。
ActionServlet就是控制器,
ModuleConfig封装着Struts应用程序的配置信息,
RequestProcessor负责处理每一个HTTP请求。
提供了一个开发框架的开放源码项目。
使用struts1的好处:
1.良好的架构和设计
2.可重用,模块化,扩展性好
3.Open source
4.它提供了丰富的标签库,使页面能更加灵活的使用。
struts1的缺点:
1.它太过于依赖web容器,当配置文件改动一次就要重新启动。
2.它的配置文件太过于复杂。
3.ActionForm无法进行测试.
4.Action测试太过于依赖servlet api,所以在测试的时候要用到模拟对象.
sturst1初始化
Struts1 = jsp + servlet + tag (MVC Model 2)
1.启动
加载多个配置文件 ctrl+shift+T(jar) ctrl+shift+R(源文件resource) ctrl+O(快速查询方法)
*init()
initInternal()读取资源文件(国际化)
MessageResources类的getMessageResources()方法
在getMessageResources()方法中,通过工厂类调配资源文件
initOther()
查找在web.xml中config参数和convertnull参数的配置
config默认配置路径为WEB-INF/struts-config.xml (struts1配置文件)
initServlet()
从web.xml中加载ActionServlet的初始化参数如servlet-name,加载DTD文件并把
其放入HashMap缓存,读取并解析web.xml的内容,
另外会将当前的ActionServlet放入到创建的Digester对象的栈中。
initChain()
读取web.xml中命令链文件初始值chainConfig
如果没有,则用默认的"org/apache/struts/chain/chain-config.xml"
将当前ActionServlet加入到上下文ServletContext()中
获取ModuleConfig实例,Struts中的MessageResource、PlugIn、数据源等,
都是通过ModuleConfig来实现的;
调用initModuleMessageResources(moduleConfig),用户资源文件的初始化;
调用initModulePlugIns(moduleConfig),用户插件的初始化;
调用initModuleFormBeans(moduleConfig);
initModuleForwards(moduleConfig);
initModuleExceptionConfigs(moduleConfig);
initModuleActions(moduleConfig),
把struts配置文件中的其他配置存储到servletContext中;
调用moduleConfig.freeze(),固定组件配置;
通过while循环,解析以"config/"开头的其他struts配置文件,遍历web.xml中
servletConfig配置的initParameterNames,如发现以"config/" 开始的parameter,
则根据此值初始化其它的ModuleConfig;
调用initModulePrefixes(this.getServletContext()) 初始化其他模块并存储
到此,ActionServlet初始化工作就算完成
附:org.apache.commons的通用组件
commons-digester 解析XML 是XML文件与对象之间的转化器
commons-chain 组织复杂流程的处理,是个责任链模式
一次请求的流程
1.以.do结尾的URL被ActionServlet拦截,执行service方法
2.根据请求传递的方法GET/POST选择执行doGet()或doPost()方法
3.在doGet()/doPost()方法中,调用process()方法
4.在process()方法中获得RequestProcessor的实例
5.RequestProcess的实例调用process()方法,处理请求
6.在RequestProcess的process()方法中,
首先通过processMultipart()处理请求。
若传送方法为get,不做处理,直接返回到process()方法
若传送方法为post,做简单处理后返回process()方法
其次通过processPath()方法获取path
若path为null,返回上一层调用
path不为null,接着进行其它处理
包括对Locale,Content,NoCache,Preprocess,CachedMessages,Mapping,
Roles,ActionForm,Populate,Validate,Forward,Include的处理。
然后创建Action实例,并执行Action返回ActionForward,最后处理
ActionForward。
在处理的过程中,采用责任链模式分别由对应的Command类进行处理,
并随时可能由于异常等原因返回。
7.一次请求到此结束,会根据ActionForward执行下一个流程 或 直接转往JSP生成
HTML发送到浏览器。
它的一些常识:
1.它的默认配置名:struts-config.xml.
2.Action类中最重要的方法: execute().
3.它的验证方式有两种:在服务器端验证(在FormBean里面重写Validate方法),在客户端验证(通过配置文件来进行验证)。
4.在服务器启动时会执行init()来进行初始化一些信息。
5.它的乱码问题可以通过过滤器来解决。
6.struts1所需要用到的jar包可能会和tomcat中的jsp-api.jar,servlet-api.jar包冲突,最好的解决方案是将这两个jar包放到
重新建的一个包中去,然后再引用这个包中的jar。
7.在使用validate框架时from类一定要继承ValidatorFrom这个类。
Struts Validator框架采用两个基于XML的配置文件来配置验证规则。
这两个文件为validator-rules.xml和validation.xml。
struts的标签库的标签主要分为几类:
1.html标签库 这个标签库的大部分标签和HTML中的标签一一对应的。
html标签库的目的是将jsp页面和Action通过ActionForm连接起来。
2.bean标签库 这个标签库主要用来向客户端输出文本信息(比如说国际化的一些信息等)。
3.logic标签库 为了避免在JSP页面中直接使用Java代码进行逻辑判断和循环操作.
4.nested标签库 这个标签库中的标签有来显示form或对象中的“nested”属性
5.tiles标签库:这个标签库的标签允许我们为视图层建立布局。
struts的自定义标签使用过程:
1.先写一个标签类这个类继承了SimpleTagSupport这个类,实现doTag()方法。
2.然后再写一个以.tld为后缀的标签库配置文件里面进行配置一些属性包括(标签类、URI等一些东西)
如果有属性里面还需要添加attribute这个属性。
3.在页面上通过<%@taglib uri="" prefix="" %>导入标签库 使用的时候注意前缀和在.tld中配置的标签名及属性
struts1中DynaValidatorForm的使用
<form-beans>
<form-bean name="LoginForm" type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="userName" type="java.lang.String" />
<form-property name="password" type="java.lang.String" />
</form-bean>
</form-beans>
如果在Action类中使用它,可以这样子:DynaValidatorForm loginForm=(DynaValidatorForm)form;
客户端数据验证与服务端数据验证的区别:
Struts中客户端验证跟服务器端验证有区别.客户端验证直接写一个action文件便可实现,
而服务器端验证必须通过客户端程序去调用服务器端相应的 WebServices,实现业务逻辑.
它们的本质区别是,就是客户端数据校验是在客户端上进行的,而服务器端校验是在服务器上进行的,
在速度上客户端要快很多,但也有缺陷,就是当有黑客攻击的时候,他完全可以绕过客户端直接和服务器交互。
我看到过有人介绍这方面的知识时说,一个有经验的黑客至少能有100种以上的方法绕过客户端之间访问服务器,
而且服务器如果是用JDBC写的话,还要防止sql的注入。不然很容易让黑客攻击。
1、如果注册的时候输入了密码它还显示在页面的话,就用redisplay在输入框不显示它。
2、如果试用框架验证继承ValidatorForm的话,不需要验证的类就可以在action配置里面加个Validator属性="false";
Struts有三个核心的类,分别是ActionServlet,ModuleConfig,RequestProcessor。
ActionServlet就是控制器,
ModuleConfig封装着Struts应用程序的配置信息,
RequestProcessor负责处理每一个HTTP请求。