Symfoware

Symfowareについての考察blog

jjserver java -jarで実行するときにクラスパスを含めたい

javaスクリプトでapiが記載できるpure javaなプログラムを考えてみました。
jjserver Pure Javaなapi確認用のwebサーバー

せっかくなのでデータベースにも接続したい。


クラスパス問題



javascriptでJDBCドライバを使用し、データベースへ接続する方法もばっちりです。
H2 Databaseでauto_incrementの値をJDBCで取得する

サーバーを起動するとき、

$ java -cp h2-1.4.195.jar -jar jjserver-0.1.jar

と起動すればJDBCドライバが読み込まれるだろうと思っていたのですが、
-jarオプションを指定して起動した場合、jarに含まれるクラスパス指定のみ有効で、
オプションでの指定は無視されるんですよ。


-jarで起動せず、こんな感じでmain関数を含むクラスを指定してやります。


$ java -cp jjserver-0.1.jar:h2-1.4.195.jar com.fc2.blog.symfoware.jjserver.MainProcess




これでjavascriptのファイルからもJDBCドライバを触ることが出来ました。




サンプル



せっかくデータベースに接続できるようになったので、簡単なtodoリストを作ってみます。

・index.html


  1. <!doctype html>
  2. <html lang="ja">
  3.     
  4. <html>
  5. <head>
  6.     <meta charset="UTF-8">
  7.     <title>jjserver</title>
  8.     <meta http-equiv="X-UA-Compatible" content="IE=edge">
  9. </head>
  10. <body>
  11.     <h3>jjserver apiサンプル</h3>
  12.     <!-- ここにタグの内容を反映 -->
  13.     <my-tag></my-tag>
  14. </body>
  15. <!-- ここからRiotプログラム -->
  16. <!-- カスタムタグ -->
  17. <script type="riot/tag">
  18. <my-tag>
  19.     <h3>TODO</h3>
  20.     <ul each={ row in items }>
  21.         <li>{ row.todo }<input type="button" value="削除" onclick={ del }></li>
  22.     </ul>
  23.     <input type="text" ref="post_input" value="">
  24.     <input type="button" value="追加" onclick={ add }>
  25. var self = this
  26. self.items = []
  27. getList(event) {
  28.     // todo一覧取得
  29.     const url = 'http://localhost:8080/api/todo/list'
  30.     fetch(url).then(function(response) {
  31.         return response.json()
  32.     }).then(function(json) {
  33.         self.update({items:json})
  34.     });
  35. }
  36. add(event) {
  37.     // todo 登録
  38.     const obj = {todo: self.refs.post_input.value}
  39.     const method = "POST"
  40.     const body = JSON.stringify(obj)
  41.     const headers = {
  42.         'Accept': 'application/json',
  43.         'Content-Type': 'application/json'
  44.     }
  45.     const url = 'http://localhost:8080/api/todo/add'
  46.     fetch(url, {method, headers, body}).then(function(response) {
  47.         return response.json();
  48.     }).then(function(json) {
  49.         self.update({items:json})
  50.     });
  51. }
  52. del(event) {
  53.     // todo 削除
  54.     const obj = {id: event.item.row.id}
  55.     const method = "POST"
  56.     const body = JSON.stringify(obj)
  57.     const headers = {
  58.         'Accept': 'application/json',
  59.         'Content-Type': 'application/json'
  60.     }
  61.     const url = 'http://localhost:8080/api/todo/del'
  62.     fetch(url, {method, headers, body}).then(function(response) {
  63.         return response.json();
  64.     }).then(function(json) {
  65.         self.update({items:json})
  66.     });
  67. }
  68. this.getList()
  69. </my-tag>
  70. </script>
  71. <!-- マウント -->
  72. <script src="https://cdnjs.cloudflare.com/ajax/libs/fetch/2.0.3/fetch.min.js"></script>
  73. <script src="https://cdnjs.cloudflare.com/ajax/libs/riot/3.8.1/riot+compiler.min.js"></script>
  74. <script>
  75. riot.mount('my-tag')
  76. </script>
  77.     
  78. </html>





・api/todo.js


  1. function createStatement() {
  2.     var url = "jdbc:h2:./data/sample"
  3.     var con = java.sql.DriverManager.getConnection(url)
  4.     var stmt = con.createStatement()
  5.     stmt.execute("CREATE TABLE IF NOT EXISTS todo (id INT auto_increment, val TEXT)")
  6.     return stmt
  7. }
  8. function list() {
  9.     stmt = createStatement()
  10.     var rs = stmt.executeQuery("SELECT * FROM todo")
  11.     var result = []
  12.     while(rs.next()){
  13.         result.push({id:rs.getInt('id'), todo:rs.getString('val')})
  14.     }
  15.     return JSON.stringify(result)
  16. }
  17. function add(req) {
  18.     
  19.     stmt = createStatement()
  20.     stmt.execute("INSERT INTO todo (val) VALUES ('" + req.todo + "')")
  21.     return list()
  22. }
  23. function del(req) {
  24.     stmt = createStatement()
  25.     stmt.execute("DELETE FROM todo WHERE id = " + req.id)
  26.     return list()
  27. }




828_01.gif

apiサーバーのサンプル、短くかけていい感じです。

関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2018/02/04(日) 22:43:00|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
次のページ