Creating Multiple Components
There will be requirement to build multiple components using the same builder and can have two use cases.
Use Case 1
The components are made from an already existing components/builders. For example if there is already a component with id="test.ComponentA" and another with id="test.ComponentB" and we want to get both the components in a page.
@ComponentBuilder(value="test.multi.AB", type=ComponentBuilderType.CONFIG_ONLY)
public class MultiComponentBuilder extends AbstractComponentConfigBuilder{
@Override
public ComponentConfig buildComponentConfig(ComponentParams params)
throws WTException {
MultiComponentConfig configs = new MultiComponentConfig();
configs.addNestedComponent("test.ComponentA");
//you are specifying the componentId
configs.addNestedComponent("test.ComponentB");
configs.setView("/test/multi.jsp");
return config ;
}
}
There is no need for ComponentDataBuilder as this multiComponent by itself doesn't have any data.
You need to specify a view jsp for this ComponentConfig as no default view can handle that.
When you use addNestedComponent to provide a componentId, make sure that componentIds are to be handled by the same controller instance. In other words, you can have only non-type based or type based components combined together with this approach.
Use Case 2
Here the components need to be defined and they exist together. E.g. you want property panel coming with a table.
There is a need for ComponentDataBuilder.
Infrastructure invokes the buildComponentData for each ComponentConfig available in the MultiComponentConfig. It’s invoked in the same order it has been put in the MultiComponentConfig.
You can access the rawData for the ComponentConfig that has already been processed from the ComponentParams supplying the componentId
You need to specify a view jsp for this ComponentConfig as no default view can handle that.
@ComponentBuilder("test.array.PQ")
public class ComponentArrayBuilder extends AbstractComponentBuilder {

@Override
public ComponentConfig buildComponentConfig(ComponentParams params)
throws WTException {
MultiComponentConfig configs = new MultiComponentConfig();

TableConfig table1 = createTable1();
//create a table with id = component1
......
TableConfig table2 = createTable2();
//create a table with id = component2
......
configs.addComponent(table1);
//add the components
configs.addComponent(table2);

configs.setView("/test/array.jsp");
return configs ;
}

@Override
public Object buildComponentData(ComponentConfig config,
ComponentParams params) throws WTException {

if ("component1".equals(config.getId())) {
//return data for table with id= component1
} else {
//return data for table with id= component2
}
}
}
這是否有幫助?