前面咱們經過下面兩篇博客,已經對 Servlet 有了比較深入的理解,那麼接下來咱們詳細介紹 Servlet 的升級版框架----Struts2html
Servlet 詳解:http://www.cnblogs.com/ysocean/p/6912191.htmljava
改進 Sevlert ----Struts2入門: http://www.cnblogs.com/ysocean/p/6913484.htmlweb
首先咱們仍是回顧一下 Servlet 的缺點:apache
①、一個請求對應一個 Servlet,即每個請求咱們都須要在 web.xml 文件中配置映射。若是項目大,請求不少,那麼會形成 web.xml 很大,很難維護。設計模式
②、即使在好幾個請求對應一個 Servlet,即在 service() 方法中,經過 if--else 語句來判斷執行的代碼塊。那這樣就會形成 service() 方法很擁擠。tomcat
③、一個項目只存在一個 web.xml 文件,若是一個項目是多人開發,那麼整合代碼開發過程當中會有不少問題。不適合團隊開發。安全
④、Servlet中doGet方法和doPost方法中的兩個參數reqeust,response擁有嚴重的容器依賴性。服務器
⑤、若是頁面上表單中的元素比較複雜,則在Servlet的方法中獲取表單元素的數據比較繁瑣。多線程
⑥、Servlet是單線程的,只要在Servlet中的聲明一個實例變量,那麼該變量在多線程訪問時就會有線程安全問題。app
⑦、在Servlet中處理異常,若是Servlet中有N個方法,則這N個方法必須都要try--catch。由於子類拋的異常不能大於父類。
而在這篇博客中:改進 Sevlert ----Struts2入門: http://www.cnblogs.com/ysocean/p/6913484.html 咱們已經解決了相應的一些問題,可是並無徹底解決。而徹底解決的辦法就是咱們這篇文章的主角------Struts2
一、什麼是 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的變化很小。
二、Struts2 入門實例(先無論原理是什麼,先看是怎麼實現的)
第一步:建立一個 web 工程,並將相應的 jar 包複製到 lib 目錄下
第二步:在 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 執行流程
tomcat 服務器啓動時作的工做
①、加載 web.xml 文件配置的過濾器,調用過濾器的 init()方法,初始化全部資源文件,主要包括 default.properties 文件,struts-default.xml,strut-plugin.xml,struts.xml 文件
struts2 執行流程
一、客戶端初始化一個指向Servlet容器(例如Tomcat)的請求;
二、這個請求通過一系列的過濾器(Filter)(這些過濾器中有一個叫作ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其餘框架的集成頗有幫助,例如:SiteMesh Plugin);
三、接着FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請求是否須要調用某個Action;
四、若是ActionMapper決定須要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy;
五、ActionProxy經過Configuration Manager詢問框架的配置文件,找到須要調用的Action類;
六、ActionProxy建立一個ActionInvocation的實例。
七、ActionInvocation實例使用命名模式來調用,在調用Action的過程先後,涉及到相關攔截器(Intercepter)的調用。
八、一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果一般是(但不老是,也多是另外的一個Action鏈)一個須要被表示的JSP或者FreeMarker的模版。在表示的過程當中可使用Struts2框架中繼承的標籤。在這個過程當中須要涉及到ActionMapper。