Google App Engine + Struts 1 example
Long live classic Struts 1 framework, in this tutorial, we will show you how to develop a Struts 1.x web application in Google App Engine (GAE) environment.
Tools and technologies used :
- JDK 1.6
- Eclipse 3.7 + Google Plugin for Eclipse
- Google App Engine Java SDK 1.6.3.1
- Struts 1.3.10
You may also interest at this Google App Engine + Struts 2 example.
This example is going to merge Struts 1.x hello world example with this GAE + Java example.
1. New Web Application Project
In Eclipse, create a new Web Application project, named as “StrutsGoogleAppEngine”.
Google Plugin for Eclipse will generate a sample GAE project structure. later will integrate Struts 1 into this GAE structure.
2. Integrate Struts 1.x Libraries
Visit this link to download Struts 1.x. Following jars are required :
- antlr-2.7.2.jar
- commons-beanutils-1.8.0.jar
- commons-chain-1.2.jar
- commons-digester-1.8.jar
- commons-logging-1.0.4.jar
- commons-validator-1.3.1.jar
- oro-2.0.8.jar
- struts-core-1.3.10.jar
- struts-taglib-1.3.10.jar
Copy and put it in “war/WEB-INF/lib” folder.
Right click on the project folder, select “Properties“. Select “Java Build Path” -> “Libraries” tab, click “Add Jars” button and select above 9 jars from “war/WEB-INF/lib” folder into the build path.
3. Integrate Struts 1.x Action and Form
3.1 Delete StrutsGoogleAppEngineServlet.java
, you don’t need this.
3.2 Create a new Action class.
File : src/com/mkyong/action/HelloWorldAction.java
package com.mkyong.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.mkyong.form.HelloWorldForm;
public class HelloWorldAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
HelloWorldForm helloWorldForm = (HelloWorldForm) form;
helloWorldForm.setMessage("Hello World!");
return mapping.findForward("success");
}
}
3.3 Create a new form class.
File : src/com/mkyong/form/HelloWorldForm.java
package com.mkyong.form;
import org.apache.struts.action.ActionForm;
public class HelloWorldForm extends ActionForm {
String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
4. Integrate Struts 1.x JSP Pages
4.1 Create HelloWorld.jsp
page and put in “war/User/pages/HelloWorld.jsp“.
File : HelloWorld.jsp
<%@taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<html>
<head>
</head>
<body>
<h1>
Google App Engine + Struts 1.x example
</h1>
<h2><bean:write name="helloWorldForm" property="message" /></h2>
</body>
</html>
5. Struts XML configuration
Create a struts-config.xml
file, and put it in “war/WEB-INF/struts-config.xml“.
File : struts-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_3.dtd">
<struts-config>
<form-beans>
<form-bean name="helloWorldForm" type="com.mkyong.form.HelloWorldForm" />
</form-beans>
<action-mappings>
<action path="/helloWorld" type="com.mkyong.action.HelloWorldAction"
name="helloWorldForm">
<forward name="success" path="/HelloWorld.jsp" />
</action>
</action-mappings>
</struts-config>
6. web.xml
Update web.xml
, integrate Struts.
File : 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">
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>
/WEB-INF/struts-config.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
7. Enable Session in GAE
Update appengine-web.xml
, enable session support, Struts need this.
File : 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>
If you don’t enable session in GAE, you will hit error “java.lang.RuntimeException: Session support is not enabled in appengine-web.xml“.
8. Directory Structure
Review the final directory structure.
9. Run on Local
Right click on the project, run as “Web Application“.
URL : http://localhost:8888/helloWorld.do
10. Deploy on GAE
Update appengine-web.xml
file, add your App Engine application ID.
File : appengine-web.xml
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<application>mkyong-strutsgae</application>
<version>1</version>
<sessions-enabled>true</sessions-enabled>
</appengine-web-app>
Select project, click on Google icon, “Deploy to App Engine“.
URL : http://mkyong-strutsgae.appspot.com/helloWorld.do
Not much problem, just follow GAE directory structure, at least integrate Struts 1 is more easily than Struts 2.
Download Source Code
Due to large file size, all Struts1 jars are excluded, you need to download it manually.
Hello,
I have experienced NPE exception with this example, and could not clarify, why?
Is it due to libraries or struts configuration details.
Thanks in advance for help.
NullPointerException
at org.apache.struts.chain.commands.servlet.PerformForward.handleAsForward(PerformForward.java:113)
More detailed description:
http://stackoverflow.com/questions/20439898/hellowrold-struts-1-and-goolge-app-engine-example-gives-nullpointerexception-on
I have bucket name, access id, security id but I have searched lot of sites I have not get any positive response can you please provide the mentioned code
hi mkyong, my application is working locally but when I deploy it gives 500 error what could be the problem?
Works!
HelloWorld.jsp should be in war not in war/User/pages/
Hi Mkyong, is possible to use the google app angine with struts 2?
sure, refer to this Google App Engine + Struts 2 example
Hi mkyong can you please provide how can we store files in GAE