a4j:keepAlive extends the live cycle for request scope beans. In general, each Ajax request works inside the own request scope. Therefore, the state of the component tree rendered based on the variable from one request scope does not correspond to the state of the same tree processed during the next Ajax request. This causes one of the most widespread problem when the form elements (buttons or fields) can't be correctly proceeded with Ajax if the 'rendered' attribute is mapped to the request scoped variable

Using the session scope variables solves the above mentioned problem. However, using a session scope might be inappropriate from the architectural point of view. a4j:keepAlive allows to reuse the same value for a request scope bean between several Ajax requests.

beanName attribute references to a request scope bean name you'd like to re-use during the Ajax requests.

ajaxOnly attribute is a flag that declares whether the value of the bean should be available during a non-Ajax request. If ajaxOnly="true", a request scope bean will keep the same value during Ajax requests from the given page, but it will be re-created as a regular request scope bean when a non-Ajax request will send from this page.

KeepAlive demo