JAVA编程:集成JSF与BEEHIVE PAGE FLOW
他们对jsp,servlet,javabean进行封装就是为了展示他们的某个思想,与java的开发并没有必然的关系,也不见得在所以情况下,别人使用起来会简单。js JSF对经由过程联系关系组件和事务来构建页面而说长短常棒的,可是,与一切现有的手艺一样,它必要一个把持器来分别出页面间的导航决议,并供应到营业层的链接。它具有一个基础的导航处置程序,能够勤奋能完整的处置程序来交换它。PageFlow为创立可重用的封装页面流供应了基本,并能够与视图层并行事情。它是一个功效完整的导航处置程序,将JSF页面作为最优先的处置对象。本文将会商怎样集成这两种手艺来使用两者的长处。 构建Beehive/JSF使用程序要构建Beehive/JSF使用程序,起首要启动PageFlow,然后增加对JSF的撑持。出发点是从基础的撑持NetUI(Beehive中包括PageFlow的组件)的项目入手下手。依据引导构建基础的撑持NetUI的Web使用程序。在本文中,我们临时称之为“jsf-beehive”,能够在http://localhost:8080/jsf-beehive上取得。
接上去,安装并设置JSF。PageFlow可使用任何与JavaServerFaces1.1兼容的完成,并针对两种支流完成举行了测试:ApacheMyFaces和JSFReferenceImplementation。依据上面的引导在新的Web使用程序中安装JSF:MyFacesv1.0.9及更高版本,JSFReferenceImplementationv1.1_01,大概其他完成。以后,可使用WEB-INF/faces-config.xml中的一个复杂出口启动PageFlow集成,出口在<application>标签之下,<navigation-rule>标签之上:
<factory><application-factory>org.apache.beehive.netui.pageflow.faces.PageFlowApplicationFactory</application-factory></factory> 增加了这些就为页面流供应了一个时机,使其能够供应本人的JSF框架对象版原本定制其举动。一般来讲,只要在利用页面流功效的时分,JSF举动才会被修正;JSF的基础举动不会改动。
基础集成
JSF中页面流的最基础用途是激发(挪用)来自JSF页面的举措。JSF页面能够处置页面内事务,而页面活动作则是从一个页面导航到另外一页面的办法。起首,在Web使用程序中创立一个名为“example”的目次,在个中创立一个页面流把持器类:
packageexample;importorg.apache.beehive.netui.pageflow.Forward;importorg.apache.beehive.netui.pageflow.PageFlowController;importorg.apache.beehive.netui.pageflow.annotations.Jpf;@Jpf.Controller(simpleActions={@Jpf.SimpleAction(name="begin",path="page1.faces")})publicclassExampleControllerextendsPageFlowController{@Jpf.Action(forwards={@Jpf.Forward(name="success",path="page2.faces")})publicForwardgoPage2(){Forwardfwd=newForward("success");returnfwd;}} 在这个页面流中有两个举措:跳转到page1.faces的begin举措和跳转到page2.faces的goPage2举措。将goPage2作为一个办法举措(而不是复杂举措)的缘故原由是稍后将会对其举行扩大。
在机关页面的时分,应该以.jsp为扩大名创立page1和page2;JSFservlet处置每一个.faces哀求,并终极跳转到相干的JSP。以是,跳转到page1.faces终极将显现page1.jsp,以下:
<%@taglibprefix="f"uri="http://java.sun.com/jsf/core"%><%@taglibprefix="h"uri="http://java.sun.com/jsf/html"%><html><body><f:view><h:form><h:panelGrid><h:outputTextvalue="Page1ofpageflow#{pageFlow.URI}"/><h:commandLinkaction="goPage2"value="Gotopage2"/></h:panelGrid></h:form></f:view></body></html> 从JSF页面激发一个举措很复杂:利用命令组件的action属性中的举措名字就能够了。在下面的例子中,commandLink指向goPage2举措。利用页面流集成,这意味着goPage2举措会在example.ExampleController中运转。
就是如许。要实验的话,构建使用程序,点击http://localhost:8080/jsf-beehive/example/ExampleController.jpf,这将经由过程begin举措跳转到page1.faces。单击链接“Gotopage2”,会激发goPage2举措并跳转到page2.faces。
背景Bean
PageFlow框架能够办理与JSF页面相干的背景bean(backingbean)。该类是安排与页面相干的事务处置程序和形态的便利场合。能够把它看做是会合安排与页面交互时所运转的一切代码的单一场合。当点击一个JSF页面时,PageFlow会判别是不是有具有一样称号和包的类,比方,page/example/page1.faces的example.page1类。假如存在如许的类,而且它用@Jpf.FacesBacking举行正文并扩大了FacesBackingBean,它就会创立该类的一个实例。当分开JSF页面而转到一个举措大概别的任何页面时,背景bean会被烧毁。背景bean与JSF页面共生死。
绑定到背景bean中的属性
上面是page1.faces的一个十分复杂的背景bean,和属性someProperty。文件名是page1.java:
packageexample;importorg.apache.beehive.netui.pageflow.FacesBackingBean;importorg.apache.beehive.netui.pageflow.annotations.Jpf;@Jpf.FacesBackingpublicclasspage1extendsFacesBackingBean{privateString_someProperty="Thisisapropertyvaluefrom"+getClass().getName()+".";publicStringgetSomeProperty(){return_someProperty;}publicvoidsetSomeProperty(StringsomeProperty){_someProperty=someProperty;}} 在JSF页面(page1.jsp)中,能够使用backing绑定高低文来绑定到这个属性:
<h:outputTextvalue="#{backing.someProperty}"/>
下面的例子显现了someProperty(终极在背景bean上挪用getSomeProperty())的值。相似地,设置这个值:
<h:inputTextvalue="#{backing.someProperty}"/>
注重,在这个例子中,背景bean中没有呈现事务处置程序或组件援用。这就延长了代码;背景bean是安排页面一切的处置程序和组件援用的好中央。
从背景bean激发页面活动作
在下面的“基础集成”部分,我们间接从JSF组件激发页面活动作。一般情形下,只需如许便可;当单击一个按钮大概链接时,会运转一个举措并跳转到另外一个页面上。假如想在挪用把持器之前运转一些与页面相干的代码,大概假如但愿页面能够在几个举措之间举行静态选择的话,能够在命令处置程序(JSF页面所运转的一个Java办法)中激发一个举措。上面是一个命令处置程序的例子,能够把它放到背景beanpage2.java中(大概别的任何可公然会见的bean中):
publicStringchooseNextPage(){return"goPage3";} 这是一个十分复杂的命令处置程序,它选择了goPage3举措。能够用尺度的JSF体例从一个JSF命令组件绑定到这个命令处置程序:
<h:commandButtonaction="#{backing.chooseNextPage}"value="Submit"/> 当单击链接时,会运转chooseNextPage命令处置程序,它会选择激发goPage3举措。还能够对命令处置程序办法利用一个特别的页面流正文――@Jpf.CommandHandler:
@Jpf.CommandHandler(raiseActions={@Jpf.RaiseAction(action="goPage3")})publicStringchooseNextPage(){return"goPage3";} 该正文使撑持Beehive的工具能够晓得命令处置程序激发了背景bean中的哪一个举措,并同意扩大JSF举措处置的才能(拜见上面“从JSF页面向页面流发送数据”部分)。
从背景bean会见以后页面流或共享流
在某些情形下,您也许想间接从背景bean会见以后页面流或一个举动的共享流。为此,只需创立一个得当范例的字段,并利用@Jpf.PageFlowField或@Jpf.SharedFlowField对其举行得当正文:
@Jpf.CommandHandler(raiseActions={@Jpf.RaiseAction(action="goPage3")})publicStringchooseNextPage(){return"goPage3";} 这些字段将在创立背景bean的时分被初始化。无需手动对其举行初始化。上面的例子利用了主动初始化的ExampleController字段。在这个例子中,“showhints”单选钮的事务处置程序在页面流中设置了一个一般优先级。
@Jpf.PageFlowFieldprivateExampleControllermyController;@Jpf.SharedFlowField(name="sharedFlow2")//"sharedFlow2"isa//namedefinedinthe//pageflowcontrollerprivateExampleSharedFlowmySharedFlow; 在良多情形下,页面不必要间接与页面流大概共享流举行交互;利用别的办法从页面流向JSF页面传送数据就充足了,反之亦然。上面我将给出一些例子。
从页面流把持器会见背景bean
您不克不及从页面流把持器会见背景bean!最少,这不简单做到,这是成心为之的。背景bean与JSF页面严密相干,当您分开页面的时分,背景bean会被烧毁。正如页面流把持器不该懂得页面细节一样,它也不该懂得背景bean。固然了,能够从背景bean向把持器传送数据(稍后将会先容),乃至能够传送背景bean实例自己,可是在年夜多半情形下,背景bean的内容是不该当保守给把持器的。
性命周期办法
一般,当背景bean产生某些事变的时分,好比当它被创立或烧毁时,我们但愿能运转代码。在PageFlow框架的性命周期中,它会对背景bean挪用一些办法:
[*]onCreate():创立bean时
[*]onDestroy():烧毁bean时(从用户会话移除)
[*]onRestore():这个必要具体注释一下。我说过,当您分开页面的时分,背景bean会被烧毁。在年夜多半情形下是如许的,可是假如页面流利用了navigateTo特征(它使您能够再次会见先前显现的页面),在您分开页面以后,PageFlow框架会保存背景bean一小段工夫,以防它必要复原。当经由过程@Jpf.Forward或@Jpf.SimpleAction利用navigateTo=Jpf.NavigateTo.currentPage或navigateTo=Jpf.NavigateTo.previousPage复原一个JSF页面时,页面的组件树及厥后台bean都被PageFlow框架复原。当这类情形产生时,onRestore()就被挪用。
不论要在哪一个时代运转代码,只需重写得当的办法:
protectedvoidonCreate(){/*somecreate-timelogic*/} 当重写这些办法时,不必要挪用空的super版本。
在JSF页面和页面流之间传送数据
如今我们该看看怎样在JSF页面和页面流之间传送数据了。
从页面流向JSF页面发送数据
一般,您会想要使用页面流的数据来初始化一个页面。为此,能够向page2.faces的Forward增加“actionoutputs”:
@Jpf.Action(forwards={@Jpf.Forward(name="success",path="page2.faces",actionOutputs={@Jpf.ActionOutput(name="message",type=String.class,required=true)})})publicForwardgoPage2(){Forwardfwd=newForward("success");fwd.addActionOutput("message","Gotthemessage.");returnfwd;} 做完这些以后,能够间接从JSF页面大概背景bean将该值作为页面输出来会见。(假如您不喜好键进冗杂的正文,能够省往斜体的。它们次要用于再次反省增加的对象范例是不是准确,断定不缺掉范例。)
能够在页面中使用JSF暗示言语中的页面流pageInput绑定高低文绑定到这个值:
<h:outputTextvalue="#{pageInput.message}"/> 注重,能够使用pageFlow和sharedFlow绑定高低文绑定到页面流把持器本身大概任何可用的共享流的属性:
<h:outputTextvalue="#{pageFlow.someProperty}"/><h:outputTextvalue="#{sharedFlow.mySharedFlow.someProperty}"/> 最初,要想从背景bean会见页面输出,只需在bean类代码中的恣意中央挪用getPageInput:
Stringmessage=(String)getPageInput("message"); 从JSF页面向页面流发送数据
还能够跟着页面流所激发的举措发送数据。良多举措将请求表单bean作为输出;一般,表单bean用于从页面猎取数据送到把持器。起首,让我们构建一个举措来吸收表单bean并跳转到页面:
@Jpf.Action(forwards={@Jpf.Forward(name="success",path="page3.faces")})publicForwardgoPage3(NameBeannameBean){_userName=nameBean.getFirstName()++nameBean.getLastName();returnnewForward("success");} 该举措包括一个NameBean,它是一个将getters/setters作为其firstName和lastName属性的表单bean类。它设置一个成员变量保留完全名字,以后跳转到page3.faces。我们晓得,能够间接从JSF页面大概它的背景bean激发一个举措。在这两种情形下,都能够向举措发送表单bean。上面让我们顺次看看每种情形。
从背景bean发送表单bean
要从背景bean中的命令处置程序发送表单bean,必要利用一个特定的正文。上面给出了page2.java中的情形:
privateExampleController.NameBean_nameBean;protectedvoidonCreate(){_nameBean=newExampleController.NameBean();}publicExampleController.NameBeangetName(){return_nameBean;}@Jpf.CommandHandler(raiseActions={@Jpf.RaiseAction(action="goPage3",outputFormBean="_nameBean")})publicStringchooseNextPage(){return"goPage3";} 在这个例子中,JSF页面能够用它选择的任何体例添补_nameBean的值(比方,经由过程将h:inputText值绑定到#{backing.name.firstName}和#{backing.name.lastName})。以后它利用@Jpf.RaiseAction上的outputFormBean属性来标志_nameBean应该被传送到举措goPage3。
从JSF页面发送表单bean
从JSF页面间接发送表单bean很简单,只需您能够经由过程数据绑定表达式失掉bean值。这是经由过程在commandButton组件外部增加名为submitFormBean的h:attribute组件来完成的:
<h:commandButtonaction="#{backing.chooseNextPage}"value="Submitdirectlyfrompage"><f:attributename="submitFormBean"value="backing.name"/></h:commandButton> 在这里,为了使表单bean发送到举措goPage3,按钮绑定到背景bean的“name”属性(getName)。
停止语
本文展现了怎样将JSF在构建页面方面的丰厚特征与BeehivePageFlow在把持页面间导航方面的壮大功效相分离。两者的集成十分简单,可是却会对使用形成深远的影响:它将JSF页面与使用级逻辑相分别,并把页面带进PageFlow所供应的功效范畴中。JSF页面失掉了分明的义务:作为单个(假如有充足才能的话)视图元素介入到使用程序的流中。文中没有展现JSF页面中具有事务处置功效且把持器中具有庞大的导航逻辑的完整使用程序。可是跟着使用程序的庞大水平进步,它就会加倍必要义务的分别和页面流增加给JSF的初级流功效。您能够花几分钟实验一下――很快您就将意想到如许做所带来的优点。
其实你不用Struts,spring这些工具,直接用jsp,servlet能够很方便地写出来,而且,可以根据个人的水平、爱好,有很多方案。而struts,spring这些工具的出来。 关于设计模式的资料,还是向大家推荐banq的网站 http://www.ckuyun.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。 当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢? Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。 是一种将安全性(Security)列为第一优先考虑的语言 不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。 http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。 当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢? 是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言 《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。 其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。 那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!
页:
[1]