关于回显:

如果是int型,默认就会回显为0,如果不想让回显,则Integer就好

//**************************************声明式验证**************************************

如果配置文件xml没有提示,需要重新关联tdt:

windows-preferences-xml-xml catalog,看里面有没有要关联的tdt,如果有,先移除再添加。add:

key type : uri

key : tdt路径

然后从fire system中找

 1). 验证分为两种:

     > 声明式验证*

         >> 对哪个 Action 或 Model 的那个字段进行验证
>> 使用什么验证规则
>> 如果验证失败, 转向哪一个页面, 显示是什么错误消息 > 编程式验证 2). 声明式验证的 helloworld I. 先明确对哪一个 Action 的哪一个字段进行验证: age
II. 编写配置文件:
> 把 struts-2.3.15.3\apps\struts2-blank\WEB-INF\classes\example 下的 Login-validation.xml 文件复制到
当前 Action 所在的包下.
> 把该配置文件改为: 把 Login 改为当前 Action 的名字.
> 编写验证规则: 参见 struts-2.3.15.3/docs/WW/docs/validation.html 文档即可.
> 在配置文件中可以定义错误消息: <field name="age">
<field-validator type="int">
<param name="min">20</param>
<param name="max">50</param>
<message>^^Age needs to be between ${min} and ${max}</message>
</field-validator>
</field> > 该错误消息可以国际化吗. 可以 <message key="error.int"></message>. 再在 国际化资源文件 中加入一个键值对: error.int=^^^Age needs to be between ${min} and ${max} III. 若验证失败, 则转向 input 的那个 result. 所以需要配置 name=input 的 result
<result name="input">/validation.jsp</result> IV. 如何显示错误消息呢 ? > 若使用的是非 simple, 则自动显示错误消息.
> 若使用的是 simple 主题, 则需要 s:fielderror 标签或直接使用 EL 表达式(使用 OGNL) ${fieldErrors.age[0] }
OR
<s:fielderror fieldName="age"></s:fielderror>* 3). 注意: 若一个 Action 类可以应答多个 action 请求, 多个 action 请求使用不同的验证规则, 怎么办 ? > 为每一个不同的 action 请求定义其对应的验证文件: ActionClassName-AliasName-validation.xml(AliasName=actionname) > 不带别名的配置文件: ActionClassName-validation.xml 中的验证规则依然会发生作用. 可以把各个 action 公有的验证规则
配置在其中. 但需要注意的是, 只适用于某一个 action 的请求的验证规则就不要这里再配置了. 4). 声明式验证框架的原理: > Struts2 默认的拦截器栈中提供了一个 validation 拦截器 > 每个具体的验证规则都会对应具体的一个验证器. 有一个配置文件把验证规则名称和验证器关联起来了. 而实际上验证的是那个验证器.
该文件位于 com.opensymphony.xwork2.validator.validators 下的 default.xml <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/> 5). 短路验证: 若对一个字段使用多个验证器, 默认情况下会执行所有的验证. 若希望前面的验证器验证没有通过, 后面的就不再验证, 可以使用短路验证 <!-- 设置短路验证: 若当前验证没有通过, 则不再进行下面的验证 -->
<field-validator type="conversion" short-circuit="true">
<message>^Conversion Error Occurred</message>
</field-validator> <field-validator type="int">
<param name="min">20</param>
<param name="max">60</param>
<message key="error.int"></message>
</field-validator> 6). 若类型转换失败, 默认情况下还会执行后面的拦截器, 还会进行 验证. 可以通过修改 ConversionErrorInterceptor 源代码的方式使
当类型转换失败时, 不再执行后续的验证拦截器, 而直接返回 input 的 result Object action = invocation.getAction();
if (action instanceof ValidationAware) {
ValidationAware va = (ValidationAware) action; if(va.hasFieldErrors() || va.hasActionErrors()){
return "input";
}
} 7). 关于非字段验证: 不是针对于某一个字段的验证. <validator type="expression">
<param name="expression"><![CDATA[password==password2]]></param>
<message>Password is not equals to password2</message>
</validator> 显示非字段验证的错误消息, 使用 s:actionerror 标签: <s:actionerror/> 8). 不同的字段使用同样的验证规则, 而且使用同样的响应消息 ? error.int=${getText(fieldName)} needs to be between ${min} and ${max} age=\u5E74\u9F84
count=\u6570\u91CF 详细分析参见 PPT 159. 9). 自定义验证器: I. 定义一个验证器的类 > 自定义的验证器都需要实现 Validator.
> 可以选择继承 ValidatorSupport 或 FieldValidatorSupport 类
> 若希望实现一个一般的验证器, 则可以继承 ValidatorSupport
> 若希望实现一个字段验证器, 则可以继承 FieldValidatorSupport > 具体实现可以参考目前已经有的验证器. > 若验证程序需要接受一个输入参数, 需要为这个参数增加一个相应的属性 II. 在配置文件中配置验证器 > 默认情况下下, Struts2 会在 类路径的根目录下加载 validators.xml 文件. 在该文件中加载验证器.
该文件的定义方式同默认的验证器的那个配置文件: 位于 com.opensymphony.xwork2.validator.validators 下的 default.xml > 若类路径下没有指定的验证器, 则从 com.opensymphony.xwork2.validator.validators 下的 default.xml 中的验证器加载 III. 使用: 和目前的验证器一样. IV. 示例代码: 自定义一个 18 位身份证验证器 Struts2 的验证

