Struts的工作流程

来源:互联网 发布:孚盟软件价格 编辑:程序博客网 时间:2024/06/11 21:01

 对于采用Struts框架的Web应用,在Web应用启动时就会加载并初始化ActionServletActionServletstruts- config.xml文件中读取配置信息,把它们存放到各种配置对象中,例如Action的映射信息存放在ActionMapping对象中。

   ActionServlet接受到一个客户请求时,将执行如下流程。

流程:

1)减缩和用户请求匹配的ActionMapping实例,如果不存在,就返回用户请求路径无效的信息。
2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中。
3)根据配置信息决定是否需要表单验证。如果需要验证,就调用ActionFormvalidate()方法。
4)如果ActionFormvalidate()方法返回null或返回一个不包含ActionMessageActionErrors对象,就表示表单验证成功。
5ActionServlet根据ActionMapping实例包含的映射信息决定将请求转发给哪个Action。如果相应的Action实例不存在,就先创建这个实例,然后调用Actionexecute()方法。
6Actionexecute()方法返回一个ActionForward对象,ActinoServlet再把客户请求转发给ActionForward对象只想的JSP组件。
7ActionForward对象指向的JSP组件生成动态网页,返回给客户。

   对于以上流程的流程(4),如果ActionFormvalidate()方法返回一个或多个ActionMessageActionErrors对象,就表示表单验证失败,此时ActionServlet将直接把请求转发给包含用户提交表单的JSP组件。再这种情况下,不会再创建Action对象并调用Actionexecute()方法。

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>元素指定的ActionServletActionServlet根据用户请求路径"/loginAction.do",struts配置文件中检索path属性为"/loginAction" <action>元素

<action-mappings>
<action path="/loginAction" name="loginActionForm" type="test.LoginAction">
<forward name="succ" path="/index.jsp"></forward>
<forward name="fail" path="/login.jsp"></forward>
</action>
</action-mappings>

4:ActionServlet根据<action>元素的name属性,创建一个LoginActionForm对象,把提交的表单数据传给LoginActionForm.

LoginActionForm作为参数传入LoginAction类中。

public class LoginAction extends Action {

public ActionForward execute(ActionMapping arg0, ActionForm arg1, HttpServletRequest arg2, HttpServletResponse arg3) throws Exception {
LoginActionForm loginActionForm=(LoginActionForm)arg1;
String name=loginActionForm.getName();
String password=loginActionForm.getPassword();
if(name.equals(password))
return(arg0.findForward("succ"));
else
return(arg0.findForward("fail"));
}
}


这样,在LoginAction类中,就可以得到表单中的数据。在进行完业务逻辑的验证之后,根据不同的情况,返回不同的ActionForward对象。

在这里,当用户名等于密码时,转向"succ".这时ActionMapping.findforward()方法从<action>元素中寻找name属性为"succ"<forward>子元素,然后返回与之对应的ActionForward对象,他代表的请求转发路径为"/index.jsp".

同样的道理,当验证失败时,转向"login.jsp",等待重新输入用户名密码。

原创粉丝点击