首先页面上的数据请求被发送到服务器,此时的请求先进入到前端控制器(ActionServlet)。ActionServlet再将请求转发给后 端控制器(Action),在转发中顺便送了一份礼物form(ActionForm),在Action中对form中的数据做实际的处理操作并返回一份 礼物forward(ActionForward)给ActionServlet,ActionServlet收到这份礼物后根据其中的关键字从 struts配置文件Struts-config.xml中获取具体的跳转页。
那么ActionServlet是怎么知道该找哪个后端控制器呢?又是怎么知道返回的ActionForward具体是什么呢?为了回答这个问题,我们参考一个用Struts做的登陆程序。
那么ActionServlet是怎么知道该找哪个后端控制器呢?又是怎么知道返回的ActionForward具体是什么呢?为了回答这个问题,我们参考一个用Struts做的登陆程序。
登陆表单代码:
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>struts工作流程分析</title>
- </head>
- <body>
- <form action="login.do" method="POST">
- 用户名:<input type="text" name="userName"><br/>
- 密码:<input type="password" name="userPwd"><br/>
- <input type="submit" value="登录">
- </form>
- </body>
- </html>
LoginAction代码:
- package cn.ineeke.action;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.struts.action.Action;
- import org.apache.struts.action.ActionForm;
- import org.apache.struts.action.ActionForward;
- import org.apache.struts.action.ActionMapping;
- import cn.ineeke.form.LoginForm;
- /**
- *作者:Neeke
- *BLOG:http://www.ineeke.cn
- */
- public class LoginAction extends Action {
- @Override
- public ActionForward execute(ActionMapping mapping, ActionForm form,
- HttpServletRequest request, HttpServletResponse response)
- throws Exception {
- LoginForm loginForm = (LoginForm)form;
- String forwardName = "failure";
- if(loginForm.getUserName().equals("neeke") && loginForm.getUserPwd().equals("123456")){
- forwardName = "success";
- }
- return mapping.findForward(forwardName);
- }
- }
LoginForm代码:
- package cn.ineeke.form;
- import org.apache.struts.action.ActionForm;
- public class LoginForm extends ActionForm {
- private String userName = null;
- private String userPwd = null;
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- public String getUserPwd() {
- return userPwd;
- }
- public void setUserPwd(String userPwd) {
- this.userPwd = userPwd;
- }
- }
Struts-config.xml文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd">
- <struts-config>
- <form-beans>
- <form-bean name="loginForm" type="cn.ineeke.form.LoginForm"></form-bean>
- </form-beans>
- <action-mappings>
- <action path="/login" type="cn.ineeke.action.LoginAction" name="loginForm">
- <forward name="success" path="/success.jsp"></forward>
- <forward name="failure" path="/failure.jsp"></forward>
- </action>
- </action-mappings>
- <message-resources parameter="cn.ineeke.struts.ApplicationResources" />
- </struts-config>
当 我们的表单提交给login.do的时候,ActionServlet就会去读取Struts-config.xml文件并根据<action path="/login" type="cn.ineeke.action.LoginAction" name="loginForm">中的type属性找到具体的后端控制器LoginAction,与此同时又根据name属性找到< form-bean name="loginForm" type="cn.ineeke.form.LoginForm"></form-bean>并将表单中的数据存储在 LoginForm的实例中(这个实例就是前端控制器送给后端控制器的礼物了),在LoginAction的execute方法中进行数据处理并返回一个 ActionForward对象(回赠一份礼物)给ActionServlet。最后ActionServlet再根据这份礼物的关键字在
<forward name="success" path="/success.jsp"></forward>
<forward name="failure" path="/failure.jsp"></forward>
中进行查找,并跳转到相应的path。