Jboss Seam – Getting started: Page Actions!
Marcos Sousa | March 1, 2008Um dos grandes problemas que os desenvolvedores JSF tem é lidar basicamente com 2 situações relacionadas com GET: Passar parâmetros e executar ações via GET. Vou dar dois exemplos clássicos:
1° – Você tem um sistema de cadastro de notícias. Dentro deste sistema você tem uma página que faz a listagem das notícias cadastradas. Para listar estas notícias cadastradas assim que carregasse a página você tinha duas saídas: uma seria fazer o controle no método get de seu datatable:
- No Managed Bean
private List<News> newsList;
...
public List<News> getNewList() {
if (newsList == null) {
newsList = myService.listNews();
}
return newsList;
}
Na página seria algo:
<h:dataTable value="#{newBean.newsList}">
<!-- colunas da tabela -->
</h:dataTable>
A outra forma você teria que criar a ação de listagem e para acessar a página você teria que chamar a página de um componente jsf: um menu ou um botão que fizesse uma requisição post invocando a ação.
Usando o recurso de Page Actions do Jboss Seam você não precisa mais usar estas “soluções alternativas” para executar ações e passar parâmetros para um Managed Bean via GET. Dentro de seu projeto o Seam irá reconhecer todos arquivos xml que sigam o padrão: *.page.xml ou o arquivo pages.xml dentro da pasta WEB-INF. Veja um exemplo do arquivo:
<?xml version="1.0" encoding="UTF-8"?>
<pages xmlns="http://jboss.com/products/seam/pages"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jboss.com/products/seam/pages
http://jboss.com/products/seam/pages-2.0.xsd">
<page view-id="/news/list.xhtml"
action="#{newsBean.listNews}"
conversation-required="false"/>
<page view-id="/news/EditNews.xhtml">
<param name="newsId" value="#{newsBean.news.newsId}"/>
<action execute="#{newsBean.loadNewsById(newsBean.news.newsId)}"
if="#{newsBean.news.newsId != null}"/>
</page>
</pages>
O código acima chama a ação JSF listNews antes de renderizar a página /news/list.jsf, que pode ser chamada via GET ou POST. O mesmo acontece para a edição de notícias /news/EditNews.jsf?newsId=9. Primeiro será vinculado o valor do parâmetro newsId com propriedade newsBean.news.newsId e após será chamada a ação loadNewsById que carrega a notícia recebendo como parâmetro o identificador da notícia.
Sem dúvida nenhuma o recurso de Page Actions é bem legal para se trabalhar com JSF. Vale a pena usar! Em breve mostrarei mais dicas de Page Actions!






Olá,
Tenho uma duvida em relação a page.xml… Como ficaria se usasse um commandLink com um outcome no action=”alterar”
e através do *.page.xml enviar um objeto anotado com @DataModelSelection, para uma pagina “alterar.xhtml” ??
Esse exemplo seria para que, ao clicar em uma linha no datatable, redirecionasse para um pagina alterar.xhtml com o objeto daquela linha selecionada.
Grato
Olá Matt,
bom há duas formas de você fazer esta edição:
Primeira usando @DataModel e @DataModelSelection, e commandlink/commandbutton que injeta o objeto corespondente a linha selecionanda antes de executar a ação.
A segunda é usando um s:link/h:outputlink e s:button passando o identificador como parâmetro e recuperando o parâmetro via page action.
Como eu faço para configurar um projeto SEAM para funcionar apenas com chamadas POST ao invés de GET?
Desde já agradeço,
Daniel
Olá Daneiel,
É bem simples, basta você não usar os recursos de page actions, que o JSF já é só POST por padrão. Se desejar só controle navegação e o escopo de conversação.
Opa Marcos! Acho que me deparei com um bug relacionado a page actions. Configurei o mapeamento do servlet faces para “/faces/*” ao invés de “*.seam”. O seam não interpreta os arquivos no formato (View ID).page.xml, interpretando somente o pages.xml dentro do WEB-INF. Já fez esse teste?
Oi Robert,
Eu nunca tinha visto este problema, vou até olhar! Valeu