转自:https://blog.csdn.net/chjttony/article/details/6099101

1.Struts1是Apache推出的java web开发领域一个比较早,同时也是使用最广泛的MVC开源框架,对于Struts1的基础不再做说明,本文只总结Struts1开发中的一些小技巧。

2.Struts配置文件中支持通配符:

如:

  1. <action path=”Edit*” type=”org.apache.struts.Edit{1}Action” name=”{1}Form”/>

type和name中的{1}对应path中的”*”通配符。

3.Struts配置文件中的actionFormBean和action分别对应Struts中的FormBeanConfig和ActionConfig类,在运行时,Struts将配置转换为javaBean。

4.页面中添加超链接的方法:

(1).方法1:

直接将项目路径硬编码,如:<a href=”/strutsDemo/……”/>。不灵活,不推荐使用。

(2).方法2:

使用EL表达式,具体用法如下:

a.       使用jsp指令<%@ page isELIgnored=”false” %>,不让页面忽略EL表达式。

b.       <a href=”${pageContext.request.contextPath}/……”/>。比较灵活,使用也比较多。

(3).方法3:

使用struts标签,具体用法如下:

a.       使用jsp指令<%@ taglib prefix=”html” uri=”http://struts.apache.org/tag-html”%>,导入struts标签。

b.       <html:link action=”struts action的path”/>。非常灵活,struts中推荐使用方法。

注意:使用struts的<html:link>标签的好处:

a.       不必关心web应用程序的路径和struts中央控制器actionServlet的请求映射路径。

b.       可以自动附加jsessionid参数进行url重写。

c.       可以对参数信息进行url编码。

5.Struts1 action的使用注意事项:

(1).Struts1 action是单例和线程不安全的,因此在action中最好不要有可读写的成员变量。

(2).Struts1配置文件中,action的path总以”/”开头。

(3).Struts的action在页面表单中动态配置的方法:

<form action=”<html:rewrite action=’action的path’/>” method=”post”>

(4).struts的action中,可以直接使用response对象向浏览器输出内容,具体做法:

在struts action的execute方法中不要返回actionForward对象,而直接返回null即可。

不建议这样使用,因为没有使用到struts的便利。

注意:struts中<html:link>和<html:rewrite>标签的区别:

<html:link>标签:会生成完整的超链接地址,所以经常用于取代超链接。

<html:rewrite>标签:只会生成url地址,所以常用在form表单的action属性中。

6.Struts ActionFormBean的初始化过程:

Struts中ActionFormBean用于收集请求参数,并将请求参数传递给action进行处理。ActionFormBean的初始化由Struts框架根据需要进行,具体过程如下:

如果某个struts action关联了一个ActionFormBean,当浏览器请求这个action时,struts框架将会创建这个ActionFormBean,把该ActionFormBean存储在相应的web域中,并用请求参数来填充这个ActionFormBean,该ActionFormBean保存的名字就是Action中attribute所配置的值,若attribute没有配置,则默认为name的值。

7.Session的序列化问题:

Struts调用关联ActionFormBean的action时,在服务重启时,需要将session中的ActionFormBean对象序列化到硬盘中,ActionFormBean属性的复杂对象必须实现序列化接口(ActionFormBean的父类ActionForm已经实现序列化),否则会报session序列化错误。

8.Struts的输入校验方法:

使用程序方式对输入参数进行校验的过程如下:

(1).在ActionFormBean中重写validate方法,主要代码如下:

  1. ActionErrors errors = new ActionErrors();
  2. ……
  3. errors.add(“FormBean的属性名”,new ActionMessage(“错误信息”,false));
  4. ……
  5. return errors;

(2).在action中配置校验错误页面input属性。一般input的错误页面为输入页面。

(3).在校验错误页面使用struts标签<html:errors/>显示校验错误信息。

注意:若使用国际化资源文件来显示错误信息的话要做如下改动:

(1).errors.add(“FormBean的属性名”,new ActionMessage(“国际化资源文件中的key”));

(2).在校验错误页面使用struts标签<html:errors proprety=”FormBean属性名”/>显示错误信息。

9.Struts中使用国际化:

使用Struts的<bean:message key=”国际化资源文件中的key”/>标签。

若有多个资源文件时,在struts资源文件配置时,需指定其key属性,在使用资源文件的地方使用bundle属性指定资源文件中配置的key。

10.Struts中Action的校验方法:

在Struts中除了对输入参数进行校验外,也需要对action的业务逻辑进行校验,具体如下:

(1).在Action中重写validate方法:

  1. ActionErrors errors = new ActionErrors();
  2. ……
  3. errors.add(“FormBean属性”,new ActionMessage(错误信息));
  4. ……

(2).将校验错误对象保存在请求对象中,有以下两种方法:

