---
name: jsf-ajax
description: >
JSF AJAX update rules for the HMIS project. Use when working on AJAX updates,
p:commandButton update attributes, PrimeFaces AJAX callbacks, partial page rendering,
or debugging AJAX update failures. Also covers JSF navigation patterns: why
f:viewAction must not be used on @SessionScoped beans, and how initialization
belongs in navigation methods. Critical rules to prevent silent AJAX failures
and refresh/back-button state corruption.
user-invocable: true
---
# JSF AJAX Update Guidelines
## Critical Rules
1. **AJAX UPDATE RULE**: NEVER use plain HTML elements (div, span) with id attributes for AJAX updates - use JSF components (`h:panelGroup`, `p:outputPanel`) instead
2. **RENDERED ATTRIBUTE RULE**: NEVER use `rendered` on plain HTML elements - JSF ignores it; use `h:panelGroup layout="block"` instead
3. **COMPONENT REFERENCES**: Use `p:resolveFirstComponentWithId` for updates: `update=":#{p:resolveFirstComponentWithId('componentId',view).clientId}"`
4. **NO CSS/jQuery SELECTORS**: NEVER use `@(.class)`, `@(#id)`, `@parent` in `update` or `process` attributes. Use `@this`, `@form`, explicit IDs, or `:#{p:resolveFirstComponentWithId(...)}`
## Wrong vs Correct
```xhtml
```
## Updating Growl/Messages
The growl component is in `template.xhtml` outside forms. Use absolute ID with colon prefix:
```xhtml
```
## JSF Components for AJAX Updates
- `h:panelGroup` - Lightweight wrapper, no HTML output
- `p:outputPanel` - PrimeFaces panel, renders as `` or ``
- `h:div` - Renders as HTML `
`
- `h:form` - For updating entire form sections
- `p:panel` - Full-featured panel with header/footer
## Debugging
1. Check browser console for JavaScript errors
2. Verify target element is a JSF component (not plain HTML)
3. Use browser dev tools to confirm JSF-generated id
4. Test with `h:panelGroup` wrapper if updates fail
5. Check component hierarchy - nested components affect id resolution
For complete reference, read [developer_docs/jsf/ajax-update-guidelines.md](../../../developer_docs/jsf/ajax-update-guidelines.md).
---
## PrimeFaces DataTable Multi-Selection (Current Syntax)
**🚨 Do NOT use `selectionMode="multiple"` on `
` — that is the PrimeFaces 7 and earlier pattern. The current PrimeFaces requires `selectionMode` on the dataTable and `selectionBox="true"` on the column.**
### Wrong (old PrimeFaces, no checkboxes render in current version)
```xhtml
...
```
### Correct (current PrimeFaces)
```xhtml
...
```
Also: bind selection to an **array** (`MyDTO[] selected`), not a `List`. Always include `rowKey`.
For complete reference (single-selection, controller pattern, `selectAllFilteredOnly`, troubleshooting), read [developer_docs/jsf/primefaces-datatable-selection.md](../../../developer_docs/jsf/primefaces-datatable-selection.md).
---
## Navigation Pattern: Never Use f:viewAction on @SessionScoped Beans
**🚨 Most controllers in this project are `@SessionScoped`. Never use `f:viewAction` or `f:event type="preRenderView"` to initialize state on `@SessionScoped` beans.**
`f:viewAction` fires on every GET — including browser refresh and back-button — silently resetting in-progress state. All initialization belongs in the navigation method that redirects to the page.
### Correct pattern
```java
// Navigation method — initialize here
public String navigateToFundTransferBill() {
resetClassVariables();
prepareToAddNewFundTransferBill();
currentBillPayments = new ArrayList<>();
return "/cashier/fund_transfer_bill?faces-redirect=true";
}
```
```xhtml
...
```
### The two legitimate uses of f:viewAction
1. **URL parameter ingestion** — page is reached via external URL with `f:viewParam` query params (lab result links, mobile API, patient portal). No navigation method exists; the URL is the entry point. **Signal: `f:metadata` contains `f:viewParam` elements.**
2. **`@ViewScoped` beans** — bean is created fresh on each page load, so there is no prior navigation method. (Rare in this project — most controllers are `@SessionScoped`.)
If you see `f:viewAction` without any `f:viewParam`, it is almost certainly wrong.
For complete reference, read [developer_docs/jsf/navigation-patterns.md](../../../developer_docs/jsf/navigation-patterns.md).