struts2的验证笔记

短路验证:

如果一个输入会导致多个错误提示,这个时候我们想要的是,显示一个错误,如果这个错误解决了还有错误,则显示下面的错误,这个时候就用到了短路验证。

<validator  …/> 元素和 <field-validator  …/> 元素可以指定一个可选的 short-circuit 属性,该属性指定该验证器是否是短验证器,默认值为 false。

对同一个字段内的多个验证器,如果一个短路验证器验证失败,其他验证器不会继续校验

如果不想要某种验证,比如验证拦截器,可以修改上个拦截器的源码,不让走下面的拦截器,直接返回某个result

比如验证两次密码相同:

首先继承validationAware,有input这个result,在页面上有<s:actionerror/>  来显示,有验证的xml文件。

他不是字段验证,而是非字段验证,是actionerrors,所以需要在页面上加上<s:actionerror/>  才会出现错误提示

自定义验证器,参考其他已经有的验证器就行

自定义一个 18 位身份证验证器
1、编写验证器类
2、在 validators.xml 文件中进行注册
3、在验证配置文件中使用

**************************************声明式验证**************************************//

//**************************************文件的上传下载**************************************

表单要作的准备如下:

要想使用 HTML 表单上传一个或多个文件
须把 HTML 表单的 enctype 属性设置为 multipart/form-data
须把 HTML 表单的method 属性设置为 post
需添加 <input type=“file”> 字段.

 <s:form action="" method="post" enctype="multipart/form-data">
<s:file name="ppt" label="pptFile"></s:file>
<s:textfield name="desc" label="desc"></s:textfield>
<s:submit></s:submit>
</s:form>

上传页面示例

文件上传和下载或许可以有这样的用途:

动态加载数据,或者提供热更,比如需要更换数据的时候,我就从指定路径去搜索文件,我上传文件覆盖即可。

 ServletContext servletContext = ServletActionContext.getServletContext();
String dir = servletContext.getRealPath("/files/" + fileName);//根目录下的文件

获取服务器根目录下的路径

 1. 文件的上传:

 1). 表单需要注意的 3 点

 2). Struts2 的文件上传实际上使用的是 Commons FileUpload 组件, 所以需要导入

 commons-fileupload-1.3.jar