方法1:request.setAttribute(Globals.ERROR_KEY, errors);

方法2:this.saveErrors(request, errors);

注意:当校验错误信息使用国际化资源文件时,需做如下改动:

  1. errors.add(“FormBean属性名”,new ActionMessage(“国际化资源文件的key”, getResources(request).getMessage(getLocale(request), 国际化资源文件的key)));

11.Struts的validator校验框架:

(1).在工程WEB-INF目录下加入struts validator校验框架的校验规则文件validator-rules.xml和注册校验器文件validation.xml。

这两个文件可以从struts官方例子中进行拷贝,在其基础上进行改动。

(2).在struts配置文件struts-config.xml中配置validator校验框架插件:

  1. <plug-in className=”org.apache.struts.validator.ValidatorPlugIn”>
  2. <set-property property=”pathnames”
  3. Value=”/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml”/>
  4. <set-property property=”stopOnFirstError” value=”false”/>
  5. </plug-in>

(3).ActionFormBean不需要在继承ActionForm类,而是需要继承ValidatorForm类,不再需要重新validate方法,struts框架会自动调用validator校验框架进行校验。

12.Struts校验框架注意事项:

(1).如对密码和确认密码这种复杂的校验,可以使用validatewhen校验。

(2).如果需要覆盖某个校验器的提示信息时,可以直接加入如下代码:<msg key=”错误提示信息国际化资源文件” name=”校验器名”/>

(3).如果对一个form的提交、修改等多种操作进行不同的校验时,可以使用如下方法:

a. <form name=”action的path” ……>。

b. Form继承ValidatorActionForm。

(4).对应动态Form校验时,可以使用DynaValidatorForm和DynaValidatorActionForm。

(5).Struts校验框架自动生成javascript校验代码:

<html:javascript formname=”校验框架文件中配的form名字(actionpath也支持)”/>

自动生成的javascript默认的校验方法名是:validate+form名字。

在form表单中通过onsubmit=”return 校验方法名(this)”调用。

13.Struts validator校验框架中校验文件标签:

(1).<field>标签中:<arg>、<msg>等若配resource=”false”,则表明不从国际化资源文件中读取配置,而是直接读取所写内容。

(2).<arg>标签中可以通过position指定参数的位置顺序。

(3).<arg>、<msg>等name属性是指定对于哪一个变量或者校验器的参数或信息,即指定校验主体。

14.Struts validator校验框架dtd文件:

(1).<validator>元素的msg属性相当于该validator附带的一个信息,该msg属性对validator本身不产生任何影响,一般使用msg的key去国际化资源文件中查找对应的信息。

(2).validation.xml文件中的<form>代表一组校验规则,我们可以使用它的name属性值来选择这组规则去对某个javaBean进行校验。

15.Struts中防止表单重复提交:

(1).使用<html:form>标签,会自动生成一个Token字段。

(2).在Action中通过isTokenValid()方法验证Token是否有效。若有效,则使用resetToken(request)方法将Token清除掉。若无效,则直接返回。

16.Struts数据类型转换:

(1).编写一个自定义的转换器类,继承Converter类。

(2).将编写的自定义转换器注册到ConvertUtils类中,如下:

ConvertUtils.register(自定义转换器,目标类型.TYPE/目标数据类型.class);

注意:注册自定义转换器的地方:可以写一个servlet在init中注册转换器,或者继承ActionServlet编写自定义中央控制器,在自定义的控制器的init方法中注册。

17.Struts1自定义转换器的注意事项:

在Struts1中,数据类型转换器是单向的。

在Struts2中,数据类型转换器设双向的。

因此在Struts1中,可以将页面上String类型转换为Date类型,但是在页面回显时却不能将Date类型反向转换为String类型,解决的办法是使用jstl的<fmt>标签库。

如:<fmt value=”${Form名.日期属性名}” pattern=”yyyy-MM-dd” var=”变量名”/>

日期类型就被<fmt>标签转换成了String类型了,然后该变量名就可以通过EL表达式进行引用了。

18.Struts的实用小技巧:

(1).页面上的int类型数据若没有输入值,页面返回时显示值为0,解决方法:给ActionServlet配如下初始化参数:

  1. <init-param>
  2. <param-name>ConvertNULL</param-name>
  3. <param-value>true</param-value>
  4. </init-param>

(2).Struts中的动态FormBean:

动态FormBean不需要手动写ActionForm的javaBean,因此没有属性的get/set方法。

动态Form其实就相当于一个HashMap,通过set(属性名)/get(属性名)来设置和获取属性值。

(3).Struts配置文件中<action>的parameter属性可以向action传递参数。

(4).Struts的action配置中,path属性是必须的,type属性是可选的。

type、forwar、include是三者之间必选一个。

