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