|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
最后我再次声明,我并没有说不看好java,实际上我对java很乐观的,毕竟她正在不断改进中,我相信她总有一天会和.net并驾齐驱的web
Author:zhuam
昨晚一口吻看完了夏昕写的<<Webwork2_Guide>>,固然文档材料很简便,但仍不掉为一本好的WebWork2书本,看的出作者的履历和才能都长短常的老道,在此向作者的开源精力致敬,并在此援用夏昕的那句话Somanyopensourceprojects,WhynotOpenyourDocuments?
明天下载了最新的WebWork2版本,入手下手了源码剖析,这份文档只能算是我的团体条记,也没工夫细细校正,且团体才能无限,不免有很多剖析毛病或笔误的中央,还看列位斧正.
WebWork1.x版本是接纳紧巧合的架构,相似如Struts,而WebWork2.x版本后接纳了新的架构WebWork2.x+XWork1.x就是由于他接纳了如许架构以是才吸引我往看他源码的啊!新的架构分别了与ServletAPI的紧巧合,如许我们的体系布局将加倍的明晰,且体系测试与体系移植未来的加倍便利,实在WebWork1.x版本我也没有看过,所谓的紧巧合也是看网上是这么说的,没有讲话权啊,呵呵!
在新的架构中WebWork2.x的感化是卖力将用户的HTTP哀求分别出来,使的哀求完整的离开ServletAPI,然后将这些哀求用Map的体例传进XWork1.x,且XWork1.x经由过程Interceptor将Map中的数据传到我们的VO中,然后由对应的自界说Action来挪用.
上面起首来看WebWork2.x怎样分别HTTP哀求,实在他是经由过程ServletDispatcher来到达目标.代码以下所示:
publicstaticHashMapcreateContextMap(MaprequestMap,MapparameterMap,MapsessionMap,MapapplicationMap,HttpServletRequestrequest,HttpServletResponseresponse,ServletConfigservletConfig){
HashMapextraContext=newHashMap();
//寄存HTTP中上传文件的requestsession哀求
extraContext.put(ActionContext.PARAMETERS,parameterMap);
extraContext.put(ActionContext.SESSION,sessionMap);
extraContext.put(ActionContext.APPLICATION,applicationMap);
extraContext.put(ActionContext.LOCALE,(locale==null)?request.getLocale():locale);
extraContext.put(HTTP_REQUEST,request);
extraContext.put(HTTP_RESPONSE,response);
extraContext.put(SERVLET_CONFIG,servletConfig);
extraContext.put(ComponentInterceptor.COMPONENT_MANAGER,request.getAttribute(ComponentManager.COMPONENT_MANAGER_KEY));
//helperstogetaccesstorequest/session/applicationscope
//这里用于寄存HTTP中的requestsession哀求
extraContext.put("request",requestMap);
extraContext.put("session",sessionMap);
extraContext.put("application",applicationMap);
extraContext.put("parameters",parameterMap);
AttributeMapattrMap=newAttributeMap(extraContext);
extraContext.put("attr",attrMap);
returnextraContext;
}
以上的是ServletDispatcher中的办法createContextMap是用于将HTTP哀求封装到Map中往,且ServletDispatcher也是WebWork2.x的把持器,卖力分别出Action,他是经由过程service办法往挪用serviceAction办法,然后由serviceAction来完成操纵的,代码以下:
publicvoidserviceAction(HttpServletRequestrequest,HttpServletResponseresponse,Stringnamespace,StringactionName,MaprequestMap,MapparameterMap,MapsessionMap,MapapplicationMap){
HashMapextraContext=createContextMap(requestMap,parameterMap,sessionMap,applicationMap,request,response,getServletConfig());//实例化Map哀求
extraContext.put(SERVLET_DISPATCHER,this);
//Iftherewasapreviousvaluestack,thencreateanewcopyandpassitintobeusedbythenewAction
OgnlValueStackstack=(OgnlValueStack)request.getAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY);
if(stack!=null){
extraContext.put(ActionContext.VALUE_STACK,newOgnlValueStack(stack));
}
try{
ActionProxyproxy=ActionProxyFactory.getFactory().createActionProxy(namespace,actionName,extraContext);
//这里actionName是经由过程两道getActionName剖析出来的,上面是ServletDispatcher的TODO:QUESTIONS转载出来让人人看一看
*1)WhatunitismaxSizeofattachmentsin?(assumingbytesfornow)
*2)Isnterrormessagewrongincatchoftry/catchinservice()method?
*3)WhyisgetActionName(String)notdeclaredpublic?(ThefixwouldnotbeanAPIadditionsothiscouldbe(doneforpre2.1)
*4)WhydoescreateContextMap(...)returnaHashMapandnotaMap?(2.1apichange)
*5)WhydoesntgetNameSpace(request)gettheservletpathinthesamewaythatgetActionName(request)does?
*6)WhydoesgetParameterMapthrowanIOException?Cantseeareasonforthat.(2.1apichange)
*/
request.setAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY,proxy.getInvocation().getStack());
proxy.execute();
//Iftherewasapreviousvaluestackthensetitbackontotherequest
if(stack!=null){
request.setAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY,stack);
}
}catch(ConfigurationExceptione){
log.error("Couldnotfindaction",e);
sendError(request,response,HttpServletResponse.SC_NOT_FOUND,e);
}catch(Exceptione){
log.error("Couldnotexecuteaction",e);
sendError(request,response,HttpServletResponse.SC_INTERNAL_SERVER_ERROR,e);
}
}
C++编译的是本地码,优点是启动快,而且可以精确控制资源因此可以开发很高效的程序.缺点是编程麻烦,而且容易留下安全隐患.跨平台靠源代码在各个平台间分别编译(一处编写到处编译) |
|