JAVA教程之Java Web Framework综述
手机用到的是用j2me所编出来的小程序。webJavaWebFramework综述0.简介
本文先容JavaWebFramework的基础事情道理,和一些经常使用的开源WebMVCFramework(Struts,WebWork,Tapestry,Echo,JSF,Maverick,SpringMVC,Turbine,Cocoon,Barracuda)。
Web开辟的最主要的基础功是HTTP;JavaWeb开辟的最主要的基础功是ServletSpecification。HTTP和ServletSpecification关于WebServer和WebFramework的开辟完成来讲,是相当主要的协定标准。
使用和分析开源WebFramework,既有助于深切把握HTTP&ServletSpecification,也有助于懂得一些古代的B/SWeb框架计划头脑,如MVC,事务处置机制,页面组件,IoC,AOP等。在这个古代化的年夜潮中,即便Servlet标准自己也不克不及免俗,不休引进Filter、Listener等古代框架计划形式。同是Sun公司出品的JSF更是云云。
关于MVC模子、项目简介、设置文件、进门示例等基本常识,网上已有大批的反复材料信息,本文不再赘述。
文中会提到一些相干的开源项目,和一些编程头脑,若有必要,能够用相干的关头字在网上搜刮,猎取基础的背景常识。
本文力争一针见血,凸起重点。侧重形貌其他材料没有提到、或很少提到的较主要内容,如运转道理、支流用法,相干常识,关头特征等。
1.JavaWeb程序事情道理
Tomcat的Server.xml文件中界说了收集哀求路径到主机当地文件路径的映照。好比,<contextpath="/yourapp"docBase="yourapp_dir/webapp"/>
我们来看一下,一个HTTPRequest-ResponseCycle的处置历程。
HTTPRequestURL一样平常分为三段:host,context,path。
如http://yourhost/yourapp/en/index.html这个URL,分为host=yourhost,context=yourapp,path=en/index.html三段。个中,Context部分由request.getContext()取得,path部分由request.getServletPath()取得(前往了局是“/en/index.html”)。
yourhost主机上运转的TomcatWebServer吸收到这个URL,依据Context界说,把yourapp这个收集路径映照为yourapp_dir/webapp,并在此目次下定位en/index.html这个文件,前往到客户端。
假如我们这个URL改换为http://yourhost/yourapp/en/index.jsp,这个时分Tomcat会试图把yourapp_dir/webapp/en/index.jsp文件编译成Servlet,并挪用运转这个Servlet。
我们再把这个URL改换为http://yourhost/yourapp/en/index.do。
注重,戏剧化的事变就产生在这个时分,Servlet标准中最主要的类RequestDispatcher退场了。RequestDispatcher依据WEB-INF/web.xml设置文件的界说,挪用对应的Servlet来处置en/index.do这个路径。
假定web.xml内里有如许的界说。
<servlet>
<servlet-name>DispatchServlet</servlet-name>
<servlet-class>yourapp.DispatchServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DispatchServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
那末,RequestDispatcher会挪用yourapp.DispatchServlet类处置这个路径。
假如web.xml没有界说对应en/index.do这个路径的Servlet,那末Tomcat前往“您哀求的资本不存在”。
RequestDispatcher用于WebServer中,也能够用于使用程序中举行处置转向,资本定位。好比,我们在处置en/index.do的代码中挪用,
request.getRequestDispatcher(“cn/index.jsp”).forward(request,response),就能够转交别的的资本cn/index.jsp来处置。
几近一切的WebFramework都必要界说本人的Dispatch感化的Servlet,并挪用RequestDispatcher举行转向处置。
浏览WebFramework源代码,有两条次要线索,(1)依据web.xml找到对应的Servlet类;(2)搜刮包括“RequestDispatcher”词的代码文件。
我们看到,request,response这两个参数,被RequestDispatcher在各类Servlet之间传来传往(JSP也是Servlet)。以是,request的setAttribute()和getAttribute()办法是Servlet之间传送数据的次要体例。
在MVC布局中,一样平常的处置流程以下:
处置HTTPRequest的基础单元一样平常称为Action,是一个比Servlet轻量很多的接口界说,一般只要一两个办法,如execute(perform),validate等。
我们晓得,URL->Servlet映照,界说在Web.xml设置文件里,但MVC框架一般会有别的一个界说URL->Action映照的设置文件。
出口DispatcherServlet依据URL->Action的映照干系,把哀求转发给Action。
Action取得输出参数,挪用贸易逻辑,并把了局数据和View标识给(Model&View)前往给DispatcherServlet。
DispatcherServlet依据这个View标识,定位响应的ViewTemplatePath,把处置转交给View(JSP+TagLib,Velocity,FreeMarker,XSL等)。
View一样平常经由过程request.getAttribute()取得了局数据,并显现到客户端。至因而谁把了局数据设置到request.attribute内里,有两种大概:Action或DispatcherServlet。
2.Struts
http://struts.apache.org/
Struts是今朝用户群最年夜、开辟厂商撑持最多的开源WebFramework。
Struts丰功伟绩,为提高MVC框架作出了不成消逝的奉献。显赫的名誉,趋于老化的厚重布局,令Struts成为良多古代WebFramework参照、应战的方针。
Struts使用次要包含3件事变:设置struts-config.xml文件,完成Action类,完成View;另有一些初级扩大用法。上面分离报告。
1.设置struts-config.xml文件:
Struts撑持多级设置文件,详细用法和限定,详见Struts文档。这里只会商struts-config.xml支流设置的内容。:-)
(1)URLPath到Action的映照。
如<actionpath="/LogonSubmit"type="app.LogonAction".../>
Struts的出口Servlet是ActionServlet。
ActionServlet必要此信息把URLPath挪用对应的Action类处置。
在Struts运转时代,一个URLPath,只存在一个对应的StrutsAction实例。一切的该URLPath的哀求,都经由这统一个StrutsAction实例处置。以是StrutsAction必需线程平安。
想一想看,实在这个请求其实不太过,Action只是一个处置程序,不该该保留跨HTTP哀求的形态数据,按理来讲,也应当做成线程平安的。
(2)TemplateName到ViewTemplatePath的映照。
<forwardname="success"path="/pages/Welcome.jsp"/>
Action类前往一个TemplateName,ActionServlet依据这个TemplateName取得对应的ViewTemplatePath,然后挪用
request.getRequestDispatcher(“ViewTemplatePath”),把处置转向路径对应的Servlet。在这个例子中,是转向/pages/Welcome.jsp编译后的Servlet。
我们来看一个一个Velocity的例子。
<includename="success"path="/pages/Welcome.vm"/>
web.xml的界说以下
<servlet>
<servlet-name>velocity</servlet-name>
<servlet-class>org.apache.velocity.tools.view.servlet.VelocityViewServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>velocity</servlet-name>
<url-pattern>*.vm</url-pattern>
</servlet-mapping>
这时候,request.getRequestDispatcher(“/pages/Welcome.vm”)会挪用VelocityViewServlet,由VelocityViewServlet卖力装并驱动运转/pages/Welcome.vm这个模板文件。
这内里有一个成绩,假如挪用的是DispatchRequester.include()办法,那末怎样才干把pages/Welcome.vm传给VelocityViewServlet呢?
如前所说,RequestDispatcher传送的参数只要两个,request和response。那末只能经由过程requestattribute。恰是为懂得决这个成绩,Servlet2.3标准以后,到场了javax.servlet.include.servlet_path这个属性。
拜见VelocityViewServlet的代码(velocity-tool开源项目)
//IfwegetherefromRequestDispatcher.include(),getServletPath()
//willreturntheoriginal(wrong)URIrequested.Thefollowingspecial
//attributeholdsthecorrectpath.Seesection8.3oftheServlet
//2.3specification.
Stringpath=(String)request.getAttribute("javax.servlet.include.servlet_path");
从这里我们能够看出,为何知晓ServletSpecification关于知晓WebFramework相当主要。
(3)FormBean的界说
如<form-beanname="logonForm"type="app.LogonForm"/>
StrutsFormBean必要承继ActionForm类。
FormBean类,次要有三个感化:
依据bean的界说,使用reflection机制,主动把request参数转化为必要的数据范例,填进到bean的属性傍边。ActionForm类名中固然有Form这个词,但不但可以猎取Form提交后的HTTPPost参数,也能够猎取URL后缀的HTTPGet参数。
输出考证。用户能够设置validation.xml,界说各属性的考证划定规矩。
看成ViewObject来用。用户必要纯熟把握StrutsHTMLTagLib的用法,才干把FormBean的属性准确显现出来。
(4)其他界说。详见Struts文档。不再赘述。
2.完成Action。
Action类从FormBean或间接从request中取得输出参数,挪用贸易逻辑,把了局数据(大概会包装成ViewObject),用request.setAttribute()放到request中,最初前往一个用ForwardMapping类包装的TemplateName。
3.完成View。
StrutsView的尺度完成办法是JSP+StrutsTagLib,个中最主要的就是StrutsHTMLTagLib。
html:formtag则是全部HTMLTag的中心,别的的如html:input,html:select等tag,都包括在html:formtag内里。
html:formtag用来映照FormBean(也能够经由过程得当界说,映照其他的bean,但利用上会有良多贫苦)。html:formtag包括的其他Strutshtmltag用来映照FormBean的属性。
StrutsBeanTagLib的用法对照痴肥,一样平常情形下能够用JSTL取代。固然,假如必要用到bean:messagetag完成国际化,那又另当别论。
StrutsTileTagLib用于页面结构。开源Portal项目Liferay利用了StrutsTileTagLib做为结构把持。
4.初级扩大用法
用户能够重载Struts的一些把持类,引进本人的一些定制类。详见Struts文档。
本文不是Struts专题,只报告最主要的支流用法,别的边边角角的,不再赘述。
3.WebWork
http://www.opensymphony.com/webwork/
WebWork因为天真的可插拔特征,遭到良多资深程序员的接待。仿佛很有大概大举盛行起来。
WebWork项目创建在XWork项目上。出口Servlet是WebWork项目中界说的ServletDispatcher,而Action在XWork项目中界说。
XWorkAction接口的execute()办法没有参数,不像StrutsAction那样承受request,response参数,以是XWorkAction可以离开Web情况被间接挪用,便于单位测试。
这里引进了一个成绩。没有了request参数,那末XWorkAction怎样取得requestparameters作为输出数据?又经由过程甚么桥梁(Struts用request.setAttribute)把了局数据传送到View层?
在WebWork中,只能经由过程Action自己的getter,setter属性来传送输出参数和输入了局。
好比,我们有如许一个完成了XWorkAction接口的类,
YourActionimplementsAction{
intproductId=null;
StringproductName=null;
publicvoidsetProductId(intproductId){this.productId=productId;}
publicStringgetProductName(){returnproductName;}
publicStringexecute(){
productName=findNameById(productId);
return“success”;
}
}
这个类内里的productId将承受request输出参数,productName是输入到页面显现的了局。
好比,如许的哀求,http://yourhost/yourapp/MyAction.action?productId=1
WebWork会把1填到YourAction的productId内里,然后实行execute()办法,JSP里的语句<ww:propertyvalue=“productName”>会把YourAction的productName显现在页面上。
假如一个WebFramework接纳了这类屏障Action的request,response参数的计划体例,一样平常也同时会接纳这类Action和输出输入数据分离成一体的办理体例。相似的情况也存在于Tapestry和Maverick中,前面会讲到。
当WebWorkServletDispatcher吸收到HTTPRequest的时分,起首把一切相干的信息(包含request,response,session,servletconfig,serveltcontext,一切request参数)等寄存到AcationContext中,然后依据Interceptor设置信息,天生一个YourAction的静态代办署理类对象。实践上运转的恰是这个代办署理对象,好像ServletFilter的事情机制一样平常,一切注进的Interceptor办法会先于Actio办法运转。
我们来看一下Action和Interceptor的位置:Action没有参数,没法取得ActionContext;而Interceptor承受的ActionInvoication参数具有包含ActionContext在内的一切主要信息。
这类权利分派的不屈等,必定了Action的感化十分无限,只限于挪用贸易逻辑,然后前往一个乐成与否标记。一切与内部Web天下打交道、和谐外部事情流程的重任,都义不容辞地落在Interceptor的肩上。
我们能够假想一个极度的例子。我们声明一批不做任何事变的空Action,我们只是必要它们的空壳类名;我们制造一批对应的Interceptor,一切的转发把持、贸易逻辑都在Interceptor上完成,然后把Interceptor都注进到对应的空Action。这在实际上是完整可行的。
在Web陆地的包抄中,Action可少,Interceptor不成少。Action是一个孤岛,假如没有外来盟友Interceptor的帮忙,只能在本人的小局限内自力作战(好比UnitTest),而对全体年夜局的作战方针没法发生影响。
上面我们来看一下Action是怎样在Interceptor的全程羁系下事情的。
在WebWork中,我们必要以下设置XWork.xml。
<xwork>
<!--Includewebworkdefaults(fromWebWork-2.1JAR).-->
<includefile="webwork-default.xml"/>
<!--Configurationforthedefaultpackage.-->
<packagename="default"extends="webwork-default">
<!--Defaultinterceptorstack.-->
<default-interceptor-refname="defaultStack"/>
<!--Action:YourAction.-->
<actionname="youraction"class="yourapp.YourAction">
<resultname="success"type="dispatcher">
YourAction.jsp
</result>
</action>
</package>
</xwork>
webwork-default.xml内里的相干界说以下:
<interceptors>
<interceptorname="validation"class="com.opensymphony.xwork.validator.ValidationInterceptor"/>
<interceptorname="static-params"class="com.opensymphony.xwork.interceptor.
StaticParametersInterceptor"/>
<interceptorname="params"class="com.opensymphony.xwork.interceptor.ParametersInterceptor
"/>
<interceptorname="conversionError"class="com.opensymphony.webwork.interceptor.
WebWorkConversionErrorInterceptor"/>
<interceptor-stackname="defaultStack">
<interceptor-refname="static-params"/>
<interceptor-refname="params"/>
<interceptor-refname="conversionError"/>
</interceptor-stack>
</interceptors>
从上述的设置信息中能够看出,YourAction实行execute()办法的前后,会被
defaultStack所界说的三个Intercepter截获。这些Interceptor的义务之一就是把输出参数设置到Action的对应属性傍边。
假如我们必要到场对YourAction的属性的考证功效,只需把上述界说中的validationInterceptor到场到defaultStack中就能够了。固然,实践事情还没有这么复杂,一样平常来讲,还要为每一个举行属性考证的Action的都设置一份validation.xml。
XWorkInterceptor可以在Package和Action级别上,举行截获处置。
ServletFilter可以在URLPatten级别上,举行截获处置。固然实践上,ServletFilter截获的是Servlet,但某些情形下,能够到达和截获一批Action的一样效果。
好比,在WebWork中,我们能够为一切adminpackage的Action,到场一个Interceptor,当反省到以后Session的用户没有admin权限时,一致前往一个告诫页面:您没有充足的权限实行这个操纵。
我们看到也能够为一切URLPattern为“admin/*.action”的URL界说一个ServletFilter,当反省到以后Session的用户没有admin权限时,一致前往一个告诫页面:您没有充足的权限实行这个操纵。
WebWork的Interceptor设置是相称天真的,相称于对Action完成了AOP。Interceptor相称于Aspect,基类AroundInterceptor的before(),after()办法相称于Advice。
别的,XWork也供应了从XML设置文件拆卸Component的机制,相称于完成了关于Component的IoC。
提到AOP和IoC,特地多讲两句。SpringAOP可以截获一切Interface,不限于某个特定接口;Spring框架撑持一切范例的IoC,不限于某种特定范例。
要晓得,AOP,IoC但是如今最时兴的工具,必定不要错过啊。:D
相干观点导读(假如必要,请用以下关头字搜刮收集):
AOP--AspectOrientedProgramming--面向方面编程。
IoCCInversionofControl--把持反转
DynamicProxy--静态代办署理,JDK1.4引进的特征。还能够进一步参考CGLib,ASM等开源项目。
WebWork间接撑持一切支流View--XSL,Velocity,FreeMarker,JSP。WebWork还供应了本人的TagLib。“间接撑持”的意义是说,不必像Struts那样,利用Velocity的时分,还必要引进帮助桥梁Velocity-tool。
WebWork顶用到一种功效和XPath相似的对象寻径言语ONGL,是一个开源项目。ONGL一样用鄙人面要先容的Tapestry项目中。
Opensymphony下另有一个SiteMesh项目,经由过程ServletFilter机制把持结构。能够和WebWork组合利用。
4.Tapestry
http://jakarta.apache.org/tapestry/
Tapestry最近俄然火了起来,令我感应受惊。大概是JSF带来的PageComponent风潮使人们入手下手存眷和追逐Tapestry。
Tapestry的主要头脑之一就是PageComponent。
后面讲到,XWork可以主动把request参数映照到Action的属性傍边。Tapestry走得更远,乃至可以依据request参数,映照到Action(Tapestry内里称为Page)的办法,并把request参数映照为Page办法必要的参数,举行准确的挪用。就如许,Tapestry不但把输出输入数据,并且把事务办法也绑定到了Page下面。
在Tapestry框架中,Action的观点已十分含混,而换成了Page的观点。而TapestryPage是具有属性和事务的页面组件,个中的事务处置部相称于Action的职责,而属性部分起着Model的感化。
除利用Page和别的的Tapestry页面组件,用户也能够自界说页面组件。
这类页面组件/属性事务的编程模子,遭到一些程序员的接待。固然,这类编程模子并非没有价值的,每一个Tapestry模板文件都必要一个对应的.page文件。这些.page文件界说了页面组件的属性、事务、Validator等信息。
我们来看一下B/S布局中,组件的属性、事务和HTTPRequest绑定的基础道理。一个可以收回哀求的页面组件(好比Link和Button),在输入本人的HTML的时分,必要输入一些特别的信息来标记本组件的属性/事务,如许下次HTTPRequest来的时分,会把这些信息带返来,以便WebFramework加以识别辨认,发给准确的PageComponent处置。
这些特别信息一般包括在URL参数或HiddenInput内里,需要的时分,还必要天生一些JavaScript。Tapestry,Echo,JSF都是这类道理。
Tapestry的例子以下:
<ahref="#"jwcid="@DirectLink"parameters="ognl:currentItem.itemId"listener="ognl:listeners.showItem">
JSF用TagLib完成页面组件,也供应了相似的CommandLink和CommandButtonTag。个中对应Tapestrylistener的Tag属性是action。前面会解说。
Tapestry的模板标签是HTML标签的扩大,具有优秀的“所见即所得”特征,可以间接在扫瞄器中准确显现,这也是Tapestry的一个亮点。
5.Echo
http://sourceforge.net/projects/echo
Echo供应了一套相似Swing的页面组件,间接天生HTML。
从程序员的角度看来,用Echo编写Web程序,和用Swing编写Applet一样,属于纯面向组件事务编程,编程模子也以Event/Listener布局为主体。
Echo没有DispatcherServlet,也没有界说URL->Action映照的设置文件。
Echo的Action就是完成了ActionListener接口(参数为ActionEvent)的Servlet(承继EchoServer类)。
以是,Echo间接由WebServer依据web.xml设置的URL->Servlet的映照,举行转发把持。
Echo也没有分明的View层,Echo在页面组件方面走得更远,一切的HTML和JavaScript都由框架天生。你不用(也没有举措)写HTML,只必要(也只能)在Java代码中依照相似Swing编程体例,天生或操纵用户界面。用户也能够定制本人的Echo组件。
Echo的UIComponent的完成,接纳了两个主要的形式。一个是Peer(Component->ComponentPeer)形式,一个是UIComponent->Renderer形式。
固然Echo的API更相似于Swing,但完成上却接纳更靠近于AWT的Peer形式。每一个Component类(代表笼统的组件,好比Button),都有一个对应的ComponentPeer类(代表实践的组件,好比windows桌面的Button,Linux桌面的Button,HTMLButton等)。
先别急,这个事变还没有完。固然ComponentPeer落实到了详细的界面控件,可是它仍是舍不得显现本人,进一步把显现事情交给一个Renderer来实行。
好比,在Echo内里,Button类对应一个ButtonUI(承继了ComponentPeer)类,而这个ButtonUI类会把终极显现交给ButtonRender来处置。
听说多了这么一步,可以让显现把持加倍天真丰厚。好比,统一个Renderer能够处置分歧的UIComponent,统一个UIComponent也能够交给分歧的Renderer处置。
JSF的页面组件也接纳了UIComponent->Renderer形式,前面会讲到。
6.JSF
http://java.sun.com/j2ee/javaserverfaces/index.jsp
http://wwws.sun.com/software/communitysource/jsf/download.htmldownloadsource
JSF的中央头脑也是页面组件/属性事务。一样平常来讲,JSF的页面组件是一个三件套{UIComponent,Tag,Renderer}。
UIComponent有大概对应Model,Event,Listener。Tag包括componentType和rendererType两个属性,用来选择对应的的UIComponent和Renderer。
JSF的使用中心无疑是JSFTagLib。JSFTagLib包括了对应一切主要HTML元素的Tag,并且InputTag能够间接包括ValidatorTag大概Validator属性,来界说考证手腕。
我们经由过程JSF照顾的cardemo例子,来看JSF的处置流程。
(1)carDetail.jsp有以下内容:
<h:commandButtonaction="#{carstore.buyCurrentCar}"value="#{bundle.buy}"/>
能够看到,这个button的submitaction和carstore.buyCurrentCar办法绑定在一同。我们在Tapestry内里已经看到过相似的情形。
(2)carstore在faces-config.cml中界说:
<managed-bean>
<managed-bean-name>carstore</managed-bean-name>
<managed-bean-class>carstore.CarStore</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
(3)carstore.CarStore类中的buyCurrentCar办法以下:
publicStringbuyCurrentCar(){
getCurrentModel().getCurrentPrice();
return"confirmChoices";
}
(4)confirmChoices转向在faces-config.cml中界说:
<navigation-rule>
<from-view-id>/carDetail.jsp</from-view-id>
<navigation-case>
<description>
Anyactionthatreturns"confirmChoices"oncarDetail.jspshould
causenavigationtoconfirmChoices.jsp
</description>
<from-outcome>confirmChoices</from-outcome>
<to-view-id>/confirmChoices.jsp</to-view-id>
</navigation-case>
</navigation-rule>
(5)因而转到页面confirmChoices.jsp。
除Interceptor以外,JSF几近包括了古代WebFramework应当具有的一切特征:页面组件,属性事务,IoC(ManagedBean),Component->Renderer,相似于SwingComponent的Model-Event-Listener。
大概计划者以为,浩瀚复杂的形式可以包管JSF成为一个乐成的框架。Portal开源项目eXo就是创建在JSF框架上。
能够看出如许一个趋向,古代WebFramework以为B/S布局的无形态特征和HTML界面是对编程来讲是必要尽力掩饰的一个缺点,以是只管摹拟C/S布局的组件和事务机制,以吸引更多的程序员。
7.Maverick
http://mav.sourceforge.net/
Maverick是一个轻量而完整的MVCModel2框架。Maverick的Action不叫Action,刀切斧砍的称作Controller。
Controller只承受一个ControllerContext参数。request,response,servletconfig,serveltcontext等输出信息都包装在ControllerContext内里,并且Model也经由过程ControllerContext的model属性前往。全部编程布局明晰而明快,使人欣赏。
但这个天下上难有完美无缺的事变,因为ControllerContext只要一个model属性能够传送数据,程序员必需把一切必要的数据都打包在一个对象内里设置到model属性里。这类贫苦天然而然会招致如许的大概用法,间接把Controller自己设置为model,这又回到了Controller(Action)和Model一体的老路。
后面讲到,WebWork也把一切的输出信息都包装在ActionContext内里,但Action并没有权利猎取。而在Maverick中,Controller关于ControllerContext具有全权的把持,二者位置不成等量齐观。固然,因为参数ControllerContext包括request,reponse之类信息,这也意味着,MaverickController不克不及像WebWorkAction那样离开Web情况自力运转。
固然,这也其实不意味着任何布局性缺点。程序的布局由你本人把持,你完整能够把必要UnitTest的那部分从Web情况离开开来,放到Business层。
好像WebWork,Maverick间接撑持一切的支流View。Maverick的设置文件采Struts,Cocoon两家之长,URL->Action->View映照的主体布局相似于Struts,而View界说部分对Transform的撑持则相似于Cocoon。如:
<commandname="friends">
<controllerclass="org.infohazard.friendbook.ctl.Friends"/>
<viewname="success"path="friends.jsp">
<transformpath="trimInside.jsp"/>
</view>
</command>
8.SpringMVC
http://www.springframework.com/
SpringMVC是我见过的布局最明晰的MVCModel2完成。
Action不叫Action,正确地称做Controller;Controller吸收request,response参数,爽性拖拉地前往ModelAndView(个中的Model不是Object范例,而是Map范例)。
别的的WebFramework中,Action前往值一样平常都只是一个ViewName;Model则必要经由过程别的的路子(如request.attribute,Context参数,或Action自己的属性数据)传送上往。
Spring以一招IoC名满世界,其AOP也如日中天。“Spring出品,必属佳构”的看法已不得人心。我这里多说也有益,激烈倡议读者往浏览SpringDoc&Sample&Code自己。
9.Turbine
http://jakarta.apache.org/turbine/
Turbine是一个供应了完美权限把持的坚固框架(Fulcrum子项目是其基石)。Turbine的团体用户未几,但很多公司用户选择Turbine作为框架,开辟一些严厉的使用(我并没有说,用别的框架开辟的使用就不严厉^_^)。Portal开源项目JetSpeed创建在Turbine上。
Turbine用RunData来传送输出输入数据。好像Maverick的ControllerContext,RunData是全部Turbine框架的数据互换中央。除request,response等基础信息,RunData间接包含了User/ACL等权限把持相干的属性和办法,别的还包含ActionName和TargetTemplateName等定位属性。
Module是Turbine内里除RunData以外的又一个中心类,是Turbine框架的基础构件,Action是Module,Screen也是Module。Turbine供应了LoginUser和LogoutUser两个Action作为全部体系的收支口。而其他流量的权限把持则由相似于ServletFilter机制的Pipeline把持。
TurbinePipeline的编程模子和ServletFilter千篇一律:TurbinePipeline的Valve就相称于ServletFilter,而ValveContext则相称于FilterChain。另有更邻近的例子,Tomcat源代码内里也有Valve和ValueContext两个类,不但编程模子一样,并且名字也一样。
权限把持贯串于Turbine框架的一直。要用好Turbine,起首要知晓子项目Fulcrum的Security部分的权限完成模子。
FulcrumSecurity的权限实体包含四个--User,Group,Role,Permission。
实体之间包括{Role,Permission}和{Group,User,Role}两组干系。
{Role,Permission}是多对多的干系,一个Role能够具有各类Permission;{Group,User,Role}之间是多对多的干系,一个Group可包括多个User,并能够给User分派分歧的Role。
权限模子的完成一样接纳Peer形式,Entity->EntityPeer,Entity->ManagerPeer。
Entity和EntityManger代表笼统的模子观点,而EntityPeer和ManagerPeer代表详细的完成。
用户能够依据模子,供应分歧的完成,好比,用内存布局中完成,用数据表布局完成,与WindowsNT权限考证机制分离,与OSWorkflow的权限把持模子分离,等等。个中,用数据表布局完成,又能够选择用Torque完成,大概用Hibernate完成。(Torque是Turbine的O/RMapping子项目)
比方,Falcrum.property设置文件包括以下Security相干选项:
#-------------------------------------------------------------------
#SECURITYSERVICE
#-------------------------------------------------------------------
services.SecurityService.user.class=org.apache.fulcrum.security.impl.db.entity.TurbineUser
services.SecurityService.user.manager=org.apache.fulcrum.security.impl.db.DBUserManager
services.SecurityService.secure.passwords.algorithm=SHA
#-------------------------------------------------------------------
#DATABASESERVICE
#-------------------------------------------------------------------
services.DatabaseService.database.newapp.driver=org.gjt.mm.mysql.Driver
services.DatabaseService.database.newapp.url=jdbc:mysql://127.0.0.1/newapp
services.DatabaseService.database.newapp.username=turbine
services.DatabaseService.database.newapp.password=turbine
这申明,权限把持完成由数据库供应,必要依据权限模子创立以下数据表:
TURBINE_USER,TURBINE_ROLE,TURBINE_GROUP,
TURBINE_PERMISSION,TURBINE_ROLE_PERMISSION,
TURBINE_USER_GROUP_ROLE。
10.Cocoon
http://cocoon.apache.org
Cocoon项目是一个喝采不叫做的框架。接纳XML+XSLTPipeline机制,Java程序只必要输入XML数据,Cocoon框架挪用XSL文件把XML数据转换成HTML、WML等文件。
Cocoon壮大天真的XSLPipeline设置功效,XSLT的内容/显现分别的答应,一向吸引了很多程序员fans。怎奈天不从人愿,因为庞大度、速率瓶颈、XSL进修难度等成绩的限定,Cocoon一向次要限于网站公布出书范畴,向CMS和Portal偏向不休开展。别的,Cocoon开辟了XSP剧本和CocoonForm手艺。
Cocoon的sitemap.xmap设置文件对照庞大,与别的的WebFramework不同很年夜。
主体Pipelines设置部分接纳PatternMatch的体例,很像XSL语法,也能够类比于Web.xml内里ServletMapping的界说。好比,一个典范的URL->Action的映照界说看起来是这个模样:
<map:pipelines>
<map:pipeline>
<map:matchpattern="*-dept.html">
<map:actset="process">
<map:parametername="descriptor"
value="context://docs/department-form.xml"/>
<map:parametername="form-descriptor"
value="context://docs/department-form.xml"/>
<map:generatetype="serverpages"src="docs/confirm-dept.xsp"/>
<map:transformsrc="stylesheets/apache.xsl"/>
<map:serialize/>
</map:act>
<map:generatetype="serverpages"src="docs/{1}-dept.xsp"/>
<map:transformsrc="stylesheets/apache.xsl"/>
<map:serialize/>
</map:match>
</map:pipeline>
</map:pipelines>
11.Barracuda
http://barracudamvc.org/Barracuda/index.html
Barracuda是一个HTMLDOMComponent+Event/Listener布局的框架。
依据模板文件或设置文件天生静态Java类,并在代码中利用这些天生类,是Barracuda的一年夜特征。
Barracuda必要用XMLC项目把一切的HTML或WML模板文件,静态编译成DOM布局的Java类,作为页面组件。XMLC会依据HTML元素的id界说,天生响应DOM结点的烦琐操纵办法。
Barracuda的事务类也必要用BarracudaEventBuilder工具把event.xml编译成Java类,引进到工程中。Barracuda间接用Java类的承继干系映照事务之间的父子条理干系。好比,ChildEvent是ParentEvent的子类。
Barracuda的事务分为两类:RequestEvents(ControlEvents)和ResponseEvents(ViewEvents)。
Barracuda事务处置历程很像Windows体系动静行列的处置机制。
(1)Barracuda依据HTTPRequest天生RequestEvent,放进到事务行列中。
(2)EventDispatcher反省事务行列是不是为空,假如为空,停止。假如非空,依照先辈先出的体例,处置件行列中掏出一个事务,依据这个事务的范例,选择并挪用最符合的EventListener,参数EventContext包括事务行列。
“依据事务范例,选择最符合的EventListener对象”的历程是如许的:好比,
EventDispatcher从工夫行列里掏出来一个事务,范例是ChildEvent;Barracuda起首寻觅注册了监听ChildEvent的EventListener,假如找不到,再上溯到ChildEvent的父类ParentEvent,看哪些EventListener对ParentEvent感乐趣。
具体历程拜见Barracuda的DefaultEventDispatcher类。
(3)EventListener依据EventContext包括的request信息,挪用贸易逻辑,取得了局数据,然后依据分歧情形,把新的事务到场到EventContext的事务行列中。
(4)把持交还给EventDispatcher,回到第(2)步。
TheEnd.
Enjoy.
市场分额,java比asp高一点,因为C#是仿照java开发的,所以哦C#能做的java都能做到,但是java能做的,C#不一定都能做到。毕竟是抄袭吗。 学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。 象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。 Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。 另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。 让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。 Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台 是一种使用者不需花费很多时间学习的语言 是一种突破用户端机器环境和CPU 学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。 你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。 学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。 Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。 其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。 让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。 一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从 《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。 是一种语言,用以产生「小应用程序(Applet(s)) 多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
页:
[1]