`
yingfang05
  • 浏览: 122938 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

集成JSF与BEEHIVE PAGE FLOW之二

    博客分类:
  • jsf
阅读更多
从后台bean访问当前页面流或共享流
  在某些情况下,您或许想直接从后台bean访问当前页面流或一个活动的共享流。为此,只需创建一个适当类型的字段,并使用@Jpf.PageFlowField或@Jpf.SharedFlowField对其进行适当注释:

@Jpf.CommandHandler(
raiseActions={
      @Jpf.RaiseAction(action="goPage3")
}
)
public String chooseNextPage()
{
return "goPage3";
}

  这些字段将在创建后台bean的时候被初始化。无需手动对其进行初始化。下面的例子使用了自动初始化的ExampleController字段。在这个例子中,“show hints”单选钮的事件处理程序在页面流中设置了一个普通优先级。

@Jpf.PageFlowField
private ExampleController myController;

@Jpf.SharedFlowField(name="sharedFlow2") // "sharedFlow2" is a
                              // name defined in the
                              // page flow controller
private ExampleSharedFlow mySharedFlow;


  在很多情况下,页面不需要直接与页面流或者共享流进行交互;使用其它方法从页面流向JSF页面传递数据就足够了,反之亦然。下面我将给出一些例子。

  从页面流控制器访问后台bean
  您不能从页面流控制器访问后台bean!至少,这不容易做到,这是有意为之的。后台bean与JSF页面紧密相关,当您离开页面的时候,后台bean会被销毁。正如页面流控制器不应了解页面细节一样,它也不应了解后台bean。当然了,可以从后台bean向控制器传递数据(稍后将会介绍),甚至可以传递后台bean实例本身,但是在大多数情况下,后台bean的内容是不应当泄露给控制器的。

  生命周期方法
  通常,当后台bean发生某些事情的时候,比如当它被创建或销毁时,我们希望能运行代码。在Page Flow框架的生命周期中,它会对后台bean调用一些方法:

onCreate():创建bean时
onDestroy():销毁bean时(从用户会话移除)
onRestore():这个需要详细解释一下。我说过,当您离开页面的时候,后台bean会被销毁。在大多数情况下是这样的,但是如果页面流使用了navigateTo特性(它使您可以再次访问先前显示的页面),在您离开页面之后,Page Flow框架会保留后台bean一小段时间,以防它需要还原。当通过@Jpf.Forward或@Jpf.SimpleAction使用navigateTo=Jpf.NavigateTo.currentPage或navigateTo=Jpf.NavigateTo.previousPage还原一个JSF页面时,页面的组件树及其后台bean都被Page Flow框架还原。当这种情况发生时,onRestore()就被调用。
  不管要在哪个时期运行代码,只需重写适当的方法:

protected void onCreate()
{
/*some create-time logic */
}
  当重写这些方法时,不需要调用空的super版本。

  在JSF页面和页面流之间传递数据
  现在我们该看看如何在JSF页面和页面流之间传递数据了。

  从页面流向JSF页面发送数据
  通常,您会想要利用页面流的数据来初始化一个页面。为此,可以向page2.faces的Forward添加“action outputs”:

@Jpf.Action(
forwards={
@Jpf.Forward(
    name="success", path="page2.faces",
    actionOutputs={
      @Jpf.ActionOutput(name="message", type=String.class,required=true)
    }
)
}
)

public Forward goPage2()
{
Forward fwd = new
Forward("success");
   fwd.addActionOutput("message", "Got the message.");
return fwd;
}

  做完这些之后,可以直接从JSF页面或者后台bean将该值作为页面输入来访问。(如果您不喜欢键入冗长的注释,可以省去斜体的。它们主要用于再次检查添加的对象类型是否正确,确定不缺失类型。)

  可以在页面中利用JSF表示语言中的页面流pageInput绑定上下文绑定到这个值:

<h:outputText value="#{pageInput.message}"/>
  注意,可以利用pageFlow和sharedFlow绑定上下文绑定到页面流控制器自身或者任何可用的共享流的属性:

<h:outputText value="#{pageFlow.someProperty}"/>
<h:outputText value="#{sharedFlow.mySharedFlow.someProperty}"/>
  最后,要想从后台bean访问页面输入,只需在bean类代码中的任意地方调用getPageInput:

String message = (String) getPageInput("message");
  从JSF页面向页面流发送数据
  还可以随着页面流所引发的动作发送数据。很多动作将要求表单bean作为输入;通常,表单bean用于从页面获取数据送到控制器。首先,让我们构建一个动作来接收表单bean并跳转到页面:

@Jpf.Action(
   forwards={
       @Jpf.Forward(name="success", path="page3.faces")
   }
)
public Forward goPage3(NameBean nameBean)
{
    _userName = nameBean.getFirstName() + ' ' +
                nameBean.getLastName();
    return new Forward("success");
}

  该动作包含一个NameBean,它是一个将getters/setters作为其firstName和lastName属性的表单bean类。它设置一个成员变量保存完整名字,之后跳转到page3.faces。我们知道,可以直接从JSF页面或者它的后台bean引发一个动作。在这两种情况下,都可以向动作发送表单bean。下面让我们依次看看每种情况。

  从后台bean发送表单bean
  要从后台bean中的命令处理程序发送表单bean,需要使用一个特定的注释。下面给出了page2.java中的情况:

private ExampleController.NameBean _nameBean;

protected void onCreate()
{
    _nameBean = new ExampleController.NameBean();
}

public ExampleController.NameBean getName()
{
    return _nameBean;
}

@Jpf.CommandHandler(
    raiseActions={
        @Jpf.RaiseAction(action="goPage3",
             outputFormBean="_nameBean")
    }
)
public String chooseNextPage()
{
    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:commandButton action="#{backing.chooseNextPage}"
                 value="Submit directly from page">
    <f:attribute name="submitFormBean" value="backing.name" />
</h:commandButton>
  在这里,为了使表单bean发送到动作goPage3,按钮绑定到后台bean的“name”属性(getName)。
分享到:
评论

相关推荐

    JSF 核心编程与入门

    JSF 2.0之后,可以与CDI(Contexts and Dependency Injection)框架无缝集成,使依赖注入更加灵活,提高了代码的可测试性和可维护性。 **11. JSF的错误处理和验证** JSF提供了一套内置的验证机制,可以在不同生命...

    struts2.0集成JSF插件

    Struts2.0和JavaServer Faces ...通过研究这些内容,开发者可以快速上手并掌握Struts2与JSF的集成技巧,从而在实际项目中灵活运用。记住,实践是检验真理的唯一标准,只有通过实际操作,才能更好地理解和掌握这些技术。

    JSF和Spring集成.doc

    ### JSF与Spring集成知识点详解 #### 一、概述 **JSF (JavaServer Faces)** 和 **Spring** 都是目前广泛使用的Java Web开发框架。JSF 是一个用于构建基于 Java 的 Web 应用程序的标准组件框架,而 Spring 框架则是...

    Seam-无缝集成JSF

    #### 二、Seam与JSF的互补性 Seam与JSF的结合,不仅弥补了JSF本身的不足,还为开发者提供了更为强大的功能集。具体来说,Seam对JSF生命周期进行了增强,主要包括以下几个方面: 1. **上下文状态管理**:Seam提供了...

    jsf_page.rar_ jsf_page_JSF_PAGE_java jsf_jsf glassfish_jsp page

    2. JSF与JSP(JavaServer Pages)的关系: - JSF是一种MVC(模型-视图-控制器)框架,而JSP是一种用于创建动态网页的技术。在JSF中,JSP通常作为视图层,用于渲染JSF组件。 - JSF的视图是由UI组件(如输入字段、...

    JSF入门+JSF web实战+JSF2

    《JSF2》是关于JSF的第二版,相比第一版,JSF2引入了许多新特性,如Facelets作为默认视图层技术,使得视图更易于维护;引入了Partial State Saving,降低了服务器内存消耗;支持CDI(Contexts and Dependency ...

    JSF与hibernate整合的登陆

    2. **Managed Beans**:JSF的核心概念之一是Managed Beans,它们是业务逻辑的容器。在登录场景中,可能会有一个`LoginBean`,负责处理用户提交的登录信息,包括校验、验证用户输入以及调用Hibernate服务来检查用户名...

    jsf入门列子和jsf与Tiles结合

    总结来说,这个例子涵盖了JSF的基本用法,包括Bean的创建、验证逻辑的实现、导航规则的配置,以及JSF与Tiles的初步集成。对于初学者,这是一个很好的起点,能帮助理解JSF如何处理用户交互、管理页面流程,以及如何与...

    jsf与润乾集成使用

    为了更好地理解如何将JSF与润乾报表系统进行集成,我们可以通过以下步骤进行实际操作: 1. **环境搭建**:首先,确保开发环境已安装了Eclipse或MyEclipse,并且配置了JSF的相关库文件。按照指导,我们需要创建一个...

    JSF与Spring完美结合

    2. **配置JSF**:为了使JSF能够与Spring协作,需要在JSF的配置文件(如`faces-config.xml`)中添加Spring的JSF监听器`org.springframework.web.jsf.FacesContextListener`,这样JSF就能识别到Spring的Bean。...

    使用G4JSF集成GWT和JSF

    2. **可扩展性**:JSF具有标准的UI组件库,并支持与其他组件库的轻松集成。 3. **服务器端状态管理**:JSF擅长处理服务器端的状态,适合构建大型企业级应用。 **G4JSF的关键功能** 1. **组件开发包(CDK)**:提供...

    Seam - 无缝集成 JSF

    JavaServer Faces (JSF) 是用于 Java™ Web 应用程序的第一个标准化的用户界面框架。而 Seam 是一个扩展 JSF 的强大的应用程序框架。在这个由三部分组成的新系列中的第一篇文章中,发现这两种框架之间的互补性。Dan ...

    jsf+hibernate+spring集成案例

    2. **JSF与Spring的集成**:通过Spring JSF Integration或PrimeFaces的Spring Support,我们可以将Spring的依赖注入引入JSF的Managed Beans,使得JSF组件可以方便地使用Spring管理的bean。 3. **Hibernate的使用**...

    fiji框架,jsf与flex交互。。

    JSF处理业务逻辑和数据管理,Flex负责前端展示,Fiji作为整个架构的支撑,提供模块化的服务和集成环境。这种混合开发模式可以充分利用各自技术的优势,提高开发效率并提供高质量的Web应用。 总结来说,Fiji框架与...

    JSF中文教程jsf

    **JSF与Java EE集成** 是其强大的特点之一。它可以直接利用EJB(Enterprise JavaBeans)进行服务层操作,与JPA(Java Persistence API)集成实现数据持久化,还可以与Servlet、JSP和CDI(Contexts and Dependency ...

    jSF2.0与Spring整合实例+教程

    整合教程通常会涵盖这些步骤,指导开发者如何设置环境、配置Spring和JSF、创建并集成Managed Beans,以及处理页面事件和业务逻辑。通过学习这些教程,开发者可以有效地结合两者的优点,构建出高效、灵活且易于维护的...

    EJB与JSF的集成(简单示例)

    在实际开发中,EJB和JSF的集成还可以结合CDI(Contexts and Dependency Injection)、Faces Flow、PrimeFaces等技术,以提供更高级的功能和更好的用户体验。同时,现代的Java EE框架,如Quarkus和Micronaut,也提供...

Global site tag (gtag.js) - Google Analytics