|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
他们对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这些工具的出来。 |
|