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 目錄下

<?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
然後滑鼠點選 超連結,發現頁面跳轉到 如下界面:
3、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可樂】關注我,回複 【電子書】有我特别篩選的免費電子書。
本文版權歸作者所有,歡迎轉載,但未經作者同意不能轉載,否則保留追究法律責任的權利。