commons-io-2.0.1.jar 3). Struts2 进行文件上传需要使用 FileUpload 拦截器 4). 基本的文件的上传: 直接在 Action 中定义如下 3 个属性, 并提供对应的 getter 和 setter //文件对应的 File 对象
private File [fileFieldName];
//文件类型
private String [fileFieldName]ContentType;
//文件名
private String [fileFieldName]FileName; 5). 使用 IO 流进行文件的上传即可. 6). 一次传多个文件怎么办 ? 若传递多个文件, 则上述的 3 个属性, 可以改为 List 类型! 多个文件域的 name 属性值需要一致. 7). 可以对上传的文件进行限制吗 ? 例如扩展名, 内容类型, 上传文件的大小 ? 若可以, 则若出错, 显示什么错误消息呢 ? 消息可以定制吗 ? 可以的! 可以通过配置 FileUploadInterceptor 拦截器的参数的方式来进行限制 maximumSize (optional) - 默认的最大值为 2M. 上传的单个文件的最大值 allowedTypes (optional) - 允许的上传文件的类型. 多个使用 , 分割 allowedExtensions (optional) - 允许的上传文件的扩展名. 多个使用 , 分割. 注意: 在 org.apache.struts2 下的 default.properties 中有对上传的文件总的大小的限制. 可以使用常量的方式来修改该限制 struts.multipart.maxSize=2097152 定制错误消息. 可以在国际化资源文件中定义如下的消息: struts.messages.error.uploading - 文件上传出错的消息 struts.messages.error.file.too.large - 文件超过最大值的消息 struts.messages.error.content.type.not.allowed - 文件内容类型不合法的消息 struts.messages.error.file.extension.not.allowed - 文件扩展名不合法的消息 问题: 此种方式定制的消息并不完善. 可以参考 org.apache.struts2 下的 struts-messages.properties, 可以提供更多的定制信息. 2. 文件的下载: 1). Struts2 中使用 type="stream" 的 result 进行下载即可 2). 具体使用细节参看 struts-2.3.15.3-all/struts-2.3.15.3/docs/WW/docs/stream-result.html 3). 可以为 stream 的 result 设定如下参数 contentType: 结果类型
contentLength: 下载的文件的长度
contentDisposition: 设定 Content-Dispositoin 响应头. 该响应头指定接应是一个文件下载类型, 一般取值为 attachment;filename="document.pdf". inputName: 指定文件输入流的 getter 定义的那个属性的名字. 默认为 inputStream bufferSize: 缓存的大小. 默认为 1024
allowCaching: 是否允许使用缓存
contentCharSet: 指定下载的字符集 4). 以上参数可以在 Action 中以 getter 方法的方式提供! 3. 表单的重复提交问题 1). 什么是表单的重复提交 > 在不刷新表单页面的前提下: 
>> 多次点击提交按钮
>> 已经提交成功, 按 "回退" 之后, 再点击 "提交按钮".
>> 在控制器响应页面的形式为转发情况下,若已经提交成功, 然后点击 "刷新(F5)" > 注意:
>> 若刷新表单页面, 再提交表单不算重复提交
>> 若使用的是 redirect 的响应类型, 已经提交成功后, 再点击 "刷新", 不是表单的重复提交 2). 表单重复提交的危害: 3). Struts2 解决表单的重复提交问题: I. 在 s:form 中添加 s:token 子标签 > 生成一个隐藏域
> 在 session 添加一个属性值
> 隐藏域的值和 session 的属性值是一致的. II. 使用 Token 或 TokenSession 拦截器. > 这两个拦截器均不在默认的拦截器栈中, 所以需要手工配置一下
> 若使用 Token 拦截器, 则需要配置一个 token.valid 的 result
> 若使用 TokenSession 拦截器, 则不需要配置任何其它的 result III. Token VS TokenSession > 都是解决表单重复提交问题的
> 使用 token 拦截器会转到 token.valid 这个 result
> 使用 tokenSession 拦截器则还会响应那个目标页面, 但不会执行 tokenSession 的后续拦截器,不会执行目标action方法. 就像什么都没发生过一样! IV. 可以使用 s:actionerror 标签来显示重复提交的错误消息.
该错误消息可以在国际化资源文件中覆盖. 该消息可以在 struts-messages.properties 文件中找到 struts.messages.invalid.token=^^The form has already been processed or no token was supplied, please try again. 4. 自定义拦截器 1). 具体步骤 I. 定义一个拦截器的类 > 可以实现 Interceptor 接口
> 继承 AbstractInterceptor 抽象类 II. 在 struts.xml 文件配置. <interceptors> <interceptor name="hello" class="com.atguigu.struts2.interceptors.MyInterceptor"></interceptor> </interceptors> <action name="testToken" class="com.atguigu.struts2.token.app.TokenAction">
<interceptor-ref name="hello"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<result>/success.jsp</result>
<result name="invalid.token">/token-error.jsp</result>
</action> III. 注意: 在自定义的拦截器中可以选择不调用 ActionInvocation 的 invoke() 方法. 那么后续的拦截器和 Action 方法将不会被调用.
Struts 会渲染自定义拦截器 intercept 方法返回值对应的 result

**************************************文件的上传下载**************************************//

