上篇博客由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的執行流程,這僅僅是外在的表現,其內在如何執行?