JAVA教程之WebWork2源码剖析
最后我再次声明,我并没有说不看好java,实际上我对java很乐观的,毕竟她正在不断改进中,我相信她总有一天会和.net并驾齐驱的webAuthor: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++编译的是本地码,优点是启动快,而且可以精确控制资源因此可以开发很高效的程序.缺点是编程麻烦,而且容易留下安全隐患.跨平台靠源代码在各个平台间分别编译(一处编写到处编译) 那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧! Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站 我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。 至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。 科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。 接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。 关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。 Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。 所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。 Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站 Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站 其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。 Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。 学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。 自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。 Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading) 关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。 是一种突破用户端机器环境和CPU 在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
页:
[1]