一、表单验证的流程
在
hello.jsp
网页上,不输入姓名,直接单击【
Submit
】
按钮,会看到如图
2-6
所示的网页。
图
2-6
表单验证失败的
hello.jsp
网页
当客户提交
HelloForm
表单时,
请求路径为
“
/HelloWorld.do
”:
<html:form action="/HelloWorld.do" focus="userName" >
服务器端执行表单验证流程如下。
(
1
)
Servlet
容器在
web.xml
文件中寻找
<url-pattern>
属性为“
*.do
”的
<servlet-mapping>
元素:
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
(
2
)
Servlet
容器依据以上
<servlet-mapping>
元素的
<servlet-name>
属性“
action
”,在
web.xml
文件中寻找匹配的
<servlet>
元素:
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
</servlet>
(
3
)
Servlet
容器把请求转发给以上
<servlet>
元素指定的
ActionServlet
,
ActionServlet
依据用户请求路径
“
/HelloWorld.do
”,
在
Struts
配置文件中检索
path
属性为
“
/HelloWorld
”
的
<action>
元素
:
<action path = "/HelloWorld"
type = "hello.HelloAction"
name = "HelloForm"
scope = "request"
validate = "true"
input = "/hello.jsp"
>
<forward name="SayHello" path="/hello.jsp" />
</action>
|
更确切地说,
ActionServlet
此时检索的是
ActionMapping
对象,而不是直接访问
Struts
配置文件中的
<action>
元素。因为
在
ActionServlet
初始化的时候,会加载
Struts
配置文件,把各种配置信息保存在相应的配置类的实例中,例如
<action>
元素的配置信息存放在
ActionMapping
对象中。
|
(
4
)
ActionServlet
根据
<action>
元素的
name
属性,创建一个
HelloForm
对象,把客户提交的表单数据传给
HelloForm
对象,再把
HelloForm
对象保存在
<action>
元素的
scope
属性指定的
request
范围内。
(
5
)由于
<action>
元素的
validate
属性为
true
,
ActionServlet
调用
HelloForm
对象的
validate()
方法执行表单验证:
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if ((userName == null) || (userName.length() < 1))
errors.add("username", new ActionMessage("hello.no.username.error"));
return errors;
}
(
6
)
HelloForm
对象的
validate()
方法返回一个
ActionErrors
对象,里面包含一个
ActionMessage
对象,这个
ActionMessage
对象中封装了错误消息,消息
key
为“
hello.no.username.error
”
,
在
Resource Bundle
中与值匹配的消息文本为:
hello.no.username.error=Please enter a <i>UserName</i> to say hello to!
(
7
)
ActionServlet
把
HelloForm
的
validate()
方法返回的
ActionErrors
对象保存在
request
范围内,然后根据
<action>
元素的
input
属性,把客户请求转发给
hello.jsp
。
(
8
)
hello.jsp
的
<html:errors>
标签从
request
范围内读取
ActionErrors
对象,再从
ActionErrors
对象中读取
ActionMessage
对象,把它包含的错误消息显示在网页上。
二、
逻辑验证失败的流程
接下来在
hello.jsp
的
HTML
表单中输入姓名“
Monster
”,然后单击【
Submit
】
按钮。当服务器端响应客户请求时,验证流程如下。
(
1
)表单验证
的流程(
1
)~(
4
)。
(
2
)
ActionServlet
调用
HelloForm
对象的
validate()
方法,这次
validate()
方法返回的
ActionErrors
对象中不包含任何
ActionMessage
对象,表示表单验证成功。
(
3
)
ActionServlet
查找
HelloAction
实例是否存在,如果不存在就创建一个实例。然后调用
HelloAction
的
execute()
方法。
(
4
)
HelloAction
的
execute()
方法先进行逻辑验证,由于没有通过逻辑验证,就创建一个
ActionMessage
对象,这个
ActionMessage
对象封装了错误消息,消息
key
为“
hello.dont.talk.to.monster
”,在
Resource Bundle
中与值匹配的消息文本为:
hello.dont.talk.to.monster=We don't want to say hello to Monster!!!
execute()
方法把
ActionMessage
对象保存在
ActionMessages
对象中,再把
ActionMessages
对象存放在
request
范围内。最后返回一个
ActionForward
对象,该对象包含的请求转发路径为
<action>
元素的
input
属性指定的
hello.jsp
。
以下是
execute()
方法中进行逻辑验证的代码:
ActionMessages errors = new ActionMessages();
String userName = (String)((HelloForm) form).getUserName();
String badUserName = "Monster";
if (userName.equalsIgnoreCase(badUserName)) {
errors.add("username", new ActionMessage("hello.dont.talk.to.monster", badUserName ));
saveErrors(request, errors);
return (new ActionForward(mapping.getInput()));
}
(
5
)
ActionServlet
依据
HelloAction
返回的
ActionForward
对象,再把请求转发给
hello.jsp
。
(
6
)
hello.jsp
的
<html:errors>
标签从
request
范围内读取
ActionMessages
对象,再从
ActionMessages
对象中读取
ActionMessage
对象,把它包含的错误消息显示在网页上,
如图
所示。
逻辑验证失败时的
hello.jsp
网页
三
、逻辑验证成功的流程
接下来,在
hello.jsp
的
HTML
表单中输入姓名“
Weiqin
”,然后单击【
Submit
】
按钮。当服务器端响应客户请求时,流程如下。
(
1
)重复
二
的流程(
1
)~(
3
)。
(
2
)
HelloAction
的
execute()
方法先执行逻辑验证,这次通过了验证,然后执行相关的业务逻辑,最后调用
ActionMapping.findForward()
方法,参数为
“
SayHello
”:
// Forward control to the specified success URI
return (mapping.findForward("SayHello"));
(
3
)
ActionMapping.findForward()
方法从
<action>
元素中寻找
name
属性为
“
SayHello
”的
<forward>
子元素,然后返回与之对应的
ActionForward
对象,它代表的请求转发路径为“
/hello.jsp
”。
|
更确切地说,
ActionMapping
从本身包含的
HashMap
中查找
name
属性为
“
SayHello
”
的
ActionForward
对象。在
ActionServlet
初始化时会加载
Struts
配置文件,把
<action>
元素的配置信息存放在
ActionMapping
对象中。
<action>
元素中可以包含多个
<forward>
子元素,每个
<forward>
子元素的配置信息存放在一个
ActionForward
对象中,这些
ActionForward
对象存放在
ActionMapping
对象的
HashMap
中。
|
(
4
)
HelloAction
的
execute()
方法
然后把
ActionForward
对象返回给
ActionServlet
,
ActionServlet
再把客户请求转发给
hello.jsp
。
(
5
)
hello.jsp
的
<bean:message>
标签从
Resource Bundle
中读取文本,把它们输出到网页上,最后生成
动态网页,如图
所示。
通过数据验证的
hello.jsp
网页
posted on 2006-08-17 20:22
阿成 阅读(1894)
评论(0) 编辑 收藏 所属分类:
Struts