0hi猿团提供了移动跨平台开发视频,包括html5,apicloud appcan,dcloud,具体请看http://www.9y.cm
Token解决重复提交
1.消息文件
消息文件用于存放本地化消息文本。
消息文件只是一个文本文件,它包含的是”关键字/值”对。
在struts-config.xml通过<message-resources>元素定义消息文本:
<message-resources parameter="com.hello.ApplicationResources" />
<message-resources>标签的主要属性是 parameter 属性,它给出了应用程序的消息文件相对于web应用程序的/web-inf/classes/目录的位置,因此前面的声明中,消息文件的位置/web-inf/classes/com/hello/Application.properties.
在该声明中,.properties扩展名是隐含的。
以下是Helloapp案例中资源文件:
ApplicationResources.properties中的内容:
hello.no.userName.error=<font color="red">Please enter a userName to say hello to!</font>
hello.dont.talk.to.monster=<font color="red">We don't want to say hello to monster!</font>
2.ActionFormBean(2)—表单验证
当用户提交了 HTML 表单后,Struts框架将自动把表单数据组装到ActionForm Bean中。如果Struts-config.xml中的<action>的validate属性值设为true(默认值为true),接下来Struts框架会自动调用ActionForm Bean的validate()方法进行表单验证。
Public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request)
如果validate()方法返回的ActionErrors对象为null,或者不包含任何ActionMessage对象,就表示没有错误,表单验证通过。
如果ActionErrors中包含ActionMessage对象,就表示发生了验证错误,Struts框架会把ActionErrors对象保存到request范围内,然后把请求转发到刚才的Struts-config.xml中的<action>的input中,视图组件通过<html:errors/>标签把request范围内的 ActionErrors 对象中包含的错误消息显示出来,提示用户修改错误。
3.ActionFormBean(2)—表单验证
(1)ActionErrors:类似 HashMap,用于保存错误信息,这些信息按照关键字(key)进行索引。错误消息不是一个字符串,而是一个ActionMessage实例。
ActionErrors通过add()方法添加ActionMessage
ActionMessage的构造器:public ActionMessage(String key),这里边的key必须是保存在消息资源文件中的错误消息的一个关键字
(2)如果validate()方法返回的ActionErrors对象为null,或者不包含任何ActionMessage对象,就表示没有错误,表单验证通过。
如果ActionErrors中包含ActionMessage对象,就表示发生了验证错误,Struts框架会把ActionErrors对象保存到request范围内,然后把请求转发到的Struts-config.xml中的<action>的input属性定义的web中,视图组件通过<html:errors/>标签把request范围内的 ActionErrors 对象中包含的错误消息显示出来,提示用户修改错误。
(3)<html:errors>标签:
可以将这个标签放入任何包含表单的JSP中,紧跟口令字段
<html:errors>标签在 request 和 session范围内寻找 ActionMessages(或其子类ActionErrors),在从 ActionMessages 集合对象中读取 ActionMessage 对象,把 ActionMessage 对象包含的消息文本显示到网页上。
ActionErrors,ActionMessage,属性文件,错误关键字以及错误标签之间的关系:
4.复杂验证
Struts 框架的数据验证可以分为两种
表单验证
业务逻辑验证
业务逻辑验证通过Action的子类完成,在很多情况下,需要模型组件的介入,才能完成业务逻辑验证:根据逻辑验证的不同情况给客户返回不同的视图组件
boolean isMonster = new HandleUser().helloUser(user);
if(isMonster){
ActionMessages errors = new ActionMessages();
errors.add("monster", new ActionMessage("hello.dont.talk.to.monster"));
this.saveErrors(request, errors);
return mapping.getInputForward();
}else{
request.setAttribute("userName",userName);
return mapping.findForward("hello");
}
关于 ActionMessages 和 ActionErrors:
ActionMessages 是 ActionErrors 的父类
除 FormBean 的 validate() 的返回值用 ActionErrors 外,其它地方均使用ActionMessages.
saveErrors()方法:
protected void saveErrors (HttpServletRequest?request,
ActionMessages?errors)
在Action基类中定义,负责把ActionMessages对象保存在request范围内
5.HTML 标签
在HTML标签库中的定制标签本质上与平常的HTML<form>标签及其相关的输入标签是一对一的关系。这一标签库的目的是把视图组件联系到控制器组件上。
当struts被请求一个页面的时候,它首先将页面的struts标签都替换为必要的文本数据
如果页面中包含一个表单,那么struts将进行表单数据处理。如验证失败并且返回原表单界面,则该视图组件在显示错误信息的同时,提交前的表单也会被自动的显示出来
6.常用HTML标签概要
标签 用途/注解
html 产生一个<html>标签。也包括来自于用户会话中的 language 属性
form 定义一个表单。Action 和 focus 属性是最有用的属性
checkbox 产生一个检查框字段
file 产生一个文件选择输入字段
hidden 产生一个隐藏字段
option 产生一个选择项
options 产生一个选择项列表
password 产生一个口令输入字段
radio 产生一个单选输入字段
select 产生一个选择元素
text 产生一个文本输入字段
textarea 产生一个 html 文本区域元素
image 产生一个图像输入字段
button 产生一个按钮输入字段
cancel 产生一个取消按钮
submit 产生一个提交按钮
reset 产生一个重新设定按钮
errors 显示错误消息
img 产生一个 html img 标签
7.Token解决重复提交
在某些情况下,如果用户对同一个 HTML 表单多次提交,Web应用必须能够判断用户的重复提交行为,以做出相应的处理
可以利用同步令牌(Token)机制解决web应用中重复提交的问题。
8.Token解决重复提交
Action类中的相关方法:
protected boolean isTokenValid(HttpServletRequest request)
判断存储在当前用户会话中的令牌值和请求参数中的令牌值是否匹配,匹配返回 true。
protected void resetToken(HttpServletRequest request)
从当前 session 范围内删除令牌属性
protected void saveToken(HttpServletRequest request)
创建一个新的令牌,并把它保存在当前 session 范围内。
具体的 Token 处理逻辑由 org.apache.struts.util.TokenProcessor 类完成,根据用户会话 id 和当前系统时间生成一个唯一的令牌