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這兩個類。 |
| <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模板中。 |
| <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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在RCP程序中添加一个banner栏
- 下一篇: tensorflow实现基于LSTM的文