从后台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 2.0之后,可以与CDI(Contexts and Dependency Injection)框架无缝集成,使依赖注入更加灵活,提高了代码的可测试性和可维护性。 **11. JSF的错误处理和验证** JSF提供了一套内置的验证机制,可以在不同生命...
Struts2.0和JavaServer Faces ...通过研究这些内容,开发者可以快速上手并掌握Struts2与JSF的集成技巧,从而在实际项目中灵活运用。记住,实践是检验真理的唯一标准,只有通过实际操作,才能更好地理解和掌握这些技术。
### JSF与Spring集成知识点详解 #### 一、概述 **JSF (JavaServer Faces)** 和 **Spring** 都是目前广泛使用的Java Web开发框架。JSF 是一个用于构建基于 Java 的 Web 应用程序的标准组件框架,而 Spring 框架则是...
#### 二、Seam与JSF的互补性 Seam与JSF的结合,不仅弥补了JSF本身的不足,还为开发者提供了更为强大的功能集。具体来说,Seam对JSF生命周期进行了增强,主要包括以下几个方面: 1. **上下文状态管理**:Seam提供了...
2. JSF与JSP(JavaServer Pages)的关系: - JSF是一种MVC(模型-视图-控制器)框架,而JSP是一种用于创建动态网页的技术。在JSF中,JSP通常作为视图层,用于渲染JSF组件。 - JSF的视图是由UI组件(如输入字段、...
《JSF2》是关于JSF的第二版,相比第一版,JSF2引入了许多新特性,如Facelets作为默认视图层技术,使得视图更易于维护;引入了Partial State Saving,降低了服务器内存消耗;支持CDI(Contexts and Dependency ...
2. **Managed Beans**:JSF的核心概念之一是Managed Beans,它们是业务逻辑的容器。在登录场景中,可能会有一个`LoginBean`,负责处理用户提交的登录信息,包括校验、验证用户输入以及调用Hibernate服务来检查用户名...
总结来说,这个例子涵盖了JSF的基本用法,包括Bean的创建、验证逻辑的实现、导航规则的配置,以及JSF与Tiles的初步集成。对于初学者,这是一个很好的起点,能帮助理解JSF如何处理用户交互、管理页面流程,以及如何与...
为了更好地理解如何将JSF与润乾报表系统进行集成,我们可以通过以下步骤进行实际操作: 1. **环境搭建**:首先,确保开发环境已安装了Eclipse或MyEclipse,并且配置了JSF的相关库文件。按照指导,我们需要创建一个...
2. **配置JSF**:为了使JSF能够与Spring协作,需要在JSF的配置文件(如`faces-config.xml`)中添加Spring的JSF监听器`org.springframework.web.jsf.FacesContextListener`,这样JSF就能识别到Spring的Bean。...
2. **可扩展性**:JSF具有标准的UI组件库,并支持与其他组件库的轻松集成。 3. **服务器端状态管理**:JSF擅长处理服务器端的状态,适合构建大型企业级应用。 **G4JSF的关键功能** 1. **组件开发包(CDK)**:提供...
JavaServer Faces (JSF) 是用于 Java™ Web 应用程序的第一个标准化的用户界面框架。而 Seam 是一个扩展 JSF 的强大的应用程序框架。在这个由三部分组成的新系列中的第一篇文章中,发现这两种框架之间的互补性。Dan ...
2. **JSF与Spring的集成**:通过Spring JSF Integration或PrimeFaces的Spring Support,我们可以将Spring的依赖注入引入JSF的Managed Beans,使得JSF组件可以方便地使用Spring管理的bean。 3. **Hibernate的使用**...
JSF处理业务逻辑和数据管理,Flex负责前端展示,Fiji作为整个架构的支撑,提供模块化的服务和集成环境。这种混合开发模式可以充分利用各自技术的优势,提高开发效率并提供高质量的Web应用。 总结来说,Fiji框架与...
**JSF与Java EE集成** 是其强大的特点之一。它可以直接利用EJB(Enterprise JavaBeans)进行服务层操作,与JPA(Java Persistence API)集成实现数据持久化,还可以与Servlet、JSP和CDI(Contexts and Dependency ...
整合教程通常会涵盖这些步骤,指导开发者如何设置环境、配置Spring和JSF、创建并集成Managed Beans,以及处理页面事件和业务逻辑。通过学习这些教程,开发者可以有效地结合两者的优点,构建出高效、灵活且易于维护的...
在实际开发中,EJB和JSF的集成还可以结合CDI(Contexts and Dependency Injection)、Faces Flow、PrimeFaces等技术,以提供更高级的功能和更好的用户体验。同时,现代的Java EE框架,如Quarkus和Micronaut,也提供...