Struts2 詳解

前面咱們經過下面兩篇博客,已經對 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。

相關文章
相關標籤/搜索