JSF动态生成组件

时间:2021-09-29 05:27:50

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

JSF动态生成组件package  net.moon;
JSF动态生成组件
JSF动态生成组件
import  java.util.List;
JSF动态生成组件
JSF动态生成组件
import  javax.faces.component.UIComponent;
JSF动态生成组件
import  javax.faces.component.UIViewRoot;
JSF动态生成组件
import  javax.faces.component.html.HtmlInputText;
JSF动态生成组件
import  javax.faces.context.FacesContext;
JSF动态生成组件
JSF动态生成组件JSF动态生成组件
public   class  DymaComponent  ... {
JSF动态生成组件
JSF动态生成组件    
private UIViewRoot viewRoot;
JSF动态生成组件    
private static int inputIndex = 0;
JSF动态生成组件
JSF动态生成组件JSF动态生成组件    
private List<UIComponent> getComponentChildren(UIComponent component)...{
JSF动态生成组件        List
<UIComponent> componentList = null;
JSF动态生成组件        System.out.println(component.getId());
JSF动态生成组件JSF动态生成组件        
if(component.getChildCount() > 0)...{
JSF动态生成组件JSF动态生成组件            
for(UIComponent ui : component.getChildren())...{
JSF动态生成组件                componentList 
= getComponentChildren(ui);
JSF动态生成组件            }

JSF动态生成组件        }

JSF动态生成组件        
return componentList;
JSF动态生成组件    }

JSF动态生成组件    
JSF动态生成组件JSF动态生成组件    
public String getComponentsList()...{
JSF动态生成组件        viewRoot 
= FacesContext.getCurrentInstance().getViewRoot();
JSF动态生成组件JSF动态生成组件        
for(UIComponent component : viewRoot.getChildren())...{
JSF动态生成组件            getComponentChildren(component);
JSF动态生成组件        }

JSF动态生成组件        
return null;
JSF动态生成组件    }

JSF动态生成组件    
JSF动态生成组件JSF动态生成组件    
public String addTextBox()...{
JSF动态生成组件        viewRoot 
= FacesContext.getCurrentInstance().getViewRoot();
JSF动态生成组件        UIComponent form1 
= viewRoot.getChildren().get(0);
JSF动态生成组件        HtmlInputText input 
= new HtmlInputText();
JSF动态生成组件        input.setId(
"input" + (inputIndex++));
JSF动态生成组件        input.setValue(
"Input 1");
JSF动态生成组件        input.setRendered(
true);
JSF动态生成组件        form1.getChildren().add(input);
JSF动态生成组件        
return null;
JSF动态生成组件    }

JSF动态生成组件    
JSF动态生成组件}

JSF动态生成组件

 

JSF动态生成组件JSF动态生成组件<% ... @ page contentType="text/html; charset=UTF-8"  %>
JSF动态生成组件JSF动态生成组件
<% ... @ taglib uri="http://java.sun.com/jsf/html" prefix="h"  %>
JSF动态生成组件JSF动态生成组件
<% ... @ taglib uri="http://java.sun.com/jsf/core" prefix="f"  %>
JSF动态生成组件
JSF动态生成组件
< html >
JSF动态生成组件    
< head >
JSF动态生成组件        
< meta  http-equiv ="Content-Type"  content ="text/html; charset=UTF-8" />
JSF动态生成组件        
< title ></ title >
JSF动态生成组件    
</ head >
JSF动态生成组件    
< body >
JSF动态生成组件        
< f:view >
JSF动态生成组件            
< h:form  id ="form1" >
JSF动态生成组件                
< h:commandButton  id ="commmand1"  action ="#{dymaComponent.getComponentsList}"  value ="Print ViewRoot" ></ h:commandButton >
JSF动态生成组件                
< h:commandButton  action ="#{dymaComponent.addTextBox}"  value ="Add TextBox" ></ h:commandButton >
JSF动态生成组件            
</ h:form >
JSF动态生成组件        
</ f:view >
JSF动态生成组件    
</ body >
JSF动态生成组件
</ html >

 

 

 

JSF动态生成组件<? xml version="1.0" encoding="UTF-8" ?>
JSF动态生成组件
JSF动态生成组件
< faces-config
JSF动态生成组件    
xmlns ="http://java.sun.com/xml/ns/javaee"
JSF动态生成组件    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
JSF动态生成组件    xsi:schemaLocation
="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
JSF动态生成组件    version
="1.2" >
JSF动态生成组件    
< managed-bean >
JSF动态生成组件        
< managed-bean-name >
JSF动态生成组件        dymaComponent
</ managed-bean-name >
JSF动态生成组件        
< managed-bean-class >
JSF动态生成组件        net.moon.DymaComponent
</ managed-bean-class >
JSF动态生成组件        
< managed-bean-scope >
JSF动态生成组件        session
</ managed-bean-scope >
JSF动态生成组件    
</ managed-bean >
JSF动态生成组件
JSF动态生成组件
</ faces-config >
JSF动态生成组件