日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

webx学习(三)——Webx Turbine

發布時間:2025/3/16 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 webx学习(三)——Webx Turbine 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Webx Turbine建立在Webx Framework的基礎上,實現了頁面渲染、布局、數據驗證、數據提交等一系列工作。
Webx Turbine所遵循下面的設計理念包括:
頁面驅動
約定勝于配置

頁面布局:


其中:
Screen,代表頁面的主體。
Layout,代表頁面的布局。
Control,代表嵌在screen和layout中的頁面片段

處理頁面的基本流程:
Webx Turbine的處理流程被定義在pipeline中。Webx Framework沒有規定Pipeline的內容,但Webx Turbine卻定義了一系列valves。下面是一個Webx Turbine推薦的pipeline配置:

<services:pipeline xmlns="http://www.alibaba.com/schema/services/pipeline/valves"> ????<prepareForTurbine /> ????<setLoggingContext /> ????<analyzeURL homepage="homepage" /> ????<checkCsrfToken /> ????<loop> ????????<choose> ????????????<when> ????????????????<pl-conditions:target-extension-condition extension="null, vm, jsp" /> ????????????????<performAction /> ????????????????<performTemplateScreen /> ????????????????<renderTemplate /> ????????????</when> ????????????<when> ????????????????<pl-conditions:target-extension-condition extension="do" /> ????????????????<performAction /> ????????????????<performScreen /> ????????????</when> ????????????<otherwise> ????????????????<exit /> ????????????</otherwise> ????????</choose> ????????<breakUnlessTargetRedirected /> ????</loop> </services:pipeline>

當用戶以:localhost:8080 來訪問webx的時候,首先WebxFrameworkFilter接收請求,并一路到達pipeline

<analyzeURL> - 分析URL

分析URL的目的是取得target。由于用戶訪問的URL中并沒有提供path信息,通常被理解為:用戶想要訪問“主頁”。AnalyzeURL valve提供了一個可選的參數“homepage”,即是在這種情況下起作用 —— http://localhost:8081/對應的target為“homepage”。

需要注意的是,target不代表模板名,也不代表類名。Target只是一個抽象的概念 —— 當前頁面需要達成的目標。Target可能被后續的valves解釋成模板名、類名或者其它東西。

進入<choose> - 多重分支
很明顯,“homepage”滿足了第一個<when>所附帶的條件:<target-extension-condition extension="null, vm, jsp">,意思是target的后綴不存在(null)或為“jsp”或為“vm”。
<performAction> - 執行action
和其它框架中的action概念不同,在Webx Turbine中,action是用來處理用戶提交的表單的。
因為本次請求未提供action參數,所以跳過該步驟。
<performTemplateScreen> - 查找并執行screen。
這里要用到一個規則:target映射成screen module類名的規則。
假設target為xxx/yyy/zzz,那么Webx Turbine會依次查找下面的screen模塊:

screen.xxx.yyy.Zzz,

screen.xxx.yyy.Default,

screen.xxx.Default,

screen.Default。

本次請求的target為homepage,因此它會嘗試查找screen.Homepage和screen.Default這兩個類。
如果找到screen類,Webx Turbine就會執行它。Screen類的功能,通常是讀取數據庫,然后把模板所需要的對象放到context中。
如果找不到,也沒關系 —— 這就是“頁面優先”:像homepage這樣的主頁,通常沒有業務邏輯,因此不需要screen類,只需要有模板就可以了。

<renderTemplate> - 渲染模板
這里用到兩個規則:target映射成screen template,以及target映射成layout template。
假設target為xxx/yyy/zzz,那么Webx Turbine會查找下面的screen模板:/templates/screen/xxx/yyy/zzz。Screen模板如果未找到,就會報404 Not Found錯誤。 找到screen模板以后,Webx Turbine還會試著查找下面的layout模板:

/templates/layout/xxx/yyy/zzz

/templates/layout/xxx/yyy/default

/templates/layout/xxx/default

