JSF动态生成组件
2007-11-15 09:06
323 查看
JSF动态生成组件
分类:Java开发
Web开发
Java模式 2007-11-15 09:06
962人阅读 评论(0)
收藏
举报
用过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动态生成组件
- ASM(三) 利用Method组件动态生成方法的字节码
- Android动态生成组件
- JSF: 动态生成的DataTable, 固定表头, 固定行标,
- 运用dtree组件动态生成目录树
- JSF动态生成菜单
- 运用dtree组件动态生成带复选框的目录树
- 关于使用Jquery动态生成页面组件的时候,单引号和双引号的注意
- mxml中动态生成组件的OO重写
- Java动态生成组件
- 利用开源组件iText动态生成PDF文档
- 【Cocos creator】绘图系统:Graphics组件之动态改变生成图像的透明度
- updatepanel中动态生成组件及绑定事件问题的解决
- react---react router4.0路由中如何异步动态加载组件,webpack使用require.ensure()生成异步chunk
- 用VisualC#动态生成组件
- 发布一个类似Subsonic语法的动态生成SQL语句,并可以返回相应实体类的一个组件
- asp.net 生成word 动态的填充表格(Microsoft的自带组件)
- JSF: 动态生成的DataTable, 固定表头, 固定行标
- jsf-后台动态生成richfaces的dataTable
- 用Visual C#动态生成组件