http://blog.csdn.net/shine0181/archive/2010/10/17/5946393.aspx
输入检验: DEMO
服务端检验: 防止非法数据进入程序,导致程序异常、底层数据库异常。服务器端校验是保证程序有效运行及数据完整的手段
1. 编写校验规则文件
a) 校验规则文件与Aciton 的类文件放在同一路径
b) 校验规则文件名 就是 Aciton 的类名-validatin .xml
2. 页面上使用 表单标签,会输出验 证错误 。或使用<s:fielderror /> 也可以输出
3. 错误提示国际化输出 <s:message key= />
客户端检验: 拒绝误操作输入提交到服务器处理,降低服务器负担, 异常 DEMO
1. 应该用<s:form ../> 生成表单
2. 为<s:form ../> 增加validate="true"
3. [W3] 如果希望国际化,应该把错误信息放到全局 国际化资源中。并用${getText("key")} 的方式来加载国际化消息
Struts2 中有一个小小的问题,当需要使用客户端校验时,如果在校验规则文件 RegistAction-validation.xml 的 <message> 元素中指定了 key 属性,系统将无法从全局国际化资源文件中加载此 key 对应的国际化信息。可以用 $getText("fff")}
如果希望类型转换还有输入检验可以正常工作,记住你的Action 应该继承ActinSupport
转换失败时,系统会跳到input Result ,因此需要配置name="input" 的result ;
国际化提示信息:
字段优先风格 ( 字段校验器配置风格 )
<field name=" 被校验的字段">
<field-validator type=" 检验器名">
<param name="filedName"> 需要被检验的字段</param>
<message key= >
检验器优先风格 ( 非字段校验器配置风格 ) DEMO
<validator type=" 校验器名">
<param name="filedName"> 需要被检验的字段</param>
<message key= >
短路校验器(默认是非短路的)
在<field-validator> 或<validator> 增加属性short-circuit="true" DEMO
校验文件的搜索规则:
Struts2 允许通过为校验规则文件名增加Aciton 别名来指定具体需要校验的处理逻辑
假设系统有两个Action: BaseActin 和RegistAction ,搜索规则文件顺序如下:
BaseAction-validation.xml
BaseAction- 别名-validation.xml
RegistAction-validation.xml
RegistAction- 别名-validation
不管有没有规则文件,也不管是否找到,系统都会按顺序一直找下去的
校验顺序和短路:
校验器的执行顺序规则:
所有非字段风格的校验器优先于字段风格的校验器
所有非字段风格的校验顺中,排在前面的会先执行
所有字段风格的校验器中,排在前面的会先执行
校验器短路的原则:
所有非字段校验器是最先执行的,如果某个非字段校验顺校验失败了,是此字段上所有字段校验器都都不会获得校验机会
非字段校验器的校验失败,不会阻止其他非字段校验的执行
如果一个字段校验器校验失败后,则此字段下且排在此校验失败的校验器之后的其他字段校验器不会获得校验的机会
字段校验器永远不会阻止非字段校验器的执行
开发自己的校验器:
新建一个validator.xml 放到classes 中,
<validators >
<validator name= class= ><validator>
</validators >
如果struts2 系统在WEB-INF/CLASS 路径下找到一个validator.xml ,则不会再加载指纹默认的default.xml 文件,所以要把default.xml 文件中原有的校验器复制到自己建立的validator.xml 文件中去
输入校验的手动校验:
1. 在Action 类里重写validate() 方法( DEMO ) 或 validate 处理方法() 方法。
比如你的处理方法名为abc 。
那么你应该重写validateAbc() 方法。 ( DEMO )
只要系统调用Action 里的处理方法来处理用户请求,validate() 方法都会被执行。
只有当系统调用Action 里abc 方法来处理用户请求时,validateAbc() 方法才会被执行。
2. 实现这些方法很简单:
程序先判断某个字段是否满足要求,
如果字段不满足要求,调用addFieldError() 向Action 关联的容器中添加fielderror 消息。
ActionSupport 提供了addFieldError() 、addActionError 、addActionMessage()
向Action 所关联的3 个容器添加消息,下面3 个标签就用于遍历、并输出对应容器中消息。
<s:fielderror /> :输出类型转换失败、输入校验失败的错误提示。
<s:actionerror />
<s:actionmesssage />
内建校验器:
<param name= "trim" > true </param> // 指定载断被校验属性值前后的空白
struts2 文件上传: DEMO ( 这个有点问题 ) 课堂实例 DEMO
1. 页面上的表单必须增加 enctype="multipart/form-data" [W1]
2. 选择文件上传的底层支持。
默认使用Common-FileUpload 。 [W2]
需要说明的是:无论你使用何种文件上传支持,你上层的编码几乎不需要改变。
因为Struts2 已经为你做了很好的封装。
表单的 enctype 属性指定的是表单数据的编码方式:
applicaiton/x-www-form-urlencoded :默认的编码方式,它只处理表单域里的 value 属性值,采用这种编码方式的表单会将表单域的值处理成 URL 编码方式;
multipart/form-data :以二进制的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数里;
tet/pain :当表单的 action 属性为 mailto:URL 的形式时比较方便,适用于直接通过表单发送邮件方式。
一旦设置了 enctype="multipart/form-data" ,服务器端就不能通过 request.getParameter() 方法来取得参数
在 struts.properties 配置文件中
# 指定使用 COS 文件上传解析器
#struts.multipart.parser=cos
# 指定使用 Pell 的文件上传解析器
#struts.multipart.parser=pell
# 默认使用 Jakarta 的 Common-FileUpload 的文件上传解析器 ( 不用指定的 )
#struts.multipart.parser=jakarta
3. 实现Action
一个文件上传域,在Action 里对应3 个field 。比如name 为abc 的文件上传域,需要
File abc ;
String abcFileName;
String abcContentType;
至于文件上传,就是将File 类型参数中数据写入本地磁盘。
ActionSupport 提供了addFieldError () 、addActionError 、addActionMessage ()
向Action 所关联的3 个容器添加消息,下面3 个标签就用于遍历、并输出对应容器中消息。
<s:fielderror /> :输出类型转换失败、输入校验失败的错误提示。
<s:actionerror />
<s:actionmesssage />
同时上传多个文件?而且我不确定有多少个文件,怎么办?
1 。 页面上的文件上传域可通过JS 来动态地增加。、
2 。 Action 里用数组来代表多个文件。
文件过滤 (只允许上传指定大小的文件、只允许上传指定类型的文件)
1. 用代码过滤 手动 DEMO
通过File 类型的属性来进行文件大小过滤。
也通过xxxContentType 属性进行文件类型过滤。
2. 用拦截器过滤。 拦截器 DEMO
使用fileUplod 拦截器,使用该拦截器时指定如下两个参数:
allowTypes :指定所有允许上传的文件类型。
maximumsize :指定允许上传的文件大小。
如果你要上传的文件超过了指定大小,或者不是允许的文件类型。
系统会跳转到input 视图。
fileUpload 拦截器必须配置在defaultStack 拦截器栈之前。
3. 当上传的文件大小超出、或文件类型不允许时,
系统会将错误提示添加成fielderror 。
所以可通过<s:fielderror/> 或Struts 2 的theme="xhtml" 的表单标签来输出错误提示。
国际化错误提示:
上传文件太大的提示信息的key 是:"struts.messages.error.file.too.large"
不允许上传的文件的key 为:struts.messages.error.content.type.not.allowed
未错误 struts.messages.error.Uploading
struts2 文件下载: DEMO
根据MVC 规范,应用请求并不能直接向指定资源发送。
1. 如果文件名是中文,就出问题
2. 如果应用程序需要在用户下载之前做进一步检查,比如我们要检查用户权限,有权限的人才可以下载,没有权限的人就不能下载
更好的做法:为了保护某些资源,我们考虑将一些受保护的资源放入/WEB-INF/ 路径下,那么/WEB-INF/ 是被保护的,用户不能直接访问WEB-INF 下的任何资源。
Struts2 为文件下载提供了stream 的结果类型
实现下载的Action :
下载的Action 应该提供一个getter 方法,此getter 方法的返回值类型是InputStream
拦截器:interceptors
拦截器,一个处理类用于完成一个特定的、小粒度的功能
拦截器栈,将多个小粒度的拦截器组合成一个完成较大功能的、较大粒度的“拦截器”
Struts2 配置了一个默认的拦截器,它会引用系统的defaultStack .
对于绝大部分开发者,直接在应用中l 默认的拦截器就足够了
拦截方法的拦截器 DEMO
拦截器的权限控制 DEMO
Intercept(ActinInvocation invocation) 方法是用户需要实现的拦截动作。就像 Action 的 execute 方法一样, intercept 方法会返回一个随行人员中作为逻辑视力。如果此方法直接返回不念旧恶随行人员中,系统将会跳转到此逻辑视图对应的实际视图资源,不会调用被拦截的 Action 。此方法的 AvtionInvocation 参数包括了被拦截的 Action 引用,可以通过调用此参数的 invoke 方法,将控制权转给下一个拦截器,或者转给 Action 的 ececute 方法
HTTP1.1 相比HTTP1.0 最大的区别在于:
HTTP1 。1 支持持久连接,在一个TCP 连接上可以传送多个H TTP 请求和响应、减少了建立和关闭连接的消耗和延迟。
HTTP1 。1 还允许客户端不用等待上一次结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序 依次返回响应结果,以保证客户端能够区分出每次请求的响应内容,这样也显著地减少整个下载过程所需要的时间
小软件httplook