/templates/layout/default

Layout模板如果找不到,就直接渲染screen模板;如果存在,則把渲染screen模板后的結果,嵌入到layout模板中。
Layout模板和screen模板中,都可以調用control。每個頁面只有一個screen,卻可以有任意多個controls。

<breakUnlessTargetRedirected> - 內部重定向
在screen和action中,可以進行“內部重定向”。內部重定向實質上就是由<breakUnlessTargetRedirected>實施的 —— 如果沒有重定向標記,就退出;否則循環到<loop>標簽。
和外部重定向不同,外部重定向是向瀏覽器返回一個302或303 response,其中包含Location header,瀏覽器看到這樣的response以后,就會發出第二個請求。而內部重定向發生在pipeline內部,瀏覽器并不了解內部重定向。

接下來我們看一下petstore項目的pipeline.xml

<services:pipeline> ????????<!-- 初始化turbine rundata,并在pipelineContext中設置可能會用到的對象(如rundata、utils),以便valve取得。 --> ????????<pl-valves:prepareForTurbine /> ????????<!-- 設置日志系統的上下文,支持把當前請求的詳情打印在日志中。 --> ????????<pl-valves:setLoggingContext /> ????????<!-- 分析URL,取得target。 --> ????????<pl-valves:analyzeURL homepage="homepage" /> ????????<!-- 檢查csrf token,防止csrf攻擊和重復提交。假如request和session中的token不匹配,則出錯,或顯示expired頁面。 --> ????????<pl-valves:checkCsrfToken /> ????????<!-- 檢查頁面的授權,如果當前用戶無權訪問該頁面,則跳轉到petstoreLogin頁面 --> ????????<pl-valves:pageAuthorization callbackClass="com.alibaba.sample.petstore.web.common.PetstoreUserAuth" /> ????????<pl-valves:loop> ????????????<pl-valves:choose> ????????????????<when> ????????????????????<!-- 執行帶模板的screen,默認有layout。 --> ????????????????????<pl-conditions:target-extension-condition extension="null" /> ????????????????????<pl-valves:performAction /> ????????????????????<pl-valves:performTemplateScreen /> ????????????????????<pl-valves:renderTemplate /> ????????????????</when> ????????????????<when> ????????????????????<!-- 執行不帶模板的screen,無layout。 --> ????????????????????<pl-conditions:target-extension-condition extension="do" /> ????????????????????<pl-valves:performAction /> ????????????????????<pl-valves:performScreen /> ????????????????</when> ????????????????<when> ????????????????????<!-- 創建JSON,無模板,無layout。 --> ????????????????????<pl-conditions:target-extension-condition extension="json" /> ????????????????????<pl-valves:performScreen /> ????????????????????<pl-valves:renderResultAsJson /> ????????????????</when> ????????????????<when> ????????????????????<!-- 讀取資源文件。 --> ????????????????????<pl-conditions:path-condition name="/petstore/images/(.+)" /> ????????????????????<pl-valves:getResource name="/petstore/images/$1" /> ????????????????</when> ????????????????<otherwise> ????????????????????<!-- 將控制交還給servlet engine。 --> ????????????????????<pl-valves:exit /> ????????????????</otherwise> ????????????</pl-valves:choose> ????????????<!-- 假如rundata.setRedirectTarget()被設置,則循環,否則退出循環。 --> ????????????<pl-valves:breakUnlessTargetRedirected /> ????????</pl-valves:loop> ????</services:pipeline>

依賴注入:

通過@Autowired annotation注入

public class LoginAction { ????@Autowired ????private UserManager userManager; ????... }

注入request、response和session對象

public class LoginAction { ????@Autowired ????private HttpServletRequest request; ????@Autowired ????private HttpServletResponse response; ????@Autowired ????private HttpSession session; ????... }

參數注入


轉自本人內網空間:@璞堯

總結

以上是生活随笔為你收集整理的webx学习(三)——Webx Turbine的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。