萌萌妈妈 发表于 2015-1-18 11:48:46

JAVA教程之WebWork2源码剖析

最后我再次声明,我并没有说不看好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++编译的是本地码,优点是启动快,而且可以精确控制资源因此可以开发很高效的程序.缺点是编程麻烦,而且容易留下安全隐患.跨平台靠源代码在各个平台间分别编译(一处编写到处编译)

小魔女 发表于 2015-1-21 15:22:12

那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!

再现理想 发表于 2015-1-24 20:35:34

Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站

老尸 发表于 2015-1-28 09:52:58

我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。

变相怪杰 发表于 2015-2-2 21:42:43

至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。

若天明 发表于 2015-2-8 07:07:09

科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。

冷月葬花魂 发表于 2015-2-24 19:50:12

接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。

再见西城 发表于 2015-2-26 22:18:08

关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。

乐观 发表于 2015-3-8 18:16:46

Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。

金色的骷髅 发表于 2015-3-10 18:29:34

所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。

兰色精灵 发表于 2015-3-17 09:04:53

Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站

admin 发表于 2015-3-23 17:20:34

Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站

蒙在股里 发表于 2015-4-1 02:09:38

其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。

因胸联盟 发表于 2015-4-6 09:33:00

Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。

简单生活 发表于 2015-4-7 19:01:57

学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。

不帅 发表于 2015-4-13 08:59:59

自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。

小女巫 发表于 2015-4-16 22:10:47

Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)

小妖女 发表于 2015-4-29 20:08:09

关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。

谁可相欹 发表于 2015-5-4 05:11:42

是一种突破用户端机器环境和CPU

山那边是海 发表于 2015-5-11 02:26:20

在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
页: [1]
查看完整版本: JAVA教程之WebWork2源码剖析