`
ivy1107
  • 浏览: 15586 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
最近访客 更多访客>>
社区版块
存档分类
最新评论

jsf几个常用取值方法和技巧总结

    博客分类:
  • J2EE
阅读更多
jsf几个常用取值方法和技巧总结(持续更新)

1、获取managedbean或是解析表达式
有三种方法

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


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


(3)
 
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八个常用jar包

    jsf常用jar包 包括commons-beanutils.jar commons-collections-3.1.jar commons-digester.jar commons-logging.jar jsf-api.jar jsf-impl.jar jstl.jar standard.jar 肯定有你想要的!

    jsf常用标签整理

    robStrategy(String probeStrategy) { this...总结,JSF中的常用标签包括、、、、、、、、、、和等。这些标签用于构建用户界面,与后台bean交互,并处理表单提交、验证和导航。理解和熟练使用这些标签是JSF开发的关键。

    应用JSF常用标签介绍

    通过深入探讨JSF中的导航、转换和验证、数据表格等常用标签,我们不难发现,JSF框架为Web开发提供了一套强大而灵活的工具集。它不仅简化了Web应用的创建过程,还确保了应用的高质量和高效率。对于任何希望在Web开发...

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

    在这个例子中,`loginBean`是Managed Bean,它有两个属性(username和password),并有一个login方法处理登录操作。当用户点击登录按钮时,JSF会调用`loginBean.login`方法。 总的来说,JSF提供了一个强大且灵活的...

    jsf常用控件的使用

    本文将深入探讨JSF中的一些常见控件及其使用方法,旨在帮助开发者更好地理解和应用这些控件。 1. **输入控件**: - `h:inputText`:用于创建简单的文本输入字段,可以与Bean中的属性绑定,处理用户输入的数据。 -...

    jsf分页 jsf分页 jsf分页

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

    jsf-api.jar和jsf-impl.jar

    开发者通常需要这个库来编译他们的JSF项目,因为编译时需要知道JSF提供的公共接口和抽象类。它不包含具体的实现,而是提供了规范,使得不同供应商可以提供自己的实现。 **jsf-impl.jar** 文件则是JSF API的具体实现...

    JSF生命周期总结JSF生命周期总结

    JSF生命周期总结JSF生命周期总结JSF生命周期总结JSF生命周期总结JSF生命周期总结JSF生命周期总结

    jsf入门列子和jsf与Tiles结合

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

    jsf介绍和例子

    5. **EL(Expression Language)** - EL是用于访问应用程序上下文中的属性和方法的简洁表达式语言,与JSF组件紧密集成。 **京东JSF服务框架**: 京东可能在其内部开发了一个定制版的JSF框架,以适应其电商平台的...

    jsf实例jsf实例 JSF学习 JSF jar包 JSF

    jsf实例 JSF学习 JSF jar包 JSF jsf实例 JSF学习 JSF jar包 JSFjsf实例 JSF学习 JSF jar包 JSF jsf实例 JSF学习 JSF jar包 JSF

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

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

    JSF Java Server Faces (JSF)框架

    JSF是一种用于构建Java ... 包含JSP页面的JSF应用程序也使用由为了表现UI组件和在页面上的其他对象的JSF技术而定义的标准的tag库。 Java Server Faces技术的重要开发框架 sun-ri、myfaces、icefaces、richfaces、seam

    JSF的第一个程序

    JSF程序通常由以下几个部分组成: - **Managed Beans**: 这是业务逻辑的容器,可以看作是JavaBean的增强版。在Eclipse中,右键点击项目,选择"New" -&gt; "Other" -&gt; "JSF" -&gt; "Managed Bean"来创建一个。 - **JSF组件*...

    JSF和Spring集成.doc

    - 这个类的主要功能是在 JSF 世界中查找 Spring 管理的 bean,同时也实现了在 Spring 中查找 JSF 组件的方法。 - `findBean(String beanName)` 方法用于从 Spring 中查找 bean,该方法通过当前 `FacesContext` ...

    基于JSF全注解框架

    总结来说,基于JSF全注解的框架是一种现代化的开发方式,它将JSF的功能与Java注解的强大结合在一起,降低了开发难度,提高了开发效率。通过理解和掌握这些知识点,开发者能够更好地构建出高效、可维护的JSF应用程序...

    JSF中文教程jsf

    JSF提供了一个组件模型,允许开发者通过拖放组件的方式来构建用户界面,并通过事件处理和数据绑定来实现业务逻辑。 在JSF中,**组件** 是UI的基础元素,如按钮、文本输入框等。这些组件可以通过XML(Facelets)或...

    JSF_TAG(JSF 标签)

    常用的 JSF标签库 常用的 JSF标签库

Global site tag (gtag.js) - Google Analytics