现在的位置: 首页 > 综合 > 正文

在google app engine(GAE)中利用struts2

2014年02月28日 ⁄ 综合 ⁄ 共 10672字 ⁄ 字号 评论关闭

Why i am writing this blog?

I faced lot of problems while creating my first application using Struts 2 on Google App Engine . So i decided to write a blog detailing how developers can create their application on Struts2 by avoiding the problems that i faced while developing my application.

Note

If you want to do FileUpload using struts 2  on google app engine please refer to this post.

Prerequisites for starting Struts2 Application on Google App Engine

Before you start building your sample application on google app engine using struts 2 you will need the following:-

  1. Google App Engine runs on java 5 and above so if necessary, download and install the Java SE Development Kit (JDK) for your platform and for mac users download and install the latest version.
  2. In this example we will be using Eclipse as our ide. So if necessary, download eclipse and google app engine plugin for eclipse.You will also need to download the google  java app engine SDK. For more information you can refer to installing the java SDK for google app engine.
  3. Download the latest release of Struts2 framework.If you want to learn struts 2 a very good reference is struts 2 in action book.Please buy Struts 2 in Action.

Step by Step procedure to create Struts2 application on Google App Engine.

Step 1: Create a new project by clicking the New Web Application Project button in the toolbarnew_app_button.

1

Step 2 : Give the project name say login  as we are going to create a simple login application. Enter package name as com.login and uncheck “Use Google Web Toolkit,” and ensure “Use Google App Engine” is checked and click the finish button.

2

Step3 : When you click the finish button you will get a sample HelloWorld application, which you can run going in the Run menu, select Run As > Web Application.By default application will run at port 8080, you can view the sample application at http://locahost:8080. For more information on the sample google web application created by the plugin you can refer to Google java app engine documentation .Please keep in mind that intent of this document is not to provide developers the overview of Google App engine for Java.

Step4 : By now you are ready with the google app engine infrastructure and we can move to the next step of creating a login application in Struts 2.

  • for creating a struts 2 application you will need to first add the required dependencies to the login project. The required struts 2 jars are below mentioned and you can find these jars in struts2 package you downloaded inside the lib folder :-

    • commons-fileupload-1.2.1.jar
    • commons-io-1.3.2.jar
    • commons-logging-1.1.jar
    • freemarker-2.3.13.jar
    • ognl-2.6.11.jar
    • struts2-core-2.1.6.jar
    • xwork-2.1.2.jar
  • Add these dependencies in your eclipse java build path.

3

  • Add these dependencies in the war/WEB-INF/lib folder so that these jars gets deployed along with your application.

4

  • As you can see in the above image there are some warnings in the problems view like  “commons-fileupload-1.2.1.jar’ will not be available on the server’s classpath” .To remove these warnings you need to right click on the project and select properties and then go to Google > web application and click the add button and add all the jars and then press ok.

5

  • First step in creating a struts 2 application is configuring the web.xml (deployment descriptor) which is located in WEB-INF folder.You can remove the servlet declaration from web.xml as we will not be needing this.We need to add the FilterDispatcher declaration in web.xml because in struts2 every request goes  pass through FilterDispatcher which will invoke the appropriate action corresponding to the URL mapping.So our web.xml will look like :-
