JAVA网页编程之Structs深切研讨(一)-----Struts fra...
最后我再次声明,我并没有说不看好java,实际上我对java很乐观的,毕竟她正在不断改进中,我相信她总有一天会和.net并驾齐驱的Strutsframework的事情道理和组件
关于Struts怎样把持、处置客户哀求,让我们经由过程对struts的四个中心组件先容来详细申明。这几个组件就是:ActionServlet。ActionClasses,ActionMapping(此处包含ActionForward),ActionFromBean。
StrutsActionServlet把持器对象
ActionServlet承继自javax.servlet.http.HttpServlet类,其在Strutsframework中饰演的脚色是中央把持器。它供应一其中心地位来处置全体的终端哀求。把持器ActionServlet次要卖力将HTTP的客户哀求信息组装后,依据设置文件的指定形貌,转发到得当的处置器。
依照Servelt的尺度,一切得Servlet必需在web设置文件(web.xml)声明。一样,ActoinServlet必需在WebApplication设置文件(web.xml)中形貌,有关设置信息以下。
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
</servlet>
全体的哀求URI以*.do的形式存在并映照到这个servlet,其设置以下:
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
一个该形式的哀求URI切合以下格局:
http://www.my_site_name.com/mycontext/actionName.do
中央把持器为一切的暗示层哀求供应了一个会合的会见点。这个把持器供应的笼统观点加重了开辟者创建大众使用体系服务的坚苦,如办理视图、会话及表双数据。它也供应一个通用机制如毛病及非常处置,导航,国际化,数据考证,数据转换等。
当用户向服务器端提交哀求的时分,实践上信息是起首发送到把持器ActionServlet,一旦把持器取得了哀求,其就会将哀求信息传交给一些帮助类(helpclasses)处置。这些帮助类晓得怎样去向理与哀求信息所对应的营业操纵。在Struts中,这个帮助类就是org.apache.struts.action.Action。一般开辟者必要本人承继Aciton类,从而完成本人的Action实例。
StrutsActionClasses
ActionServlet把全体提交的哀求都被把持器托付到RequestProcessor对象。RequestProcessor利用struts-config.xml文件反省哀求URI找到举措Action标示符。
一个Action类的脚色,就像客户哀求举措和营业逻辑处置之间的一个适配器(Adaptor),其功效就是将哀求与营业逻辑分隔。如许的分别,使得客户哀求和Action类之间能够有多个点对点的映照。并且Action类一般还供应了别的的帮助功效,好比:认证(authorization)、日记(logging)和数据考证(validation)。
publicActionForwardexecute(ActionMappingmapping,
ActionFormform,
javax.servlet.ServletRequestrequest,
javax.servlet.ServletResponseresponse)
throwsjava.io.IOException,javax.servlet.ServletException
Action最为经常使用的是execute()办法。(注重,之前的perform办法在struts1.1中已不再撑持),另有一个execute()办法,请参考apidoc,在此不在申明。
当Controller收到客户的哀求的时分,在将哀求转移到一个Action实例时,假如这个实例不存在,把持器会起首创立,然后会挪用这个Action实例的execute()办法。StrutsFramework为使用体系中的每个Action类只创立一个实例。由于一切的用户都利用这一个实例,以是你必需断定你的Action类运转在一个多线程的情况中。下图显现了一个execute()办法怎样被会见:
Action实例的execute()办法
注重,客户本人承继的Action子类,必需重写execute()办法,由于Action类在默许情形下是前往null的。
StrutsActionMapping
下面讲到了一个客户哀求是怎样被把持器转发和处置的,可是,把持器怎样晓得甚么样的信息转发到甚么样的Action类呢?这就必要一些与举措和哀求信息绝对应的映照设置申明。在struts中,这些设置映照信息是存储在特定的XML文件(好比struts-config.xml)。
这些设置信息在体系启动的时分被读进内存,供strutsframework在运转时代利用。在内存中,每个<action>元素都与org.apache.struts.action.ActionMapping类的一个实例对应。下表就显现了一个上岸的设置映照。
<action-mappings>
<actionpath="/logonAction"
type="com.test.LogonAction"
name="LogonForm"
scope="request"
input="logoncheck.jsp"
validate="false">
<forwardname="welcome"path="/welcome.jsp"/>
<forwardname="failure"path="/logon_failure.jsp"/>
</action>
</action-mappings>
<form-beans>
<form-beanname="LoginForm"
type="com.test.LoginForm"/>
</form-beans>
下面的设置暗示:当能够经由过程/logonAction.do(此处假定设置的把持器映照为*.do)提交哀求信息的时分,把持器将信息托付com.test.LogonAction处置。挪用LogonAction实例的execute()办法。同时将Mapping实例和所对应的LogonFormBean信息传进。个中name=LogonForm,利用的form-bean元素所声明的ActionFormBean。有关form-bean的声名以下显现。
利用ActionForward导航
元素<forward>则暗示了当Action实例的execute()办法运转终了或,把持器依据Mapping可将呼应信息转到得当的中央。如下面实际,假如客户上岸乐成,则挪用welcomeforward,将乐成信息前往到/welcome.jsp页面。在你的execute()办法的开头可使用上面的实例代码而前往welcomeforward。固然你的welcomeforward必需在action元素属性中界说,正如下面所声明的那样。
return(mapping.findForward("welcome"));
ActionForward对象是设置对象。这些设置对象具有举世无双的标识以同意它们依照成心义的称号如“success”,“failure”等来检索。ActionForward对象封装了向行进的URL路径且被哀求处置器用于辨认方针视图。ActionForward对象创建自<forward>元素位于struts-config.xml。上面是一个Struts中<forward>元素例子,属于<action>元素局限。
<actionpath="/editCustomerProfile"
type="packageName.EditCustomerProfileAction"
name="customerProfileForm"scope="request">
<forwardname="success"path="/MainMenu.jsp"/>
<forwardname="failure"path="/CustomerService.jsp"/>
</action>
基于实行哀求处置器的execute(…)办法的了局,当传送一个值婚配指定于<forward>元素中name属性的值的时分,下一个视图能够在execute(…)办法中被开辟者用便利的办法org.apache.struts.action.ActionMapping.findForward(…)选择。ActionMapping.findForward(…)办法既从它的当地局限又从全局局限供应一个ActionForward对象,该对象前往至RequestProcessor以RequestDispatcher.forward(…)或response.sendRedirect(…)挪用下一个视图。当<forward>元素有redirect=“false”属性或redirect属性不存在的时分,RequestDispatcher.forward(…)被实行;当redirect=“true”是,将挪用sendRedirect(…)办法。下例举例申明了redirect属性的用法:
<forwardname="success"path="/Catalog.jsp"redirect="true"/>
假如redirect=true,URL创建如/contextPath/path由于HttpServletResponse.sendRedirect(…)中注释URL接纳”/”开首相对servlet容器根目次。
假如redirect=false,URI创建如/path由于ServletContext.getRequestDisptacher(…)接纳假造目次相干URL。
在此稍稍说一下有关global-forwards的观点。其在设置文件中形貌了全部使用体系可使用的ActionForward,而不是仅仅是一个特定的Action。
<global-forwards>
<forwardname="logout"path="/logout.do"/>
<forwardname="error"path="/error.jsp"/>
</global-forwards>
StrutsActionFormBean捕捉表双数据
在下面解说ActionServlet,ActionClasses和ActionMapping的时分,我们都提到了ActionFormBean的观点。一个使用体系的动静转移(大概说形态转移)的非耐久性数据存储,是由ActionFormBean的卖力坚持的。
ActionForm派生的对象用于保留哀求对象的参数,因而它们和用户严密接洽。
一个ActionForm类被RequestProcessor创建。这是产生在已完成向行进到一个URL,该URL为映照到把持器servlet而不是JSP和响应的举措映照指定的表单属性的。在这个情形下,假如没有在指定的举动局限内找到,RequestProcessor将实验寻觅大概招致创立一个新ActionForm对象的表单bean。该ActionForm对象在指定的举动局限内被用<action>元素的name属性找到;
RequestProcessor将随后从头布置表单属性,用哀求时参数添补表单,随即挪用表单对象的validate(…)办法以实行服务器端用户输出考证。仅当ActionMapping对象中validate属性被设为true时,validate(…)办法被挪用;这就是默许的举动。request.getParameterValues(parameterName)被用于失掉一个String[]对象,它用来表单添补;考证的了局应当是一个ActionErrors对象,用org.apache.struts.taglib.html.ErrorsTag来显现考证毛病给用户。ActionForm也能够被用于为以后用户保留行将被一个视图援用的两头模子形态。
当一个表单对象被RequestProcessor找到,它被传送到哀求处置器的execute(…)办法。一个ActionForm对象也能够被哀求处置器创建。表单对象创建目标是供应两头模子形态给利用哀求局限JSP;这将确保对象不会在无效性过时后仍旧存在。默许的,一切的表单都被保留为会话局限。会话中表单对象离开无效性的存在大概招致华侈内存,一样的,哀求处置器必需跟踪保留在会话中的表单对象的性命周期。一个好的捕捉表双数据的理论是为高出多用户交互的相干表单用一个独自的表单bean。表单bean也能够在反应的时分用来贮存可以被自界说标签改动的两头模子形态。在视图中标签用法制止分离Java代码,因而要成一个好的义务分别,web临盆组次要处置标记,而使用开辟组次要处置Java代码。标签要素加入会见两头模子形态的逻辑;当会见嵌套的对象或当经由过程会萃枚举时这个逻辑大概很庞大。
注重:在struts1.1中,ActionForm的校验功效,渐渐被剥离出来(固然仍然可使用)。利用了validatorframework对全部使用体系的表双数据考证举行一致办理。信任信息请参考:http://home.earthlink.net/~dwinterfeldt
在ActionForm的利用中,Struts倡始利用到值对象(ValueObject)。如许将客户或开辟职员,对数据形态与对象形态可以加倍明晰的了解和利用。
关于每个客户哀求,Strutsframework在处置ActionForm的时分,一样平常必要履历以下几个步骤:
(1)反省Action的映照,断定Action中已设置了对ActionForm的映照
(2)依据name属性,查找formbean的设置信息
(3)反省Action的formbean的利用局限,断定在此局限下,是不是已有此formbean的实例。
(4)假设以后局限下,已存在了此formbean的实例,而是对以后哀求来讲,是统一品种型的话,那末就重用。
(5)不然,就从头构建一个formbean的实例
(6)formbean的reset()办法备挪用
(7)挪用对应的setter办法,对形态属性赋值
(8)假如validatede的属性北设置为true,那末就挪用formbean的validate()办法。
(9)假如validate()办法没有前往任何毛病,把持器将ActionForm作为参数,传给Action实例的execute()办法并实行。
注重:间接从ActionFrom类承继的reset()和validate()办法,其实不能完成甚么处置功效,以是有需要本人从头掩盖。
Struts的其他组件
Strutsframework自己供应了良多可扩大的组件或subframework,便利的开辟职员在其构架上构建web层的使用体系。好比upload,collections,logging等等。让我们来看看两个对照主要的组件:validationgframework和strutstaglib。有关其他组件请参考Struts用户手册(http://jakarta.apache.org/struts/userGuide)。
ValidationFrameworkforStruts
在struts1.1中,新增了validationframework。增添了对form数据提交的考证。将底本必要在ActionFromBean的validate()举行的考证经由过程设置文件的形貌举行考证。
有关其具体信息,请参考http://home.earthlink.net/~dwinterfeldt。团体倡议关于小型使用体系能够接纳这类设置体例,可是关于使用体系中有大批web层表单使用的体系,而且营业需求变化对照年夜的,利用validationframework大概会减轻开辟难度、体系保护难度。能够自创validationframework的JavascriptValidatorTag。
StrutsTagLib
struts供应了一组可扩大的自界说标签库(TagLib),能够简化创立用户界面的历程。今朝包含:BeanTags,HTMLTags,LogicTags,NestedTags,TemplateTags 这几个Taglib。有关StrutsTaglib的布局和利用,能够参考后面有关CutomerTagLib的先容,有关起具体材料,请参考
BeanUtils
这个组件的全称是BeanIntrospectionUtilites。是属于JakartaCommons项目组的。次要是匡助构建javabean的属性操纵的(getter,setter),已供应一种静态界说和会见bean的属性。有关具体信息,请参考。
http://jakarta.apache.org/commons/beanutils.html
假如列位对这方面有很乐趣,能够参考一些有关java反射(Reflectio)方面的材料。
Collections
这个组件次要是供应了一些汇合或列表对象,在原本的javacollectionsframework的基本长进行了扩大。具体材料请参考:
http://jakarta.apache.org/commons/collections.html和
http://cvs.apache.org/viewcvs/~checkout~/jakarta-commons/collections/STATUS.html?rev=1.13
Digester
这个组件翻译成中文的意义是“汇编”。其次要功效是依据xml设置文件,初始化体系的一些java类对象。Digester匡助你指定XML与java对象之间映照模子,并且同意客户话定制映照划定规矩(rules)。具体材料请参考
http://jakarta.apache.org/commons/digester.html
在性能方面,在windows平台下,.net可能是占强项,要是把.net放在sun开发的操作系统上去运行呢?根本就运行不了,.net对其它操作系统的支持也很弱,性能也可能比不上java。 《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。 至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。 所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。 J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。 当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢? Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台 Java是一种计算机编程语言,拥有跨平台、面向对java 是一种突破用户端机器环境和CPU 关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。 如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。 你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。 是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能 至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。 至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。 你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。 Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站 任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言 关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。 是一种语言,用以产生「小应用程序(Applet(s))
页:
[1]