Skip to content

8. Introdução ao PrimeFaces Mobile

8.1. O papel do Primefaces Mobile numa aplicação JSF

Voltemos à arquitetura de uma aplicação Primefaces, tal como a estudámos no início deste documento:

Quando o destino é o navegador de um telemóvel, temos de alterar a apresentação. Com efeito, é necessário ter em conta o tamanho do ecrã de um smartphone e repensar a ergonomia das páginas. Existem bibliotecas especializadas na criação de páginas web para dispositivos móveis. É o caso da biblioteca Primefaces Mobile, que, por sua vez, se baseia na biblioteca JQuery Mobile.

A arquitetura de uma aplicação web para dispositivos móveis será idêntica à anterior, com a diferença de que, além da JSF e da Primefaces, utilizaremos a biblioteca Primefaces Mobile (PFM).

Vamos retomar todos os conceitos estudados com o JSF e o Primefaces. Apenas a camada [présentation] (principalmente as páginas) irá mudar.

8.2. As novidades do Primefaces Mobile

O site do Primefaces Mobile

[http://www.primefaces.org/showcase-labs/mobile/showcase.jsf?javax.faces.RenderKitId=PRIMEFACES_MOBILE]

apresenta a lista de componentes que podem ser utilizados numa página PFM [1, 2]:

É possível utilizar simuladores de smartphone para visualizar a aplicação de demonstração acima. Um deles está disponível para o iPhone 4 em URL [http://iphone4simulator.com/] [3]. Basta introduzir o endereço da aplicação a testar em [4] e esta é apresentada com as dimensões do iPhone. Estes simuladores são úteis na fase de desenvolvimento, mas, no final, a aplicação deve ser testada em condições reais em diferentes telemóveis.

8.3. Aprendizagem do PrimeFaces Mobile

O PrimeFaces Mobile oferece muito menos componentes do que o PrimeFaces. O site do PrimeFaces Mobile

[http://www.primefaces.org/showcase-labs/mobile/showcase.jsf?javax.faces.RenderKitId=PRIMEFACES_MOBILE]

apresenta a lista. Aqui estão, por exemplo, os componentes que podem ser utilizados num formulário [1], [2], [3]:

É possível descarregar o código-fonte dos exemplos [4]. Assim, descobrimos que a página PFM, que apresenta os componentes [1], [2] e [3] acima referidos, é a seguinte:


<?xml version="1.0" encoding="windows-1250"?>
<f:view xmlns="http://www.w3.org/1999/xhtml"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:p="http://primefaces.org/ui"
        xmlns:pm="http://primefaces.org/mobile"
        contentType="text/html">

    <pm:page title="Components">
        <!-- Formulários -->
        <pm:view id="forms">
            <pm:header title="Forms">
                <f:facet name="left"><p:button value="Back" icon="back" href="#main?reverse=true"/></f:facet>
            </pm:header>
            <pm:content>
                <p:inputText label="Input:" />   
                <p:inputText label="Search:" type="search"/>
                <p:inputText label="Phone:" type="tel"/>
                <p:inputTextarea id="inputTextarea" label="Textarea:"/>
                <pm:field>
                    <h:outputLabel for="selectOneMenu" value="Dropdown: "/>
                    <h:selectOneMenu id="selectOneMenu">
                        <f:selectItem itemLabel="Select One" itemValue="" />
                        <f:selectItem itemLabel="Option 1" itemValue="Option 1" />
                        <f:selectItem itemLabel="Option 2" itemValue="Option 2" />
                        <f:selectItem itemLabel="Option 3" itemValue="Option 3" />
                    </h:selectOneMenu>
                </pm:field>
                <pm:inputRange id="range" minValue="0" maxValue="100" label="Range:" />
                <pm:switch id="switch" onLabel="yes" offLabel="no" label="Switch:" />
                <p:selectBooleanCheckbox id="booleanCheckbox" value="false" itemLabel="I agree" label="Checkbox"/>
                <p:selectManyCheckbox id="checkbox" label="Checkboxes: ">
                    <f:selectItem itemLabel="Option 1" itemValue="Option 1" />
                    <f:selectItem itemLabel="Option 2" itemValue="Option 2" />
                    <f:selectItem itemLabel="Option 3" itemValue="Option 3" />
                </p:selectManyCheckbox>
                <p:selectOneRadio id="radio" label="Radios: ">
                    <f:selectItem itemLabel="Option 1" itemValue="Option 1" />
                    <f:selectItem itemLabel="Option 2" itemValue="Option 2" />
                    <f:selectItem itemLabel="Option 3" itemValue="Option 3" />
                </p:selectOneRadio>
            </pm:content>
        </pm:view>
    </pm:page>
</f:view>
  • linha 7: surge um novo espaço de nomes, o dos componentes PrimeFaces Mobile com o prefixo «pm»,
  • linha 10: define uma página. Uma página será composta por várias vistas (linha 12). Apenas uma vista é visível de cada vez. Encontramos aqui um conceito que utilizámos amplamente nos nossos exemplos do Primefaces: uma única página com vários fragmentos que podemos mostrar ou ocultar. Aqui, não teremos de fazer isso. Iremos simplesmente indicar a vista a exibir, ficando as outras automaticamente ocultas,
  • linha 12: uma vista,
  • linhas 13-15: definem o cabeçalho da vista:


<pm:header title="Forms">
    <f:facet name="left"><p:button value="Back" icon="back" href="#main?reverse=true"/></f:facet>
</pm:header>
  

Note-se a baliza para gerar um botão. O atributo href permite navegar. O seu valor aqui é o nome de uma vista. Um clique no botão irá redirecionar (reverse=true) para a vista denominada «main» (não representada aqui).

  • linha 16: introduz o conteúdo da vista,
  • linha 17: gera um campo de introdução de dados:

                <p:inputText label="Input:" />
  
  • linha 18: um campo de introdução de dados com um ícone específico:

                <p:inputText label="Search:" type="search"/>
  
  • linha 19: um campo de introdução para um número de telefone:

                <p:inputText label="Phone:" type="tel"/>
  

O atributo «type» de uma baliza <inputText> tem um significado: determina o tipo de teclado apresentado ao utilizador para efetuar a introdução de dados. Assim, para «type='tel'», será apresentado um teclado numérico,

  • linha 20: uma área de introdução de texto com várias linhas e extensível:

                <p:inputTextarea id="inputTextarea" label="Textarea:"/>
  
  • linhas 21-29: um campo que reúne vários componentes:

                <pm:field>
                    <h:outputLabel for="selectOneMenu" value="Dropdown: "/>
                    <h:selectOneMenu id="selectOneMenu">
                        <f:selectItem itemLabel="Select One" itemValue="" />
                        <f:selectItem itemLabel="Option 1" itemValue="Option 1" />
                        <f:selectItem itemLabel="Option 2" itemValue="Option 2" />
                        <f:selectItem itemLabel="Option 3" itemValue="Option 3" />
                    </h:selectOneMenu>
</pm:field>
 
  • linha 2: o texto descritivo do componente da linha 3;
  • linha 3: uma lista suspensa;
  • linhas 4-7: o seu conteúdo,
  • linha 30: um controlo deslizante:

                <pm:inputRange id="range" minValue="0" maxValue="100" label="Range:" />
  
  • linha 31: um botão com dois valores:

                <pm:switch id="switch" onLabel="yes" offLabel="no" label="Switch:" />
 
  • linha 32: uma caixa de seleção:

      <p:selectBooleanCheckbox id="booleanCheckbox" value="false" itemLabel="I agree" label="Checkbox"/>
  
  • linhas 33-37: um grupo de caixas de seleção:

                  <p:selectManyCheckbox id="checkbox" label="Checkboxes: ">
                    <f:selectItem itemLabel="Option 1" itemValue="Option 1" />
                    <f:selectItem itemLabel="Option 2" itemValue="Option 2" />
                    <f:selectItem itemLabel="Option 3" itemValue="Option 3" />
                </p:selectManyCheckbox>
  
  • linhas 38-42: um grupo de botões de opção

                    <p:selectOneRadio id="radio" label="Radios: ">
                    <f:selectItem itemLabel="Option 1" itemValue="Option 1" />
                    <f:selectItem itemLabel="Option 2" itemValue="Option 2" />
                    <f:selectItem itemLabel="Option 3" itemValue="Option 3" />
                </p:selectOneRadio>
  

Note-se que a página utiliza tags das três bibliotecas JSF, PF e PFM. Já sabemos o suficiente para criar o nosso primeiro projeto PrimeFaces para dispositivos móveis.

8.4. Um primeiro projeto Primefaces para dispositivos móveis: mv-pfm-01

Vamos retomar o exemplo analisado anteriormente para o integrar num projeto Maven. Assim, iremos descobrir as dependências necessárias para um projeto Primefaces para dispositivos móveis.

8.4.1. O projeto NetBeans

O projeto NetBeans é o seguinte:

O projeto NetBeans é, inicialmente, um projeto web básico do Maven ao qual foram adicionadas as dependências [2]. Isto traduz-se no ficheiro [pom.xml] pelo seguinte código:


<dependency>
      <groupId>com.sun.faces</groupId>
      <artifactId>jsf-impl</artifactId>
      <version>2.1.8</version>
    </dependency>
    <dependency>
      <groupId>org.primefaces</groupId>
      <artifactId>primefaces</artifactId>
      <version>3.2</version>
    </dependency>
    <dependency>
      <groupId>org.primefaces</groupId>
      <artifactId>mobile</artifactId>
      <version>0.9.1</version>
      <type>jar</type>
    </dependency>
  </dependencies>
  <repositories>
    <repository>
      <url>http://download.java.net/maven/2/</url>
      <id>jsf20</id>
      <layout>default</layout>
      <name>Repository for library Library[jsf20]</name>
    </repository>
    <repository>
      <url>http://repository.primefaces.org/</url>
      <id>primefaces</id>
      <layout>default</layout>
      <name>Repository for library Library[primefaces]</name>
    </repository>
  </repositories>

Nas linhas 11 a 16, encontra-se a dependência do Primefaces Mobile. Optámos aqui pela versão 0.9.1 (linha 14). Além disso, utilizámos a versão 3.2 do Primefaces (linha 9). Estes números de versão são importantes. De facto, deparei-me com bastantes problemas com o PFM, que é uma biblioteca não finalizada. Assim, existiu durante algum tempo uma versão 0.9.2 que apresentava erros. Esta foi entretanto retirada. Voltámos à versão 0.9.1. O projeto PFM sofreu, portanto, um retrocesso. Os testes também falharam com a versão 1.0-SNAPSHOT da versão 1.0 em desenvolvimento (início de junho de 2012).

A página inicial [index.xhtml] [1] é a página de demonstração dos componentes PrimeFaces Mobile:


<?xml version="1.0" encoding="windows-1250"?>
<f:view xmlns="http://www.w3.org/1999/xhtml"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:p="http://primefaces.org/ui"
        xmlns:pm="http://primefaces.org/mobile"
        contentType="text/html">

  <pm:page title="Components">

    <!-- Vista principal -->
    <pm:view id="main">
      ...
    </pm:view>

    <!-- Formulários -->
    <pm:view id="forms">
      ...
    </pm:view>


    <!-- Botões -->
    <pm:view id="buttons">
      ...
    </pm:view>

    ...
  </pm:page>
</f:view>

Existe uma única página (linha 10) composta por doze vistas. Não iremos detalhá-las. O objetivo aqui é simplesmente mostrar como construir um projeto PrimeFaces Mobile.

Vamos executar este projeto. Obtemos uma página de erro [1]:

A razão para isso é que uma aplicação Primefaces para dispositivos móveis deve ser chamada com o parâmetro [?javax.faces.RenderKitId=PRIMEFACES_MOBILE], tal como em [2]. É possível dispensar este parâmetro alterando o ficheiro [faces-config.xml] (ou criando-o, caso não exista, como neste caso) [3]:

O seu conteúdo é o seguinte:


<?xml version='1.0' encoding='UTF-8'?>

<!-- =========== FULL CONFIGURATION FILE ================================== -->

<faces-config version="2.0"
              xmlns="http://java.sun.com/xml/ns/javaee" 
              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">

  <application>
    <default-render-kit-id>PRIMEFACES_MOBILE</default-render-kit-id>
  </application>
</faces-config>
  • linha 11: define o valor do parâmetro [javax.faces.RenderKitId].

Ao executar, obtém-se a mesma página que anteriormente, mas sem ter de definir o parâmetro URL [4]. Deixamos ao leitor a tarefa de testar esta aplicação. Descobrem-se alguns erros: a baliza <p:selectManyCheckbox> não é apresentada, o mesmo acontece com a baliza <p:selectOneRadio> e a baliza <pm:range> não funciona. Estas falhas, que não existem no site de demonstração, levam a crer que a aplicação não funciona com a combinação aqui utilizada do PrimeFaces Mobile 0.9.1 com o PrimeFaces 3.2. No entanto, trata-se de um ponto de partida para explorar as tags desta biblioteca ainda em desenvolvimento.

Para obter um resultado mais realista, podemos testar a aplicação num simulador como o do iPhone 4 [http://iphone4simulator.com/]. Obtemos o seguinte:

Introduzimos [5], o mesmo URL utilizado pelo navegador anterior em [4].

8.5. Exemplo mv-pfm-02: formulário e modelo

Neste projeto, mostramos as interações entre uma página do Primefaces Mobile e o seu modelo. Estas interações seguem as regras do framework JSF, no qual o Primefaces Mobile se baseia.

8.5.1. As vistas

Existem duas vistas no projeto

  • a vista 1, [1], apresenta um formulário que pode ser validado em [2],
  • a vista 2, [3], confirma os dados introduzidos e oferece a possibilidade de regressar ao formulário [4].

O projeto mostra duas coisas:

  • a relação entre uma página e o seu modelo,
  • a navegação entre as vistas da página.

8.5.2. O projeto NetBeans

O projeto NetBeans é o seguinte:

  • em [1], a página PrimeFaces para dispositivos móveis,
  • em [2], o seu modelo
  • em [3], os ficheiros de mensagens, uma vez que a aplicação está internacionalizada,
  • em [4], as dependências do projeto.

8.5.3. Configuração do projeto

Apresentamos os ficheiros de configuração sem os explicar. Atualmente, são já padrão.

[web.xml]: configura a aplicação web:


<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" 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-app_3_0.xsd">
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>
</web-app>

[faces-config.xml]: configura a aplicação JSF:


<?xml version='1.0' encoding='UTF-8'?>

<!-- =========== FULL CONFIGURATION FILE ================================== -->

<faces-config version="2.0"
              xmlns="http://java.sun.com/xml/ns/javaee" 
              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">

  <application>
    <resource-bundle>
      <base-name>
        messages
      </base-name>
      <var>msg</var>
    </resource-bundle>
    <message-bundle>messages</message-bundle>
    <default-render-kit-id>PRIMEFACES_MOBILE</default-render-kit-id>
  </application>
</faces-config>

[messages_fr.properties]: o ficheiro de mensagens em francês:


forms=Formulaire
input=Saisie de texte
textarea=Saisie multi-lignes
dropdown=Liste d\u00e9roulante
range=Slider
switch=Switch
checkbox=Case \u00e0 cocher
checkboxes=Cases \u00e0 cocher
radios=Boutons radio
valider=Valider
confirmations=Confirmations
back=Retour

8.5.4. A página Primefaces Mobile

A página [index.xhtml] é a seguinte:


<?xml version="1.0" encoding='UTF-8'?>
<f:view xmlns="http://www.w3.org/1999/xhtml"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:p="http://primefaces.org/ui"
        xmlns:pm="http://primefaces.org/mobile"
        contentType="text/html">

  <pm:page title="mv-pfm-02">

    <!-- visualização do Forms -->
    <pm:view id="forms" swatch="b">
      <pm:header title="#{msg['forms']}"/>
      <pm:content>
        <h:form id="formulaire">
          <p:inputText id="inputText" label="#{msg['input']}" value="#{form.inputText}"/>
          <p:inputTextarea id="inputTextArea" label="#{msg['textarea']}" value="#{form.inputTextArea}"/>
          <pm:field>
            <h:outputLabel for="selectOneMenu" value="#{msg['dropdown']}"/>
            <h:selectOneMenu id="selectOneMenu" value="#{form.selectOneMenu}">
              <f:selectItem itemLabel="Option 1" itemValue="1" />
              <f:selectItem itemLabel="Option 2" itemValue="2" />
              <f:selectItem itemLabel="Option 3" itemValue="3" />
            </h:selectOneMenu>
          </pm:field>
          <pm:inputRange id="range" minValue="0" maxValue="100" label="#{msg['range']}" value="#{form.range}"/>
          <pm:switch id="switch" onLabel="yes" offLabel="no" label="#{msg['switch']}" value="#{form.bswitch}"/>
          <p:selectBooleanCheckbox id="booleanCheckbox" itemLabel="I agree" label="#{msg['checkbox']}" value="#{form.booleanCheckbox}"/>
          <pm:field>
            <h:outputLabel for="manyCheckbox" value="#{msg['checkboxes']}"/>
            <h:selectManyCheckbox id="manyCheckbox" value="#{form.manyCheckbox}">
              <f:selectItem itemLabel="Option 1" itemValue="1" />
              <f:selectItem itemLabel="Option 2" itemValue="2" />
              <f:selectItem itemLabel="Option 3" itemValue="3" />
            </h:selectManyCheckbox>
          </pm:field>
          <pm:field>
            <h:outputLabel for="radio" value="#{msg['radios']}"/>
            <h:selectOneRadio id="radio" value="#{form.radio}">
              <f:selectItem itemLabel="Option 1" itemValue="1" />
              <f:selectItem itemLabel="Option 2" itemValue="2" />
              <f:selectItem itemLabel="Option 3" itemValue="3" />
            </h:selectOneRadio>
          </pm:field>
          <p:commandButton inline="true" value="#{msg['valider']}" update=":infos" action="#{form.valider}"/>
        </h:form>
      </pm:content>
    </pm:view>

    <!-- vista de informações -->
    <pm:view id="infos" swatch="b">
      <pm:header title="#{msg['confirmations']}">
        <f:facet name="left"><p:button value="#{msg['back']}" icon="back" href="#forms?reverse=true"/></f:facet>
      </pm:header>
      <pm:content>
        <ul>
          <li>#{msg['input']} : ${form.inputText}</li>
          <li>#{msg['textarea']} : ${form.inputTextArea}</li>
          <li>#{msg['dropdown']} : ${form.selectOneMenu}</li>
          <li>#{msg['range']} : ${form.range}</li>
          <li>#{msg['switch']} : ${form.bswitch}</li>
          <li>#{msg['checkbox']} : ${form.booleanCheckbox}</li>
          <li>#{msg['checkboxes']} : ${form.manyCheckboxValue}</li>
          <li>#{msg['radios']} : ${form.radio}</li>
        </ul>
      </pm:content>
    </pm:view>
  </pm:page>
</f:view>

Retomámos o exemplo de demonstração do site do Primefaces Mobile, adaptando-o para que funcionasse:

  • a tag <p:selectManyCheckbox> não era apresentada. Substituímo-la por uma tag <h:selectManyCheckbox> (linha 32),
  • a tag <p:selectOneRadio> não era exibida. Substituímo-la por uma tag <p:selectOneRadio> (linha 40),
  • linha 27: mantivemos a baliza <pm:inputRange>, que exibe um controlo deslizante. Este apresenta um erro: não é possível deslocar o cursor do controlo deslizante. No entanto, é possível introduzir um número que o faz mover-se,
  • note-se que existem poucas balizas específicas do PFM (linhas 13, 14, 15, 19, 27, 28 na primeira vista). As restantes balizas são balizas clássicas do JSF e do PF. O PrimeFaces Mobile baseia-se nestes dois frameworks.

Repare na estrutura da página:


<?xml version="1.0" encoding='UTF-8'?>
<f:view xmlns="http://www.w3.org/1999/xhtml"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:p="http://primefaces.org/ui"
        xmlns:pm="http://primefaces.org/mobile"
        contentType="text/html">

  <pm:page title="mv-pfm-02">

    <!-- visualização do Forms -->
    <pm:view id="forms" swatch="b">
      <pm:header ...>
      <pm:content>
        <h:form id="formulaire">
          ...
          <p:commandButton inline="true" value="#{msg['valider']}" update=":infos" action="#{form.valider}"/>
        </h:form>
      </pm:content>
    </pm:view>

    <!-- vista de informações -->
    <pm:view id="infos" swatch="b">
      <pm:header title="#{msg['confirmations']}">
        <f:facet name="left"><p:button value="#{msg['back']}" icon="back" href="#forms?reverse=true"/></f:facet>
      </pm:header>
      <pm:content>
        ...
      </pm:content>
    </pm:view>
  </pm:page>
</f:view>
  • linha 10: define uma página PFM. O atributo title define o título exibido pelo navegador;
  • uma página é composta por uma ou mais vistas. Na primeira visualização da página, é a primeira vista que é apresentada. Posteriormente, passa-se de uma vista para outra através da navegação. Aqui existem duas vistas: «forms» na linha 13 e «infos» na linha 24,
  • linha 14: a baliza header define o cabeçalho de uma vista,
  • linha 15: a baliza «content» define o conteúdo de uma vista,
  • linha 16: a vista «forms» contém um formulário JSF,
  • linha 18: este formulário será validado por um botão clássico do Primefaces. O formulário será enviado para o modelo [Form] e será processado pelo método [Form].valider. Este método executará a sua função. Veremos que este método solicita a exibição da vista «infos». Anteriormente, esta vista terá sido atualizada pela chamada AJAX (atributo «update»),
  • linha 26: será possível passar da vista «infos» para a vista «forms» através de um botão. Repare-se na forma do atributo href [href="#forms?reverse=true"]. A notação #forms designa a vista «forms». O parâmetro reverse=true solicita um retorno à vista anterior. Retirei este atributo da demonstração. Quando o removemos, não se nota qualquer diferença num simulador... Talvez haja alguma diferença em smartphones reais,
  • por fim, note-se a utilização da biblioteca Primefaces Mobile na linha 7.

Embora traga novidades, esta página PFM é perfeitamente compreensível. O mesmo se aplica ao seu modelo [Form.java].

8.5.5. O modelo [Form.java]

Este modelo é o seguinte:


package beans;

import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class Form implements Serializable {
  // modelo

  private String inputText = "bonjour";
  private String inputTextArea = "ligne1\nligne2";
  private String selectOneMenu = "2";
  private int range = 4;
  private boolean bswitch = true;
  private boolean booleanCheckbox = false;
  private String[] manyCheckbox = {"1", "3"};
  private String radio = "3";

  public String valider() {
    // passa-se para a vista de informações
    return "pm:infos";
  }

  public String getManyCheckboxValue() {
    StringBuffer str = new StringBuffer("[");
    for (String checkbox : manyCheckbox) {
      str.append(checkbox);
    }
    str.append("]");
    return str.toString();
  }

  // getters e setters
  ...
}

Não há aqui nada de novo. Já vimos tudo isto antes. No entanto, é de salientar a forma do método «valider» chamado pelo formulário. Linha 21: devolve uma cadeia de caracteres com o formato «pm:nomedavistaparaexibir». Neste caso, será exibida a vista «infos». O método não faz mais nada além desta navegação. Anteriormente, os campos das linhas 12 a 19 receberam os valores enviados. Estes servirão para atualizar a vista «infos» (atributo «update» abaixo):


<p:commandButton inline="true" value="#{msg['valider']}" update=":infos" action="#{form.valider}"/>

A vista «infos» irá então apresentar os valores enviados:

  

<pm:view id="infos" swatch="b">
      <pm:header title="#{msg['confirmations']}">
        <f:facet name="left"><p:button value="#{msg['back']}" icon="back" href="#forms"/></f:facet>
      </pm:header>
      <pm:content>
        <ul>
          <li>#{msg['input']} : ${form.inputText}</li>
          <li>#{msg['textarea']} : ${form.inputTextArea}</li>
          <li>#{msg['dropdown']} : ${form.selectOneMenu}</li>
          <li>#{msg['range']} : ${form.range}</li>
          <li>#{msg['switch']} : ${form.bswitch}</li>
          <li>#{msg['checkbox']} : ${form.booleanCheckbox}</li>
          <li>#{msg['checkboxes']} : ${form.manyCheckboxValue}</li>
          <li>#{msg['radios']} : ${form.radio}</li>
        </ul>
      </pm:content>
    </pm:view>

8.5.6. es de teste

Executa-se o projeto NetBeans. Depois de o projeto ter sido implementado no Tomcat [1], é possível testá-lo num simulador [http://iphone4simulator.com/] [2]:

Vamos agora mostrar como testá-lo num smartphone real. Vamos ligar o servidor que aloja a aplicação e o smartphone à mesma rede WIFI:

Ligamos o servidor à rede Wi-Fi. Podemos, em seguida, verificar o seu endereço IP:

Anote-se acima o endereço IP do servidor: 192.168.1.127. Desative-se quaisquer firewalls e antivírus do servidor:

 

No servidor, iniciamos a aplicação [mv-pfm-02] no NetBeans [1]:

Ligue o smartphone à mesma rede Wi-Fi que o servidor, para que os dois dispositivos se reconheçam. Em seguida, abra um navegador e aceda a URL [http://192.168.1.127:8080/mv-pfm-02/] [2]. Depois, pode testar a aplicação. Descobriremos assim, com satisfação, que o controlo deslizante que não funciona no simulador funciona no smartphone. Existe, portanto, uma discrepância entre os simuladores e os dispositivos reais.

8.6. Conclusion

Apresentámos apenas as tags de formulário da biblioteca Primefaces Mobile, mas isso é suficiente para a nossa aplicação de exemplo.

8.7. Testes com o Eclipse

Importamos para o Eclipse os projetos Maven [1] e executamo-los [2],

no servidor Tomcat [3]. A aplicação em execução aparece então no navegador interno do Eclipse [4].

Note-se que a aplicação [mv-pfm-02] apresentou falhas no navegador do Eclipse. Se a carregarmos nos navegadores Firefox ou IE, essas falhas desapareceram.