01 <?xml version="1.0" encoding="utf-8"?>
04     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
05   
07   
08     version="2.5">
09     <filter>
10         <filter-name>struts2</filter-name>
11         <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
12     </filter>
13     <filter-mapping>
14         <filter-name>struts2</filter-name>
15         <url-pattern>/*</url-pattern>
16     </filter-mapping>
17     <welcome-file-list>
18         <welcome-file>index.html</welcome-file>
19     </welcome-file-list>
20 </web-app>
  • To start we will be creating a jsp login page using struts 2 tag library and we will call login page from index.html.To call the login page there are two ways first, we can directly call the login.jsp page from link second, we can calling it through struts. We will be taking the second step as this will show you how to configure actions when you dont need to invoke any action.Lets first see how our login page and index.html will look like :-

index.html

01 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
02 <html>
03 <head>
04 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
05 <title>Struts2 on Google App Engine</title>
06 </head>
07   
08 <body>
09 <h1>Struts2 on Google App Engine!</h1>
10 <table>
11 <tr>
12 <td colspan="2" style="font-weight: bold;">Available Application:</td>
13 </tr>
14 <tr>
15 <td><a href="/member/login" />Login</td>
16 </tr>
17 </table>
18 </body>
19 </html>

login.jsp

01 <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
02  pageEncoding="ISO-8859-1"%>
03 <%@ taglib prefix="s" uri="/struts-tags" %>
04 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
05 <html>
06 <head>
07 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
08 <title>Please login</title>
09 </head>
10 <body>
11  <s:actionerror/>
12  <s:form action="home" method="post">
13  <s:textfield name="username" label="UserName"></s:textfield>
14  <s:textfield name="password" label="Password"></s:textfield>
15  <s:submit name="login" value="login"></s:submit>
16  </s:form>
17 </body>
18 </html>
  • After creating the login.jsp we need to configure this as action in the struts.xml file which you be should put inside source folder parallel to log4j.properties file.We can configure action as mentioned below:-
01 <?xml version="1.0" encoding="UTF-8" ?>
02 <!DOCTYPE struts PUBLIC
03 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
05 <struts>
06     <include file="struts-default.xml"></include>
07 <package name="member" namespace="/member" extends="struts-default">
08         <action name="login">
09             <result>/login.jsp</result>
10         </action>
11     </package>
12 </struts>
  • Now try running this application by right click on project run as > web application and click http://localhost:8080. You will see index.html and when you click on login you will get this exception :-

SEVERE: Unable to set parameter [location] in result of type    [org.apache.struts2.dispatcher.ServletDispatcherResult]

Caught OgnlException while setting property ‘location’ on type ‘org.apache.struts2.dispatcher.ServletDispatcherResult’. – Class: ognl.OgnlRuntime

File: OgnlRuntime.java

Method: invokeMethod

Line: 508 – ognl/OgnlRuntime.java:508:-1

at com.opensymphony.xwork2.ognl.OgnlUtil.internalSetProperty(OgnlUtil.java:392)

Caused by: java.lang.IllegalAccessException: Method [public void org.apache.struts2.dispatcher.StrutsResultSupport.setLocation(java.lang.String)] cannot be accessed.

at ognl.OgnlRuntime.invokeMethod(OgnlRuntime.java:508)

at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:812)

at ognl.OgnlRuntime.setMethodValue(OgnlRuntime.java:964)

at ognl.ObjectPropertyAccessor.setPossibleProperty(ObjectPropertyAccessor.java:75)

at ognl.ObjectPropertyAccessor.setProperty(ObjectPropertyAccessor.java:131)

at com.opensymphony.xwork2.ognl.accessor.ObjectAccessor.setProperty(ObjectAccessor.java:28)

at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:1656)

at ognl.ASTProperty.setValueBody(ASTProperty.java:101)

at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:177)

at ognl.SimpleNode.setValue(SimpleNode.java:246)

at ognl.Ognl.setValue(Ognl.java:476)

at com.opensymphony.xwork2.ognl.OgnlUtil.setValue(OgnlUtil.java:192)

at com.opensymphony.xwork2.ognl.OgnlUtil.internalSetProperty(OgnlUtil.java:385)

… 73 more

  • In order to resolve this problem we  need to create an ServletContextListner which will set OGNL security manager to null when the context is initialized.
01 package com.login;
02   
03 import javax.servlet.ServletContextEvent;
04 import javax.servlet.ServletContextListener;
05   
06 import ognl.OgnlRuntime;
07   
08 public class OgnlListener implements ServletContextListener {
09   
10     @Override
11     public void contextDestroyed(ServletContextEvent arg0) {
12         // TODO Auto-generated method stub
13   
14     }
15   
16     @Override
17     public void contextInitialized(ServletContextEvent arg0) {
18         OgnlRuntime.setSecurityManager(null);
19     }
20   
21 }
  • Also we will need to make entry in web.xml file also for OgnlListener
1     <listener>
2     <listener-class>com.login.OgnlListener</listener-class>
3 </listener>
  • Now if you run the web application you will see the login page.
  • You need to add this step if you are using Google App Engine 1.2.6 because when you run struts2 application on google app engine 1.2.6 you will get the following error:-

javax.servlet.ServletException: java.lang.NoClassDefFoundError: javax.swing.tree.TreeNode is a restricted class. Please see the Google App Engine developer’s guide for more details.
at org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:825)
at org.apache.jasper.runtime.PageContextImpl.access$1100(PageContextImpl.java:64)
at org.apache.jasper.runtime.PageContextImpl$12.run(PageContextImpl.java:745)
at java.security.AccessController.doPrivileged(Native Method)
at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:743)
at org.apache.jsp.login_jsp._jspService(login_jsp.java:86)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
at com.google.appengine.tools.development.PrivilegedJspServlet.access$101(PrivilegedJspServlet.java:23)
at com.google.appengine.tools.development.PrivilegedJspServlet$2.run(PrivilegedJspServlet.java:59)
at java.security.AccessController.doPrivileged(Native Method)
at com.google.appengine.tools.development.PrivilegedJspServlet.service(PrivilegedJspServlet.java)

To avoid this error you need to create a new package “freemarker.core” in your source folder and add the following class

 

  • Next step is to create the LoginAction which will be do the business processing of whether usename and password are correct .
01 package com.login;
02   
03 import com.opensymphony.xwork2.ActionSupport;
04   
05 public class LoginAction extends ActionSupport {
06   
07     private static final long serialVersionUID = 1L;
08     private String username;
09     private String password;
10   
11     public String login(){
12         if(username.equals("whyjava") && password.equals("password")){
13             addActionMessage("You are successfully logged in.");
14             return SUCCESS;
15         }
16         addActionError("Username and Password Combination doesnot match.");
17         return INPUT;
18     }
19   
20     public String getUsername() {
21         return username;
22     }
23   
24     public void setUsername(String username) {
25         this.username = username;
26     }
27   
28     public String getPassword() {
29         return password;
30

抱歉!评论已关闭.