JAVA网页设计WebWork2源码剖析续一
Java的桌面程序开发在java程序员里通常叫swing开发,主要用的swing包里的类开发的,也就是通常说的c/s架构开发web至于Action是的创立则是由ActionProxy来完成的,来看一段扼要的程序挪用
ActionProxyproxy=ActionProxyFactory.getFactory().createActionProxy(namespace,actionName,extraContext);
request.setAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY,proxy.getInvocation().getStack());//挪用ActionInvocation
proxy.execute();
实在ActionProxy是一个接口,而ActionProxyFactory则是一个笼统类,他们都是经由过程一个DefaultActionProxy和DefaultActionProxyFactory来完成操纵的,且ActionProxy将挪用ActionInvocation接口,由DefaultActionInvocation初始化的时分读取设置,然后由Invoke()办法来完成Action的挪用及一些在Action被挪用之前的Interceptor的操纵.上面是关于DefaultActionInvocation的初始化和挪用代码.
publicclassDefaultActionInvocationimplementsActionInvocation{
privatevoidinit()throwsException{
MapcontextMap=createContextMap();
createAction();//加载Action
if(pushAction){
stack.push(action);
}
invocationContext=newActionContext(contextMap);
invocationContext.setName(proxy.getActionName());
//getanewListsowedontgetproblemswiththeiteratorifsomeonechangesthelist
ListinterceptorList=newArrayList(proxy.getConfig().getInterceptors());//猎取设置
interceptors=interceptorList.iterator();
}
publicStringinvoke()throwsException{
if(executed){
thrownewIllegalStateException("Actionhasalreadyexecuted");
}
//这里是实行拦阻器的操纵,注:拦阻器自己就是AOP的一个特别完成,Servlet2.3中Filter就是一个惯例啊
if(interceptors.hasNext()){
Interceptorinterceptor=(Interceptor)interceptors.next();
resultCode=interceptor.intercept(this);
}else{
resultCode=invokeAction(getAction(),proxy.getConfig());
}
//thisisneededbecausetheresultwillbeexecuted,thencontrolwillreturntotheInterceptor,whichwill
//returnaboveandflowthroughagain
if(!executed){
if(preResultListeners!=null){
for(Iteratoriterator=preResultListeners.iterator();
iterator.hasNext();){
PreResultListenerlistener=(PreResultListener)iterator.next();
listener.beforeResult(this,resultCode);
}
}
//nowexecutetheresult,ifweresupposedto
if(proxy.getExecuteResult()){
executeResult();
}
executed=true;
}
…
}
上面再来讲说Interceptor的完成布局,刚入手下手我觉得XWork1.x中Interceptor应当是从Filter中承继上去的,厥后看了源码,本来我的设法不合错误,想一想也切实其实是不必要,也不该该从Filter下承继,由于Filter就是Servlet2.3的一个API,而XWork1.x计划目标就是要离开ServletAPI,且Interceptor的完成并不是是少了Filter就不可,只是我们有了Filter将会来的加倍便利!
关于WebWork2.x中的一切的拦阻器,他们都有一个大众的接口Interceptor,在它傍边界说了拦阻器的一些基础操纵办法,然后有一个AroundInterceptor笼统类,完成了该接口,AroundInterceptor的感化是组合拦阻器的挪用按次,代码以下:
publicStringintercept(ActionInvocationinvocation)throwsException{
Stringresult=null;
before(invocation);//这里是用于组合挪用按次
result=invocation.invoke();
after(invocation,result);
returnresult;
}
至于将Map中的数据转换到我们的VO中,是经由过程ParametersInterceptor拦阻器来完成操纵的,这个拦阻器是一个真实的完成类,他从AroundInterceptor笼统类上面承继
publicclassParametersInterceptorextendsAroundInterceptor{
//~Methods////////////////////////////////////////////////////////////////
protectedvoidafter(ActionInvocationdispatcher,Stringresult)throwsException{
}
protectedvoidbefore(ActionInvocationinvocation)throwsException{
if(!(invocation.getAction()instanceofNoParameters)){
finalMapparameters=ActionContext.getContext().getParameters();
//用于猎取Map布局中的Parameters
if(log.isDebugEnabled()){
log.debug("Settingparams"+parameters);
}
ActionContextinvocationContext=invocation.getInvocationContext();
try{
invocationContext.put(InstantiatingNullHandler.CREATE_NULL_OBJECTS,Boolean.TRUE);
invocationContext.put(XWorkMethodAccessor.DENY_METHOD_EXECUTION,Boolean.TRUE);
invocationContext.put(XWorkConverter.REPORT_CONVERSION_ERRORS,Boolean.TRUE);
if(parameters!=null){
finalOgnlValueStackstack=ActionContext.getContext().getValueStack();
//用于猎取OgnlValueStack操纵,这个package没看过,详细听夏昕说是一套可读写对象属性的的类库,功效有些相似与JakartaCommonsBeanUtils,及SpringBeanWrapper
for(Iteratoriterator=parameters.entrySet().iterator();
//遍历Parameters中的信息
iterator.hasNext();){
Map.Entryentry=(Map.Entry)iterator.next();
Stringname=entry.getKey().toString();
//添补VO信息
if(acceptableName(name)){
Objectvalue=entry.getValue();
stack.setValue(name,value);
}
}
}
}finally{
invocationContext.put(InstantiatingNullHandler.CREATE_NULL_OBJECTS,Boolean.FALSE);
invocationContext.put(XWorkMethodAccessor.DENY_METHOD_EXECUTION,Boolean.FALSE);
invocationContext.put(XWorkConverter.REPORT_CONVERSION_ERRORS,Boolean.FALSE);
}
}
}
protectedbooleanacceptableName(Stringname){
if(name.indexOf(=)!=-1||name.indexOf(,)!=-1||name.indexOf(#)!=-1){
returnfalse;
}else{
returntrue;
}
}
}
有了这样一个呼声:让java代替C语言成为基本语言。这些足以说明java简单易学的这个优点。其次,java的功能强大,前面我也提到了,EJB3.0的推出使java成为了大型项目的首选。 科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。 你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。 不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。 所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。 至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。 那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧! 是一种为 Internet发展的计算机语言 http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。 当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢? 还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。 那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧! 所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。 一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。 那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧! 是一种将安全性(Security)列为第一优先考虑的语言 关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。 Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台 有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想) 关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
页:
[1]