vagrant上に Redisをインストールする
Redis
キーバリュー型のNoSQLデータベースらしいMongoDBとかちょっと違う感じのやつ
環境
vagrant上のCentOS7
インストール
epelインストール
sudo yum -y install epel-release
redisインストール
sudo yum -y install redis
バージョン確認
$ redis-cli -v redis-cli 2.8.19 $
自動起動して、起動
sudo systemctl enable redis sudo systemctl start redis
起動
$ redis-cli 127.0.0.1:6379> set test hoge1 OK 127.0.0.1:6379> get test "hoge1" 127.0.0.1:6379> 127.0.0.1:6379> set test2 aaaa OK 127.0.0.1:6379> 127.0.0.1:6379> keys * 1) "test2" 2) "test" 127.0.0.1:6379> 127.0.0.1:6379> exit $
外部から接続
ホストへredisをインストール
brew install redis
接続元編集
/etc/redis.conf
#bind 127.0.0.1 bind 0.0.0.0
※bindを変更する
接続元のredisを再起動
sudo systemctl restart redis
ホストより接続
$ redis-cli -h 192.168.33.10 192.168.33.10:6379> keys (error) ERR wrong number of arguments for 'keys' command 192.168.33.10:6379> keys * 1) "test2" 2) "test" 192.168.33.10:6379> 192.168.33.10:6379> get test "hoge1" 192.168.33.10:6379> 192.168.33.10:6379> get test2 "aaaa" 192.168.33.10:6379> exit $
所感
複雑なデータを管理するのには向かない感じだけどちょっとだけ残しておきたいデータを管理するのには役に立ちそう。
Spring Bootでセッション管理するのにつかうような記事が多かったのでこれを使ってみる。
MySQL5.7をvagrant上のCentOS7へインストール
インストールするもの
MySQL5.7.x
インストール
sudo yum -y localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm sudo yum -y install mysql-community-server
自動起動の設定して、起動する
sudo systemctl enable mysqld.service sudo systemctl start mysqld.service
初期パスワードを確認
sudo cat /var/log/mysqld.log ---- 2016-11-25T20:29:28.134584Z 1 [Note] A temporary password is generated for root@localhost: eudf/s_ak2oE ----
ほう、/var/log/mysqld.logに出力するようです。
仮パスワードでアクセスしてrootパスワードを変更
mysql -uroot -p ---- set password for root@localhost=password('Password123@'); ----
※パスワードの制限が結構厳しい
新しいユーザーを作成
mysql -uroot -p ---- GRANT ALL ON *.* TO 'app'@'%' IDENTIFIED BY 'Password123@' WITH GRANT OPTION; FLUSH PRIVILEGES; ----
新しいデータベースを作成
mysql -uroot -p ---- create database myapp; ----
macからクライアントでアクセス
クライアントのインストール
brew install mysql --client-only
アクセス
mysql -uapp -h 192.168.33.10 -p ---- mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | myapp | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec) mysql> use myapp; Database changed mysql> ----
できました(^^)
所感
機能が新しくなっていくにつれ対応が必要なのは仕方がない。
最新の機能や技術は知っておかないとあとで苦労することになるので…
きちんとCentOS7のことも調べておかないと…
Spring bootでHttpSessionを使用する
セッションを使用する
データが複数画面に跨ったり一定期間データを保持する必要があるデータの管理をすることがあるので…
イメージ
うん、適当だねw
やること
- コントローラーでセッションを使用する
- データを渡すフォーム系のクラスをシリアライズ化する
実装
src/main/java/HelloController.java
package com.example; import java.util.Date; import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import com.example.beans.TestForm; @Controller public class HelloController { @Autowired HttpSession session; @RequestMapping(value = {"/"}, method = {RequestMethod.GET}) public ModelAndView index(@ModelAttribute TestForm form) { // 生成 ModelAndView mv = new ModelAndView(); // テンプレートを指定 mv.setViewName("index"); // 日時を取得、設定 mv.addObject("now", new Date().toString()); // modelに設定して画面に表示するようにする mv.addObject("form", form); // 返却 return mv; } // POST用のパラメータを受け取る @RequestMapping(value = {"/formPost"}, method = {RequestMethod.POST}) public String postTest1( @ModelAttribute TestForm form) { // セッションへ保存 session.setAttribute("form", form); // リダイレクト return "redirect:/formPostView"; } // GET用のパラメータを受け取る @RequestMapping(value = {"/formPostView"}, method = {RequestMethod.GET}) public ModelAndView getTest1() { // 生成 ModelAndView mv = new ModelAndView(); // テンプレートを指定 mv.setViewName("test1/post"); // セッションを取得 TestForm form = (TestForm) session.getAttribute("form"); if(null != form){ // セッションよりデータを取得して設定 mv.addObject("form", form); } // セッションクリア session.invalidate(); // 返却 return mv; } }
※最後にセッションをクリアします
src/main/java/TestForm.java
package com.example.beans; import java.io.Serializable; public class TestForm implements Serializable{ /** * */ private static final long serialVersionUID = 4674112863194397526L; private String name; private String age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } }
src/main/resources/templates/test1/post.html
<!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Spring Sample Demo</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <h1>Spring Sample</h1> <div> Post Data </div> <br /> <form method="post" action="formPost"> <span>name: </span> <span th:if="${form} != null" th:text="${form.name}"></span> <br /> <span>age: </span> <span th:if="${form} != null" th:text="${form.age}"></span> <br /> </form> <a href="/">back</a> </body> </html>
実行
↓
リロードしたあと
所感
セッションのデータの扱いはそこまで複雑ではないかと期待する。
Javaになるとロードバランサとか絡んでいくのでセッションの関与もちょっとややこしいことになりそうだけど
扱い自体はそこまで手間をかけたくないので…
Spring Bootでリクエスト時の受け取るパラメータをクラスにする
リクエストパラメータを1つずつ書くのはちょっと手間がかかる
もう少し楽したい(^^)
こんな感じのクラスを用意
TestForm.java
package com.example.beans; public class TestForm { private String name; private String age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } }
※lombokを使用したかったけどわからなくなるのでやめた
コントローラー
HelloController.java
package com.example; import java.util.Date; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; import com.example.beans.TestForm; @Controller public class HelloController { @RequestMapping(value = {"/"}, method = {RequestMethod.GET}) public ModelAndView index(@ModelAttribute TestForm form) { // 生成 ModelAndView mv = new ModelAndView(); // テンプレートを指定 mv.setViewName("index"); // 日時を取得、設定 mv.addObject("now", new Date().toString()); // modelに設定して画面に表示するようにする mv.addObject("form", form); // 返却 return mv; } // POST用のパラメータを受け取る @RequestMapping(value = {"/formPost"}, method = {RequestMethod.POST}) public ModelAndView postTest1( @ModelAttribute TestForm form) { // 生成 ModelAndView mv = new ModelAndView(); // テンプレートを指定 mv.setViewName("test1/post"); // modelに設定して画面に表示するようにする mv.addObject("form", form); // 返却 return mv; } // GET用のパラメータを受け取る @RequestMapping(value = {"/formPost"}, method = {RequestMethod.GET}) public ModelAndView getTest1( @ModelAttribute TestForm form) { // 生成 ModelAndView mv = new ModelAndView(); // テンプレートを指定 mv.setViewName("test1/post"); // modelに設定して画面に表示するようにする mv.addObject("form", form); // 返却 return mv; } }
※ModelAttributeを使用するように変更
画面
index.html
<!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Spring Sample Demo</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <h1>Spring Sample</h1> <div> Spring Sample Test </div> <p>Now <span th:text="${now}"></span></p> <br /> <form method="post" action="formPost"> <span>name: </span> <input type="text" name="name" th:field="${form.name}" /> <br /> <span>age: </span> <input type="text" name="age" th:field="${form.age}" /> <br /> <input type="submit" value="send" /> </form> </body> </html>
post.html
<!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Spring Sample Demo</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <h1>Spring Sample</h1> <div> Post Data </div> <br /> <form method="post" action="formPost"> <span>name: </span> <span th:text="${form.name}"></span> <br /> <span>age: </span> <span th:text="${form.age}"></span> <br /> </form> </body> </html>
参考
Spring Bootでリクエストパラメータをオブジェクトで受け取る - かずきのBlog@hatena
Spring Boot触ってみる その2 ーController,テンプレートエンジン(Thymeleaf)ー - endokのブログ
所感
単純な受取が少しだけ楽になった感じ…
システムが複雑になるにつれて便利になっていくと思うので忘れないようにしたい。
Spring Bootで画面へ設定した入力を他の画面へ渡す
一般的画面遷移
入力→確認
入力画面を設定して、確認画面で内容を表示する
画面構成
/の場合のページ
<!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Spring Sample Demo</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <h1>Spring Sample</h1> <div> Spring Sample Test </div> <p>Now <span th:text="${now}"></span></p> <br /> <form method="post" action="formPost"> <span>name: </span> <input type="text" name="name" value="" /> <br /> <span>age: </span> <input type="text" name="age" value="" /> <br /> <input type="submit" value="send" /> </form> </body> </html>
/formPostの場合のページ
<!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Spring Sample Demo</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <h1>Spring Sample</h1> <div> Post Data </div> <br /> <form method="post" action="formPost"> <span>name: </span> <span th:text="${name}"></span> <br /> <span>age: </span> <span th:text="${age}"></span> <br /> </form> </body> </html>
コントローラー実装
package com.example; import java.util.Date; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; @Controller public class HelloController { @RequestMapping(value = {"/"}, method = {RequestMethod.GET}) public ModelAndView index() { // 生成 ModelAndView mv = new ModelAndView(); // テンプレートを指定 mv.setViewName("index"); // 日時を取得、設定 mv.addObject("now", new Date().toString()); // 返却 return mv; } // POST用のパラメータを受け取る @RequestMapping(value = {"/formPost"}, method = {RequestMethod.POST}) public ModelAndView postTest1( @RequestParam(value="name", required = true) String name, @RequestParam(value="age", required = true) String age) { // 生成 ModelAndView mv = new ModelAndView(); // テンプレートを指定 mv.setViewName("test1/post"); // modelに設定して画面に表示するようにする mv.addObject("name", name); mv.addObject("age", age); // 返却 return mv; } // GET用のパラメータを受け取る @RequestMapping(value = {"/formPost"}, method = {RequestMethod.GET}) public ModelAndView getTest1( @RequestParam(value="name", required = true) String name, @RequestParam(value="age", required = true) String age) { // 生成 ModelAndView mv = new ModelAndView(); // テンプレートを指定 mv.setViewName("test1/post"); // modelに設定して画面に表示するようにする mv.addObject("name", name); mv.addObject("age", age); // 返却 return mv; } }
実行
↓
GETパラメータ指定でも動く
参考
Spring Boot触ってみる その2 ーController,テンプレートエンジン(Thymeleaf)ー - endokのブログ
Spring MVC 4.0 No. 005 GETパラメータを受け取る - コンピュータクワガタ
うーん、ModelとModelAndViewの使い方はなんとなくわかったけど使い分けはわからない…
とりあえず、ModelAndViewを使っていこう…
JavaのSpring bootでthymeleafを使用する
直接HTMLを記載するわけにはいかない
いろいろなフレームワークではテンプレートを使用する
Maven設定
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
※「spring-boot-starter-thymeleaf」を追加
ソース設定
HelloController.java
package com.example; import java.util.Date; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HelloController { @RequestMapping("/") public String index(Model model) { // 日時を取得、設定 model.addAttribute("now", new Date().toString()); // テンプレートを指定 return "index"; } @RequestMapping("/test1") public String test1Index(Model model) { // テンプレートを指定 return "test1/index"; } }
※@RestControllerではテンプレートを使用しないので@Controllerに変更する
※アクションメソッドにModelを指定することで画面へ反映するオブジェクトを設定できる
※returnにはテンプレートのパスを設定する
テンプレート設定
src/main/resources/templates/index.html
<!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Spring Sample Demo</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <h1>Spring Sample</h1> <div> Spring Sample Test </div> <p>Now <span th:text="${now}"></span></p> <p> <a href="test1/">test1</a> </p> </body> </html>
src/main/resources/templates/test1/index.html
<!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Spring Sample Demo</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <h1>Spring Sample Test1/index</h1> <div> Spring Sample Test Test1/index </div> </body> </html>
結果
macにcompassを入れる
新しく購入
mac miniをお試し中
なんか起動がすでにおかしいけどw
環境が変わった
アップデート
sudo gem update --system
conpassインストール
sudo gem install -n /usr/local/bin compass
これでいいらしい
以前は
sudo gem install compass
でうまくいっていた気がしてたけど環境が変わると多少やり方が変わるのは仕方がない