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 analisámos no início deste documento:

Quando o destino é o navegador de um telemóvel, precisamos de alterar o layout. De facto, o tamanho do ecrã de um smartphone deve ser tido em conta e a usabilidade das páginas redesenhada. 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 móvel será idêntica à anterior, exceto que, além do JSF e do PrimeFaces, utilizaremos a biblioteca PrimeFaces Mobile (PFM).

Iremos rever todos os conceitos abordados com o JSF e o PrimeFaces. Apenas a camada de [apresentação] (principalmente as páginas) irá mudar.

8.2. As vantagens do PrimeFaces Mobile

O site do PrimeFaces Mobile

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

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

Pode utilizar simuladores de smartphones para visualizar a aplicação de demonstração acima. Um deles está disponível para o iPhone 4 no URL [http://iphone4simulator.com/] [3]. Introduza o endereço da aplicação a testar em [4] e esta será apresentada com as dimensões do iPhone. Estes simuladores são úteis durante a fase de desenvolvimento, mas, em última análise, a aplicação deve ser testada em condições reais em vários dispositivos móveis.

8.3. Aprendendo o 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]

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

Pode descarregar o código-fonte dos exemplos [4]. Verificamos que a página PFM que apresenta os componentes [1], [2] e [3] acima é 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">
        <!-- Forms -->
        <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 namespace, 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. Este é um conceito que temos utilizado extensivamente nos nossos exemplos do PrimeFaces: uma única página com vários fragmentos que podem ser mostrados ou ocultados. Aqui, não teremos de fazer isso. Designaremos simplesmente a vista a apresentar, com as outras automaticamente ocultadas,
  • 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>
  

Repare na tag utilizada para criar um botão. O atributo href permite a navegação. O seu valor aqui é o nome de uma vista. Ao clicar no botão, será redirecionado (reverse=true) para a vista denominada main (não apresentada aqui).

  • linha 16: apresenta o conteúdo da vista,
  • linha 17: gera um campo de entrada:

                <p:inputText label="Input:" />
  
  • linha 18: um campo de entrada com um ícone específico:

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

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

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

  • linha 20: um campo de entrada de texto expansível e com várias linhas:

                <p:inputTextarea id="inputTextarea" label="Textarea:"/>
  
  • Linhas 21–29: um campo que combina 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 rótulo do componente na 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 de alternância:

                <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 conjunto 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 que a página utiliza tags das três bibliotecas: JSF, PF e PFM. Agora sabemos o suficiente para criar o nosso primeiro projeto PrimeFaces Mobile.

8.4. Um primeiro projeto PrimeFaces Mobile: mv-pfm-01

Vamos revisitar o exemplo estudado anteriormente para o integrar num projeto Maven. Isto permitir-nos-á explorar as dependências necessárias para um projeto PrimeFaces Mobile.

8.4.1. O projeto NetBeans

O projeto NetBeans é o seguinte:

O projeto NetBeans começa como um projeto web básico do Maven ao qual foram adicionadas as dependências [2]. Isto reflete-se no ficheiro [pom.xml] com o 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–16, a dependência do PrimeFaces Mobile. Aqui utilizámos a 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. Na verdade, deparei-me com bastantes problemas com o PFM, que é uma biblioteca inacabada. Durante algum tempo, houve uma versão 0.9.2 que apresentava erros. Desde então, foi removida. Regressámos à versão 0.9.1. O projeto PFM sofreu, assim, um retrocesso. Os testes também falharam com a versão 1.0-SNAPSHOT da próxima versão 1.0 (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">
 
    <!-- Main View -->
    <pm:view id="main">
      ...
    </pm:view>
 
    <!-- Forms -->
    <pm:view id="forms">
      ...
    </pm:view>
 
 
    <!-- Buttons -->
    <pm:view id="buttons">
      ...
    </pm:view>
 
    ...
  </pm:page>
</f:view>

Existe uma única página (linha 10) composta por doze vistas. Não entraremos em detalhes sobre elas aqui. O objetivo aqui é simplesmente mostrar como criar um projeto PrimeFaces Mobile.

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

A razão é que uma aplicação PrimeFaces Mobile deve ser chamada com o parâmetro [?javax.faces.RenderKitId=PRIMEFACES_MOBILE], conforme mostrado em [2]. Pode ignorar este parâmetro modificando 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].

Após a execução, obtemos a mesma página de antes, mas sem ter de incluir um parâmetro no URL [4]. Deixamos ao leitor a tarefa de testar esta aplicação. Descobrimos alguns erros: a tag <p:selectManyCheckbox> não é apresentada, tal como a tag <p:selectOneRadio>, e a tag <pm:range> não funciona. Estes problemas, que não existem no site de demonstração, sugerem que a demonstração não funciona com a combinação aqui utilizada do PrimeFaces Mobile 0.9.1 e do PrimeFaces 3.2. No entanto, serve como ponto de partida para explorar as tags desta biblioteca, que ainda se encontra em desenvolvimento.

