Код Primefaces является длинным, и может быть трудно поддерживать контроль в большом веб-приложении.
Некоторые примеры:
HTML
<p:selectOneMenu id="clientToCopyRoles" value="#{form.clientToCopyRoles}"
rendered="#{form.copyAllowed}">
<f:selectItem value="#{null}" itemLabel="#{msg.clientSelect}"/>
<f:selectItems value="#{form.possibleClientsForCopying}"/>
</p:selectOneMenu>
<p:commandButton id="copyRolesToClient"
rendered="#{form.copyAllowed}"
disabled="#{form.canCopyRoles}"
action="#{form.copyRolesToClient()}"
value="#{msg.copyToClient}"/>
Требуется Java
private boolean copyAllowed;
private Client clientToCopyRoles;
private List<SelectItem> possibleClientsForCopying;
private boolean canCopyRoles;
public Client getClientToCopyRoles() {
return clientToCopyRoles;
}
public void setClientToCopyRoles(Client clientToCopyRoles) {
this.clientToCopyRoles = clientToCopyRoles;
}
public boolean isCopyAllowed() {
return copyAllowed;
}
public void copyRolesToClient() {
businessLogic.copyRolesToClient(clientToCopyRoles);
}
public List<SelectItem> getPossibleClientsForCopying() {
return possibleClientsForCopying;
}
public boolean isCanCopyRoles() {
return canCopyRoles;
}
Это долго, нет очевидной связи между полями классов и компонентами в HTML, и это вводит в заблуждение программистов для реализации сложной и медленной логики в методах получения, которые, как мы знаем, должны вызыватьсянесколько раз JSF во время обработки, и никогда не должны выдавать никаких исключений. Я хотел бы что-то вроде этого:
HTML
<p:selectOneMenu id="clientToCopyRoles" java="#{form.clientToCopyRoles}"
nullItemLabel="#{msg.clientSelect}" />
<p:commandButton id="copyRolesToClient" java="#{form.copyRolesToClient}"
value="#{msg.copyToClient}"/>
Требуется Java
private final SelectOneMenu<Client> clientToCopyRoles = new SelectOneMenu<>();
private final CommandButton copyRolesToClient = new CommandButton();
public Form() {
clientToCopyRoles.setRendered(true);
clientToCopyRoles.setNullItemSelctable(true);
clientToCopyRoles.setItems(possibleClientsForCopying, Client::getName);
clientToCopyRoles.onChange(selectOneMenu ->
copyRolesToClient.setDisabled(selectOneMenu.getSelectedItem() != null));
copyRolesToClient.setRendered(true);
copyRolesToClient.setDisabled(true);
copyRolesToClient.onClick(commandButton ->
businessLogic.copyRolesToClient(clientToCopyRoles.getSelectedItem()));
}
public SelectOneMenu<Client> getClientToCopyRoles() {
return clientToCopyRoles;
}
public CommandButton copyRolesToClient() {
return copyRolesToClient;
}
Конечно, я мог бы написать такие классыкак SelectOneMenu
и CommandButton
, но это все равно оставит мне гораздо больше HTML:
<p:selectOneMenu id="clientToCopyRoles" value="#{form.clientToCopyRoles.selectedItem}"
rendered="#{form.clientToCopyRoles.rendered}">
<f:selectItem value="#{null}" itemLabel="#{msg.clientSelect}"/>
<f:selectItems value="#{form.clientToCopyRoles.items}"/>
</p:selectOneMenu>
<p:commandButton id="copyRolesToClient"
rendered="#{form.copyRolesToClient.rendered}"
disabled="#{form.copyRolesToClient.disabled}"
action="#{form.copyRolesToClient.click()}"
value="#{msg.copyToClient}"/>
И если я забуду явно назначить атрибут, такой как rendered
в HTML, я мог бы установитьэто true
или false
на моем бобе, и ничего не произойдет.
Мне кажется, что это что-то настолько базовое, что оно должно определенно (и я предполагаю, что это) где-то в классах Primefacesи я просто не смог найти или понять это правильно. Я внимательно посмотрел на пакет javax.faces.component
, который и ожидал атрибут * компоненты 'Primefaces binding
, где я и предполагал его найти. Есть некоторые вещи, связанные с чем-то вроде UISelectMany
и UISelectItems
, но это не похоже на чистый и простой в использовании API, который будет использоваться для программирования интерфейса, но для выполнения внутренних функций (HTML, AJAX и т. Д.).
Существуют ли такие виды внутренних классов для компонентов Primefaces, либо официальная часть, либо, может быть, существует проект, который занимается именно этим (по крайней мере, частью Java)возможно)? Я хотел бы ввести значение по умолчанию вместо того, чтобы писать свое, если это возможно.