Um 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!
April 8th, 2008 at 2:36 pm
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
April 8th, 2008 at 5:49 pm
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.
November 19th, 2008 at 5:50 pm
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
November 20th, 2008 at 7:27 am
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.