程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> Java開發者結合Node.js編程入門教程

Java開發者結合Node.js編程入門教程

編輯:JAVA編程入門知識

首先, 我必須得承認,作為一個有著十多年開發經驗的java開發者,我已經形成了解決絕大部分問題的固有套路,盡管它們很多時候顯得笨重和繁瑣。 比如說如果要讀取一個文件,那應該就是初始化一個BufferedReader 實例並傳入一個FileReader,這幾乎是順理成章的,我在很多自認為算得上“企業級”的項目中編寫這樣的代碼並且很享受這個過程,可以說我就是一個對其他語言不屑一顧的java腦殘粉。     

  如果你正在閱讀這篇博文,你可能已經陷入了我多年前早就陷入的一個誤區,作為一名合格的開發人員應該不斷地學習新的技術並且根據實際工作需求選用適 當的技術。盡管我一直在變老並且有朝一日可能會厭煩了java。但是我現在真的發現了一個激動人心的新東西,node.js對於我就像一個兒童得到一個新 奇的玩具,在這篇博文中,我將先向您展示如何使用Java EE創建一個簡單的Rest服務來讀取 MongoDB數據庫。然後我會用node.js來實現相同的功能,你會更容易了解到這種新的開發語言的激動人心之處。

從基礎開始——什麼是Node.js?

  首先,我要說明一點,Node.js不是那種“新潮時尚”,只有“潮人”才使用的語言。雖然它是本著這種認知開始,但是我很高興的報告給大 家,Node.js是一種成熟的語言——並且在當下這個互聯網時代,它已經找到了其自己的方式進入大型企業,支撐起一些最高流量的網站。Node.js是 你技能儲備當中的一個非常實用的工具,在構建穩定、安全和高性能的代碼上,其便捷度會令你大吃一驚。

  言而總之,Node是一種針對服務器端活動的語言。它使用了Javascript語言,並且有非常多的庫可用,比如npm模型。你可以把那些npm 模型比作Java中的.jar包。當你需要一部分功能,並且不喜歡自己全部編寫這部分代碼,極有可能在npm模型中已經提供了你正在尋找的特性。

  Node應用程序通常執行時需要實現效率最大化利用非阻塞 I/O 和異步事件。對於Java開發者來講需要知道的一點是Node應用運行單線程中。然而,後端節點代碼使用多個線程進行操作,如網絡和文件訪問。鑒於此,Node對於那些需要實時經驗的應用是完美的選擇。

繼續——IDE支持

  你可能會像我一樣,在IDE中“生存”和“呼吸”,這可能源於Java實在是太羅嗦了,需要我們在軟件開發過程中編寫恆定的代碼來完成功能。一旦我們找到 了代碼完成的好處,我們慢慢學會了使用 IDE 進行文件管理、 調試和其他非常有用的功能。可以這樣說,我喜歡使用一款IDE並且在使用Nodeb工作時繼續使用它。下面是當前最為第一批支持Node的IDE:

1.Eclipse——這應該很容易上手當你在Java中已經使用它。僅需要安裝Node.js插件即可。
2.JetBrains IntelliJ IDEA——一款非常流行的商業化的IDE。目前為止,這是我最喜歡的IDE。
3.Microsoft Visual Studio——是的,你沒看錯。Node已經成長到微軟在Visual Studio添加了對其的原生支持。這個實現非常穩定,並且VS是我第二喜歡的IDE。說來也怪,我使用VS僅僅用作一些基礎的Node項目。
4.CodeEnvy——一款基於web的IDE
5.Cloud9——一款基於web的IDE
6.SublimeText 2——沒有多余裝飾的文本編輯器,由於其輕量級,在開發者中的知名度越來越高。

這是我工作在Node基礎項目上的最喜歡的幾款IDE。僅僅做個舉例。

