Cloud classification
Software as a Service(SaaS) Application:
-Web Apps
-DesktopApps
-Mobile Apps
(Google Apps, Google Translate, Office
360, NetSuite, IBM Lotus Live, GitHub)
Platform as a Service(PaaS) Development Platform+ RuntimeTools +
Environment
(Google App Engine, Heroku, Windows
Azure, force.com, Rollbase)
Infrastructure as a Service(IaaS) CPU
Networks
Data Storage
(AWS,VM Ware, Joyent, Rackspace)
Google App Engine
•run your web applications on Google's
infrastructure
–Google handles the maintenance infrasturcture:
hardware failures, security patches, OS upgrades
•Free ... within quota
GAE Limits & Quota
•10 Apps per user
•5 Mio pageview free per month
•6.5 hours of CPU and 1 Gb in & out traffic
•https://developers.google.com/appengine/do
cs/quotas
Why GAE
•Easy to build
–Language support (Java, Python, GO, PHP)
–Automatic scaling & load balancing
•Easy to maintain
–Web based admin dashboard
•Easy to scale (traffic & data storage)
–GAE Datastore
–Google Cloud SQL
–Google Cloud Storage
The Servlet Class
packageguestbook;
importjava.io.IOException;
importjavax.servlet.http.*;
publicclassGuestbookServletextendsHttpServlet{
publicvoiddoGet(HttpServletRequestreq,
HttpServletResponseresp)
throwsIOException {
resp.setContentType("text/plain");
resp.getWriter().println("Hello, world");
}
}
Project Structure
Java source code
other configuration
JSPs, images, data files
app configuration
JARs for libraries
Running Application
Preparation for deployment
•Register to Google App Engine
•Create an Application
•Deploy via Eclipse
Register to App Engine
•Register at: https://appengine.google.com/
•Create an Application
Create an Application
•For now, just fill in ‘Application Identifier’ and ‘Application
Title’, than accept ‘Term of Service’
Problem when Deploying
•Adding VM config
oOpen eclipse.ini in the eclipse folder
oAdd below lines before -vmargs
-vm
C:\Java\jdk1.7.0_40\bin\javaw.exe
Adding VM config
•Open eclipse.ini in the eclipse folder
•Add below lines before -vmargs
•-vm
•C:\Java\jdk1.7.0_40\bin\javaw.exe
Sign in to Deploy
Setting App ID & Version
Input Application Identifier
registered at appspot.com
Refactor Example to MVC
•Using JSP as View template
–JSP files will resides inside ‘WEB-INF/jsp’ folder
–So users can not access our template directly
•Using Servlet as Controller
–Put model in request attribute
–Forward to proper View
–Change SignGuestbookServlet.java so it redirect to
servlet (not JSP):
resp.sendRedirect("/guestbook?guestbookName="+ guestbookName);
GuestbookServlet.java –doGet()
UserService userService = UserServiceFactory.getUserService();
User user = userService.getCurrentUser();
String signUrl = "";
String userNickname = "";
if(user!=null) {
signUrl = userService.createLogoutURL(req.getRequestURI());
userNickname = user.getNickname();
} else{
signUrl = userService.createLoginURL(req.getRequestURI());
}
String guestbookName = req.getParameter("guestbookName");
if(guestbookName == null) {
guestbookName = "default";
}
DatastoreService datastore = DatastoreServiceFactory. getDatastoreService();
Key guestbookKey= KeyFactory.createKey("Guestbook", guestbookName);
Query query = newQuery("Greeting", guestbookKey).addSort("date", Query.SortDirection.DESCENDING);
List<Entity> greetings = datastore.prepare(query).asList(FetchOptions.Builder. withLimit(5));
// put data tobedisplayed in JSP
req.setAttribute("signUrl", signUrl);
req.setAttribute("userNickname", userNickname);
req.setAttribute("guestbookName", guestbookName);
req.setAttribute("greetingList", greetings);
String templateFile = "/WEB-INF/jsp/guestbook.jsp";
RequestDispatcher rd = getServletContext().getRequestDispatcher(templateFile);
rd.forward(req, resp);
Put data in Request
Attribute
Forward to View
Login or Logout URL
Retrieve data from
datastore
/WEB-INF/jsp/guestbook.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<link type="text/css" rel="stylesheet" href="/stylesheets/main.css" />
</head>
<body>
<c:iftest="${userNickname!=''}">
<p>Hello, ${fn:escapeXml(userNickname)}! (You can <a href="${signUrl}">sign
out</a>.)</p>
</c:if>
<c:iftest="${userNickname==''}">
<p>Hello!
<a href="${signUrl}">Sign in</a>to include your name with greetings you post. </p>
</c:if>
<c:iftest="${empty greetingList}">
<p>Guestbook '${fn:escapeXml(guestbookName)}' has no messages.</p>
</c:if>
<c:iftest="${not empty greetingList}">
<p>Messages in Guestbook '${fn:escapeXml(guestbookName)}'. </p>
</c:if>
Taglib
Say proper hello to
sign in user
/WEB-INF/jsp/guestbook.jsp
<c:forEachitems="${greetingList}"var="greeting">
<c:iftest="${not empty greeting.properties['user']}">
<p><b>${fn:escapeXml(greeting.properties['user'].nickname)} </b>wrote:</p>
</c:if>
<c:iftest="${empty greeting.properties['user']}">
<p>An anonymous person wrote:</p>
</c:if>
<blockquote>${fn:escapeXml(greeting.properties['content'])} </blockquote>
</c:forEach>
<form action="/sign" method="post">
<div><textareaname="content" rows="3" cols="60"></textarea></div>
<div><input type="submit" value="Post Greeting" /></div>
<input type="hidden" name="guestbookName"
value="${fn:escapeXml(guestbookName)}"/>
</form>
</body>
</html>
Iterate Greeting List
Passed from Servlet
Form same as
previous
Maybe Next Time
•Using Guicein GAE/J
•Using GAE Python