JAVA网页设计集成 Struts、Tiles 和 JavaServer Fac...
net程序员的大部门代码都靠控件拖拽完成的,虽然java也有,但是无论从美观和速度上都没发和.net比。java程序员都是代码完成的,所以java程序员常戏称.net程序员是操作员,呵呵。server内容:JSF简介为何将这三者集成为一体?将Struts和JSF与Struts-Faces集成将Struts使用程序移植到JSF集成Struts-Faces和Tiles的应战到今朝为止所作的改动参考材料作者简介对本文的评价相干内容:Struts,anopen-sourceMVCimplementationStrutsandTilesaidcomponent-baseddevelopmentUIdevelopmentwithJavaServerFacesdeveloperWorksToolbox定阅定阅:developerWorks时势通信将三种手艺的功效、天真性和可办理性集成到一同SrikanthShenoy,J2EE参谋,ObjectseekInc.NithinMallya,J2EE参谋,ObjectseekInc.2003年10月25日
您是不是想将JavaServerFaces(JSF)的壮大前端功效、Tiles的内容格局编排上风和Strutscontroller层的天真性都到场到您的J2EEWeb使用程序中?企业级Java专家SrikanthShenoy和NithinMallya为您展现了怎样将这三者的功效集成到一同。本文演示了怎样在Struts-Faces集成库中定制类以使得它们能够与Tiles和JSF一同利用,并用一个实践的例子注释了这个历程面前的基础道理和怎样利用新的一组类的细节。
将Struts、Tiles和JavaServerFaces(JSF)一同利用,开辟职员能够完成易于办理和重用的、强健的、界面明晰的Web使用程序。
Struts框架推出已有一段工夫了,它已成为在开辟J2EEWeb使用程序时开辟职员所接纳的现实上的尺度。Tiles框架是在Struts以后不久呈现的,它经由过程为开辟职员供应用组件组装展现页面的才能开辟了本人的保存情况。JSF是Web使用程序框架中最新的成员,它供应了考证用户输出和处置用户事务的机制,最主要的是,这是一种以协定有关的体例出现用户界面组件的办法(有关这些手艺的概略,拜见本文相干页面“Themajorplayers”)。
只管Struts和JSF中有一些功效是堆叠的,可是它们在其他方面起到了互为增补的感化。这三种手艺的分离能够为开辟Web使用程序、构造其展现和以协定有关的体例出现定制的用户界面(UI)组件供应一种高效的路子。
为了运转本文中的示例代码,必要Struts1.1、Tiles、JavaServerFacesReferenceImplementation(JSF-RI)EarlyAccessRelease4.0和Struts-Faces0.4。Jakarta项目供应的Struts1.1刊行版本将Struts和Tiles绑缚公布。还能够从Jakarta项目高低载Struts-Faces集成库。JSF-RI是Sun的Web开辟工具包(WebServicesDeveloperPack)的一部分(在参考材料中有这些下载和示例代码的链接)。
如今回到集成三种手艺的细节上。起首有个坏动静:在本文宣布的时分,这三种手艺是不克不及间接互操纵的。好动静是:在本文中,我们展现了集成Struts、Tiles和JSF的办法。我们假定您已懂得Struts和Tiles。对JSF有一些懂得会有匡助(参阅参考材料中供应的developerWorks上的JSF教程的链接),可是不懂得也无妨碍对本文的了解。
JSF简介JSF使用程序是利用JSF框架的一般J2EEWeb使用程序,JSF框架供应了丰厚的GUI组件模子,这些模子表现了真实的GUI框架内在。您大概听人们说过,只管某种手艺不错,可是它的表面仍旧必要改善。是的,用HTML组件构建平铺直叙的页面的日子已已往了,假如利用JSF的话,具有更初级GUI表面的日子就在长远。您会问,怎样做呢?树形组件、菜单组件和图形是已存在的UI组件,这些JSF必定要供应。更进一步,JSF经由过程供应简单利用的API勉励创立自界说组件。
注:这里所提到的UI组件是Sun供应的示例的一部分。像一切标准一样,实践的完成由分歧的供应商完成。
在传统的利用模子-视图-把持器(MVC)的Web使用程序中,GUI组件是由处置展现和营业逻辑的自界说标志所暗示的。如许就呈现了必需“编写与客户机设备打交道的代码”的成绩,这会发生反复的代码。利用JSF就不会有这个成绩。
JSF布局将展现逻辑(“甚么”)与UI组件的营业逻辑(“为何”和“怎样”)分别。经由过程在JSP页面中利用JSF标志,就能够将renderer与UI组件联系关系在一同。一个UI组件能够用分歧的renderer从而以分歧的体例出现。特定于UI组件的代码在服务器上运转,而且呼应用户操纵所发生的事务。
JSF-RI供应了一个renderkit,它带有一个自界说标志库,用以从UI组件出现HTML。它还供应了依据必要定制这些组件表面的才能。假如必要特别的组件,那末能够为特定的客户机设备机关定制的标志并让它与一个子UI组件和定制的renderer相干联。关于分歧的设备,您所必要做的就是指定分歧的renderer。
JSF和UI组件您大概已用JavaAWT大概SwingAPI创立过JavaGUI使用程序,以是您应当熟习JSF的UIComponent(它与AWT大概Swing组件很相像)。它贮存其子组件的树(假如有的话)并为客户端产生的举措天生尺度事务,比方单击一个按钮以提交表单。这些事务缓存在FacesContext中。您能够用自界说标志联系关系每个这类事务的处置程序。比方,用一个自界说的ActionListener处置用户单击大概表单提交。
JSFUIComponent、Renderer和标志老是配合事情的。一切JSP自界说标志都是经由过程承继UIComponentTag创立的。doStart和doEnd办法老是在UIComponentTag类中完成。您只需在这些标志类中供应其他的功效。
展现了自界说标志、UI组件和renderer之间的干系。客户机扫瞄器会见用JSF标志(jsf:myTag)暗示UI组件(MyComponent)的JSP页面。这个UI组件运转在服务器上,并用得当的renderer(MyRenderer)以HTML的情势出现给客户。这个JSP页面体现了在JSF-RI中利用带自界说标志的用户界面组件而不是在HTML中对它们举行编码。
比方,展现了h:panel:group标志的利用。这个标志用于将一个父组件上面的各个组件构造到一同。假如与像panel_grid和panel_data如许的其他面板标志配合利用,那末它会在运转时天生HTML表中的列的标志。JSF-RI-供应的html_basic标志库用于暗示像文本字段、按钮如许的HTML组件。
.出现一个JSF页面
JSF性命周期JSF性命周期包含六个阶段:一个传进的哀求大概会履历全体阶段,也大概不履历任何阶段,这取决于哀求的范例、在性命周期中产生的考证和转换毛病和呼应的范例。JSF框架处置由JSP页天生的Faces哀求,并前往faces大概non-faces呼应。
在提交一个JSF表单,大概当用户单击指向在URL中具有/faces前缀的URL的链接时,就会呈现faces呼应。一切faces哀求都由一个FacesServlet处置--这是JSF中的把持器。
发送给一个servlet大概一个没有JSF组件的JSP页面的哀求称为non-faces哀求。假如了局页中有JSF标志,那末它就称为faces呼应,假如没有JSF标志,就是non-faces呼应。
JSF性命周期有六个阶段:
重修哀求树使用哀求值举行考证更新模子值挪用使用程序出现呼应
依据JSF标准,每阶段暗示哀求处置性命周期的一个逻辑观点。不外在JSF-RI中,这些阶段是由具有对应名字的实践类暗示的。上面一节形貌了每阶段是怎样对哀求举行处置并天生呼应的。您将起首看到的是处置一个faces哀求所触及的阶段,然后是处置faces呼应所触及的阶段。
处置faces哀求为了了解JSF哀求处置,请看FlightSearch.jsp,这是清单1中的一个复杂的JSF表单。一个JSF页面基础上就是这个模样的。这个JSF表单有输出文本字段from和tocities、departure和returndates,另有提交和重设表单的按钮(我们会在稍后剖析清单1中每个标志的意义)。如今,假定提交这个表单发生了一个faces哀求。
这个哀求被FacesServlet所吸收、并在向客户发还呼应之前经由过程分歧的阶段。展现了怎样对JSF哀求举行处置。让我们看一看这是怎样举行的。
1.吸收哀求FacesServlet吸收哀求并从FacesContextFactory失掉FacesContext的一个实例。
2.托付性命周期处置FacesServlet经由过程对在faces高低文中传送的Lifecycle完成挪用execute办法将性命周期处置托付给Lifecycle接口。
3.Lifecycle实行每阶段Lifecycle完成实行从重修组件树阶段入手下手的每阶段。
4.创立的组件树在重修组件树阶段,用travelForm中的组件创立一个组件树。这个树以UIForm作为根,用分歧的文本字段和按钮作为其子组件。
fromCity字段有一个考证划定规矩,它划定其不克不及为空,如validate_required标志所示。这个标志将fromCity文本字段与一个JSFValidator链接起来。
JSF有几个内建的考证器。响应的Validator是在这个阶段初始化的。这个组件树缓存在FacesContext中、而且这个高低文会在前面用于会见树及挪用任何一个事务处置程序。同时UIForm形态会主动保留。以是,当革新这一页时,就会显现表单的原始内容。
5.从树中提取值在使用哀求值阶段,JSF完成遍历组件树并用decode办法从哀求中提取值,并在当地设置每个组件。假如在这个过程当中呈现了任何毛病,那末它们就在FacesContext中列队并在出现呼应阶段显现给用户。
同时,在这个阶段列队的一切由像单击按钮如许的用户操纵发生的事务,都播送给注册的侦听器。单击reset按钮会将文本字段中的值从头设置为它们本来的值。
6.处置考证在处置考证阶段,对在使用哀求值阶段设置的当地值举行一切与各组件相干的考证。当JSF完成对每个注册的考证器挪用validate办法时就会进进此阶段。
假如任何一项考证失利,那末性命周期就会进进出现呼应阶段,在那边出现带有毛病信息的统一页面。在这里,一切在这一阶段列队的事务一样城市播送给注册的侦听器。
JSF完成处置源字段上的考证器。假如数据是有效的,那末把持就交给出现呼应阶段,在这个阶段从头显现FlightSearch.jsp并带有相干组件的考证毛病。经由过程在JSP页面中声明output_errors,,页面中的一切毛病城市显现在页面的底部。
7.设置模子对象值在更新模子值阶段,乐成处置了一切考证后,JSF完成就经由过程对每组件挪用updateModel办法用无效值设置模子对象值。假如在将当地数据转换为由模子对象属性所指定的范例时呈现任何毛病,那末性命周期就进进出现呼应阶段,并将毛病显现出来。来自表单字段属性的值会添补为模子对象的属性值。
8.能够挪用ActionListener能够将一个ActionListener与一个用户操纵,如单击提交按钮相干联,如清单1所示。在挪用使用程序阶段,对FlightSearchActionListener挪用了processAction办法。在实践使用中,processAction办法在挪用后会搜刮数据以找出满意前提的航班,并从组件的action属性中提取输入。
在本文供应的这个示例Web使用程序中,我们利用了静态数据暗示航班表。这个办法还将提取的action属性发送给NavigationHandler完成。NavigationHandler查询faces-config.xml文件--这是JSF的默许使用程序设置文件--以依据这一输入断定下一页是甚么。
9.出现呼应在出现呼应阶段,假如在faces高低文中没有毛病,就显现由查询设置文件失掉的这一页FlightList.jsp。假如是由于后面任一阶段的毛病而抵达这一阶段的,那末就会从头显现带有毛病信息的FlightSearch.jsp。
.处置一个JSF哀求单击这里以寓目该图。
清单1.FlightSearch.jsp,一个复杂的JSF表单
<%@tagliburi="http://java.sun.com/jsf/html"prefix="h"%><%@tagliburi="http://java.sun.com/jsf/core"prefix="f"%><f:use_faces><h:formid="flightForm"formName="flightForm"><h:input_textid="fromCity"valueRef="FlightSearchBean.fromCity"><f:validate_required/><h:input_text/><h:input_textid="toCity"valueRef="FlightSearchBean.toCity"><h:input_textid="departureDate"valueRef="FlightSearchBean.departureDate"><h:input_textid="arrivalDate"valueRef="FlightSearchBean.arrivalDate"><h:command_buttonid="submit"action="success"label="Submit"commandName="submit"><f:action_listenertype="foo.bar.FlightSearchActionListener"/></h:command_button><h:command_buttonid="reset"action="reset"label="Reset"commandName="reset"/><h:output_errors/></h:form></f:use_faces>
在这段代码中利用了两个JSF-RI的标志库。html_basic标志库界说了HTML组件经常使用的标志,而jsf-core标志库包括用于注册侦听器和考证器的标志。其他标志有:
f:use_faces标志向JSF完成标明前面的标志是faces标志。f:validate_required标志标明它地点的字段(在FlightSearchBean中是fromCity字段)在提交表单时应当有值。h:form和h:input_text标志分离暗示一个名为flightSearchForm的HTML表单和各类文本字段。h:command_button标志用于暗示提交和重设按钮。最初,h:output_errors标志相似于Strutshtml:errors标志,用于显现在表单字段考证中呈现的任何毛病。
一个名为FlightSearchBean的JavaBean暗示在更新模子值阶段用UIComponent数据更新的模子。一般在JSP页中JavaBean是用jsp:useBean标志声明的。您大概注重到了在FlightSearch.jsp中没有如许做。这是由于可使用JSF的一个名为ManagedBeans的功效,在faces设置文件中声明一切JSP页面利用的JavaBeans组件。在入手下手时,servlet容器会初始化这些JavaBeans组件。faces-config.xml文件中的FlightSearchBean出口如清单2所示:
清单2.faces-config.xml的TravelInfoBean出口
<managed-bean><managed-bean-name>FlightSearchBean</managed-bean-name><managed-bean-class>foo.bar.FlightSearchBean</managed-bean-class><managed-bean-scope>session</managed-bean-scope></managed-bean>
如今让我们看一看这些阶段是怎样处置呼应的。
出现faces呼应一个faces呼应是由Faces使用程序在天生包括JSF标志的JSP页时天生的。这个呼应能够是JSF使用程序的faces大概non-faces呼应。
在我们的例子中,清单1中页面的出现是一个faces呼应。您大概熟习Tag接口的doStartTag()和doEndTag()办法。在JSF和Struts-Faces中,每个标志都是从UIComponentTag扩大的。UIComponentTag完成了doStartTag()和doEndTag()办法。
它另有两个笼统办法getComponentType()和getRendererType()。经由过程在详细的标志类中完成这两个办法,就能够分离指定组件和renderer的范例。
思索一个带有文本字段的复杂JSF表单。在出现JSF表单时实行以下一系列步骤。
1.挪用doStartTag()办法Servlet窗口对FormTag挪用doStartTag()办法。
2.失掉UIComponentFormTag从getComponentType()办法失掉其UIComponent。UIComponentTag(FormTag的父组件)利用getComponentType()以从faces-config.xml文件中查询这个组件的类名,并创立UIComponent(FormComponent)的一个实例。
3.失掉renderer下一步,FormTag从getRendererType办法中失掉其renderer。与组件范例一样,renderer名是在faces-config.xml文件中查询的。
4.挪用编码办法在创立了FormComponent和FormRenderer后,对FormComponent挪用encodeBegin()办法。每个标志的出现都由encodeBegin()入手下手、由encodeEnd()停止。encodeBegin()办法是按嵌套的按次挪用的。
5.停止标志和出现HTMLservlet容器对标志挪用doEndTag()办法。以嵌套的反按次对每个组件挪用encodeEnd()办法。在最初,表单和一切嵌套的组件都出现为HTML。这时候,HTML就天生终了,并出现出对应于JSP的HTML。
显现组成天生faces呼应的事务序列。
.出现一个faces呼应单击这里以检察该图。
为何将这三者集成为一体?跟着JSP和相干标准的不休开展,像JSF和JSP标志库(大概JSTL,它利用复杂的标志封装很多JSP使用程序经常使用的中心功效)如许的新尺度正在不休呈现。上面是利用集成为一个全体的新手艺一些优点:
更明晰地分别举动和展现。将标志、renderer和组件分别,就能够更好地界说开辟周期中的页面作者和使用程序开辟职员的感化。改动一个组件的展现不会有雪崩效应。如今您能够简单地只对renderer作出改动。在传统的MVC模子中,因为没有这类分别,关于标志的任何改动都必要改动营业逻辑。如今再不必要如许了。renderer有关性。也能够说是协定有关性,经由过程对带有多个renderer的多种展现设备反复利用组件逻辑完成。利用分歧renderer的才能使得不再必要对特定的设备编写全部暗示层代码。组装和重用自界说组件的尺度。JSF的思索局限超越了“表单和字段”,它供应了丰厚的组件模子用以出现自界说GUI组件。用JSF能够定制每个组件在页面中的表面和举动。开辟职员还具有创立他们本人的GUI组件(如菜单和树)的才能,这些组件能够用复杂的自界说标志简单地到场就任何JSP页面中。就像AWT和Swing所供应的Java前端GUI组件一样,我们能够在我们的Web页而中有自界说的组件,它们利用本人的事务处置程序并有定制的表面。这是Web层的GUI地狱!
Struts是一种已具有大批客户基本的框架。很多IT部门熟悉到这类MVC框架的代价并利用它有一段工夫了。JSF没有像Structs如许壮大的把持器布局,也没有像它那样尺度化的ActionForm和Actions(及它们声明的才能)。将Tiles集成到汇合体中,就给了本人反复利用和以无缝的体例改动公司结构的才能。
移植撑持JSF的Struts使用程序的应战是两重的。起首,Struts标志不是JSF兼容的。换句话说,它们没有像JSF标准所划定的那样扩大UIComponentTag,以是,JSF不克不及注释它们并联系关系到UIComponent和Renderers。
其次,在FacesServlet与StrutsRequestProcessor之间没有链接。在Struts使用程序中,RequestProcessor卖力用ActionForm和Actions类中的回调办法显现。ActionForm属性和validate()的getter和setter是ActionForm中的回调办法。关于Action,execute()是回调办法。除非挪用了RequestProcessor,不然StrutsActionForm和Actions类中的回调办法没无机会挪用营业逻辑。
将Struts和JSF与Struts-Faces集成这里,您大概会问是不是有软件能够匡助将Struts与JSF集成,大概是不是必需本人编写集成软件。
好动静是已有如许的软件了。Struts-Faces是一个初期公布的StrutsJSF集成库。这个库是由CraigMcClanahan创立的,它使得将现有Struts使用程序移植到JSF变得简单了(保存了对现有Struts投资的代价)。Struts-Faces还力争与JSF举行简便的集成,如许就能够在前端利用JSF,同时后端仍旧有熟习的Struts组件。
展现了Struts-Faces与JSF类之间的干系。蓝色的类属于Struts-Faces。
.Struts-Faces类图单击这里以检察该图。
上面是Struts-Faces的次要组件:
FacesRequestProcessor类,它处置一切faces哀求。这个类承继了惯例StrutsRequestProcessor,并处置faces哀求。Non-faces哀求发送给出其父类--RequestProcessor。ActionListenerImpl类,它处置像提交表单大概单击链接如许的ActionEvent。这个类用于取代由JSF-RI供应的默许ActionListener完成。只需在一个faces哀求中天生ActionEvent,就会对ActionListenerImpl挪用processAction()办法、并将ActionEvents转送给FacesRequestProcessor。这很成心思,由于RequestProcessor一般只由ActionServlet挪用以处置HTTP哀求。FormComponent类,它扩大了JSFForm组件,可是是在Struts性命周期内挪用的。FormComponent的renderer和标志。只用于输入的数据标志和renderer,这里不必要分别组件。比方,ErrorsTag和ErrorsRenderer用于在HTML中显现表单毛病。ServletContextListener的名为LifeCycleListener的完成。它用于在初始化时注册响应的RequestProcessor。faces-config.xml文件。这个文件已绑缚在struts-faces.jar文件中。
清单3展现了利用Struts-Faces标志的FlightSearch.jsp。它相似于在清单1中展现的JSF例子。这里用粗体凸起了区分的地方。在这里,您会发明增添了一个新标志库tags-faces。这个标志库界说声明这些标志由Struts-FacesAPI所利用。
清单3.FlightSearch.jsp利用Struts-Faces标志
<%@tagliburi="http://java.sun.com/jsf/html"prefix="h"%><%@tagliburi="http://java.sun.com/jsf/core"prefix="f"%><%@tagliburi="http://jakarta.apache.org/struts/tags-faces"prefix="s"%><f:use_faces><s:formaction="/listFlights"><h:input_textid="fromCity"valueRef="FlightSearchForm.fromCity"/><h:input_textid="toCity"valueRef="FlightSearchForm.toCity"/><h:input_textid="departureDate"valueRef="FlightSearchForm.departureDate"><h:input_textid="arrivalDate"valueRef="FlightSearchForm.arrivalDate"><h:command_buttonid="submit"action="success"label="Submit"commandName="submit"/><h:command_buttonid="reset"action="reset"label="Reset"commandName="reset"/><s:errors/></s:form></f:use_faces>
s:form标志用于创立这个HTML表单。表单的action属性是/listFlights而不是像清单1那样指定为表单名flightForm。在JSF中,表单名只是指定给UIForm的名字而没有更多的意义。
FlightSearchBean是JSF表单的模子,并在更新模子值阶段失掉其值。不外在Struts中,表单action指向Struts设置文件struts-config.xml中的ActionMapping。为了了解它是怎样起感化的,还必需看一下清单4中显现的struts-config.xml文件。
您会看到/listFlights的ActionMapping标明这个URI路径的ActionForm是foo.bar.FlightSearchForm,而Action类是foo.bar.FlightSearchAction。换句话说,ActionForm(FlightSearchForm)自己就是Struts-Faces中的HTML表单的模子,它的action直接地指向这个模子(您能够在清单3中看到这一点,那边文本字段标志指向FlightSearchForm。在一般Struts使用程序中这会是<html:textproperty="fromCity"/>)。
清单4.在struts-config.xml中声明Action
<form-beanname="FlightSearchForm"type="foo.bar.FlightSearchForm"/><!--==========ActionMappingDefinition=========================--><action-mappings><!--ListFlightsaction--><actionpath="/listFlights"type="foo.bar.FlightSearchAction"name="FlightSearchForm"scope="request"input="/faces/FlightSearch.jsp"><forwardname="success"path="/faces/FlightList.jsp"/></action></action-mappings>
您会注重到在action属性中短少熟习的.do。这是由于Struts-Faces利用表单action自己作为表单名(它还应当与Struts设置文件中的ActionForm名相婚配)。
集成Struts和Tiles的五个步骤以下五步可让Struts1.1和Tiles配合事情:1.创立一个JSP以暗示站点的结构。这是主JSP,并带有页头、页体和页脚的占位符。分离用Tiles标志增加到主JSP页面中。2.创立一个Tiles界说文件并界说每一个集成页面的每一个占位符中必需包含哪一个JSP页面。用唯一的称号标识出每个分解页面界说。3.在struts-config.xml文件中改动全局和当地转发以利用上一步骤中给出的唯一称号而不是别号。4.在启动时用TilesPlugIn装载Tiles界说文件。将TilesPlugIn项到场到struts-config.xml文件中。5.将TilesRequestProcessor项增加到struts-config.xml文件中。这是撑持Tiles的Struts使用程序的默许哀求处置程序。
还要注重我们在这里没有利用JSFvalidation标志。这是由于在Struts中,考证是在ActionForm类中的validate()办法中举行的,有多是经由过程利用Commons-Validator。s:errors标志相似于Struts毛病标志并用于显现在考证时呈现的毛病动静。
另外一件要注重的事变是没有ActionListener显式地与提交按钮相干联。这是由于在Struts-Faces中已供应了ActionListener而且老是将faces哀求与ActionEvents一同转交给FacesRequestProcessor,在那边依据struts-config.xml文件将哀求分拨给响应的Action类。
将Struts使用程序移植到JSF为了将StrutsWeb使用程序与JSF集成,遵守以下步骤:
将struts-faces.jar文件与特定于JSF的JAR(jsf-api.jar、jsf-ri.jar)增加到Web使用程序的WEB-INF/lib目次中。假如筹办利用JSF和JSTL,则将特定于JSTL的JAR(jstl.jar、standard.jar)增加到WEB-INF/lib文件夹中。这一步只要在部署到惯例Tomcat时才会必要。JWSDP已供应了这些JAR。修正Web使用程序部署形貌符(/WEB-INF/web.xml)以便有一个FacesServlet项,如清单5所示。修正JSP页面以利用JSF和Struts-Faces标志而不是Struts标志。出格是用Struts-Faces响应标志交换html、base、form和errors标志。用JSF响应标志交换text、textarea和radio标志。Struts-Faces没有独自针对这些的标志。只管没有请求,可是您大概还会思索用JSTL标志交换StrutsLogic标志。关于每个利用JSF标志的JSP,修正struts-config.xml文件以在指向该JSP的ActionMapping中的global-forwards和local-forwards中到场前缀/faces。假如Web使用程序利用了任何您创立的自界说组件,那末您就必要用JSF完成的默许RenderKit注册它们。能够经由过程在WEB-INF文件中创立一个faces-config.xml文件、并增添每个组件和renderer的项做到这一点。不外,要记着faces-config.xml文件已绑定在struts-faces.jar文件中了。您必需从struts-faces.jar文件中提出它、到场本人的内容并将它放到WEB-INF文件夹中。清单5.在web.xml中声明FacesServlet
<!--JavaServerFacesServletConfiguration--><servlet><servlet-name>faces</servlet-name><servlet-class>javax.faces.webapp.FacesServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><!--JavaServerFacesServletMapping--><servlet-mapping><servlet-name>faces</servlet-name><url-pattern>/faces/*</url-pattern></servlet-mapping>
集成Struts-Faces和Tiles的应战Struts-Faces库供应了Struts与JSF之间的一个高效的桥梁,使得在J2EEWeb使用程序中具有丰厚的暗示层成为实际。您能够经由过程在组合体中增加Titles使暗示层更丰厚,如许不但失掉了Struts和JSF组合的优点,并且还能够高效地反复利用分歧的JSP页面,由于它们将由能够依据必要增加大概删除的组件部分大概tiles所组成。
本文已展现了Struts和JSP的集成,您会想将Tiles到场到组合中只是大事一桩,是否是?
不幸的是,JSF仍旧处于初期阶段,还没有给出最初的公布。基于这一思索,Struts-Faces集成软件开辟仍旧在不休地开展以包含JSF的分歧的功效,而且还没有撑持Tiles。
Struts和Tiles能够无缝地配合事情,可是在集成之路上您会碰到路障。鄙人面几大节中,您会看到在与Tiles配合利用Struts-Faces集成库时常常碰到的成绩的汇总。关于每个成绩,我们具体申明了一个修正Struts-Faces类的办理计划。我们将用一个航班搜刮示例注释这个办理计划。
清单6展现了航班搜刮页面的结构。注重我们称它为航班搜刮页面而不是FlightSearch.jsp。这是由于FlightSearchJSP是用户在foobar游览Web站点看到的分解页面的主体。
如今,我们坚持实践的FlightSearch.jsp稳定。我们将跟着停顿改动它。在您这边,也必要用航班搜刮页的界说创立一个Tiles界说文件。清单7(紧接着清单6)展现了Tiles界说文件中航班搜刮页的一项。注重对带有extends属性的主结构模板的反复利用。
在清单6和7后是每个大概的应战。
清单6.航班搜刮例子的Tiles结构
<%@tagliburi="/WEB-INF/struts-tiles.tld"prefix="tiles"%><%@tagliburi="http://jakarta.apache.org/struts/tags-faces"prefix="s"%><!--Layoutcomponentparameters:header,menu,body,footer--><s:html><head><title><tiles:getAsStringname="title"/></title><s:base/></head><body><TABLEborder="0"width="100%"cellspacing="5"><tr><td><tiles:insertattribute="header"/></td></tr><tr><td><tiles:insertattribute="body"/></td></tr><tr><td><hr></td></tr><tr><td><tiles:insertattribute="footer"/></td></tr></TABLE></body></s:html>
清单7.航班搜刮页的Tiles界说
<!--MasterLayoutdefinition--><definitionname="foobar.master-layout"path="/faces/layout/MasterLayout.jsp"><putname="title"value="WelcometoFooBarTravels"/><putname="header"value="/faces/common/header.jsp"/><putname="footer"value="/faces/common/footer.jsp"/><putname="body"value=""/></definition><!--DefinitionforFlightSearchPage--><definitionname="/foobar.flight-search"extends="foobar.master-layout"><putname="body"value="/faces/FlightSearch.jsp"/></definition>
呼应已提交这是您在试图会见航班搜刮表单时即刻会看到的第一个成绩。当心检察仓库跟踪。您会看到成绩出在类com.sun.faces.lifecycle.ViewHandlerImpl上。这是一个完成了ViewHandler接口的JSF-RI类。
展现了ViewHandler所饰演的脚色。这是一个将哀求转发给下一页的类。在转发哀求时,它不在转发前反省呼应的形态--这只要在利用Tiles时才会产生,由于Tiles外部将JSP页面包含在呼应内,而JSF-RI在第一次转发后提交呼应、然后试图再次转发给上面的包含JSP的Tiles。
要办理这个成绩,必需创立一个自界说的ViewHandler完成,它将反省呼应的形态以断定它是不是提交过。假如呼应没有提交过,那末哀求就转发给下一页,不然,就到场哀求并显现响应的JSP。我们将创立一个名为STFViewHandlerImpl的类,它完成了ViewHandler接口并完成了所必要的办法renderView()。清单8展现了STFViewHandlerImpl中的renderView()办法:
清单8.STFViewHandlerImpl中的renderView()办法
RequestDispatcherrd=null;Treetree=context.getTree();StringrequestURI=context.getTree().getTreeId();rd=request.getRequestDispatcher(requestURI);/**Iftheresponseiscommitted,includetheresource**/if(!response.isCommitted()){rd.forward(request,context.getServletResponse());}else{rd.include(request,context.getServletResponse());}
如今您完成了本人的ViewHandler,怎样关照JSF-RI利用您的ViewHandler而不是默许的完成呢?要回覆这个成绩,就必需了解FacesServlet的事情历程。
在Faces初始化过程当中,FacesServlet会让LifecycleFactory完成前往Lifecycle类的一个完成,如清单9所示:
清单9.FacesServlet中Faces的初始化
//GettheLifecycleFactoryfromtheFactoryFinderLifecycleFactoryfactory=(LifecycleFactory)FactoryFinder.getFactory("javax.faces.lifecycle.LifecycleFactory");//Getthecontextparamfromweb.xmlStringlifecycleID=getServletContext().getInitParameter("javax.faces.lifecycle.LIFECYCLE_ID");//GettheLifecycleImplementationLifecyclelifecycle=factory.getLifecycle(lifeCycleID);
Lifecycle完成对象具有在出现呼应阶段要利用的ViewHandler。您能够经由过程对Lifecycle完成挪用setViewHandler办法让本人的ViewHandler完成成为默许的。
如今成绩变成怎样失掉默许Lifecycle完成?回覆是不必要如许做。只需创立一个新的完成并用一个唯一ID注册它,如清单10所示:
清单10.注册自界说ViewHandler和Lifecycle
//GettheLifecycleFactoryfromtheFactoryFinderLifecycleFactoryfactory=(LifecycleFactory)FactoryFinder.getFactory("javax.faces.lifecycle.LifecycleFactory");//CreateanewinstanceofLifecycleimplementation-//com.sun.faces.lifecycle.LifecycleImpl//Accordingtothedocumentation,factory.getLifecycle("STFLifecycle")//shouldwork,butJSF-RIhasadefect.//HencethisworkaroundofcreatingaRIclassexplicitly.LifecycleImplstfLifecycleImpl=newLifecycleImpl();//CreateanewinstanceofourSTFViewHandlerandsetitontheLifecyclestfLifecycleImpl.setViewHandler(newSTFViewHandlerImpl());//Registerthenewlifecyclewiththefactorywithaunique//name"STFLifecycle"factory.addLifecycle("STFLifecycle",stfLifecycleImpl);
您能够看到lifecycleId硬编码为STFLifecycle。实践上不是如许。当您回过火剖析清单9时就会分明。FacesServlet从在web.xml文件中声明的高低文参数中失掉名为javax.faces.lifecycle.LIFECYCLE_ID的lifecycleID,以下所示:
<context-param><param-name>javax.faces.lifecycle.LIFECYCLE_ID</param-name><param-value>STFLifecycle</param-value></context-param>
由于FacesServlet取决于其初始化时的Lifecycle完成,在清单10中展现的代码应当在FacesServlet初始化之前实行。经由过程创立另外一个servlet并在FacesServlet之前初始化它而做到这一点。
可是一种更伶俐的举措是完成一个ServletContextListener接口。这个类声明两个办法:contextInitialized()和contextDestroyed(),在Web使用程序被创立及Web使用程序被烧毁之前会分离挪用它们。因此清单10中的代码在contextInitialized()办法中实行,而自界说ViewHandler已用标识名STFLifecycle注册到Lifecycle,而且可被FacesServlet利用。ServletContextListener类自己是在web.xml文件中声明的,以下所示:
<listener><listener-class>foo.bar.stf.application.STFContextListener</listener-class></listener>
这不是注册一个带有自界说ViewHandler的Lifecycle唯一办法。现实上FactoryFinder完成了本人的发明算法以发明Factory对象,包含LifecycleFactory。这些机制依照按次包含在体系属性中检察工场完成类名的机制、faces.propertiesfile、大概1.3Services发明机制(META-INF/services/{factory-class-name})。不外,我们会商的这类机制是最简单的,也是最不具有损坏性的一种。
404ResourceNotFound在办理了提交呼应的成绩后,单击任何一个Tiles特定的链接大概输出一个会出现Faces呼应的URL。在这里,能够输出显现FlightSearchForm的URL。
在如许做了今后,您会失掉一个foobar.flight-search-404ResourceNotFound毛病。foobar.flight-search是航班搜刮页面的Tiles界说的名字。FacesRequestProcessor不克不及处置Tiles哀求(由于它扩大的是RequestProcessor而不是TilesRequestProcessor),以是会失掉毛病。
为办理这个成绩,我们将创立一个名为STFRequestProcessor(暗示Struts-Tiles-FacesRequestProcessor)的新的哀求处置程序。如今我们将拷贝FacesRequestProcessor的一切代码到这个新类中。唯一的区分是STFRequestProcessor承继的是TilesRequestProcessor而不是承继惯例的RequestProcessor。这个新的RequestProcessor能够处置Tiles哀求。清单11具体列出了这个STFRequestProcessor:
清单11.STFRequestProcessor.java
正如您所晓得的,Struts框架的RequestProcessor是在struts-config.xml文件中指定的。将上面的项增加到struts-cinfig.xml文件中后,STFRequestProcessor就成为处置程序:
<controllerprocessorClass="foobar.stf.application.STFRequestProcessor"/>
表单提交显现前往统一个表单因为STFRequestProcessor的感化,这时候您就能够扫瞄并检察航班页面了。不外,在提交航班搜刮表单时,您会失掉前往来的统一个表单,并且没有页头和页脚!而且没有考证毛病。现实上,基本就没有举行考证!
为了懂得究竟产生了甚么事变,我们用扫瞄器回到航班页面并反省HTML源代码。您会看到像上面如许的一项:
<formname="FlightSearchForm"method="post"action="/flightapp/faces/FlightSearch.jsp">
注重表单action是指向JSP页而不是一个.do的。啊哈!这就是成绩!这不是因为同时利用Tiles和Struts-Faces而带来的新成绩,Struts-Faces的默许举动是让JSP与表单action有一样的名字。这类举动在有单一的JSP页(如在后面的Struts-Faces例子中)时没有成绩。清单3展现了本来的FlightSearch.jsp,让我们持续并像上面如许修正action:
<s:formaction="/listFlights.do>
固然,光有这类修正其实不能办理成绩。作了这类改动后,您就会发明STFRequestProcessor不克不及找到ActionForm。明显还必要其他的改动。
不外,在持续往下之前,看一下图م。它显现了在出现卖力Struts-Faces表单的faces时相干的一系列事务。这与不异,除在FormComponent中凸起显现的办法createActionForm()。由Struts-FacesAPI供应的FormComponent类是javax.faces.component.UIForm的特别子类,它撑持哀求大概会话局限的表单Bean。
.出现Struts-Faces呼应单击这里以检察该图。
正如您所看到的,createActionForm()办法利用action名以从Struts设置文件中失掉ActionMapping。由于没有关于/listFlights.do的ActionMapping,以是Struts不克不及找到ActionForm。
这个成绩的办理办法是利用org.apache.struts.util.RequestUtils。RequestUtils中的static办法getActionMappingName()具有充足的智能剖析映照到准确ActionMapping的路径(/x/y/z)大概后缀(.do)。
清单12以粗体显现对createActionForm办法的改动。我们没有对Struts-Faces中的FormComponent作这些改动,而是经由过程承继FormComponent并掩盖createActionForm()办法创立了一个新的STFFormComponent。
清单12.FormComponent中修正过的createActionForm()办法
//LookuptheapplicationmoduleconfigurationinformationweneedModuleConfigmoduleConfig=lookupModuleConfig(context);//LookuptheActionConfigweareprocessingStringaction=getAction();StringmappingName=RequestUtils.getActionMappingName(action);ActionConfigactionConfig=moduleConfig.findActionConfig(mappingName);........
对新的STFFormComponent还要作一项改动。Struts-Faces将action名自己作为表单名。这必要改动,由于action带有后缀.do,而表单名没有后缀.do。以是我们在STFFormComponent上增添一个名为action的新属性,并掩盖getAction()和setAction()办法。
FormRenderer的改动必需对FormRenderer(以HTML格局出现Struts-Faces表单的类)的encodeBegin办法举行相似于清单10所示的修正。
一样,经由过程承继FormRenderer做到这一点。别的,还必需改动写出到HTML的表单action。清单13以粗体具体列出了这些改动:
清单13.FormRenderer的改动
protectedStringaction(FacesContextcontext,UIComponentcomponent){StringtreeId=context.getTree().getTreeId();StringBuffersb=newStringBuffer(context.getExternalContext().getRequestContextPath());sb.append("/faces");//sb.append(treeId);--Thisisoldcode,replacedwith//thetwolinesbelow.STFFormComponentfComponent=(STFFormComponent)component;sb.append(fComponent.getAction());return(context.getExternalContext().encodeURL(sb.toString()));}
FormTag的改动正如您已晓得的,当组件和renderer改动时,标志也必需改动。在这里,经由过程承继Struts-Faces中的FormTag创立一个新的标志:STFFormTag。不用改动任何功效,只需掩盖getComponentType()和getRendererType()办法。清单14展现了从STFFormComponent掩盖的办法:
清单14.FormTag的改动
publicStringgetComponentType(){return("STFFormComponent");}publicStringgetRendererType(){return("STFFormRenderer");}
修正faces-config.xml文件自界说组件和renderer必需在faces-config.xml文件中声明,如许JSF框架才能够初始化并利用它们。如今我们已创立了一个新组件STFFormComponent和一个新rendererSTFFormRenderer。
如今我们将在faces-config.xml文件中增添一个声明,如清单15所示。component-class是组件的完整限制类名。component-type指的是在STFFormTag(清单12)顶用于标识组件的名字。以相似的体例发明息争释renderer。注重faces-config.xml文件是在struts-faces.jar文件中的。从struts-faces.jar文件中掏出这个文件并将它放到Web使用程序的WEB-INF文件夹中并修正它。
清单15.在faces-config.xml中声明自界说组件和renderer
<faces-config><!--CustomComponents--><component><component-type>STFFormComponent</component-type><component-class>foobar.stf.component.STFFormComponent</component-class></component>......<!--CustomRenderers--><render-kit><renderer><renderer-type>STFFormRenderer</renderer-type><renderer-class>foobar.stf.renderer.STFFormRenderer</renderer-class></renderer>......</render-kit></faces-config>
修正struts-faces.tld文件您不会在这个示例Struts-Faces使用程序中看到struts-faces.tld文件,它打包到了struts-faces.jar文件中。翻开并剖析这个文件。它声了然一个名为org.apache.struts.faces.taglib.LifecycleListener的类,这个类完成了ServletContextListener并初始化FacesRequestProcessor。
由于但愿利用新的STFRequestProccessor,以是必需将这个文件从struts-faces.jar文件中删除,将它放到Web使用程序的WEB-INF文件夹中,并删除侦听器声明。假如让这个tld文件坚持原样,那末在初始化这个Web使用程序时,除STFRequestProcessor,还会实例化一个FacesRequestProcessor。
修正basehref标志如今,您已完成了Struts、Tiles、JSF集成的最坚苦的部分了。您乃至能够扫瞄航班搜刮页面,并输出搜刮尺度检察航班列表。如今试着从航班列表页面前往航班搜刮表单。您会失掉一个HTTP400毛病。这个毛病的缘故原由是HTMLbasehref标志。它被设置为MasterLayout页面。
<basehref="http://localhost:8080/stf-example/faces/layout/MasterLayout.jsp"/>|_________||_____________________|ContextServletPath
程序一切页面扫瞄都是相对结构页面盘算的。假如到场的basehref标志只到达Web使用程序高低文则会很便利,像如许:
<basehref="http://localhost:8080/stf-example/"/>
我们能够经由过程定制Struts-FacesBaseTag做到这一点。这个类中的改动相称微乎其微。只须在basehref中往失落HttpServletRequest.getServletPath()。
由于这些改动是与显现相干的,以是为它创立了一个名为STFBaseRenderer的新renderer。这个新标志称为STFBaseTag,它声明STFBaseRenderer作为其联系关系的renderer。不必要新的组件。
有了这些信息,经由过程承继BaseTag并掩盖getRendererType办法创立新的STFBaseTag,以下所示:
publicStringgetRendererType(){return("STFBaseRenderer");}
到今朝为止所作的改动祝贺!经由这些绝对较小的修正,您已乐成地集成了Struts、Tiles和JSF,并保存了您之前在这些手艺上所做的一切投资。本文演示了怎样将JSF壮大的前端才能、Tiles的内容格局编排上风和Struts把持器层的天真性分离在一个包中,使得创立一个J2EEWeb使用程序成为一项更简单的义务。
我们会商了定制Struts类以便与JavaServerFaces和Tiles框架构成严密集成的事情干系,包含上面这些修正和增添:
新的ViewHandler,用于反省提交的呼应。新的ServletContextListener,用于创立新的Lifecycle完成并注册这个定制的ViewHandler。新的RequestProcessor,用于处置Tiles哀求。修正过的web.xml文件,声明新的ServletContextListener和JSFLifecycleID。新的FormTag、FormComponent和FormRenderer类。新的BaseTag和BaseRenderer类。修正过的faces-config.xml文件,它声了然新的组件和renderer。修正过的struts-faces.tld文件,不声明侦听器。
但愿它能够归纳综合本文中利用的复合手艺,最主要的是,我们为您供应了将Struts、Tiles和JavaServerFaces分离到用于构建Web使用程序的一个壮大而天真的机制中的一个使人佩服的线路图。
参考材料
您能够参阅本文在developerWorks环球站点上的英文原文.下载本文的例子和代码,并遵守README.txt中给出的编译和部署的申明。Ant用于对例子举行编译,能够从ApacheAnt项目Web站点下载它。有关Struts和Tiles的更多内容,包含可下载的教程、文档、二进制文件和源代码,可从ApacheJakartaProjectStrutsWeb站点取得。能够将JSFEarlyAcessRelease4(EA4)作为JavaWebServicesDeveloperPackVersion1.2的一部分下载--它带有本人版本的Tomcat。能够从Jakarta站点下载Struts-Facesintegrationlibrary的0.3和0.4版本。能够从JavaWebServicesDeveloperPack1.2下载JSF-RI。“Struts,anopen-sourceMVCimplementation”(developerWorks,2001年2月)先容了Struts,这是一个利用了servlets和JavaServerPages手艺的模子-视图-把持器完成。“StrutsandTilesaidcomponent-baseddevelopment”(developerWorks,2002年6月)注释了为何分离Struts和Tiles能够成为创立Web使用程序的杰出软件包,并展现了怎样利用它,偏重于Struts0.9以后的改动。“StruttinyourstuffwithWebSphereStudioApplicationDeveloper,Part2:Tiles”(developerWorks,2002年11月)是一个教程,次要存眷在利用WebShpereStudioApplicationDeveloper作为开辟情况时分离Struts利用Tiles模子框架。“ArchitectStrutsapplicationsforWebservices”(developerWorks,2003年4月)展现了怎样基于MVB计划形式用Struts创建Web服务使用程序。“AJSTLprimer”(developerWorks,2003年2-5月),这是一个分为四部分的系列,供应了有关JSTL的一切内容,包含怎样利用JSTL标志以免在JSP页面中利用剧本元素、怎样经由过程删除暗示层中的代码简化软件保护、和JSTL的简化的表达式言语,它使得无需利用全功效的编程言语就能够为JSTLaction指定静态属性值。进修用JSF开辟Web使用程序的基础内容。在其教程“UIdevelopmentwithJavaServerFaces”(developerWorks,2003年9月)中,JackwindLiGuojie切磋了JSF性命周期、输出考证、事务处置、页面扫瞄和国际化。Sun的JSFWeb站点是另外一个很好的进修有关JavaServerFaces手艺的出发点。ServerSide.comJ2EE社区是查找有关J2EE的资本及列入开辟者论坛的幻想地址。在JavaCommunityProcess站点能够敏捷失掉有关JavaServerPages1.2标准的内容。在developerWorksJava手艺专区能够找到关于Java编程各方面的数百篇文章。
作者简介SrikanthShenoy专门处置年夜型J2EE和EAI项目标系统布局、计划、开辟和部署事情。Srikanth已帮他的打造业、物流业和金融业客户完成了Java平台“一次编写,到处运转”的妄想。他是Sun认证的企业架构师,而且是行将出书的PracticalGuidetoJ2EEWebProjects一书的作者之一。能够经由过程srikanth@srikanth.org与他接洽。
NithinMallya专门为金融客户供应企业级办理计划。他有七年架构和开辟服务器端办理计划的履历,年夜多半是Java平台。他是Sun认证的企业架构师,而且是Sun认证的Web组件开辟者。他也是行将出书的PracticalGuidetoJ2EEWebProjects一书的作者之一。能够经由过程nithin@mallya.org与他接洽。
还有就是总有人问我到底该学习什么语言,什么语言有前途,那么我的回答是不论是C,C++,java,.net,ruby,asp或是其他语言都可以学,编程的关键不是语言,而是思想。 那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧! 是一种突破用户端机器环境和CPU 你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢? 你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。 应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展 是一种使用者不需花费很多时间学习的语言 那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧! 你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。 让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。 是一种使网页(Web Page)产生生动活泼画面的语言 你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。 是一种语言,用以产生「小应用程序(Applet(s)) 吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧 当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢? 另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。 接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。 Java是一种计算机编程语言,拥有跨平台、面向对java 我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。 是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言
页:
[1]