從一個范例開始

  在這篇博文的剩下部分裡,我們將要用Java EE和Node.js結合起來創建一個簡單的REST服務。這個REST服務將會簡單的從MongoDB數據庫裡面讀取信息並且返回這些結果給請求者。而 關於Java應用服務器和MongoDB數據庫的安裝和配置則不在本文的討論范圍之中。

創建我們的Java應用

  第一步:配置pom.xml文件

  我們把這個范例叫做restexample ,我將會使用JBoss EAP應用服務器。第一件我們要做的事情就是為使用Maven構建系統的依賴管理來配置我們的pom.xml文件。下面就是包含了我們這個restexample 應用裡面所需要的依賴的pom.xml文件:

<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>restexample</groupId>
    <artifactId>restexample</artifactId>
    <packaging>war</packaging>
    <version>1.0</version>
    <name>restexample</name>
    <repositories>
      <repository>
        <id>eap</id>
        <url>http://maven.repository.redhat.com/techpreview/all</url>
        <releases>
          <enabled>true</enabled>
        </releases>
        <snapshots>
          <enabled>true</enabled>
        </snapshots>
      </repository>
    </repositories>
    <pluginRepositories>
      <pluginRepository>
        <id>eap</id>
        <url>http://maven.repository.redhat.com/techpreview/all</url>
        <releases>
          <enabled>true</enabled>
        </releases>
        <snapshots>
          <enabled>true</enabled>
        </snapshots>
      </pluginRepository>
    </pluginRepositories>
    <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <maven.compiler.source>1.6</maven.compiler.source>
      <maven.compiler.target>1.6</maven.compiler.target>
    </properties>
    <dependencies>
      <dependency>
        <groupId>org.jboss.spec</groupId>
        <artifactId>jboss-javaee-6.0</artifactId>
        <version>3.0.2.Final-redhat-4</version>
        <type>pom</type>
        <scope>provided</scope>
      </dependency>
      <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongo-java-driver</artifactId>
        <version>2.9.1</version>
      </dependency>
      </dependencies>
    </project>

 酷,相當的詳細,但是我希望你們能夠理解裡面的代碼,在這篇博文中我假設讀者都已經了解Java,因此我不准備解釋裡面的細節了。

第二步:創建beans.xml文件並且設置我們的servlet映射

  作為范例的一部分,我們將會對我們的數據庫訪問類使用CDI(上下文依賴注入)。根據官方的CDI配置說明,一個應用要使用CDI的話就要在該應用的 WEB-INF 目錄裡面包含一個beans.xml文件。因此我們就來創建這個文件並且按照我們所需的信息來配置它。進入到你的 /src/main/webapp/WEB-INF 目錄然後創建一個 beans.xml文件,加入下面的代碼:

<?xml version="1.0"?>
<beans 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://jboss.org/schema/cdi/beans_1_0.xsd"/>

  我們也需要在 web.xml 文件裡面為我們的RESI API設置servlet映射。在 /src/main/webapp/WEB-INF 目錄的文件裡面加入下面的servlet映射元素:

