Why you can't use c:forEach? Columns in RF 3.3.x was made just the same as that facelet JSTL tag.

The problem is that c:forEach runs when the view is build and is then gone. Often you need columns to be created following an operation that took place in the "invoke application" phase. If you then try to build a table from the result of that operation, it won't work since "invoke application" happens after "restore view".

In this example, someResult would be e.g. a List<Object[]>, or a List<Map<String, Object>> or whatever. It's value is being set in an action method, so it will only be available after the "invoke application" phase.