其中type和forward不能同时出现,forward中隐含了type。

19.Struts的plug-in:

(1).作用:将自己的一些程序代码插入进Struts中央控制器ActionServlet的生命周期中,即在ActionServlet启动和停止的过程中加入自己的代码,但不需要编写ActionServlet的子类,相比ContextListener的好处在于可以获得Struts内部的一些特定信息。

(2).编写plug-in的步骤:

a.编写实现PlugIn接口的类。

b.在struts配置文件中配置<plug-in>和<set-property>元素。

20.编写自定义的RequestProcessor:

RequestProcessor用于对请求做一些处理,编写自定义请求处理器的方法如下:

(1).编写继承RequestProcessor的类,覆盖其process方法。

(2).在struts的配置文件中通过<controller>元素标签来配置自定义的RequestProcessor类和其相关属性。

21.Struts中的DispatchAction:

(1).使用DispatchAction时,不能覆盖其execute()方法。

(2).在struts配置文件中,action中应配置parameter属性,以区分DispatchAction中不同的方法。

(3).DispatchAction中,有些请求需要ActionForm,而有些请求则不需要,若ActionForm使用了表单校验的话,struts启动时,不需要表单的action就会报空指针异常,解决方法如下:

通常写两个action,需要表单校验的请求放在一个DispatchAction中,不需要表单校验的请求放在另一个DispatchAction中。

22.MappingDispatchAction:

MappingDispatchAction可以让每个请求对应一个独立的配置。其在struts中的配置方法:

Action的parameter属性的值直接为MappingDispatchAction中具体的方法名,即每个请求对应一个独立的配置,而type却对应同一个类。

23.Struts中常用的Action:

(1).ForwardAction与forward属性:

必须配parameter属性,用于跳转到parameter指定的路径。

注意:ForwardAction还可以简化配置,不用配type,直接配forward属性。

(2).IncludeActionn与include属性:

和ForwardAction与forward属性类似。

(3).DownloadAction:

动态生成文件,供浏览器下载,返回StreamInfo类型。

注意:为了顺利下载文件,最好重写DownloadAction的execute()方法,在执行父类的execute()方法之前设置HTTP头信息处理附件,具体代码如下:

response.setHeader(“Content-Disposition”,”attachment;filename=文件名”);

若自定义写servlet处理的话,还需加入response.setContentType(“application/x-MSdownload”);

(4).LocaleAction:

用于改变客户端的语言信息,读取客户端指定的国际化资源文件。

注意:LocaleAction的语言,国家,跳转页面等参数需要从Form表单中获得。

(5).LookupDispatchAction:

覆盖getKeyMethodMap()方法,作用是多个国际化资源文件按钮对应同一个Action中的同一个方法问题。

注意:按钮国际化资源文件只能放在默认文件中。

24.Struts将xml文件中各个元素映射成相应的java对象原理:

Struts使用Apache的digester框架将xml文件中的各个元素映射成为相应的java对象。

(1).Apache的Commons Digester框架是一套xml to Object API,专门用于将XML文档转换成为相关的javaBean对象,它让开发人员不用编写解析XML和组装JavaBean对象的具体代码和细节。

(2).Digester框架内容应用SAX方式去解析XML文档,在解析XML文档过程中,Digester框架按照预先注册好的规则去处理所遇到的XML数据。

(3).为Digester框架注册规则需提供两个要素:模式(描述xml某个元素的方式)和规则(模式匹配时操作)。

Digester内部维护者一个堆栈。

25.Struts中央控制器ActionServlet init()方法的工作原理:

(1).调用initInternal()方法,初始化struts内部使用的国际化资源包。

(2).调用方法读取ActionServlet的初始化配置参数,对于ConvertNULL参数为ConvertUtils注册相应的转换器。

(3).使用Digester框架从web.xml文件中获取ActionServlet的url请求映射路径。

(4).使用Digester从struts配置文件中生成ModuleConfig对象。

(5).根据ModuleConfig对象生成MessageResource对象,DataSource对象,以及PlugIn对象,并冻结ModuleConfig的设置。

