在本教程中,我们将向您展示如何在Google App Engine(GAE)环境中开发和部署JSF 2.0 Web应用程序。
使用的工具和技术:
- JDK 1.6
- Eclipse 3.7 + Eclipse的Google插件
- Google App Engine Java SDK 1.6.3.1
- JSF 2.1.7
注意
该示例将重用此JSF 2.0 hello世界示例 ,对其进行修改并将其与该GAE + Java示例合并。
1.新的Web应用程序项目
在Eclipse中,创建一个新的Web应用程序项目,名为“ JSFGoogleAppEngine ”。
“ Google Eclipse插件”将生成GAE项目结构的示例。
2. JSF 2依赖关系
要在GAE中使用JSF 2,您需要以下jar
- jsf-api-2.1.7.jar
- jsf-impl-2.1.7.jar
- el-ri-1.0.jar
复制并将其放在“ war / WEB-INF / lib ”文件夹中。
右键单击项目文件夹,选择“ 属性 ”。 选择“ Java Build Path ”->“ Libraries ”选项卡,单击“ Add Jars ”按钮,然后选择上方的jars。
注意
您需要放置此el-ri-1.0.jar
,否则,您将看到错误消息– 无法实例化ExpressionFactory'com.sun.el.ExpressionFactoryImpl' 。
3. JSF托管bean
3.1删除插件生成的JSFGoogleAppEngineServlet.java
,您不需要这样做。
3.2创建一个托管bean。
文件:src / com / mkyong / HelloBean.java
package com.mkyong;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import java.io.Serializable;
@ManagedBean
@SessionScoped
public class HelloBean implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3.3创建一个新的WebConfiguration.java。
JSF 2正在使用GAE不支持的“ javax.naming.InitialContext
”。
为了解决这个问题,您需要获取JSF的源代码副本,克隆WebConfiguration.java
,使用“ javax.naming.InitialContext
”类的注释方法,并将其放在“ src / com / sun / faces / comfig / WebConfiguration.java ”。 现在,新创建的WebConfiguration.java
类将重载原始的WebConfiguration.java
。
注意
获取WebConfiguration.java的完整源代码 。
我认为GAE团队不会将此罐列入白名单,只是希望JSF的团队可以在将来的版本中解决此问题。
4. JSF页面
4.1创建hello.xhtml
页面,接受用户输入并将其传递给helloBean。
文件:war / hello.xhtml
<?xml version="1.0" encoding="UTF-8"?>
<!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:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>GAE + JSF</title>
</h:head>
<h:body>
<h1>Google App Engine + JSF 2.0 example - hello.xhtml</h1>
<h:form>
<h:inputText value="#{helloBean.name}"></h:inputText>
<h:commandButton value="Welcome Me" action="welcome"></h:commandButton>
</h:form>
</h:body>
</html>
4.2创建welcome.xhtml
页面,显示来自hellobean的用户输入。
档案:war / welcome.xhtml
<?xml version="1.0" encoding="UTF-8"?>
<!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:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>GAE + JSF</title>
</h:head>
<h:body bgcolor="white">
<h1>Google App Engine + JSF 2.0 example - welcome.xhtml</h1>
<h2>Welcome #{helloBean.name}</h2>
</h:body>
</html>
4.3删除插件生成的index.html
文件,您不需要此文件。
5. web.xml
更新web.xml,集成JSF 2。
档案:web.xml
<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>JavaServerFaces</display-name>
<!-- GAE 1.6.3 cannot handle server side (JSF default) state management. -->
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
<!-- Change to "Production" when you are ready to deploy -->
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<!-- Welcome page -->
<welcome-file-list>
<welcome-file>faces/hello.xhtml</welcome-file>
</welcome-file-list>
<!-- JSF mapping -->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map these files with JSF -->
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
</web-app>
注意
GAE不支持服务器端状态管理,因此,您需要将“javax.faces.STATE_SAVING_METHOD
”定义为“client
”,以避免在GAE生产环境中出现“ 无法还原View /hello.xhtml ”错误消息。
6.在GAE中启用会话
更新appengine-web.xml
,启用会话支持,JSF需要此。
文件:appengine-web.xml
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<application></application>
<version>1</version>
<sessions-enabled>true</sessions-enabled>
</appengine-web-app>
7.目录结构
查看最终目录结构。
8.在本地运行
右键单击该项目,以“ Web应用程序”运行。
网址:http:// localhost:8888 / hello.jsf
点击按钮。
10.在GAE上部署
更新appengine-web.xml
文件,添加您的App Engine应用程序ID。
文件:appengine-web.xml
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<application>mkyong-jsf2gae</application>
<version>1</version>
<sessions-enabled>true</sessions-enabled>
</appengine-web-app>
选择项目,然后单击Google图标“ Deploy to App Engine ”。
网址:http://mkyong-jsf2gae.appspot.com/hello.jsf
下载源代码
由于文件较大,因此不包括所有JSF和GAE jar。
下载– JSF2-GoogleAppEngine-Example.zip (42 KB)
参考文献
- JSF和GAE兼容的问题
- Google App上的JSF 2配置
- 带有JSF 2 + CDI的Google App Engine
- Google App和JSF入门
- JSF 2.0 Hello World示例
- Oracle:JavaServer Faces开发教程
翻译自: https://mkyong.com/google-app-engine/google-app-engine-jsf-2-example/