JSF Parametros por Get Request RESTFull

Olá tudo bem?

Como utilizar passagem de parâmetros via URL utilizando JSF? Creio que será o menor post aqui do blog, pois é muito simples.

Ao final do post você irá encontrar o link para download do código de hoje.

Os outros posts sobre JSF são: JSF Exemplos Simples com AjaxJSF Exibindo Objeto e Mensagens após Redirect, Validação de Login de Usuário com JSF e JAASJSF: Converter and Bean AutoCompleteJSF – Hello World, AutoComplete, Tratando Exceções em uma Aplicação Web, Autenticação de Usuários (Filter/Servlet), Criando um WebServer..

Veja como é simples o código para receber parâmetros via URL no JSF 2.0:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core">
<h:head>
	<f:metadata>
		<f:viewParam name="email" value="#{user.email}" />
		<f:viewParam name="name" value="#{user.name}" />
	</f:metadata>
</h:head>
<h:body>
	<h:form>
		Your email is: #{user.email} <br/>
		Your name is: #{user.name} <br/>
		Your name and email from MB: #{user.nameAndEmail} <br/>
	</h:form>
</h:body>
</html>
package demo;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

/**
 * Created by JBoss Tools
 */
@ManagedBean(name = "user")
@RequestScoped
public class User {

	private String email;
	private String name;

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getNameAndEmail(){
		return email + " " + name;
	}
}

A URL utilizada foi: http://localhost:8080/RequestParameter/values.xhtml?email=Read+Romans&name=Chapter10+Ver+09.

Como você pode ver a página espera dois parâmetros e existe um método que utiliza os dois parâmetros; seria o método em que você iria disparar a consulta no banco de dados ou qualquer outra ação necessária.

E como criar um link para o usuário navegar? Fácil, olhe e página abaixo:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core">
<h:head>

</h:head>
<h:body>
	<h:form>
		01) A pre-formed link: <br/>
		<h:link outcome="values?email=Read Romans&amp;name=Chapter10 Ver 09" value="Let us go!" />
		<br/>
		<br/>
		02)Link with the f:param component<br/>
		<h:link outcome="values" value="Write all params and let us go!" >
			<f:param name="email" value="Read Romans" />
			<f:param name="name" value="Chapter10 Ver 09" />
		</h:link>
		<br/>
		<br/>
		03) <h:commandLink value="Redirect Me!" action="values?faces-redirect=true&amp;email=Read Romans&amp;name=Chapter10 Ver 09" />
	</h:form>
</h:body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core">
<h:head>
	<f:metadata>
		<f:viewParam name="email" value="#{user.email}" />
		<f:viewParam name="name" value="#{user.name}" />
	</f:metadata>
</h:head>
<h:body>
	<h:form>
		Your email is: #{user.email} <br/>
		Your name is: #{user.name} <br/>
		Your name and email from MB: #{user.nameAndEmail} <br/>

		04) <h:link outcome="values" value="Get everybody and leave this place" includeViewParams="true" />
	</h:form>
</h:body>
</html>

Vou comentar agora sobre cada abordagem utilizada na criação do link (de acordo com a numeração utilizada no código fonte “01,02…”):

  • 01)  Foi um link já formado onde todos os parâmetros estão escritos.
  • 02)  Utilizamos o componente “f:param” que acaba por deixar mais legível o código.
  • 03)  A navegação é feita através de um redirect e utilizando o commandLink. ATENÇÃO: até o dia de hoje, ainda não é possível utilizar o componente “f:param” junto com um redirect. Por isso que escrevi a URL toda de uma vez com o redirect no link. “<h:commandLink action=”values?faces-redirect=true.
  • 04) Com esse modo de link, com a opção (includeViewParams=”true”), você irá levar automaticamente todos os “f:viewParam” presentes na tela. Você nem irá precisar escrever os parâmetros progamaticamente. O JSF irá automaticamente pegar todos os parâmetros para você.

Você pode adicionar parâmetros de navegação após um redirect utilizando a faces-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">
	<navigation-rule>
		<navigation-case>
			<from-outcome>redirectMe</from-outcome>
			<to-view-id>/myPage.xhtml</to-view-id>
			<redirect include-view-params="true">
				<view-param>
					<name>calculatedValue</name>
					<value>#{myBean.value}</value>
				</view-param>
			</redirect>
		</navigation-case>
	</navigation-rule>
</faces-config>

O código de hoje funciona com os componentes “<h:link />” e “<h:commandLink />” ambos podendo ser utilizados com ou sem a opção redirect.

Lembro também que seu link pode ser escrito em seu ManagedBean e seu valor acessado por #{meuMB.createTheURL} nos componentes link/commandLink.

Click aqui para fazer o download do código do post de hoje.

Espero que esse post possa te ajudar.

Qualquer dúvida/pergunta/colocação basta postar.

Até a próxima pessoal.

12 thoughts on “JSF Parametros por Get Request RESTFull

  1. Conheci o site hoje, e estou achando os posts muito bons, mesmo este sendo uma dica simples, é muito util para quem nao sabe, parabens cara e até mais, abraços!

  2. Que pena. Aqui ainda usamos o 1.2 e Seam 2.2 e estou fazendo uma função genérica para gerar JSon com @WebRemote, mas precisava passar o remotingInterface.js o @name dinamicamente…..

    Para fazer os getUrl usei javascript mas como o seam ja precisa estar carregado para fazer tal manobra, não consegui com exito….
    ——————–
    Será que há outra forma de fazer isso sem depender diretamente de um xhtml?

    Isso tudo para resolver isso aqui… :(

    http://www.guj.com.br/java/285003-jboss-seam–json—exibir-json-na-pagina

    e mesmo assim não está 100%
    ———————
    Solucionei criando uma classe com scope aplication e fiz um método para pegar o parametro do contexto..

      • Desculpe-me, mas expressei de forma equívoca.
        Meu cenário é o seguinte:

        Tenho uma aplicação na intranet da empresa em asp. No entanto, desenvolvi alguns relatórios utilizando JSF e há um link na intranet para a página onde está os relatórios. Nesta comunicação de um sistema para a pagina de relatórios, preciso enviar o código de usuário e senha para verificar a permissão de acesso.

        Agora sim, neste cenário, é possível uma comunicação via post ou de alguma forma que eu ‘esconda’ os parâmetros da URL?

          • Max, boa tarde.

            Nesse caso você poderia realizar chamadas posts normais, código java sem a necessidade da requisição sair de um ambiente JSF.

            Na internet você encontra bastante material com esse assunto.

            Até mais. [=

Leave a Comment