天天看點

Struts2 詳解

Struts2 詳解

前面我們通過下面兩篇部落格,已經對 Servlet 有了比較深刻的了解,那麼接下來我們詳細介紹 Servlet 的更新版架構----Struts2

     Servlet 詳解:http://www.cnblogs.com/ysocean/p/6912191.html

     改進 Sevlert ----Struts2入門: http://www.cnblogs.com/ysocean/p/6913484.html

首先我們還是回顧一下 Servlet 的缺點:

  ①、一個請求對應一個 Servlet,即每一個請求我們都需要在 web.xml 檔案中配置映射。如果項目大,請求很多,那麼會造成 web.xml 很大,很難維護。

  ②、即便在好幾個請求對應一個 Servlet,即在 service() 方法中,通過 if--else 語句來判斷執行的代碼塊。那這樣就會造成 service() 方法很擁擠。

  ③、一個項目隻存在一個 web.xml 檔案,如果一個項目是多人開發,那麼整合代碼開發過程中會有很多問題。不适合團隊開發。

  ④、Servlet中doGet方法和doPost方法中的兩個參數reqeust,response擁有嚴重的容器依賴性。

  ⑤、如果頁面上表單中的元素比較複雜,則在Servlet的方法中擷取表單元素的資料比較繁瑣。

  ⑥、Servlet是單線程的,隻要在Servlet中的聲明一個執行個體變量,那麼該變量在多線程通路時就會有線程安全問題。

  ⑦、在Servlet中處理異常,如果Servlet中有N個方法,則這N個方法必須都要try--catch。因為子類抛的異常不能大于父類。

  而在這篇部落格中:改進 Sevlert ----Struts2入門: http://www.cnblogs.com/ysocean/p/6913484.html 我們已經解決了相應的一些問題,但是并沒有完全解決。而完全解決的辦法就是我們這篇文章的主角------Struts2

1、什麼是 Struts2 ?

  Struts2是一個基于MVC設計模式的Web應用架構,它本質上相當于一個servlet,在MVC設計模式中,Struts2作為控制器(Controller)來建立模型與視圖的資料互動。Struts 2是Struts的下一代産品,是

struts 1和WebWork的技術基礎上進行了合并的全新的Struts 2架構。其全新的Struts 2的體系結構與Struts 1的體系結構差别巨大。Struts 2以WebWork為核心,采用攔截器的機制來處理使用者的請求,這樣的

設計也使得業務邏輯控制器能夠與ServletAPI完全脫離開,是以Struts 2可以了解為WebWork的更新産品。雖然從Struts 1到Struts 2有着太大的變化,但是相對于WebWork,Struts 2的變化很小。

2、Struts2 入門執行個體(先不管原理是什麼,先看是怎麼實作的)

  第一步:建立一個 web 工程,并将相應的 jar 包複制到 lib 目錄下

  

Struts2 詳解
   第二步:在 WEB-INF 目錄下,建立 web.xml 檔案,并添加 struts2 攔截器

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns="http://java.sun.com/xml/ns/javaee" 
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id="WebApp_ID" version="3.0">
   
  <!-- 配置Struts2的過濾器 -->
	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>
      

  第三步:在 src 目錄下,建立一個Java檔案,HelloWorldAction,包名為 com.ys.action

package com.ys.action;

public class HelloWorldAction {
	
	public String execute(){
		System.out.println("執行Action.....");
		return "success";
	}

}
      

  第四步:在 src 目錄下,建立 struts.xml 檔案,并添加如下代碼

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
	"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
   <package name="user" namespace="/" extends="struts-default">
     	<action name="helloAction" class="com.ys.action.HelloWorldAction">
     		<result name="success">success.jsp</result>
     	</action>
   </package>  
</struts>	
      

   第五步:我們建立一個 index.jsp 檔案,然後點選頁面上的超連結,跳轉到 success.jsp 頁面

index.jsp 頁面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
	"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<a href="helloAction">點選跳轉到 success.jsp 頁面</a>
</body>
</html>        

success.jsp頁面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 
	4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	success.jsp
</body>
</html>
      

 驗證:我們将項目釋出到 tomcat 伺服器,然後輸傳入連結接:http://localhost:8080/HelloStruts2/index.jsp

Struts2 詳解

  然後滑鼠點選 超連結,發現頁面跳轉到 如下界面:

Struts2 詳解

3、struts2 執行流程

Struts2 詳解

tomcat 伺服器啟動時做的工作

  ①、加載 web.xml 檔案配置的過濾器,調用過濾器的 init()方法,初始化所有資源檔案,主要包括 default.properties 檔案,struts-default.xml,strut-plugin.xml,struts.xml 檔案

struts2 執行流程

1、用戶端初始化一個指向Servlet容器(例如Tomcat)的請求;

2、這個請求經過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對于Struts2和其他架構的內建很有幫助,例如:SiteMesh Plugin);

3、接着FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請求是否需要調用某個Action;

4、如果ActionMapper決定需要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy;

5、ActionProxy通過Configuration Manager詢問架構的配置檔案,找到需要調用的Action類;

6、ActionProxy建立一個ActionInvocation的執行個體。

7、ActionInvocation執行個體使用命名模式來調用,在調用Action的過程前後,涉及到相關攔截器(Intercepter)的調用。

8、一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的傳回結果。傳回結果通常是(但不總是,也可能是另外的一個Action鍊)一個需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2架構中繼承的标簽。在這個過程中需要涉及到ActionMapper。

作者:IT可樂

出處:http://www.cnblogs.com/ysocean/

資源:微信搜【IT可樂】關注我,回複 【電子書】有我特别篩選的免費電子書。

本文版權歸作者所有,歡迎轉載,但未經作者同意不能轉載,否則保留追究法律責任的權利。