struts2笔记(3)的更多相关文章

  1. struts2笔记(2)

    <context-param> <param-name>pattern</param-name> <param-value>yyyy-MM-dd hh: ...

  2. struts2笔记

    Struts2 中, HTML 表单将被直接映射到一个 POJO,通过params拦截器,类中定义对应属性,及对应set方法即可. Struts2 中,任何一个POJO都可以是一个action类. S ...

  3. struts2笔记4

    1.自定义struts拦截器 应用场景:如果用户登陆后可以访问action中的所有方法,如果用户没有登陆不允许访问action中的方法,并且提示“你没有操作权限” 1)两个页面,一个用户登陆user. ...

  4. struts2 笔记04 杂记

    流程: 1. StrutsPrepareAndExcuteFilter:StrutsPrepareAndExcuteFilter作为前端控制器,是整个Struts2的调度中心. 2. ActionMa ...

  5. struts2 笔记03 异常支持、防止页面刷新和后退、方法验证

    Struts2对异常支持(声明式异常.自动的异常处理), 异常处理(运行期异常事务自动回滚) 1. 自定义异常类,继承RuntimeException或Exception实现构造方法. 2. 配置异常 ...

  6. struts2 笔记02 文件上传、文件下载、类型转换器、国际化的支持

    Struts2的上传 1. Struts2默认采用了apache commons-fileupload  2. Struts2支持三种类型的上传组件 3. 需要引入commons-fileupload ...

  7. struts2 笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用

    Struts2登录 1. 需要注意:Struts2需要运行在JRE1.5及以上版本 2. 在web.xml配置文件中,配置StrutsPrepareAndExecuteFilter或FilterDis ...

  8. Struts2笔记——利用token防止表单重复提交

    在一些项目中经常会让用户提交表单,当用户点击按钮提交后,如果再次浏览器刷新,这就会造成表单重复提交,若是提交的内容上传至服务器并请求数据库保存,重复提交的表单可能会导致错误,然后跳转到错误界面,这是一 ...

  9. Struts2笔记——struts常用标签

    使用struts标签前,首先要配置struts2架构,然后导入标签库,jsp插入如下语句: <%@taglib uri="/struts-tags" prefix=" ...

随机推荐

  1. spring MVC入门教程

    写一个spring mvc后台传值到前台的一个小例子. 分为以下几个步骤: 1.创建web项目. 导入项目包.具体有如下: spring-aop-4.0.4.RELEASE.jar spring-be ...

  2. 设计向 20款优秀免费的Icons图标合集 (转)

    Pioneer Icons Free Sample Sketch Resource Zodiac Icon Set Sketch Resource 90 Pixel Perfect Halloween ...

  3. Web Application Penetration Testing Local File Inclusion (LFI) Testing Techniques

    Web Application Penetration Testing Local File Inclusion (LFI) Testing Techniques Jan 04, 2017, Vers ...

  4. maven打包jar包

    参考http://www.cnblogs.com/justinzhang/p/4983633.html 新建jar类型的maven project (选择simple project ) 配置 < ...

  5. RocketMQ原理解析-Remoting

    Remoting2. 通信层底层传输协议 RocketMq服务器与客户端通过传递RemotingCommand来交互,通过NettyDecoder,对RemotingCommand进行协议的编码与解码 ...

  6. SVN服务器搭建

    一.SVN下载:https://tortoisesvn.net/downloads.html,下载安装步骤百度一下,基本上都是一路点击next即可安装完成. 服务端安装文件: 二.测试是否安装成功,在 ...

  7. 中国计算机学会CCF推荐国际学术会议

    中国计算机学会推荐国际学术会议 (计算机系统与高性能计算) 一.A类 序号 会议简称 会议全称 出版社 网址 1 ASPLOS Architectural Support for Programmin ...

  8. 8Spring初步----青软S2SH(笔记)

    例子: bean.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...

  9. linux查看MySQL版本的四种方法

    1 在终端下执行 mysql -V 2 在help中查找 mysql --help |grep Distrib 3 在mysql 里查看 select version() 4 在mysql 里查看 s ...

  10. Stm32F107VCT6硬件资源

    一直在用stm32系列的单片机,最近因为需要使用到以太网,所以采用了stm32f107vc这款芯片.对于存储资源一直不是非常清楚,今天专门到官网看了一下. 如下: RAM------>64kB ...