Хороший вопрос. Ответ BalusC - как всегда - полный и правильный.
Однако, если вы хотите создать приложение, в котором графический интерфейс построен динамически, есть способ, который может помочь вам лучше (в зависимости от того, чего вы действительно хотите достичь).
Представления JSF похожи на формы Swing - они представляют собой просто набор JavaBeans (tm), склеенных вместе. Большая разница состоит в том, что когда поле связано с выражением EL, вы не используете стандартные методы доступа, а скорее используете специальный метод (setValueExpression).
Это означает, что вы можете создать свой графический интерфейс из объектов (конкретные классы можно найти в javax.faces.component.html) чисто программным способом, а затем использовать атрибут привязки, чтобы отобразить его на странице. Что-то вроде:
<h:form>
<h:panelGrid binding="#{formBuilder.component}"/>
</h:form>
А затем в управляемой форме bean-компонента Builder:
@PostConstruct
public void init() {
HtmlInputText hit = new HtmlInputText();
// properties are easy:
hol.setStyle("border: 2px solid red");
// binding is a bit harder:
hit.setValueExpression("value", expression("#{test.counter}", String.class));
HtmlOutcomeTargetLink hol = new HtmlOutcomeTargetLink();
hol.setValue("link leading to another view");
hol.setOutcome("whatever");
component = new UIPanel();
component.getChildren().add(hit);
component.getChildren().add(hol);
}
private ValueExpression expression(String s, Class c){
return FacesContext.getCurrentInstance().getApplication().getExpressionFactory().createValueExpression(
FacesContext.getCurrentInstance().getELContext(),
s, c
);
}
В приведенном выше примере строится статическая панель, но было бы возможно:
- создать объектную модель вашего GUI
- сопоставить модель с базой данных (в спящем режиме или с другой формой)
- написать какой-нибудь адаптер или мост для построения объектов JSF из вашей объектной модели
- создать управляемый компонент, который получает идентификатор формы, извлекает соответствующую форму из базы данных, строит из нее панель JSF и представляет ее как свойство, готовое для привязки.
Таким образом, вы можете иметь только один статический xhtml с одним тегом и использовать его для представления любого количества динамических форм.
Как я уже сказал, этот метод может быть лучше, чем просто хранение файлов, но не обязательно. Если вы просто хотите избавить себя от необходимости повторного развертывания, это является огромным излишним (опять же, вам НЕ нужно повторно развертывать приложения JSF просто для изменения форм). Если, с другой стороны, ваша цель состоит в том, чтобы иметь что-то вроде пользовательских и отредактированных форм, хорошей идеей может быть хорошая объектная модель и ее правильное хранение.
Удары впереди будут:
- навигация (возможно, подойдет пользовательский обработчик навигации?)
- проблемы с генерацией простого HTML
- возможно, некоторые проблемы с жизненным циклом видимых форм