26. Struts中央控制器ActionServlet doGet()和doPost(()方法的工作原理:

(1).doGet()和doPost()方法调用process()方法。

(2).process()方法中先得到与struts配置文件相对应的ModuleConfig对象。

(3).从ModuleConfig对象中获取RequestProcessor对象。

Struts配置文件中可以通过<controller>元素来配置RequestProcessor的类和其相关的属性。

Struts1使用技巧的更多相关文章

  1. Struts1中ActionForward的技巧介绍

    ActionForward是做什么的?他是用来封装转发和重定向路径的. 在struts- config.xml中<forward name="error" path=&quo ...

  2. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  3. 前端极易被误导的css选择器权重计算及css内联样式的妙用技巧

    记得大学时候,专业课的网页设计书籍里面讲过css选择器权重的计算:id是100,class是10,html标签是5等等,然后全部加起来的和进行比较... 我只想说:真是误人子弟,害人不浅! 最近,在前 ...

  4. 前端网络、JavaScript优化以及开发小技巧

    一.网络优化 YSlow有23条规则,中文可以参考这里.这几十条规则最主要是在做消除或减少不必要的网络延迟,将需要传输的数据压缩至最少. 1)合并压缩CSS.JavaScript.图片,静态资源CDN ...

  5. 工欲善其事,必先利其器 之 VS2013全攻略(安装,技巧,快捷键,插件)!

    如有需要WPF工具的朋友可以移步 工欲善其事,必先利其器 之 WPF篇: 随着开发轨迹来看高效WPF开发的工具和技巧 之前一篇<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATI ...

  6. 15个关于Chrome的开发必备小技巧[译]

    谷歌Chrome,是当前最流行且被众多web开发人员使用的浏览器.最快六周就更新发布一次以及伴随着它不断强大的开发组件,使得Chrome成为你必备的开发工具.例如,在线编辑CSS,console以及d ...

  7. Git小技巧 - 指令别名及使用Beyond Compare作为差异比较工具

    前言 本文主要写给使用命令行来操作Git的用户,用于提高Git使用的效率.至于使用命令还是GUI(Tortoise Git或VS的Git插件)就不在此讨论了,大家根据自己的的喜好选择就好.我个人是比较 ...

  8. 【工具使用】mac电脑使用技巧

    本文地址 分享提纲: 1.  mac命令行和finder的交互 2. 一些mac的插件 3. 一些开发的配置 1.mac命令行和findder交互           1)命令行中打开当前文件夹: o ...

  9. Function.prototype.toString 的使用技巧

    Function.prototype.toString这个原型方法可以帮助你获得函数的源代码, 比如: function hello ( msg ){ console.log("hello& ...

随机推荐

  1. JavaWeb -- Jsp 自定义标签的使用

    Jsp中不要有一行Java代码, 需要的Java代码都要封到自定义标签中. 自定义标签的作用: a.  自定义标签除了可以移除jsp页面java代码外,它也可以实现以上功能. b.  控制jsp页面某 ...

  2. JavaScript -- Input Select 操作, 级联菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. volist/foreach下,点击循环中的一个进行操作

    第一种方法,是给点击元素绑定事件,用ajax将值传到控制器中,其中传的值,用jquery选择器选择值. 1.在html中 <foreach name="save" item= ...

  4. 动态链接库(dll)文件的动态调用(使用动态链接库,解析Wis文件--测井数据文件的一种)

    在画出井眼轨迹后,老师又给了三口井的数据,不过这次给的数据是WIS格式的,可以使用一个动态链接库进行解析,解析结束后会生成一个固定格式的txt文件,然后再读取txt文件,画井眼轨迹. 学长给了一个可以 ...

  5. rsync 实现断点续传

    Linux 主机之间即时传送文件,scp命令大家都很熟悉但当要传送的文件较大,过程中如果网络中断了,就比较悲剧了.这时候可以考虑使用rsync命令替代scp,实现断点续传文件. 试验:rsync使用 ...

  6. node_Express安装及检验

    Express安装及检验 因为自己在学习express的安装是时候,遇到了很多问题,相信第一次尝试的你们也会遇到一些安装不成功的问题吧,下面是我查阅了一些资料及借鉴了一些技术大神的经验写的总结,希望可 ...

  7. hive从查询中获取数据插入到表或动态分区

    Hive的insert语句能够从查询语句中获取数据,并同时将数据Load到目标表中.现在假定有一个已有数据的表staged_employees(雇员信息全量表),所属国家cnty和所属州st是该表的两 ...

  8. 太深了,梯度传不下去,于是有了highway。 干脆连highway的参数都不要,直接变残差,于是有了ResNet。 强行稳定参数的均值和方差,于是有了BatchNorm。RNN梯度不稳定,于是加几个通路和门控,于是有了LSTM。 LSTM简化一下,有了GRU。

    请简述神经网络的发展史sigmoid会饱和,造成梯度消失.于是有了ReLU.ReLU负半轴是死区,造成梯度变0.于是有了LeakyReLU,PReLU.强调梯度和权值分布的稳定性,由此有了ELU,以及 ...

  9. 求一些数字字符参数的和(Java)

    一.思路 输入数字(字符型)参数: 将字符型强制转化为整数型: 求和: 输出: 二.流程图 三.源程序代码及结果

  10. HDU - 5730 :Shell Necklace(CDQ分治+FFT)

    Perhaps the sea‘s definition of a shell is the pearl. However, in my view, a shell necklace with n b ...