<servlet-mapping>
  <servlet-name>javax.ws.rs.core.Application</servlet-name>
  <url-pattern>/ws/*</url-pattern>
</servlet-mapping>

第三步:創建DBConnection類

  到這一步,我們已經建立好項目並且我們的pom.xml文件已經包含了MongoDB數據庫的驅動依賴,記得要確保所需要的驅動已經被打包好在我們的應用裡面。下一件事我們就要創建一個類用來管理數據庫的連接。創建一個新的文件命名為 DBConneection.java,把這個文件放置到 /src/main/java/com/strongloop/data 目錄裡面,然後再這個文件裡面加入下面的代碼:

  注意:要確保你安裝MongoDB數據庫配置好適當的連接授權細節信息!

package com.strongloop.data;
 
import java.net.UnknownHostException;
 
import javax.annotation.PostConstruct;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Named;
 
import com.mongodb.DB;
import com.mongodb.Mongo;
 
@Named
@ApplicationScoped
public class DBConnection {
 
  private DB mongoDB;
 
  public DBConnection() {
    super();
  }
 
  @PostConstruct
  public void afterCreate() {
    String mongoHost = "127.0.0.1"
    String mongoPort = "27001"
    String mongoUser = "strongloop;
    String mongoPassword = "rocks";
    String mongoDBName = "restexample";
    int port = Integer.decode(mongoPort);
 
    Mongo mongo = null;
    try {
      mongo = new Mongo(mongoHost, port);
    } catch (UnknownHostException e) {
      System.out.println("Couldn't connect to MongoDB: " + e.getMessage()
          + " :: " + e.getClass());
    }
 
    mongoDB = mongo.getDB(mongoDBName);
 
    if (mongoDB.authenticate(mongoUser, mongoPassword.toCharArray()) == false) {
      System.out.println("Failed to authenticate DB ");
    }
 
  }
 
  public DB getDB() {
    return mongoDB;
  }
 
}

第四步:把數據導入到MongoDB中(mmmm啤酒)

在我們的項目中,我們想要加載所有名稱為Pabst的啤酒列表。如果你不熟悉啤酒行業,你可以試下Pabst Brewing公司生產的美式淡啤。這些啤酒上面帶有藍绶帶和柯爾特{敏感詞}圖案,他們包含所有的麥芽糖飲料種類。

首先你需要下載一個json文件,裡面包含需要返回的所有數據。你可以用下面的URL來實現這點:
https://dl.dropboxusercontent.com/u/72466829/beers.json

下載結束後,使用mongoimport命令把它導入到數據庫中,命令如下:

$ mongoimport --jsonArray -d yourDBName -c beers --type json --file /tmp/beers.json -h yourMongoHost --port yourMongoPort -u yourMongoUsername -p yourMongoPassword

你可以看到如下結果:

connected to: 127.0.0.1:27017
Tue Jun 10 20:09:55.436 check 9 24
Tue Jun 10 20:09:55.437 imported 24 objects

第5步: 創建Beer模型對象

  我們已經創建了一個數據庫連接類並且已經把啤酒信息載入到MongoDB數據庫裡了,是時候創建一個模型對象來控制我們的啤酒信息了。創建一個新文件,名為Beer.java並把它放到/src/main/java/com/strongloop/data目錄下。創建好該文件後,在其中添加如下代碼:

package com.strongloop.data;
 
public class Beer {
  private String id;
  private String name;
  private String description;
 
  public String getId() {
    return id;
  }
  public void setId(String id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getDescription() {
    return description;
  }
  public void setDescription(String description) {
    this.description = description;
  }
}

 注意: 提供好的JSON文件中包含了更多我們將會使用到的信息,所以可以找出來看看,並向其中添加一些額外的功能來拓寬你的學習經驗。

第6步: 創建REST服務

  猜猜看該干什麼了?不錯,我們終於准備好要創建基於REST的web服務了,它使我們可以獲取到上一個步驟當中載入進來的啤酒信息。為此,我們需要創建一個新的名為BeerWS.java的文件,並把它放到/src/main/java/com/strongloop/webservice目錄下。創建好之後,添加下列代碼:

package com.strongloop.webservice;
 
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import com.strongloop.data.DBConnection;
import com.strongloop.data.Beer;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
 
@RequestScoped
@Path("/beers")
public class BeerWS {
 
  @Inject
  private DBConnection dbConnection;
 
  private DBCollection getBeerCollection() {
    DB db = dbConnection.getDB();
    DBCollection beerCollection = db.getCollection("beers");
    return beerCollection;
  }
 
  private Beer populateBeerInformation(DBObject dataValue) {
    Beer theBeer = new Beer();
    theBeer.setName(dataValue.get("name"));
    theBeer.setDescription(dataValue.get("name"));
    theBeer.setId(dataValue.get("_id").toString());
 
    return theBeer;
  }
 
  // 獲取所有啤酒
  @GET()
  @Produces("application/json")
  public List<Beer> getAllBeers() {
    ArrayList<Beer> allBeersList = new ArrayList<Beer>();
 
    DBCollection beers = this.getBeerCollection();
    DBCursor cursor = beers.find();
    try {
      while (cursor.hasNext()) {
        allBeersList.add(this.populateBeerInformation(cursor.next()));
      }
    } finally {
      cursor.close();
    }
 
    return allBeersList;
  }
}

第7步: 浏覽著啤酒信息傻樂

  喔,搞定。我們已經寫好了一個REST服務,可以從數據庫中獲取所有的啤酒信息。現在把你的代碼部署到你的應用服務器吧, 在浏覽器中打開下列地址看看它是否工作正常:
http://yourserverlocation/ws/beers

  如果所有東西都正常,你將會看到所有的啤酒信息列表,如下圖所示:

創建 Node 應用

  如果你按照上面的步驟使用java進行編程,你會意識到使用javaEE創建應用盡管進展很快,但是創建一個類似REST服務的簡單應用還是很麻煩。不要誤解,我仍然很喜歡用javaEE,但是發現對於很多場景,比如創建返回json數據的REST服務,Node更適用。接下來,我們將要使用StrongLoop的LoopBack API創建一個簡單的web服務。另外,我會向你展示如何在蘋果OSX系統上安裝Node。

步驟1:安裝 Node

  最簡單的安裝Node的方式是通過一個兼容大部分操作系統的二進制包。打開浏覽器訪問下面的網頁,根據你的操作系統下載適用的版本:
http://nodejs.org/download/

  下載完成後,你會看到下面的內容:

如果你用的是Mac OSX,點擊通用的.pkg文件。這會把安裝程序保存到你本機中。下載了該文件之後,雙擊它就可以啟動安裝程序,你會看到下列安裝對話框:

一路默認的安裝下去,成功安裝之後,點擊close按鈕來退出安裝程序。

相當簡單,是吧?

步驟2:使用NPM安裝LoopBack

  現在本地系統中已經安裝了Node,接下來要安裝StroopLoop公司提供的LoopBack包。LoopBack是一個開放的API源碼包,當你學習使用Node開發、部署軟件時,LoopBack可以使編程更簡單。

  為了安裝LoopBack,我們要使用npm命令行,它是Node語言核心的一部分。NPM是一個官方的包管理工具,用於安裝應用程序依賴的類庫或模版。如果你是一名java程序員,你可以把NPM比作Maven。使用Maven構建項目,開發人員可以在pom.xml中配置項目依賴的jar包或模版。當項目開始編譯時,Maven會下載所有依賴的文件,並將jar包引入到項目中。NPM工作原理和Maven相同,對於一些特殊的項目,它使用package.json文件來配置項目依賴的文件。你也可以使用命令行方式將依賴的文件下載到本地系統中。如果這些內容你不理解,不要擔心,在接下來的步驟裡我們會詳細描述package.json文件。

  為了安裝LoopBack, 我們使用一個簡單的命令行來下載和安裝所有依賴的文件。打開你的window命令行窗口,輸入下面命令:

$ npm install -g strongloop

提示:安裝時,你可能需要使用其它用戶帳號來執行這個命令。

  這個命令行是什麼含義呢?-g參數表示告訴npm我們想要安裝strong-cli包。-g參數使這個包對任何系統和應用程序都兼容。一旦你運行了上面的命令,NPM會下載所有依賴的文件。下載的時間視網速而定,可能需要幾分鐘。

步驟3:創建應用程序

  使用LoopBack API創建一個應用程序很簡單。 打開你的window命令行窗口,使用下面的命令來創建一個新的應用程序restexample.

$ slc loopback

接下來它會提示輸入項目根路徑的名稱。 在這個示例中,使用restexample。 接下來它會提示輸入應用程序名稱。 使用默認值restexample。

slc命令現在已經創建一個名稱為restexample的LoopBack應用程序,並且已經配置了這個應用程序。 如果再次執行上面的命令,仍然使用restexample命名,LoopBack會創建一個新的目錄。 可以使用cd命令來修改應用程序的根路徑。

$ cd restexample

現在我們已經創建完一個應用程序,接下來我們將MongoDB配置為程序的數據源。

步驟4:定義數據源

為了連通MongoDB,我們需要給應用程序增加一個數據源,運行以下命令即可:

$ slc loopback:datasource

在彈出的提示符下,可以輸入任意自定義的數據源名稱,這裡選擇myMongo

[?] Enter the data-source name: myMongo

這樣我們就將後端的數據源定義附加到由StrongLoop支持的真實連接器上面.這裡我們從列表選擇MongoDB連接器.

[?] Select the connector for myMongo:
PostgreSQL (supported by StrongLoop)
Oracle (supported by StrongLoop)
Microsoft SQL (supported by StrongLoop)
MongoDB (supported by StrongLoop)
SOAP webservices (supported by StrongLoop)
REST services (supported by StrongLoop)
Neo4j (provided by community)
(Move up and down to reveal more choices)

步驟5:指向真實的數據源

  為了連通MongoDB,我們需要指向真實際的MongoDB實例.LoopBack在datasource.json文件中定義了所有的數據源配置信息.這個文件位於應用程序的root/server目錄.打開這個文件,按照如下的方式,為MongoDB增加一個數據源:

{
 
 "db": {
  "name": "db",
  "connector": "memory"
 },
 "myMongo": {
  "name": "myMongo",
  "connector": "mongodb"
  "url": "mongodb://localhost:27017/restexample"
 }
}

注意:要保證為MongoDB數據庫提供正確的 連接 URL.針對這個例子,我創建了一個名為 restexample 的數據庫,它用來作為數據源.

步驟6:導入數據到MongoDB(mmmmm 啤酒)

  就像本文Java部分說到的那樣,我們需要加載數據集到MongoDB數據庫中.如果你已經按照本文說到的方法完成了這個步驟,然後打算使用同一個數據庫,你可以忽略步驟6,直接跳到步驟7.

  首先,你需要下載一個包含所有要返回信息的JSON文件,可以從如下的URL獲取:
https://dl.dropboxusercontent.com/u/72466829/beers.json

  數據集文件下載完畢後,直接使用如下的mongoimport命令將它加載到數據庫:

$ mongoimport --jsonArray -d yourDBName -c beers --type json --file /tmp/beers.json -h yourMongoHost --port

  你應該可以看到如下的結果:

connected to: 127.6.189.2:27017
Tue Jun 10 20:09:55.436 check 9 24
Tue Jun 10 20:09:55.437 imported 24 objects

步驟7:創造我們自己的啤酒模型

  在Java世界裡,由此可以想到對象模型.它代表這一個對象,只是在這裡,這個對象是啤酒.LoopBack通過命令行,提供了一種創建模型對象的簡便方式.打開終端窗口,進入到工程文件夾,輸入如下命令:

$ slc loopback:model

這將會開啟一個交互式的會話來定義模型.首先需要輸入的是模型名稱,這裡輸入"beer".接下來會提示,這個模型應該附加到的數據源,這裡選擇之前創建的myMongo數據源.

[?] Enter the model name: beer
[?] Select the data-source to attach beer to:
db (memory)
myMongo (mongodb)

接下來提示,是否通過REST將此API暴露出來.當然,這裡希望這樣.

[?] Expose beer via the REST API? Yes

最後,為模型選擇網絡復數名,這裡模型名為beer,所以復數為beers(默認).敲擊Enter鍵接受默認值.

[?] Custom plural form (used to build REST URL):

接下來會提示定義模型屬性.對這個示例程序,我們關注名稱和對啤酒的描述.

Enter an empty property name when done.
[?] Property name: name

只要敲擊了Enter,就會提示輸入各個指定屬性的數據類型.第一個項是name,這裡選擇字符串類型.選擇字符串類型,然後敲擊

Enter.
[?] Property type: (Use arrow keys)
string
number
boolean
object
array
date
buffer
geopoint
(other)

接下來,按照同樣的方式創建description屬性,接著會要求輸入數據類型.它同樣是一個字符串類型,選擇字符串選項,然後敲擊

Enter.
Let's add another beer property.
Enter an empty property name when done.
[?] Property name: description
invoke loopback:property
[?] Property type: string
[?] Required? Yes

  祝賀!你已經使用LoopBack結合Node完成了模型對象的創建.如果想查看在這個過程中真正創建了什麼,可以打開位於應用程序root/common/models目錄的beer.json文件,滾動到這個文件的最後,將會看到如下模型:

{
 "name": "beer",
 "base": "PersistedModel",
 "properties": {
  "name": {
   "type": "string",
   "required": true
  },
  "description": {
   "type": "string",
   "required": true
  }
 },
 "validations": [],
 "relations": {},
 "acls": [],
 "methods": []
}

這裡可以看到,我們創建了一個模型,同時,name和description屬性已經賦予了這個模型.

在/server/model-config.js文件中,可以注意到,文件中包含一些額外的字段,包括public和datasource.其中public域指定我們希望通過一個REST網絡服務將此模型暴露給外部.datasource域則指定這個模型的CRUD操作將會用到的數據源.

"beer": {
  "dataSource": "myMongo",
  "public": true
 }

步驟8:沉浸在看到beers的喜悅中

  祝賀!你已經創建了第一個Node.js應用程序,其中包含可以獲取beer信息的REST網絡服務.最後,我們需要做的就是部署這個應用程序.

  慶幸的是,部署是已經很容易的事情.可以通過在應用程序根目錄執行如下命令來完成:

$ slc run

只要應用程序一運行,就可以通過浏覽器轉到如下的URL來確認部署是否成功:

http://0.0.0.0:3000/api/beers

相當酷,是不是?

LoopBack同時也包含了一個允許查看應用程序所有可用服務的頁面,包括Beer模型和我們創建的REST服務,將浏覽器指向如下的URL即可查看:

http://0.0.0.0:3000/explorer

頁面加載成功後,你會看到下面的界面,我們已經創建了beers節點作為博客的一部分,我把/beers端點進行高亮顯示了:

你可以點擊/beers來展開可供調用的API,你可以操作並測試一下,如下圖所示:

結論

 在這篇博文中,我展示了如何使用java EE 去創建一個rest服務,這個服務能夠返回Pabst啤酒公司的啤酒產品清單數據。 之後我又使用node.js以及基於node.js的loopback框架使用很少的代碼實現了相同功能的rest服務。 最重要的是,LoopBack API  還對beer實體的增刪查改提供了默認的實現,使得我們不用再寫一行代碼就得到了一個具有完整增刪查改功能的rest服務。

下面的清單對博文中涉及的javaEE和node.js各自特性進行一個對比:

Feature

Java EE

Node.js

完善的IDE支持

Yes, 多種IDE供選擇,包括 Eclipse, Sublime and Idea

Yes,  多種IDE供選擇, Visual Studio, Eclipse, Sublime

依賴管理

Maven

NPM

有企業級項目采用

Yes

Yes

龐大的組件生態系統

Yes

Yes

需要 JVM

Yes

No

通用開發框架

Spring, JEE

Express

數據庫支持

Yes

Yes

ORM 框架

Yes

Yes

測試框架

Yes

Yes

接下來的內容?

 即將發布的Node v0.12 將帶來至少8個激動人心的新特性,它們會是什麼呢?訪問 “What's New in Node.js v0.12” 頁面了解更多.
對Node相關的培訓和認證感興趣? StrongLoop 公司提供各種服務滿足您的需求。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved