とりあえずExpressを動かしてみる。
Node.jsのフレームワーク「Express」を動かしてみます。
package.jsonには以下のように記述します。
{ "name" : "MEAN", "version" : "0.0.1", "dependencies" : { "express" : "latest", "glup" : "latest" } }
で、server.js
を書きます。
var express = require('express'); var hasName = function(req, res, next) { if (req.param('name')) { next(); } else { res.send('What is your name?'); } }; var sayHello = function(req, res, next) { res.send('Hello ' + req.param('name')); }; //create new Express application object var app = express(); app.get('/', hasName, sayHello); //user() method to mount a middleware funtion with a specific path /* app.use('/', function(req, res) { res.send('Hello World'); }); */ app.listen(3000); console.log('Server running at http://localhost:3000'); module.exports = app;
これをnode server
で実行します。
NPMでGlobalモードでインストールしたパッケージはどこにインストールされるのか?
NPMには2つのインストールモードがあります。 ローカルモードとグローバルモードです。
Unixベースのシステムの場合、/usr/local/lib/node_modules/
にインストールされます。
Windowsの場合、C:¥Users¥%USERNAME%¥AppData¥Roaming¥npm¥node_modules
にインストールされます。
何か不安があるときは、とりあえずローカルモードでインストールするのがいいと思います。
npmでパッケージをインストールするときは、以下のコマンドを使います。
npm install express
バージョンを指定するときは、
npm install express@2.2
のようにコマンドを打ちます。
その他に、
npm uninstall
や、
npm update
コマンドがあります。
複数のパッケージを管理するには、package.jsonを使うのが一般的です。
アプリケーションのルートディレクトリに置きます。
こんな感じで書いておけば、npm install
で依存ファイルをまとめてインストールできます。
{ "name" : "MEAN", "version" : "0.0.1", "dependencies" : { "express" : "latest", "grunt" : "latest" } }
npm init
で作成するのが一般的です。
npmで手動インストールした情報をpackage.jsonに自動追加したいときは、
npm install <package> --save
としてください。
Macで8080番ポートでLISTENしているプロセスをkillするコマンド
以下のコマンドで、8080番ポートでLISTENしているプロセスをkillすることができます。
$ kill $(lsof -t -i:8080)
Spring Bootで画面遷移型アプリケーションを作成する
Spring Bootを使えば画面遷移型のアプリケーションも簡単に作ることができます。
テンプレートエンジンとして、次のライブラリがサポートされています。
- Thymeleaf
- FreeMarker
- Groovy templates
- Velocity
- Mustache
JSPの利用はさまざまな制約があるため、推奨されていないようです。
Spring Bootで画面遷移型アプリケーション
pom.xmlに以下の依存モジュールを追加します。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
次に、src/main/java
に以下のクラスを配置します。
RestaurantController.java
package com.example; import java.util.ArrayList; import java.util.List; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import con.example.tw.RestaurantBean; @Controller public class RestaurantController { final List<RestaurantBean> restaurantList = new ArrayList<RestaurantBean>(); public List<RestaurantBean> getRestaurants() { RestaurantBean bean = new RestaurantBean(); bean.setTagName("sampleTag"); bean.setTabelogUrl("https://www.google.com"); bean.setUserName("takashi"); bean.setTweet("this is nice restaurant!"); restaurantList.add(bean); return restaurantList; } @RequestMapping("/info") public String info(Model model) { model.addAttribute("title", "おいしいレストラン情報"); model.addAttribute("info", "This is Restaurant Infomation"); return "info"; } }
TemplateResolverがビュー名につけるプレフィックスとサフィックスのデフォルト値はそれぞれ"classpath:/templates/"と".html"になるため、 /src/main/resources/templates/info.htmlを配置します。
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="utf-8" /> <title th:text="${title}"></title> </head> <body> <p> <span th:text="${info}">Hello!</span> </p> </body> </html>
これで、localhost:8080/info にアクセスすると、
「This is Restaurant Infomation」
と表示されます。
Spring BootでRESTfull Webサービスを作成する
RESTful Web サービス
Spring Bootでは簡単にRESTful Webサービスを作成することができます。 RESTとは「REpresentational State Transfer」の略で、クライアントとサーバー間でデータをやりとりするアプリケーションを構築するためのアーキテクチャスタイルの一つです。
REST APIではデータベースなどで管理している情報の中からクライアントに提供する情報を「リソース」として抽出します。 これをResource Oriented Architectureといいます。
- Web上のリソースとして公開する
- URIでリソースを識別する
- HTTPメソッドによってリソースを操作する
- JSON,XMLなどの適切なフォーマットを使用する
- 適切なHTTPステータスコードを使用する
- ステートレスなクライアント/サーバ間の通信を行う
- 関連のあるリソースへリンクさせる
Spring BootでRestControllerを作成する
まず、デフォルトのDemoApplicationに
@SpringBootApplication
アノテーションがあることを確認しましょう。
@SpringBootApplicationアノテーションを付与したクラスのパッケージ配下がコンポーネントスキャンの対象になります。
では、以下のようなサンプルクラスを作成してみます。
package com.example; import java.util.ArrayList; import java.util.List; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import con.example.tw.RestaurantBean; @RestController @RequestMapping("log") public class RestaurantController { final List<RestaurantBean> restaurantList = new ArrayList<RestaurantBean>(); @RequestMapping(method = RequestMethod.GET) public List<RestaurantBean> getRestaurants() { RestaurantBean bean = new RestaurantBean(); bean.setTagName("sampleTag"); bean.setTabelogUrl("https://www.google.com"); bean.setUserName("takashi"); bean.setTweet("this is nice restaurant!"); restaurantList.add(bean); return restaurantList; } }
これで、localhost:8080/log
にリクエストを投げると、以下のようなJSONが返ってきます。
[{"tweet":"this is nice restaurant!","userName":"takashi","tagName":"sampleTag","tabelogUrl":"https://www.google.com"}]
Spring Bootで実行可能jarを作成する
実行可能jarを作成する
Spring Bootでは実行可能なjarを作成できます。
これはwarファイルをWebアプリケーションサーバにデプロイするといった面倒な作業を省き、java -jar
でWebアプリが起動できることを意味します。
実行可能jarの作り方は簡単です。 以下のコマンドを実行するだけです。
./mvnw clean package
以下のようなエラーが出たときはコンパイルのバージョンが異なっています。
$ ./mvnw clean package Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/maven/wrapper/MavenWrapperMain : Unsupported major.minor version 51.0 at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:637) at java.lang.ClassLoader.defineClass(ClassLoader.java:621) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) at java.net.URLClassLoader.access$000(URLClassLoader.java:58) at java.net.URLClassLoader$1.run(URLClassLoader.java:197) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Javaの対応表は以下の通り。
J2SE 8 = 52, J2SE 7 = 51, J2SE 6.0 = 50, J2SE 5.0 = 49, JDK 1.4 = 48, JDK 1.3 = 47, JDK 1.2 = 46, JDK 1.1 = 45
以下の記事が参考になります。 http://qiita.com/iwag@github/items/3f749010f0981195e2ba
java -version
で1.7以上を指定しても、mavenが見ているJavaが1.6だとエラーが出ます。
maven実行前にJAVA_HOMEを指定する必要があります。
$ JAVA_HOME=`/usr/libexec/java_home -v 1.8` ./mvnw clean package
これでjarを作成することができました。
[INFO] --- spring-boot-maven-plugin:1.4.3.RELEASE:repackage (default) @ demo --- [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 18.982 s [INFO] Finished at: 2017-01-02T11:59:45+09:00 [INFO] Final Memory: 29M/267M [INFO] ------------------------------------------------------------------------
targetディレクトリ以下にjarができています。