Para obter uma renderização mais realista, pode testar a aplicação num simulador como o simulador do iPhone 4 [http://iphone4simulator.com/]. Obterá o seguinte:

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

8.5. Exemplo mv-pfm-02: Formulário e Modelo

Neste projeto, demonstramos as interações entre uma página do PrimeFaces Mobile e o seu modelo. Estas interações seguem as regras da estrutura JSF, na 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 enviado [2],
  • A Vista 2 [3] confirma os dados introduzidos e oferece a opção de voltar ao formulário [4].

O projeto demonstra duas coisas:

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

8.5.2. O projeto NetBeans

O projeto NetBeans é o seguinte:

  • em [1], a página do PrimeFaces Mobile,
  • 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

Fornecemos os ficheiros de configuração sem os explicar. São agora 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 móvel do Primefaces

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">
 
    <!-- forms view -->
    <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>
 
    <!-- info view -->
    <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>

Pegámos no exemplo de demonstração do site do PrimeFaces Mobile e modificámo-lo para que funcionasse:

  • a tag <p:selectManyCheckbox> não era exibida. 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 tag <pm:inputRange>, que exibe um controlo deslizante. Este controlo deslizante tem um bug: não é possível mover o cursor do controlo deslizante. No entanto, pode introduzir um número que o faça mover-se,
  • Note que existem poucas tags específicas do PFM (linhas 13, 14, 15, 19, 27 e 28 na primeira vista). As outras tags são tags padrão do JSF e do PF. O PrimeFaces Mobile baseia-se nestas duas estruturas.

Observe a 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">
 
    <!-- forms view -->
    <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>
 
    <!-- info view -->
    <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. Quando a página é exibida pela primeira vez, a primeira vista é mostrada. Em seguida, navega-se de uma vista para outra. Aqui, existem duas vistas: formulários na linha 13 e informações na linha 24,
  • linha 14: a tag header define o cabeçalho de uma vista,
  • linha 15: a tag content define o conteúdo de uma vista,
  • linha 16: a vista de formulários contém um formulário JSF,
  • linha 18: este formulário será enviado através de um botão padrão do PrimeFaces. O formulário será enviado para o modelo [Form] e processado pelo método [Form].validate. Este método fará o seu trabalho. Veremos que ele solicita a exibição da vista de informações. Antes disso, a vista terá sido atualizada através de uma chamada AJAX (atributo update),
  • linha 26: podemos alternar da vista de informações para a vista de formulários utilizando um botão. Repare no formato do atributo href [href="#forms?reverse=true"]. A notação #forms refere-se à vista de formulários. O parâmetro reverse=true solicita o regresso à página anterior. Retirei este atributo da demonstração. Quando o remove, não se nota qualquer diferença num simulador... Talvez haja alguma em smartphones reais,
  • por fim, repare na utilização da biblioteca PrimeFaces Mobile na linha 7.

Apesar de introduzir novas funcionalidades, esta página PFM é bastante simples. 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 {
  // model
 
  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() {
    // we move on to the news view
    return "pm:infos";
  }
 
  public String getManyCheckboxValue() {
    StringBuffer str = new StringBuffer("[");
    for (String checkbox : manyCheckbox) {
      str.append(checkbox);
    }
    str.append("]");
    return str.toString();
  }
 
  // getters and setters
  ...
}

Não há nada de novo aqui. Já vimos tudo isto antes. Repare, no entanto, na forma do método validate chamado pelo formulário. Linha 21: ele devolve uma string na forma «pm:viewname». Aqui, a vista de informações será apresentada. O método não faz nada além desta navegação. Anteriormente, os campos nas linhas 12–19 receberam os valores enviados. Estes serão utilizados para atualizar a vista de informações (atributo update abaixo):


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

A vista de informações exibirá então 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. Teste

Execute o projeto NetBeans. Assim que o projeto estiver implementado no Tomcat [1], pode 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 Wi-Fi:

Ligue o servidor à rede Wi-Fi. Pode então verificar o seu endereço IP:

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

 

No servidor, inicie 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 possam ver mutuamente. Em seguida, abra um navegador e introduza o URL [http://192.168.1.127:8080/mv-pfm-02/] [2]. Agora pode testar a aplicação. Ficará satisfeito ao descobrir 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. Conclusão

Abordá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

Importe os projetos Maven [1] para o Eclipse e execute-os [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 avarias no navegador do Eclipse. Quando carregada nos navegadores Firefox ou IE, estas avarias desapareceram.