框架總結之Struts2上
一、Struts2的由來和介紹:
傳統的Java Web應用程序是采用JSP+Servlet+Javabean來實現的,這種模式實現了最基本的MVC分層,使的程序結構分為幾層,有負責前臺展示的 JSP、負責流程邏輯控制的Servlet以及負責數據封裝的Javabean。但是這種結構仍然存在問題:如JSP頁面中需要使用符號嵌入很多的 Java代碼,造成頁面結構混亂,Servlet和Javabean負責了大量的跳轉和運算工作,耦合緊密,程序復用度低等等。
因此產生了Struts框架來解決這個問題。
什麽是Struts框架:
Struts2框架中其實是把JSP+Servlet+Javabean這個簡易版的Mvc模式進行了升級。
Struts 2框架由3個部分組成:StrutsPrepareAndExecuteFilter是核心控制器、業務控制器和用戶實現的業務邏輯組件。
Struts的MVC框架解讀:
M:負責封裝應用的狀態,並實現應用的功能。通常分為數據模型和業務邏輯模型,數據模型用來存放業務數據,比如訂單信息、用戶信息等;而業務邏輯模型包含應用的業務操作,比如訂單的添加或者修改等。
V:說白點就是把M的數據展示到頁面上給用戶看。
C:表示控制層,在這個控制層中采用FilterDispatcher核心控制器來,該控制器作為一個Filter運行在Web應用中,它負責攔截所有的用戶請求,當 用戶請求到達時,該Filter會過濾用戶請求。如果用戶請求以action結尾,該請求將被轉入Struts 2框架處理。
在Web.xml中配置控制器FilterDispatcher即可使用
<filter>
<!-- 定義核心Filter的名字 -->
<filter-name>struts2</filter-name>
<!-- 定義核心Filter的實現類 -->
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<!-- StrutsPrepareAndExecuteFilter用來處理所有的HTTP請求 -->
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Struts2框架獲得了*.action請求後,將根據*.action請求的前面部分決定調用哪個業務邏輯組件,例如,對於login.action請求,Struts2調用名為login的Action來處理該請求。
Struts2用於處理用戶請求的Action實例,並不是用戶實現的業務控制器,而是Action代理——因為用戶實現的業務控制器並沒有與Servlet API耦合,顯然無法處理用戶請求。而Struts2
框架提供了系列攔截器,該系列攔截器負責將 HttpServletRequest請求中的請求參數解析出來,傳入到Action中,並回調Action的execute方法來處理用戶請求。
二.Struts2的工作流程 (原文:http://www.cnblogs.com/jy02444453/archive/2011/08/27/2155427.html)
一個請求在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
在上述過程中所有的對象(Action,Results,Interceptors,等)都是通過ObjectFactory來創建的。
三.Hello,Struts2
Struts開發步驟:
1. web項目,引入struts - jar包
2. web.xml中,引入struts的核心功能
配置過濾器
3. 開發action
4. 配置action
src/struts.xml
1. web項目struts2,引入struts2的jar包
包名 | 作用 |
commons-fileupload-x.y.z.jar | 核心包:Struts的上傳和下載 |
commons-io-x.y.z.jar | |
commons-lang-x.y.jar | 核心包:為java.lang包提供擴展 |
commons-logging-x.y.z.jar | 核心包:Jakarta的通用日誌記錄包 |
commons-logging-api-x.y.jar | 輔助包:Apache Commons包中的一個,包含了一些數據類型工具類,是java.lang.*的擴展。 |
freemarker-x.y.z.jar | 核心包:FreeMarker是一個模板引擎,一個基於模板生成文本輸出的通用工具 |
javassist-.xy.z.GA | |
ognl-x.y.z.jar | 核心包:支持ognl表達式 |
struts2-core-x.y.z.jar | 核心包:struts的核心包 |
xwork-core.x.y.z.jar | 核心包:xwork核心包 |
2. web.xml中,引入struts的核心功能
配置過濾器
<filter> <!-- 定義核心Filter的名字 --> <filter-name>struts2</filter-name> <!-- 定義核心Filter的實現類 --> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <!-- StrutsPrepareAndExecuteFilter用來處理所有的HTTP請求 --> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
3. 開發action
package huangrenchao.hellostruts2; public class HelloStruts2Action { private String name; public String hello(){ System.out.println("hello,struts"); name = "黃仁超"; return "success"; } }
4. 在struts中配置action
<?xml version="1.0" encoding="GBK" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 配置了一個包元素 --> <package name="lee" extends="struts-default"> <!-- 配置處理文件上傳的Action --> <action name="hello" class="huangrenchao.hellostruts2.HelloStruts2Action" method="hello"> <result name="success" >/success.jsp</result> </action> </package> </struts>
5.寫一個success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> hello.struts </body> </html>
6.發布項目到tomcat中,然後在瀏覽器中運行
框架總結之Struts2上