`
caiweisoft
  • 浏览: 2335 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论
阅读更多
1、获取managedbean或是解析表达式
有三种方法
1.Java代码:

FacesContext context =FacesContext.getCurrentInstance();  
ValueBinding binding =  
context.getApplication().createValueBinding("#{bean}");  
YourBean  bean = (YourBean  ) binding.getValue(context);  

2.Java代码:

FacesContext ctx = FacesContext.getCurrentInstance(); 
VariableResolver variableResolver =ctx.getApplication().getVariableResolver();  
YourBean  bean = (YourBean  ) variableResolver.resolveVariable(ctx, "bean");  

3.Java代码:

Application application=context.getApplication(); 
YourBean   ManageBeanProperty=(YourBean  )application.evaluateValueExpressionGet(context,
"#{bean}",YourBean .class);   
第3种方法只对jsf1.2可用。(evaluateValueExpressionGet方法1.1种没有)
其实还有一种方法。后面会提到。


2、对于已知范围和名字的bean,可以
externalContext.getRequestMap().get(beanName)
externalContext.getSessionMap().get(beanName)
externalContext.getApplicationMap().get(beanName)


3、FacesContext
组件实例相关

facesContext.getViewRoot()
可以获取ViewRoot,然后递归循环其children得到整个组件树,
可以实现:
(1)根据组建id得到组件。
(2)得到form,添加新的组件到此集合,或是改变form的属性。
(3)得到某个类型的所有组件,然后加上监听器。
。。。。。
从这个root入手,再加上事件,绑定和分析,几乎可以完全控制整个组件树。


4、Application
获取方式Application application=facesContext.getApplication(); 
用处可以见下面的代码:
(1)组件类型的注册和组件集合的获取
(2)converter,validator的。。。
(3)属性分析器和变量分析器的。。。
(4)NavigationHandler、ViewHandler....
(5)添加一个listener
(6)创建一个组件的实例
(7)创建一个值绑定或方法绑定

大部分全局性配置的东西都在这儿可以找到。而且几乎都是可以热替换的。
其中5、6比较常用。


5、RuntimeConfig
获取方式RuntimeConfig runtimeConfig = RuntimeConfig.getCurrentInstance();

两个功能:
(1)获取配置文件中所有的导航规则,或者运行时添加新的导航规则。
(2)获取配置文件中所有的managedmean类型,或者运行时添加一个新的managedmean类型。

第一条可以实现通过一个给定的url,动态添加一条规则,然后在action中return起outcome字符串。
后一条可以获取给定的bean的class全称,实例化一个bean。或者动态配置一个bean。


6、ExternalContext
servlet相关操作和各种参数
(1)获取response和request、session、servletContext
(2)redirect和dispacth
(3)获取resquest、session、application、servlet参数
(4)获取资源和url本地路径
(5)encode url


create by qinjinwei
last modified at 2008年5月5日18:09:45


7、绑定List和Map
使用JSF开发时,经常遇到要把MBean中的一个List或Map中的值通过EL显示在页面上,EL中访问Map或List的方法如下:

    假设FacesConfig中配置一个bean的MBean,它的类中定义了一个List类型的list属性和一个Map型的map属性。

    首先是访问List,页面中引用bean中list属性的方法为:#{bean.list[index]}

    而对于Map,EL可以把Key作为一个属性来读取,因此对map的访问可以写为:#{bean.map.key},当然这样可以解决基本的问题,但是如果map中的key是一个包含了空格或特殊字符的String,那么很明显,这个字符串不符合作为属性名的条件,那么用上面的方法去访问明显是有问题的,所以我们很可以用另外一种方法访问Map中的value,#{bean.map['key']}。同时可以看到,因为EL中的内建对象基本都是用Map实现的,因此,EL中的访问方法也是:#{sessionScope['key']}。


8、JSF动态为DataTable添加列
开发JSF的朋友可能会遇到这样的问题,如果DataTable的列不固定,需要动态生成, 该如何实现呢。

    假设FacesConfig中配置一个名为bean的MBean,该MBean中需定义一个类型为 javax.faces.component.html.HtmlDataTable类型的变量dt,页面中的DataTable设置bingding= "#{bean.dt}"。

    首先了解一下JSF中DataTable的渲染方式:

    DataTable

    --<Header> UIComponent

    --<Children>List<HtmlColumn>

    ----<HtmlColumn>

    ------<Header>UIComponent

    ----<Children>List<UIComponent>

    因此,要在后台变更DataTable的状态,可以用dt.setHeader(UIComponent)设置DataTable的表头,然后可以往 dt.getChildren()中添加HtmlColumn类型的列,同样,列中也可以由Header和Children组成。代码实现如下:

private void initialReportTable(List<ExcelReport> reportList) ...{
    dt.getChildren().clear();
    for (ExcelReport report : reportList) ...{
        HtmlColumn column = new HtmlColumn();
        HtmlOutputText header = new HtmlOutputText();
        header.setValueExpression("value",
            getValueExpression("#{rmaReport.captions.c"
            + report.getPosition() + "}"));
        column.setHeader(header);

        HtmlOutputText value = new HtmlOutputText();
        String ve = getVEString(report);
        System.out.println(report.getCaption() + " : " + ve);
        value.setValueExpression("value", getValueExpression(ve));
        column.getChildren().add(value);

        dt.getChildren().add(column);
    }
}其中,动态建立控件的方法为直接创建一个控件,然后通过ValueExpression来设置控件在运行时显示的值,如果是Column中的数据,则可以使用#{tableVar.ColumnName}格式的EL表达式。

9、 JSF动态生成组件

用过Servlet和JSP的开发者对动态生成组件应该是情有独钟了,可以根据数据的情况生成特定的组件,这样增大了Form的灵活性,那么 JSF中如何生成动态的窗体呢,其实非常简单。主要逻辑就是通过FacesContext得到viewRoot对象,然后通过viewRoot对象的 getChildren方法可以得到viewRoot下的所有第一级组件,然后分别对每个组件的getChildren方法进行递归调用,就可以得到整个组件树,当然可以对某个组件的getChildren得到的List使用add方法添加组件了,代码如下,页面有两个commandButton,其中一个可以添加一个TextBox控件,另外一个可以在console打印出当前的组件列表。

package net.moon;

import java.util.List;

import javax.faces.component.UIComponent;
import javax.faces.component.UIViewRoot;
import javax.faces.component.html.HtmlInputText;
import javax.faces.context.FacesContext;

public class DymaComponent ...{

    private UIViewRoot viewRoot;
    private static int inputIndex = 0;

    private List<UIComponent> getComponentChildren(UIComponent component)...{
        List<UIComponent> componentList = null;
        System.out.println(component.getId());
        if(component.getChildCount() > 0)...{
            for(UIComponent ui : component.getChildren())...{
                componentList = getComponentChildren(ui);
            }
        }
        return componentList;
    }
   
    public String getComponentsList()...{
        viewRoot = FacesContext.getCurrentInstance().getViewRoot();
        for(UIComponent component : viewRoot.getChildren())...{
            getComponentChildren(component);
        }
        return null;
    }
   
    public String addTextBox()...{
        viewRoot = FacesContext.getCurrentInstance().getViewRoot();
        UIComponent form1 = viewRoot.getChildren().get(0);
        HtmlInputText input = new HtmlInputText();
        input.setId("input" + (inputIndex++));
        input.setValue("Input 1");
        input.setRendered(true);
        form1.getChildren().add(input);
        return null;
    }
   
}



<%...@ page contentType="text/html; charset=UTF-8" %>
<%...@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%...@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <title></title>
    </head>
    <body>
        <f:view>
            <h:form id="form1">
                <h:commandButton id="commmand1" action="#{dymaComponent.getComponentsList}" value="Print ViewRoot"></h:commandButton>
                <h:commandButton action="#{dymaComponent.addTextBox}" value="Add TextBox"></h:commandButton>
            </h:form>
        </f:view>
    </body>
</html>






<?xml version="1.0" encoding="UTF-8"?>

<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
    version="1.2">
    <managed-bean>
        <managed-bean-name>
        dymaComponent</managed-bean-name>
        <managed-bean-class>
        net.moon.DymaComponent</managed-bean-class>
        <managed-bean-scope>
        session</managed-bean-scope>
    </managed-bean>

</faces-config>
一个网友的意见:
在jsf 的bean与bean之间的交互,我以为通过这样的方式较好,不知各位意下如何?

假这othenBean之other要访问UserBean之user中的数据。
可以先在othenBean中增加一个属性,userProperty,其类型为UserBean
然后在bean配置中相应更改
  <managed-bean>
______<managed-bean-name>user</managed-bean-name>
_________<managed-bean-class>
____________webapplication1.UserBean
_________</managed-bean-class>
______<managed-bean-scope>session</managed-bean-scope>
</managed-bean>

<managed-bean>
__<managed-bean-name>other</managed-bean-name>
__<managed-bean-class>
_____webapplication1.OtherBean 
__</managed-bean-class>
__<managed-bean-scope>session</managed-bean-scope>
__<managed-property>
_____<property-name>userProperty </property-name>
_____<value>#{user}</value>
__</managed-property>
</managed-bean>

其中,#{user} 表示对已经规定了的bean的引用。
本例中:设定了两个bean,UserBean 、OtherBean ,它们的实例名为user与other. 其中other中的有一个属性(userProperty)其值设成user.
分享到:
评论

相关推荐

    JSF上传 JSF大文件上传 JSF上传代码 JSF上传源代码

    JSF(JavaServer Faces)是Java平台上用于构建用户界面的Web框架,尤其在处理表单和数据交互方面表现强大。本项目聚焦于JSF的文件上传功能,特别是针对大文件的上传,允许用户上传最大可达1.99GB的文件。在实际应用...

    JSF Java Server Faces (JSF)框架

    JSF是一种用于构建Java Web 应用程序的标准框架(是Java Community Process 规定的JSR-127标准)。JSF(Java Server Faces)技术为开发基于网络用户界面的Java开发者提供了标准的编程接口API以及标签库。就像Struts框架...

    JSF文件下载实现

    **JSF 文件下载实现** 在JavaServer Faces (JSF)框架中,实现文件下载功能是一项常见的需求。在本文中,我们将深入探讨如何使用JSF来实现在Web应用程序中下载文件的功能。主要涉及的关键知识点包括: 1. **JSF上...

    jsf-api.jar和jsf-impl.jar

    **JSF(JavaServer Faces)** 是一个Java平台上的用户界面框架,用于构建Web应用程序。它提供了一种组件化和事件驱动的方式来创建交互式的Web界面。JSF API 和 JSF Impl 是JSF框架的核心组成部分。 **jsf-api.jar**...

    开发JSF所需要的jar包

    JavaServer Faces(JSF)是Java平台上的一种用于构建Web应用程序的MVC(Model-View-Controller)框架。它提供了一种组件化的方式来构建用户界面,简化了前后端交互的复杂性。在JSF中,开发者可以使用声明式编程模型...

    jsf1.2 jar包下载

    JavaServer Faces(JSF)是Java平台上的一种用于构建用户界面的服务器端Web应用程序框架,它遵循Model-View-Controller(MVC)设计模式。JSF 1.2是该框架的一个较早版本,发布于2006年,提供了一系列增强功能和改进...

    IDEA创建JSF项目所需jar包.zip

    在JavaServer Faces (JSF) 开发环境中,IntelliJ IDEA (IDEA) 是一个流行的集成开发环境。这个“IDEA创建JSF项目所需jar包.zip”文件包含了两个关键的库文件,它们对于在IDEA中成功搭建JSF项目至关重要。下面我们将...

    JSF开发必备JAR

    ================================= JSF开发必备JAR ================================= &lt;br&gt;《JSF入门简单中文版》开篇提到JSF开发需要的jar,' 但是按其中提供的方法: &lt;br&gt;jstl.jar 与 ...

    JSF中文教程jsf

    **JSF(JavaServer Faces)** 是一个Java平台上的用户界面框架,用于构建Web应用程序。它简化了开发人员创建交互式、数据驱动的Web界面的过程。JSF提供了一个组件模型,允许开发者通过拖放组件的方式来构建用户界面...

    JSF与hibernate整合的登陆

    **JSF(JavaServer Faces)** 是Java平台上的一种用于构建用户界面的Web应用程序框架,它简化了开发人员创建和管理动态Web用户界面的过程。JSF提供了组件库、事件处理机制和生命周期管理,允许开发者通过声明式的...

    jsf-api.jar

    JSF(JavaServer Faces)是Java平台上的一种用于构建用户界面的MVC(Model-View-Controller)框架。它简化了Web应用开发,提供了一种声明式的方式来创建动态、交互式的Web界面。`jsf-api.jar` 文件是JSF API的核心库...

    jsf第一个例子 jsf架包 jsf实例

    **JSF(JavaServer Faces)** 是一个Java平台上的用户界面框架,用于构建Web应用程序。它为开发人员提供了一种模型-视图-控制器(MVC)架构,简化了前端和后端之间的交互。JSF提供了组件库,使得创建动态、交互式的...

    用jsf做的登录注册的组件

    JSF(JavaServer Faces)是一种用于构建Web应用程序的Java技术,它提供了一种声明式的方式来创建用户界面,并处理用户交互。在这个"用jsf做的登录注册的组件"中,我们可能会涉及以下几个关键知识点: 1. **JSF架构*...

    JSF的工作方式 JSF架构 JSF模型 JSF事件类型

    JavaServer Faces (JSF) 是一个用于构建用户界面的Java Web框架,它简化了创建和维护Web应用程序的复杂性。JSF的核心理念是提供一种组件化的编程模型,将UI元素与业务逻辑分离,使得开发者可以专注于应用的逻辑部分...

    JSF包,jsf包,JSF包,jsf包

    **JSF(JavaServer Faces)** 是一种Java平台上的Web应用程序开发框架,它提供了一种组件化和事件驱动的方式来创建用户界面。JSF的核心概念包括组件、事件、渲染器和生命周期,这些元素共同构建了一个强大的MVC...

    JSF入门+JSF web实战+JSF2

    JavaServer Faces(JSF)是Java平台上的一种用于构建Web应用程序的MVC(Model-View-Controller)框架。它提供了一种声明式的方式来构建用户界面,简化了开发过程,并且与Java EE平台无缝集成。本系列资料包括《JSF...

    jsf分页 jsf分页 jsf分页

    在JavaServer Faces (JSF)框架中,分页是一种常用的技术,用于处理大量数据时提供更好的用户体验。当数据集过大,一次性加载所有记录到页面上会导致性能下降且用户界面响应变慢。通过分页,我们可以将数据分成多个...

    javaee.jar,jsf-api.jar,jsf-impl.jar,jstl-1.2.jar

    3. **jsf-impl.jar**:与jsf-api.jar相对应,这个文件包含了JSF的实现代码。在实际开发中,开发者通常只需要引用api.jar进行编程,而impl.jar则在运行时提供具体的实现细节,执行用户界面的渲染和事件处理等功能。 ...

    图书管理系统-BookM_JSF_Hibernate_Spring

    《图书管理系统-BookM_JSF_Hibernate_Spring》是一个基于Java技术栈的Web应用程序,它融合了多个核心技术,包括JavaServer Faces(JSF)、Hibernate、Spring框架以及ajax4jsf库,旨在提供一个高效、易用的图书管理...

    jsf-api-2.0.3.jar.zip_jsf api_jsf jar包_jsf-api-2.0.3.jar_jsf-api

    JSF(JavaServer Faces)是Java平台上的一种用于构建用户界面的MVC(Model-View-Controller)框架。它提供了一种声明式的方式来创建Web应用程序,允许开发者通过组件和事件处理来构建用户界面,而无需深入HTML和...

Global site tag (gtag.js) - Google Analytics