Como Criar uma tabela com paginação?!

Olá,

Estou desenvolvendo uma aplicação Web e me deparei com a seguinte dúvida, tenho uma lista que aplicação me devolve com todos as salas que possuem um tipo de reunião agendada e gostaria que fossem mostradas apenas 3 itens por vez numa tabela no html e depois aquela div desse um refresh com mais 3 itens até que toda lista fosse exibida e voltasse ao ponto inicial. Estou usando Richfaces + Hibernate + JPA + JSF. Alguem teria alguma ideia de como fazer essa “paginação”?

Segue trecho do meu codigo:

	public List<AgendamentoSalaVO> getAgendamentosAtuaisSala() {
		List<AgendamentoSalaVO> todosAgendamentos = getAgendamentosSala();
		List<AgendamentoSalaVO> agendamentosAtuais = new ArrayList<AgendamentoSalaVO>();
		Calendar agora = Calendar.getInstance();

		for (AgendamentoSalaVO agendamento : todosAgendamentos) {
			Calendar fimReuniao = Calendar.getInstance();
			fimReuniao.setTime(agendamento.getData().getTime());
			fimReuniao.set(Calendar.HOUR_OF_DAY,
					Integer.parseInt(agendamento.getHoraFim()));
			fimReuniao.set(Calendar.MINUTE,
					Integer.parseInt(agendamento.getMinutoFim()));

			if (fimReuniao.after(agora)) {
				agendamentosAtuais.add(agendamento);
			}
		}
		
		return agendamentosAtuais;
	}

xhtml:

<ui:repeat value="#{salaDeReuniaoMBean.salasDeReuniaoAtuais}" var="salaDeReuniao">
	<tr style="height: 10px;">
		<td></td>
	</tr>
	<tr valign="top">
		<td align="center" valign="top" width="100%">
			<table  class="tableizer-table" style="font-weight: normal;color:#504444; width:97%;" id="tabRotina">
				<tr>
					<td colspan="4" style="background: #E6E6FA; color: #1C1C1C; font-weight: none; text-align:center; font-size:18px;"><h:outputText value="#{salaDeReuniao.nome} - #{salaDeReuniao.local}"/>
					</td>
				</tr>
				<h:panelGroup rendered="#{!salaDeReuniao.reuniaoAgendada}">
					<tr class="TrSubTituloSala">
						<td width="14%" class="TdConteudoSala">Data</td>
						<td width="26%" class="TdConteudoSala">Período</td>
						<td width="60%" class="TdConteudoSala">Assunto</td>
					</tr>
					<ui:repeat value="#{agendamentoSala.agendamentosAtuaisSala}" var="agendamentoSala">
						<tr class="TrConteudoSala">
							<td  class="TdConteudoSala">
				                <h:outputText value="#{agendamentoSala.data.time}">
				                    <f:convertDateTime timeZone="#{informacoesSistemaMBean.timeZone}"
				                        pattern="dd/MM" />
				                </h:outputText>
							</td>
							<td  class="TdConteudoSala">
								<h:outputText value="#{agendamentoSala.dataInicio} a #{agendamentoSala.dataFim}"/>
							</td>
							<td class="TdConteudoSala">
								<h:outputText value="#{agendamentoSala.assunto}"/>
							</td>
						</tr>
					</ui:repeat>
				</h:panelGroup>
				<h:panelGroup rendered="#{salaDeReuniao.reuniaoAgendada}">
					<tr class="TrConteudoSala">
						<td align="center" class="TdConteudoSala">
							<h:outputText value="Não há reuniões agendadas."/>
						</td>
					</tr>
				</h:panelGroup>
			</table>
		</td>
	</tr>
</ui:repeat>

eu costumo usar limit e offset pra isso no banco, e ele sempre trás a listagem adequada, e no caso cada página vc multiplica por 3 pra saber seu offset, e seu limit sempre é 3.

Da uma olhada nisso: http://www.guj.com.br/java/224063-richfaces-com-paginacao-sob-demanda-true-pagination