上篇博客由Servlet的幾個版本的例子,引出在頁面跳轉控制方面要解決的問題,在文章最後提到了 Struts1,這篇文章目的是解釋一下什麼是Struts1,及如何使用的問題。
什麼是Struts1
說一 下我的理解:它符合MVC思想,使用Java二次開發封裝的一個框架,主要簡化、解決頁面請求分發、跳轉的問 題。Stuts1的優點是使用了豐富的配置文件使得靈活性大大提高;因為已經封裝成框架,使得縮短了開發時間 、提高了開發效率,同時適量使用抽象,使得代碼冗余減低、文件冗余減少,維護更加簡單。
Struts1 各個部件的相互作用如下:
它是一個開源項目,我們可以深入到框架的源碼中,進一步理解Struts1並學習其開發、封裝的思想,非常 利於編程能力的提升。
登錄實例
首先來看一下一個完整的struts1的登錄實例,通過這個實例 中涉及到的Struts1組成,來解釋這些組成,並說明Struts1執行的流程。
文件樹
login.jsp
簡單的登錄驗證界面,僅驗證用戶名和密碼。
<form action="login.do" method="post"> 用戶:<input type="text" name="username" /><br/> 密碼:<input type="text" name="password" /><br/> <input type="submit" value="提交"/> </form>
LoginActionForm
封裝使用到的用戶名和密碼信息,和三層中的實體作用了類 似,這個在以後的文章中會詳細說明。
package com.tgb.struts1; import org.apache.struts.action.ActionForm; /***** * 收集表單數據 * 表單屬性值必須和get/set相對應 * @author Administrator * */ @SuppressWarnings("serial") public class LoginActionForm extends ActionForm { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
LoginAction
用於跳轉請求的邏輯處理和跳轉指向,此處一直跳轉到success標簽中,從下 面的配置文件中,可以看到success代表的是login_success.jsp。
package com.tgb.struts1; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.swing.ActionMap; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; /**** * 調用業務邏輯,返回轉向信息 * @author Administrator * */ public class LoginAction extends Action { @Override public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response) throws Exception { LoginActionForm laf=(LoginActionForm)form; String username=laf.getUsername(); String password=laf.getPassword(); UserManager userManager=new UserManager(); try { userManager.login(username, password); } catch (UserNotFoundException e) { e.printStackTrace(); request.setAttribute("msg", "用戶名未找到"+username); } catch(PasswordWrongException e) { e.printStackTrace(); request.setAttribute("msg", "密碼錯誤"); } return mapping.findForward("success"); } }
UserManager
模擬model和controller的功能。
package com.tgb.struts1; /***** * 邏輯處理,此處以簡答的admin驗證為例 * @author lidab_000 * */ public class UserManager { public void login(String username,String password) { if (!"admin".equals(username)) { throw new UserNotFoundException(); } if (!"admin".equals(password)) { throw new PasswordWrongException(); } } }
配置文件
web.xml
這個是Tomcat讀取的配置文件,在這裡需要指定進入struts的請 求類型和處理此請求的類。
<servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <init-param> <param-name>debug</param-name> <param-value>2</param-value> </init-param> <init-param> <param-name>detail</param-name> <param-value>2</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <!-- Standard Action Servlet Mapping --> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
struts-config.xml
這個是struts讀取的配置文件,在此配置文 件中,需要設置通過截取url指定的處理類、轉向信息、表單封裝的類及其它信息,例如作用域等。
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd"> <struts-config> <form-beans> <form-bean name="loginForm" type="com.tgb.struts1.LoginActionForm" /> </form-beans> <action-mappings> <action path="/login" type="com.tgb.struts1.LoginAction" name="loginForm" scope="request"> <forward name="success" path="/login_success.jsp"/> <forward name="error" path="/login_error.jsp" /> </action> </action-mappings> </struts-config>
運行結果
如果輸入的都是admin,則顯示登錄成功:
流程分 析
使用時序圖分析流程如下:
我來解釋一下這個流程:
用戶輸入用戶名、密碼後提交請求
Tomcat得到請求,根據讀取的web.xml,判斷是否為struts指定的類型(*.do)
如果是struts指定類型,則將請求轉到指定的類文件(ActionServlet.java)
ActionServlet截取請求的url,匹配struts-config文件中的form和action類(LoginActionForm.java和 LoginAction.java)
將提交的表單數據放入form中(LoginActionForm)
執行指定的Action(LoginAction),獲取跳轉信息(login_success.jsp)
ActionServlet執行跳轉
渲染頁面,展現給用戶
這僅僅是從宏觀上struts的執行流程,這僅僅是外在的表現,其內在如何執行?