这个样例程序是一个最简单的基于servlet的java web应用,向用户输出一行包含该应用所运行环境的主机地址及端口的欢迎信息。旨在演示如何开发一个java web应用程序并将其部署到cloud foundry之上。
程序repository地址:https://github.com/SpringSource/cloudfoundry-samples/tree/master/hello-java
使用技术:Java,Servlet
程序位于"hello-java"根目录下,其中包含程序的源代码“src”目录及maven构建文件pom.xml。其目录结构如图:
可以看出这就是一个最简单的基于Servlet的java web应用,简单到连web页面文件都没有。
Servlet
HelloServlet.java 内容如下:
package org.cloudfoundry.samples;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/plain");
response.setStatus(200);
PrintWriter writer = response.getWriter();
writer.println("Hello from " + System.getenv("VCAP_APP_HOST") + ":" + System.getenv("VCAP_APP_PORT"));
writer.close();
}
}
在这个Servlet的doGet方法中,仅仅是简单地打印了一行hello信息作为web输出。需要注意的是,以下两处代码与通常的java程序不同
System.getenv("VCAP_APP_HOST")
System.getenv("VCAP_APP_PORT")
其分别获取该应用程序运行环境的主机地址及端口两个环境变量。只有当应用程序部署在cloud foundry上时,这两个环境变量才是可用的。
web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Hello Java</display-name>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>org.cloudfoundry.samples.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
这就是一个标准的Java web应用所必需的配置文件,在其中对servlet进行配置。相信大家只要对Java Web开发稍有了解,就不会对此感到陌生。
pom.xml文件
我们使用Maven来构建该应用,因此,在程序根目录 hello-java/ 下建立pom.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.cloudfoundry.samples</groupId>
<artifactId>hello-java</artifactId>
<version>1.0</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
同样,该POM文件也极简单。由于本人对Maven不甚了解,能力所限,不敢妄加解说。感兴趣者可参考Maven的相关资料进行学习。
构建应用
前提是已经安装好Maven。
在Linux下,使用cd命令进入应用的根目录,即 "hello-java",并运行命令
mvn clean package
这会在根目录内生成“target”子目录并在其中创建名为“hello-java-1.0.war”的war包。
运行应用
现在开始将构建好的web应用部署到cloud foundry上运行。前提是已经安装好VMC。
在Linux终端内运行以下命令指向目标环境:vmc target api.vcap.me
这里,我指向的是本机的dev_setup,也可指定 api.cloudfoundry.com 将真正的PaaS Cloud Foundry作为目标环境。
之后,进入target目录,运行以下命令进行应用的部署:
vmc push
注意,push之后没有参数则表示默认从当前目录push应用,这也是为何要先进入target目录。
之后,终端窗口会提示一系列问题:
Would you like to deploy from the current directory? [Yn]: y
Application Name: hello-java
Detected a Java Web Application, is this correct? [Yn]: y
Application Deployed URL [hello-java.vcap.me]:
Memory reservation (128M, 256M, 512M, 1G, 2G) [512M]: 256
How many instances? [1]:
Bind existing services to 'hello-java'? [yN]: n
Create services to bind to 'hello-java'? [yN]: n
Would you like to save this configuration? [yN]: n
Creating Application: OK
Uploading Application:
Checking for available resources: OK
Packing application: OK
Uploading (4K): OK
Push Status: OK
Staging Application 'hello-java': OK
Starting Application 'hello-java': OK
从中可以看出,该应用部署之后的访问url是 “hello-java.vcap.me” 。在浏览器中访问此url即可看到Servlet输出的欢迎信息了。