freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

淘寶技術(shù)及webx3框架分析第一版-資料下載頁(yè)

2024-10-24 08:54本頁(yè)面

【導(dǎo)讀】八千萬(wàn)的大型電子商務(wù)網(wǎng)站,是亞洲最大的購(gòu)物網(wǎng)站。那么對(duì)于淘寶網(wǎng)這樣大規(guī)模的一個(gè)網(wǎng)。下面介紹一下淘寶網(wǎng)中應(yīng)用的開(kāi)源軟件。要和應(yīng)用服務(wù)分開(kāi),有單獨(dú)的數(shù)據(jù)庫(kù)服務(wù)器。

  

【正文】 ges/$1 / /when otherwise ! 將控制交還給 servlet engine。 exit / /otherwise /choose ! 假如 ()被設(shè)置,則循環(huán),否則退出循環(huán)。 breakUnlessTargetRedirected / /loop /services:pipeline 從以上配置代碼不然發(fā)現(xiàn),這種 schema 還包含了流程控制的元素,除了各個(gè) valve 的順序執(zhí)行,還可以進(jìn)行循環(huán)和 條件控制。 整個(gè) webx3 的處理核心體現(xiàn)在 valve 上,主要幾個(gè) valve 如下所示: * PerformActionValve:執(zhí)行 action * PerformScreenValve:生成 screen * RenderTemplateValve:渲染 screen 模板 * SetLoggingContextValve:設(shè)置日志系統(tǒng)的上下文 第 21 頁(yè) * AnalyzeURLValve:分析 URL,取得 target 另外還有些在特定情景下的特定 valve,比如 CheckCsrfTokenValve,用于處理 Csrf 安全問(wèn)題。今后會(huì)對(duì)幾個(gè)核心的 valve 作進(jìn)一步詳細(xì)分解,這樣才能有利于在具體開(kāi)發(fā)中得心應(yīng)手 。 . action 與 screen 從 pipeline 與 valve 可知 , action 與 screen 的處理都是通過(guò) valve 來(lái)完成的,具體所說(shuō)分別對(duì)應(yīng)著: action 與 screen 是 web 框架中最核心的兩塊,分別對(duì)應(yīng)著請(qǐng)求響應(yīng)和返回渲染 。 透過(guò)細(xì)節(jié)看本質(zhì), webx3 在這兩塊的架構(gòu)核心可以歸結(jié)為以下幾個(gè)點(diǎn) 。 下面具體解析一下這幾點(diǎn): Module 與 Adapter 請(qǐng)求響應(yīng)的 Action和返回渲染的 Screen都需要開(kāi)發(fā)者根據(jù)具體 業(yè)務(wù)邏輯定制相應(yīng)的類(lèi),勢(shì)必要解決如何管理、組織和調(diào)用這些類(lèi)的問(wèn)題。 webx 要達(dá)到的效果是開(kāi)發(fā)者開(kāi)發(fā)的 Action和 Screen 是簡(jiǎn)單無(wú)累贅的 POJO,類(lèi)似于 webwork。 webx 采用的方式是把所有 Action 和 Screen 抽象為一個(gè)個(gè)的需要執(zhí)行的動(dòng)作,而把各種執(zhí)行器抽象為 Module, Module 非常簡(jiǎn)單,代碼如下: public interface Module { /*執(zhí)行模塊 */ void execute() throws Exception。 } 不同的執(zhí)行器通過(guò) Adapter 的模式統(tǒng)一為 Module, 實(shí)現(xiàn) execute 方法,完成對(duì) Action 或Screen 的調(diào)用。主要有兩種 Adapter: webx 會(huì)在容器啟動(dòng)時(shí)通過(guò)配置文件自動(dòng)把開(kāi)發(fā)者的各個(gè) Action 和 Screen 初始化相應(yīng)的 Module,配置如下例所示: services:moduleloader mlfactories:classmodules mlfactories:searchpackages type=$1 packages=.*/ /mlfactories:classmodules /services:moduleloader 如上所示,解析器 AbstractModuleFactoryDefinitionParser 會(huì)把包 . 第 22 頁(yè) 下的所有類(lèi)基于默認(rèn)規(guī)則初始各個(gè) Module,并存儲(chǔ)到 AbstractBeanFactoryBasedModuleFactory 的 modules 里,這樣當(dāng) PerformActionValve 和 PerformScreenValve 調(diào)用 就能取到相應(yīng)的 Module,如以下類(lèi)結(jié)構(gòu): 初始為 module 的結(jié)構(gòu)為: { screen = { Hello=Module { type:name = screen:Hello beanName = source = } }, action = { SimpleAction=Module { type:name = action:SimpleAction beanName = source = } } } 這樣在取 module 的時(shí)候,只用提供相應(yīng)的 key 就能拿到類(lèi)的完整信息了。 1) 類(lèi)的反射與執(zhí)行 從上面分析可以得知,所有 Action 和 Screen 的調(diào)用都是通過(guò) Module 來(lái) execute 的,這樣勢(shì)必需要反射各個(gè) Action 和 Screen, webx 通過(guò)構(gòu)造 MethodInvoker 這個(gè)類(lèi)來(lái)統(tǒng)一處理類(lèi)的反射和執(zhí)行,它的核心方法是 invoke,源碼如下: public void invoke(Object moduleObject, Logger log) throws Exception { Object[] args = new Object[]。 for (int i = 0。 i 。 i++) { Object value。 第 23 頁(yè) try { value = resolvers[i].resolve()。 } catch (SkipModuleExecutionException e) { if (skippable) { (: {}, {}, fastMethod, tMessage())。 return。 } value = ()。 } // 特別處理:防止對(duì) primitive 類(lèi)型設(shè)置 null Class? paramType = ().getParameterTypes()[i]。 if (value == null amp。amp。 ()) { value = getPrimitiveDefaultValue(paramType)。 } args[i] = value。 } try { (moduleObject, args)。 } catch (InvocationTargetException e) { throw (Exception) ()。 } } 以上代碼的結(jié)構(gòu)還是非常清晰的,首先是解析出各個(gè)參數(shù),然后基于 cglib 完成對(duì) moduleObject 的反射調(diào)用。 2) action 參數(shù)自動(dòng)注入 以上代碼可以看出,反射調(diào)用中最核心的是對(duì)各種方法所需參數(shù)的自動(dòng)注入,比如一個(gè) action 的方法: public void doGreeting(@FormGroup(simple) SimpleObject simple, Navigator nav) 第 24 頁(yè) webx 可以自動(dòng)通過(guò)用戶提交的 request 組裝成業(yè)務(wù)對(duì)象 SimpleObjec 和導(dǎo)航類(lèi) Navigator,這個(gè)特性非常神奇,也很實(shí)用。 webx 是通過(guò)一個(gè)個(gè) DataResolver 來(lái)完成對(duì)各種參數(shù)的解析和注入, DataResolver 的源碼如下: public interface DataResolver{Object resolve()。 } 它的實(shí)現(xiàn)類(lèi)有以下幾種: FormResolver:解析整個(gè) Form GroupResolver:解析一個(gè) group GroupsResolver:解析一組 group FieldResolver:用來(lái)解析 單個(gè)參數(shù) FieldsResolver:用來(lái)解析一組字段 ParameterResolver:用來(lái)解析單個(gè)參數(shù) ParametersResolver:用來(lái)解析一組參數(shù) TurbineRunDataResolver:用來(lái)注入各種環(huán)境信息,比如 request 和 response 具體的實(shí)現(xiàn)的基本思路就是通過(guò) Annotation 得到各個(gè)參數(shù)的結(jié)構(gòu)和配置,然后從 request 里組裝成需要注入的對(duì)象,以 FiledResolver 為例,源碼如下: public FieldResolver(DataResolverContext context, Class? paramType, FormField fieldAnnotation) { super(FieldResolver, context)。 //確保 group 存在 groupName = getGroupConfig(()).getName()。 // 確保 field 存在 fieldName = getFieldConfig(groupName, ()).getName()。 groupInstanceKey = trimToNull(())。 skipIfInvalid = ()。 } public Object resolve() { Form form = ()。 Group group = (groupName, groupInstanceKey)。 Field field = (fieldName)。 boolean valid = ()。 if (().getRawType().isAssignableFr om()) { skipModuleExecutionIfNecessary(valid, field)。 return field。 } else { skipModuleExecutionIfNecessary(valid, null)。 if (valid) { try { return (().getRawType(), 第 25 頁(yè) context .getExtraObject(), null)。 } catch (TypeMismatchException e) { if (!isConverterQuiet(form)) { throw e。 } } } return null。 } } 在構(gòu)造函數(shù)里通過(guò) Annotation 得到 groupName 和 fieldName,在 resolve 方法里,通過(guò)request 組裝成 form 對(duì)象,再通過(guò) groupName 和 fieldName 取到相應(yīng)的 Field。其他 Resolver 的實(shí)現(xiàn)類(lèi)似,就不在累述。 WebX 基本的組合模式是: velocity+spring+ibits。 其開(kāi)發(fā)分三部分,頁(yè)面層( web)、業(yè)務(wù)處理層 (biz)、數(shù)據(jù)處理層 (dao)。 WEB 層開(kāi)發(fā)規(guī)范 作用和目的: web 層是直接和用戶交互的,包括界面展示,提交數(shù)據(jù)的處理,數(shù)據(jù)的獲取等功能塊;需開(kāi)發(fā)的組件:在 web 層中,常見(jiàn)的有 Screen、 Control、 Action 這三類(lèi) web 端組件需要開(kāi)發(fā),他們的職責(zé)只限于 web 端,比如提交組據(jù)的驗(yàn)證,調(diào)用 biz 層程序來(lái)處理業(yè)務(wù)邏輯,并提供模板渲染需要的數(shù)據(jù)等。 Action 開(kāi)發(fā) 作用: action 一般用于處理 form 提交,處理完之后再將結(jié)果給一個(gè)模板去進(jìn)行渲染。在提交 form 的時(shí)候需要指定 action 的名字來(lái)執(zhí)行某一個(gè) action, 如一個(gè) form: form name=f1 action= method=post ul lispan類(lèi)別名稱 /span:input name=catName size=20 maxsize=40/li liinput type=submit value=添加類(lèi)別 / /ul input type=hidden name=action value=CategoryAction/ input type=hidden name=event_submit_do_add_post value=anything/ /form 說(shuō)明: ( 1)指定要執(zhí)行的 action 類(lèi),代碼如下,表示提交這個(gè) form 的時(shí)候先執(zhí)行 CategoryAction 類(lèi)(包路徑,在配置文件里) 第 26 頁(yè) input type=hidden name=action value=CategoryAction/ ( 2)指定要執(zhí)行的 action 類(lèi)上的某個(gè)方法, input type=hidden name=event_submit_do_add value=anything/ ( 3) action 執(zhí)行完后顯示的頁(yè)面,在 form 的 action 中指定“ /”。 ( 4) Action 類(lèi)的實(shí)現(xiàn)如下: package 。 import 。 import 。 import 。 import 。 import 。 import 。 import 。 import 。 import 。 /** * 類(lèi)目相關(guān)操作的 action * * @author argan * */ public class CategoryAction extends TemplateAction {//0. 繼承基類(lèi) /**
點(diǎn)擊復(fù)制文檔內(nèi)容
高考資料相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1