blob: 73d41926eca033778f2aae9355b887e9ebbaf36b [file] [log] [blame]
------
Tutorial : Configuring MyFaces 2 to run on Google App Engine with IntelliJ IDEA
------
Ali Ok
------
2010-04-08
-------
~~ Licensed to the Apache Software Foundation (ASF) under one
~~ or more contributor license agreements. See the NOTICE file
~~ distributed with this work for additional information
~~ regarding copyright ownership. The ASF licenses this file
~~ to you under the Apache License, Version 2.0 (the
~~ "License"); you may not use this file except in compliance
~~ with the License. You may obtain a copy of the License at
~~
~~ http://www.apache.org/licenses/LICENSE-2.0
~~
~~ Unless required by applicable law or agreed to in writing,
~~ software distributed under the License is distributed on an
~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
~~ KIND, either express or implied. See the License for the
~~ specific language governing permissions and limitations
~~ under the License.
~~ NOTE: For help with the syntax of this file, see:
~~ http://maven.apache.org/doxia/references/apt-format.html
Tutorial : Configuring MyFaces 2 to run on Google App Engine with IntelliJ IDEA
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Google App Engine support for MyFaces 2 made trunk and it is released with MyFaces Core 2.0.0-beta-3.
In this tutorial, I will explain how to use it with IntelliJ IDEA. I assume that you have basic
IDEA, JSF and Facelets knowledge.
You can find IDE-independent instructions {{{./googleappenginesupport.html}here}}. Additionally, there is a tutorial for Eclipse {{{./myfaces2-googleappengine-eclipse-tutorial.html}here}}.
{{{http://sites.google.com/a/aliok.com.tr/upload/uploads/tutorial-gae-myfaces2-idea.zip?attredirects=0&d=1}Here}}
is the complete source code and the IDEA project of the example application (which I took from
{{{https://facelets.dev.java.net/nonav/docs/dev/docbook.html}Facelets Tutorial}}) that I configured to run on
Google App Engine.
I deployed the application explained in this tutorial at:
{{{http://myfaces2-tutorial-idea.latest.aliok-com-tr-test.appspot.com/guess.jsf}http://myfaces2-tutorial-idea.latest.aliok-com-tr-test.appspot.com/guess.jsf}}
In order to run Myfaces on Google App Engine, you need to complete the steps below. Configuration explained in this document is tested with
Google App Engine 1.3.0.
If you're having trouble with the figures in this page, you can download all images from
{{{http://upload.aliok.com.tr/uploads/myfaces2-gae-idea-tut-all-images.zip?attredirects=0&d=1}this link}}.
*Table of Content
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%{toc|section=1|fromDepth=1|toDepth=1}
*{Requirements}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* IntelliJ IDEA Ultimate Edition
* Google App Engine SDK
* MyFaces Core 2.0.0 Beta 3
* EL API and Impl
* Basic JSF and Facelets knowledge
* Google App Engine Account :)
*{Downloading and Configuration}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[[1]] Download {{{http://code.google.com/appengine/downloads.html#Google_App_Engine_SDK_for_Java}App Engine SDK}} and extract it to somewhere.
[[2]] Download {{{http://myfaces.apache.org/download.html}MyFaces Core 2.0.0 Beta 3}} (or a later version) and extract it.
[[3]] Download {{{http://download.java.net/maven/glassfish/javax/el/el-api/1.1/el-api-1.1.jar}EL API}} and
{{{http://download.java.net/maven/glassfish/org/glassfish/web/el-impl/1.1/el-impl-1.1.jar}EL Impl}} jars.
[[4]] We need IntelliJ IDEA {{{Ultimate Edition}http://www.jetbrains.com/idea/download/}}. Community edition doesn't have JavaEE support,
thus {{{http://plugins.intellij.net/plugin/?&id=4254}Google App Engine Plugin}} doesn't work on it. I downloaded and
installed IDEA version 9.0.1, and I don't know this plugin works for older versions of the IDE.
[images/gaetutorial-idea/myfaces2-gae-idea-tut-01-welcome.jpg] IDEA Welcome
[[5]] After installing the IDE and running for the first time, the IDE asked me which plugins that I want. I selected
"Google App Engine Integration" and its dependencies. If you have an existing installation, make sure you have
"Google App Engine Integration" plugin installed and enabled.
[images/gaetutorial-idea/myfaces2-gae-idea-tut-02-plugins.jpg] IDEA Plugins Screen
[[6]] Next, we will define our App Engine Devl Server.
[[a]] To do this, navigate to IDE settings.
[images/gaetutorial-idea/myfaces2-gae-idea-tut-03-settings-menu.jpg] IDEA Settings Menu
[[b]] Select "Application Servers" and click "Add" button. Select "Google App Engine Dev Server".
[images/gaetutorial-idea/myfaces2-gae-idea-tut-04-ide-settings.jpg] IDE Settings
[[c]] Select the path of the App Engine SDK.
[images/gaetutorial-idea/myfaces2-gae-idea-tut-05-sdk-path.jpg] SDK Path Config
[[d]] You will see some JARS under the "Classes" node.
[images/gaetutorial-idea/myfaces2-gae-idea-tut-06-sdk-verification.jpg] SDK Verification
*{Creating and Configuring the Project}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[[1]] First, we will create a new project:
[[a]] Press "File - > New Project"
[images/gaetutorial-idea/myfaces2-gae-idea-tut-07-new-project.jpg] New Project
[[b]] We will create the project from scratch. So, select it and press next.
[images/gaetutorial-idea/myfaces2-gae-idea-tut-08-create-scratch.jpg] New Project from Scratch
[[c]] Type the project name, and select "Java Module".
[images/gaetutorial-idea/myfaces2-gae-idea-tut-09-project-naming.jpg] New Project Name
[[d]] Let IDEA crete a source directory for us.
[images/gaetutorial-idea/myfaces2-gae-idea-tut-10-scr-dir.jpg] New Project src Dir
[[e]] On this screen, select "Web Application" and "Google App Engine" nodes.
Altough we will create a JSF project, don't select the "JavaServer Faces" node since IDEA doesn't
support MyFaces 2 yet. After making sure the AppEngine SDK path is correct,
press "Finish" and IDEA will create the project.
[images/gaetutorial-idea/myfaces2-gae-idea-tut-11-tech-selection.jpg] Technology Selection
[[2]] Now, we will add the MyFaces jars as an "External Library". I did this step to solve
compilation problems in my managed beans. Without explicitly adding an External Library, "javax.faces"
namespace is not visible in my managed beans �which we will create in the next steps- even if the jars
exist in "WEB-INF/lib". I am sure an experienced IDEA user can solve this problem in a better way.
[[a]] Right-click on the project and select "Module Settings".
[images/gaetutorial-idea/myfaces2-gae-idea-tut-12-module-settings.jpg] Module Settings
[[b]] You will see a screen like the one below.
[images/gaetutorial-idea/myfaces2-gae-idea-tut-13-project-libs.jpg] Project Libs
[[c]] Press the "+" button, type "MyFaces 2 Beta 3" and press "OK".
[images/gaetutorial-idea/myfaces2-gae-idea-tut-14-lib-name.jpg] Lib Name
[[d]] IDEA will ask which modules to add the library. Select the project you've created and press "OK".
[images/gaetutorial-idea/myfaces2-gae-idea-tut-15-lib-module-selecting.jpg] Project Library Module Selection
[[e]] Now we will "attach" MyFaces2 jars. While the newly created library "MyFaces 2 Beta 3" is selected,
press "Attach Classes" button and select the MyFaces (and dependencies) jars.
[images/gaetutorial-idea/myfaces2-gae-idea-tut-16-attach-classes.jpg] Attach Classes
[[f]] You should have a screen like below. Press "OK".
[images/gaetutorial-idea/myfaces2-gae-idea-tut-17-lib-verification.jpg] Library Verification
[[g]] Here is the external libraries so far:
[images/gaetutorial-idea/myfaces2-gae-idea-tut-18-ext-lib-verification.jpg] External Library Verification
[[3]] Put necessary jars into "WEB-INF/lib":
[[a]] By default, IDEA does not create a "lib" folder under "WEB-INF". So we need to create one.
Right-click on "WEB-INF" folder and select "New - > Directory".
[images/gaetutorial-idea/myfaces2-gae-idea-tut-19-lib-dir-create.jpg] lib Directory Creation
[[b]] Type "lib" and press OK.
[images/gaetutorial-idea/myfaces2-gae-idea-tut-20-lib-naming.jpg] lib Directory Naming
[[c]] Copy the jars from the MyFaces release (myfaces-api-2.x.x.jar, lib/myfaces-impl-2.x.x.jar,
lib/commons-logging-1.x.x.jar, lib/commons-beanutils-1.x.x.jar, lib/commons-codec-1.x.jar,
commons-collections-3.x.jar, lib/commons-digester-x.x.jar, lib/commons-discovery-0.x.jar)
and paste them into "WEB-INF/lib".
[images/gaetutorial-idea/myfaces2-gae-idea-tut-21-paste-jars.jpg] Paste MyFaces Jars
[[d]] Here is the "WEB-INF/lib" jars so far:
[images/gaetutorial-idea/myfaces2-gae-idea-tut-22-jar-verification.jpg] MyFaces Jar Verification
[[e]] Put el-api-x.x.jar and el-impl-1.1.jar �which you've downloaded at step 3 of
"Downloading and Configuration" section- into "WEB-INF/lib".
[images/gaetutorial-idea/myfaces2-gae-idea-tut-23-paste-el-jars.jpg] Paste EL Jars
[[4]] XML configuration:
[[a]] Put the lines below into your web.xml file:
+---------------------------------------------------------------------------------------------------------+
<web-app ...
...
<!--
Need to set a secret to avoid javax.crypto.BadPaddingException.
"param-value" must be Base64 encoded.
More details: http://wiki.apache.org/myfaces/Secure_Your_Application
-->
<context-param>
<param-name>org.apache.myfaces.SECRET</param-name>
<param-value>NzY1NDMyMTA=</param-value>
</context-param>
<!--
Facelets configuration fragment
-->
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
...
</web-app>
+---------------------------------------------------------------------------------------------------------+
[images/gaetutorial-idea/myfaces2-gae-idea-tut-24-web-xml-conf.jpg] web.xml Configuration
[[b]] Create a "faces-config.xml" file under your "WEB-INF" folder, and make sure that you use the JSF 2 header in it.
+---------------------------------------------------------------------------------------------------------+
<?xml version="1.0" encoding="UTF-8"?>
<faces-config
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"
version="2.0">
...
</faces-config>
+---------------------------------------------------------------------------------------------------------+
[images/gaetutorial-idea/myfaces2-gae-idea-tut-25-faces-config-conf.jpg] faces-config.xml Configuration
[[c]] Add the following line into war/WEB-INF/appengine-web.xml:
+---------------------------------------------------------------------------------------------------------+
<sessions-enabled>true</sessions-enabled>
+---------------------------------------------------------------------------------------------------------+
[images/gaetutorial-idea/myfaces2-gae-idea-tut-26-appengine-web-conf.jpg] appengine-web.xml Configuration
[[5]] Now you can add your pages, beans etc. You cannot use JSP as view technology on Google App Engine. You must
use Facelets, which is the default view technology in JSF 2.
{{{http://sites.google.com/a/aliok.com.tr/upload/uploads/tutorial-gae-myfaces2-idea.zip}Here}} is the complete
source code and the IDEA project of the example application (which I took from
{{{https://facelets.dev.java.net/nonav/docs/dev/docbook.html}Facelets Tutorial}}) that I configured to run on
Google App Engine.
*{Deploying to App Engine Development Server (Your Local Server)}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[[1]] We need to define a run configuration.
[[a]] Select "Run - > Edit Configurations"
[images/gaetutorial-idea/myfaces2-gae-idea-tut-27-edit-run-conf.jpg] Edit Run Configuration
[[b]] Press "+" button to add a new configuration.
[images/gaetutorial-idea/myfaces2-gae-idea-tut-28-add-new-run-conf.jpg] Adding New Run Configuration
[[c]] Select "Google AppEngine Dev Server".
[images/gaetutorial-idea/myfaces2-gae-idea-tut-29-add-gae-run-conf.jpg] Add GAE Run Configuration
[[d]] Type the configuration name, and make sure your screen seems like this:
[images/gaetutorial-idea/myfaces2-gae-idea-tut-30-gae-run-conf-settings.jpg] GAE Run Configuration Settings
[[e]] Select "Build Artifacts" and click "..." button. We will configure, what to export.
[images/gaetutorial-idea/myfaces2-gae-idea-tut-31-run-conf-build.jpg] Run Configuration Build Settings
[[f]] Select "Test-GoogleAppEngine:war exploded".
[images/gaetutorial-idea/myfaces2-gae-idea-tut-32-run-conf-artifacts.jpg] Run Configuration Build Artifacts
[[2]] Now, you can see the configuration you've defined next to "Run" button.
[[a]] Select your run configuration and press "Run".
[images/gaetutorial-idea/myfaces2-gae-idea-tut-33-run-conf-select.jpg] Run Configuration Selection
[[b]] You will see MyFaces logs on the console. You shouldn't see any exception at this step. If you saw
one, make sure you've completed all steps above.
[images/gaetutorial-idea/myfaces2-gae-idea-tut-34-myfaces-logs.jpg] MyFaces Logs
[[c]] You can see your application at "localhost:8080". IDEA created a dummy
index.jsp before, so it is normal to see "Place your content here" text.
[images/gaetutorial-idea/myfaces2-gae-idea-tut-35-local-page.jpg] Local Devl Server Page
[[d]] You can stop the GAE Devl Server by pressing stop button.
[images/gaetutorial-idea/myfaces2-gae-idea-tut-36-stop-local-server.jpg] Stopping Local Server
*{Running Facelets Tutorial Example}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
I've configured a project to run on Google App Engine, which you can find the sources
{{{http://sites.google.com/a/aliok.com.tr/upload/uploads/tutorial-gae-myfaces2-idea.zip}here}}.
You can simply copy the files guess.xhtml, response.xhtml, template.xhtml and NumberBean.java to appropriate locations.
[images/gaetutorial-idea/myfaces2-gae-idea-tut-37-add-stuff.jpg] Add Stuff
You can see the application running below.
[images/gaetutorial-idea/myfaces2-gae-idea-tut-38-guess-appl-local-page.jpg] Guess Application Local Page
*{Deploying to App Engine}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[[1]] You need to set application name and version in appengine-web.xml file. You can see my
config below. "application" is your application id at Google App Engine (AppSpot Id),
and version is anything you like.
[images/gaetutorial-idea/myfaces2-gae-idea-tut-39-app-engine-appl-version-conf.jpg] App Engine Application and Version Configuration
[[2]] You can upload the application by selecting "Tools - > Upload App Engine Application".
[images/gaetutorial-idea/myfaces2-gae-idea-tut-40-upload.jpg] Uploading
[[3]] IDEA will ask about building. Build the project by clicking "Yes".
[images/gaetutorial-idea/myfaces2-gae-idea-tut-41-upload-build.jpg] Upload : Build
[[4]] Now, IDEA will use AppEngine SDK's batch jobs to upload application. You will be asked your email and password.
You can see the output of my upload below.
[images/gaetutorial-idea/myfaces2-gae-idea-tut-42-upload-console.jpg] Upload Console
[[5]] Your application is hosted at Google App Engine now. You can see this version of the
application at "Versions" page of Google App Engine administration screen. Your application
is hosted at <version-I-specified>.latest.<application-ID>.appspot.com
[images/gaetutorial-idea/myfaces2-gae-idea-tut-43-gae-page.jpg] GAE Page