JS

Provides strict guidelines for JSF and PrimeFaces AJAX updates.

Install

mkdir -p .claude/skills/jsf-ajax && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/12460" && unzip -o skill.zip -d .claude/skills/jsf-ajax && rm skill.zip

Installs to .claude/skills/jsf-ajax

Activation

This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.

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.
437 chars✓ has a “when” triggerlonger than Claude Code's old 250-char listing cap (fine on current versions)
Intermediate

Key capabilities

  • Enforce JSF AJAX update rules
  • Prevent silent AJAX failures with plain HTML elements
  • Correctly use JSF components for AJAX updates
  • Debug AJAX update issues
  • Apply correct PrimeFaces DataTable multi-selection syntax
  • Implement correct JSF navigation patterns for `@SessionScoped` beans

How it works

The skill provides critical rules and examples for JSF AJAX updates, PrimeFaces component usage, and navigation patterns. It identifies common pitfalls and offers correct implementations.

Inputs & outputs

You give it
JSF/PrimeFaces XHTML code with AJAX updates or data table selections
You get back
Corrected XHTML code, debugging guidance, or explanation of JSF patterns

When to use jsf-ajax

  • Debug AJAX update failure
  • Implement partial page rendering
  • Configure commandButton updates

About this skill

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

<!-- WRONG - Plain HTML, AJAX silently fails -->
<div id="stockSelection">
    <!-- content -->
</div>
<p:commandButton update="stockSelection" />

<!-- CORRECT - JSF component, AJAX works -->
<h:panelGroup id="stockSelection">
    <div><!-- content --></div>
</h:panelGroup>
<p:commandButton update="stockSelection" />

Updating Growl/Messages

The growl component is in template.xhtml outside forms. Use absolute ID with colon prefix:

<!-- CORRECT -->
<p:commandButton action="#{bean.save}" update="myTable :growl" />

<!-- WRONG - Do NOT use CSS selectors -->
<p:commandButton update="@(.ui-growl)" />

JSF Components for AJAX Updates

  • h:panelGroup - Lightweight wrapper, no HTML output
  • p:outputPanel - PrimeFaces panel, renders as <span> or <div>
  • h:div - Renders as HTML <div>
  • 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.


PrimeFaces DataTable Multi-Selection (Current Syntax)

🚨 Do NOT use selectionMode="multiple" on <p:column> — 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)

<p:dataTable value="#{bean.items}" var="i"
             selection="#{bean.selected}" rowKey="#{i.id}">
    <p:column selectionMode="multiple" />   <!-- WRONG -->
    ...
</p:dataTable>

Correct (current PrimeFaces)

<p:dataTable value="#{bean.items}" var="i"
             selection="#{bean.selected}" rowKey="#{i.id}"
             selectionMode="multiple">
    <p:column selectionBox="true" style="width: 3rem; text-align: center;" />
    ...
</p:dataTable>

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.


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

// Navigation method — initialize here
public String navigateToFundTransferBill() {
    resetClassVariables();
    prepareToAddNewFundTransferBill();
    currentBillPayments = new ArrayList<>();
    return "/cashier/fund_transfer_bill?faces-redirect=true";
}
<!-- XHTML — no f:metadata needed -->
<ui:define name="subcontent">
    <h:form>...</h:form>
</ui:define>

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.

When not to use it

  • When working with `f:viewAction` on `@SessionScoped` beans for initialization
  • When using `selectionMode="multiple"` on `<p:column>` in PrimeFaces

Limitations

  • Rules are specific to HMIS project JSF AJAX updates
  • PrimeFaces DataTable multi-selection syntax is for current PrimeFaces versions
  • Navigation patterns are primarily for `@SessionScoped` beans

How it compares

This skill provides specific, project-tailored guidelines for JSF and PrimeFaces, addressing common issues that lead to silent failures or state corruption, unlike generic JSF documentation.

Compared to similar skills

jsf-ajax side by side with the closest alternatives in the catalog.

SkillInstallsUpdatedSafetyDifficulty
jsf-ajax (this skill)02moNo flagsIntermediate
android-java04moNo flagsIntermediate
azure-messaging-webpubsub-java13moReviewIntermediate
code-checklist04moReviewBeginner

Try saying

Example prompts that trigger this skill in your AI assistant.

Search skills

Search the agent skills registry