8. PrimeFaces Mobile 简介
8.1. PrimeFaces Mobile在JSF应用程序中的作用
让我们回到本文开头所探讨的 PrimeFaces 应用程序架构:
![]() |
当目标是手机浏览器时,我们需要调整布局。确实,必须考虑到智能手机屏幕的尺寸,并重新设计页面的易用性。有一些专门用于构建移动设备网页的库。PrimeFaces Mobile 库就是其中之一,它本身依赖于 jQuery Mobile 库。
移动 Web 应用程序的架构将与前文所述完全一致,唯一的区别在于:除了 JSF 和 PrimeFaces 之外,我们还将使用 PrimeFaces Mobile(PFM)库。
![]() |
我们将重新回顾JSF和PrimeFaces涉及的所有概念。只有[展示]层(主要是页面)会发生变化。
8.2. PrimeFaces Mobile 的优势
PrimeFaces Mobile 网站
[http://www.primefaces.org/showcase-labs/mobile/showcase.jsf?javax.faces.RenderKitId=PRIMEFACES_MOBILE]
提供了一份可在 PFM 页面中使用的组件列表 [1, 2]:
![]() |
您可以使用智能手机模拟器查看上述演示应用程序。其中一个适用于 iPhone 4 的模拟器可通过 URL [http://iphone4simulator.com/] [3] 访问。在 [4] 中输入待测试应用程序的地址,它将以 iPhone 的屏幕尺寸显示。此类模拟器在开发阶段非常有用,但最终必须在各种移动设备上进行实际环境测试。
8.3. 学习 PrimeFaces Mobile
PrimeFaces Mobile 提供的组件远少于 PrimeFaces。PrimeFaces Mobile 网站
[http://www.primefaces.org/showcase-labs/mobile/showcase.jsf?javax.faces.RenderKitId=PRIMEFACES_MOBILE]
提供了组件列表。例如,以下是在表单中可用的组件 [1]、[2]、[3]:
![]() |
您可以下载示例的源代码 [4]。我们发现,显示上述组件 [1]、[2]、[3] 的 PFM 页面如下所示:
<?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>
- 第 7 行:出现了一个新的命名空间,即 PrimeFaces Mobile 组件的命名空间,其前缀为 pm,
- 第 10 行:定义了一个页面。一个页面由多个视图组成(第 12 行)。在任何给定时刻,仅有一个视图可见。这是我们在 PrimeFaces 示例中广泛使用的一个概念:一个页面包含多个片段,这些片段可以显示或隐藏。在这里,我们无需这样做。我们将简单地指定要显示的视图,其余视图将自动隐藏,
- 第 12 行:一个视图,
- 第 13–15 行:定义视图标题:
<pm:header title="Forms">
<f:facet name="left"><p:button value="Back" icon="back" href="#main?reverse=true"/></f:facet>
</pm:header>
请注意用于生成按钮的标签。href 属性用于实现导航功能。此处的值为一个视图的名称。点击该按钮将带您返回(reverse=true)名为 main 的视图(此处未显示)。
- 第 16 行:引入视图的内容,
- 第 17 行:生成一个输入字段:
<p:inputText label="Input:" />
![]() |
- 第 18 行:一个带有特定图标的输入框:
<p:inputText label="Search:" type="search"/>
![]() |
- 第19行:一个用于输入电话号码的输入框:
<p:inputText label="Phone:" type="tel"/>
![]() |
<inputText> 标签的 type 属性具有特定含义:它决定了向用户显示用于数据输入的键盘类型。因此,当 type='tel' 时,将显示数字键盘,
- 第 20 行:一个多行、可扩展的文本输入框:
<p:inputTextarea id="inputTextarea" label="Textarea:"/>
![]() |
- 第21–29行:一个由多个组件组成的字段:
<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>
![]() | ![]() |
- 第 2 行:第 3 行组件的标签;
- 第 3 行:下拉列表;
- 第4–7行:其内容;
- 第30行:一个滑块:
<pm:inputRange id="range" minValue="0" maxValue="100" label="Range:" />
![]() |
- 第31行:一个切换按钮:
<pm:switch id="switch" onLabel="yes" offLabel="no" label="Switch:" />
![]() | ![]() |
- 第32行:一个复选框:
<p:selectBooleanCheckbox id="booleanCheckbox" value="false" itemLabel="I agree" label="Checkbox"/>
![]() |
- 第33至37行:一组复选框:
<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>
![]() |
- 第38–42行:一组单选按钮
<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>
![]() |
请注意,该页面使用了来自三个库的标签:JSF、PF 和 PFM。现在我们已经掌握了足够的基础知识,可以构建我们的第一个 PrimeFaces Mobile 项目了。
8.4. 首个 PrimeFaces Mobile 项目:mv-pfm-01
我们将重新审视之前学习的示例,将其集成到一个 Maven 项目中。这将使我们能够探索 PrimeFaces Mobile 项目所需的依赖项。
8.4.1. NetBeans 项目
NetBeans 项目结构如下:
![]() |
NetBeans 项目最初是一个基本的 Maven Web 项目,其中已添加了依赖项 [2]。这在 [pom.xml] 文件中通过以下代码体现:
<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>
第 11–16 行定义了对 PrimeFaces Mobile 的依赖。这里我们使用了 0.9.1 版本(第 14 行)。此外,我们还使用了 PrimeFaces 的 3.2 版本(第 9 行)。这些版本号非常重要。事实上,我在使用 PFM 时遇到了不少问题,因为这是一个尚未完成的库。 有一段时间,曾有一个漏洞百出的 0.9.2 版本。该版本现已移除。我们已回退至 0.9.1 版本。因此,PFM 项目出现了退步。在即将发布的 1.0 版本(2012 年 6 月初)的 1.0-SNAPSHOT 版本中,测试也失败了。
主页 [index.xhtml] [1] 是 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>
有一个页面(第 10 行),其中包含十二个视图。这里我们不再详细讨论它们。此处的目的是简单展示如何构建一个 PrimeFaces Mobile 项目。
让我们运行这个项目。我们会看到一个错误页面 [1]:
![]() |
原因是 PrimeFaces Mobile 应用程序必须带上参数 [?javax.faces.RenderKitId=PRIMEFACES_MOBILE] 进行调用,如 [2] 所示。您可以通过修改 [faces-config.xml] 文件(如果该文件不存在,则需要创建,如本例所示)来绕过此参数 [3]:
![]() |
其内容如下:
<?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>
- 第 11 行:设置 [javax.faces.RenderKitId] 参数的值。
执行后,我们得到与之前相同的页面,但无需在 URL 中包含参数 [4]。我们留给读者自行测试此应用程序。我们发现了一些错误:<p:selectManyCheckbox> 标签未显示,<p:selectOneRadio> 标签也未显示,且 <pm:range> 标签无法正常工作。 这些问题在演示站点上并不存在,这表明该演示与这里使用的 PrimeFaces Mobile 0.9.1 和 PrimeFaces 3.2 的组合不兼容。尽管如此,它仍可作为探索该库中标签的起点,该库目前仍处于开发阶段。
若要获得更真实的渲染效果,您可以在 iPhone 4 模拟器 [http://iphone4simulator.com/] 等模拟器上测试该应用程序。您将看到以下内容:
![]() |
输入 [5],即 [4] 中前一个浏览器使用的同一 URL。
8.5. 示例 mv-pfm-02:表单与模型
在本项目中,我们将演示 PrimeFaces Mobile 页面与其模型之间的交互。这些交互遵循 JSF 框架的规则,而 PrimeFaces Mobile 最终正是基于该框架构建的。
8.5.1. 观点
该项目中有两个视图
![]() |
- 视图 1 [1] 显示了一个可提交的表单 [2],
- 视图 2 [3] 确认输入内容,并提供返回表单的选项 [4]。
该项目展示了两点:
- 页面与其模板之间的关系,
- 页面视图之间的导航。
8.5.2. NetBeans 项目
NetBeans 项目结构如下:
![]() |
- 在 [1] 中,PrimeFaces Mobile 页面,
- 在 [2] 中,其模板
- 在 [3] 中,消息文件,因为该应用程序已实现国际化,
- 在 [4] 中,项目依赖项。
8.5.3. 项目配置
我们提供配置文件但不作说明。这些文件现已成为标准。
[web.xml]:用于配置 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]:配置 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]:法语消息文件:
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. PrimeFaces 移动页面
[index.xhtml] 页面如下:
<?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>
我们从 PrimeFaces Mobile 网站上获取了演示示例,并对其进行了修改以使其正常运行:
- <p:selectManyCheckbox> 标签未显示。我们将其替换为 <h:selectManyCheckbox> 标签(第 32 行),
- <p:selectOneRadio> 标签未显示。我们将其替换为 <p:selectOneRadio> 标签(第 40 行),
- 第 27 行:我们保留了 <pm:inputRange> 标签,该标签用于显示滑块。此滑块存在一个缺陷:无法移动滑块光标。不过,可以通过输入数字来使其移动,
- 请注意,PFM 特有的标签很少(第一个视图中的第 13、14、15、19、27 和 28 行)。其余标签均为标准的 JSF 和 PF 标签。PrimeFaces Mobile 正是基于这两个框架构建的。
请注意页面结构:
<?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>
- 第 10 行:定义了一个 PFM 页面。title 属性用于设置浏览器显示的标题;
- 一个页面由一个或多个视图组成。页面首次显示时,会显示第一个视图。随后,您可以在不同视图之间进行导航。此处有两个视图:第13行的表单视图和第24行的信息视图,
- 第 14 行:header 标签定义视图的页眉,
- 第 15 行:content 标签定义视图的内容,
- 第 16 行:forms 视图包含一个 JSF 表单,
- 第 18 行:该表单将通过一个标准的 PrimeFaces 按钮提交。表单数据将发送至 [Form] 模型,并由 [Form].validate 方法进行处理。该方法将执行其功能。我们可以看到,它会请求显示信息视图。在此之前,视图已通过 AJAX 调用(update 属性)进行了更新,
- 第 26 行:我们可以使用按钮在信息视图和表单视图之间切换。请注意 href 属性的格式 [href="#forms?reverse=true"]。#forms 表示表单视图。参数 reverse=true 用于请求返回上一页。 我从演示中提取了这个属性。在模拟器上移除它后,你不会看到任何区别……但在真实的智能手机上可能会有区别,
- 最后,请注意第 7 行中 PrimeFaces Mobile 库的使用。
尽管引入了新功能,但这个 PFM 页面非常简单明了。其模板 [Form.java] 也是如此。
8.5.5. [Form.java] 模板
该模型如下所示:
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
...
}
这里没有什么新内容。 我们之前都见过这些。不过请注意表单调用的 validate 方法的形式。第 21 行:它返回一个形式为 'pm:viewname' 的字符串。这里将显示 info 视图。该方法除了执行此导航外,不做其他任何操作。此前,第 12–19 行的字段接收到了提交的值。这些值将用于更新 info 视图(下文的 update 属性):
<p:commandButton inline="true" value="#{msg['valider']}" update=":infos" action="#{form.valider}"/>
随后,info视图将显示提交的值:
![]() |
<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. 测试
运行 NetBeans 项目。项目部署到 Tomcat [1] 后,您可以在模拟器 [http://iphone4simulator.com/] [2] 上进行测试:
![]() |
接下来我们将演示如何在真实的智能手机上进行测试 。我们将把托管应用程序的服务器和智能手机连接到同一个 Wi-Fi 网络:
![]() |
将服务器连接到 Wi-Fi 网络。随后您可以查看其 IP 地址:
![]() |
请记下上方的服务器 IP 地址:192.168.1.127。禁用服务器上的所有防火墙和防病毒软件:
![]() |
在服务器上,在 NetBeans [1] 中启动 [mv-pfm-02] 应用程序:
![]() |
将智能手机连接到与服务器相同的 Wi-Fi 网络,以便两台设备能够相互识别。然后打开浏览器,输入 URL [http://192.168.1.127:8080/mv-pfm-02/] [2]。现在您可以测试该应用程序了。 您会欣喜地发现,那个在模拟器中无法工作的滑块,在智能手机上却能正常工作。因此,模拟器与实际设备之间存在差异。
8.6. 结论
我们仅介绍了 PrimeFaces Mobile 库中的表单标签,但这对于我们的示例应用程序已足够。
8.7. 使用 Eclipse 进行测试
将 Maven 项目 [1] 导入 Eclipse 并运行它们 [2],
![]() |
在 Tomcat 服务器上 [3]。随后,正在运行的应用程序会显示在 Eclipse 的内置浏览器中 [4]。
![]() |
请注意,应用程序 [mv-pfm-02] 在 Eclipse 浏览器中出现了故障。当在 Firefox 或 IE 浏览器中加载时,这些问题便消失了。





























