Struts框架執行流程

00潤物無聲00發表於2017-01-22

  上篇部落格Struts2,Hibernate,Spring 環境配置,介紹了三個框架各自的初始化配置,那麼單獨的Struts框架是如何執行的,通過一個例子分析一下整個流程。

在已經配置好環境的基礎上。


一.建立工程

1.建立action,直接執行方法返回頁面

package com.dynamic.oa.test;
import com.opensymphony.xwork2.ActionSupport;
public class ActionTest extends ActionSupport {
	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;
	}
//返回input頁面
	public String input() throws Exception
	{
		return "input";
	}
	//返回success頁面
	public String success() throws Exception
	{
		return "success";
	}
	
}


2.根據Struts-2.0.dtd中的內容配置,並結合業務配置Struts.xml

從Struts的核心開發包中,src\core\src\main\resources目錄下找到dtd檔案,該檔案介紹了整個Struts.xml的配置格式。

	<package name="default" namespace="/" extends="struts-default">
	
		<action name="actionTest_*" class="com.dynamic.oa.test.ActionTest" method="{1}">
			<result name="input">WEB-INF/jsp/input.jsp</result>
			<result name="success">WEB-INF/jsp/success.jsp</result>
		</action>
	</package>


3.在WEB-INF,建立jsp資料夾,並建立2個jsp頁面

  將jsp頁面放到WEB-INF下,這樣客戶端直接請求jsp頁面是訪問不到的。必須通過action請求來訪問。

input.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<body>

	<form action="actionTest_success.action">
		username:<input name="username" type="text"> <br>
		password:<input name="password" type="text"> <br>
		               <input type="submit" value="submit">
	</form>
</body>
</html>

success.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  <body>
 username:${requestScope.username}<br>
password:${requestScope.password}
  </body>
</html>

二.執行流程




三.分析:

  1.當客戶端發出請求後,所有的請求都會通過web.xml,通過StrutsPrepareAndExecuteFilter過濾器被Struts管轄。該過濾器處理Struts排程過程的準備和執行階段.prepare與execute,前者表示準備,可以說是指filter中的init方法,即配製的匯入;後者表示進行過濾,指doFilter方法,即將request請求,轉發給對應的 action去處理。


  2.找到對應的action,上面的程式碼使用了萬用字元對映的方式

    在struts.xml檔案中配置<action…>元素時,它的name、class、method屬性都可支援萬用字元,這種萬用字元的方式是另一種形式的動態方法呼叫。
  當我們使用萬用字元定義Action的name屬性時,相當於用一個元素action定義了多個邏輯Action: 

		<action name="actionTest_*" class="com.dynamic.oa.test.ActionTest" method="{1}">
			<result name="input">WEB-INF/jsp/input.jsp</result>
			<result name="success">WEB-INF/jsp/success.jsp</result>
		</action>
    如上,<action name=”actionTest_*”>定義一系列請求URL是actionTest_*.action模式的邏輯Action。同時method屬性值為一個表示式{1},表示它的值是name屬性值中第一個*的值。例如:使用者請求URL為actionTest_input.action時,將呼叫到ActionTest類的input方法;使用者請求URL為actionTest_success.action時,將呼叫到ActionTest類的success方法。


 3.在ActionTest中執行方法後,返回字串,該字串配置Struts.xml檔案中<action>元素下的<result>元素的name屬性的值,並轉到對應的jsp頁面。


四.總結

  通過一個簡單的例子,從流程上分析了Struts框架的基本執行過程,有了這個瞭解,再分析原始碼的執行流程。




相關文章