posts - 120,  comments - 19,  trackbacks - 0
一、表单验证的流程

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

只有注册用户登录后才能发表评论。


网站导航: