{"id":8929,"date":"2015-12-14T09:45:37","date_gmt":"2015-12-14T00:45:37","guid":{"rendered":"http:\/\/www.techscore.com\/blog\/?p=8929"},"modified":"2018-11-14T16:33:46","modified_gmt":"2018-11-14T07:33:46","slug":"ninja-micro-frame-work","status":"publish","type":"post","link":"https:\/\/www.techscore.com\/blog\/2015\/12\/14\/ninja-micro-frame-work\/","title":{"rendered":"\u30de\u30a4\u30af\u30ed\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u300cNinja\u300d\u3092\u4f7f\u3063\u3066\u307f\u308b"},"content":{"rendered":"<p>\u3053\u3093\u306b\u3061\u306f\u3001\u9577\u4e95\u3067\u3059\u3002<\/p>\n<p>\u3053\u308c\u306f <a href=\"\/blog\/2015\/11\/30\/techscore-advent-calendar-2015\/\">TECHSCORE Advent Calendar 2015<\/a> \u306e14\u65e5\u76ee\u306e\u8a18\u4e8b\u3067\u3059\u3002<\/p>\n<p>\u672c\u8a18\u4e8b\u3067\u306fJava\u306e\u30de\u30a4\u30af\u30ed\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u300c<a href=\"http:\/\/www.ninjaframework.org\/\" target=\"_blank\">Ninja<\/a>\u300d\u3092\u4f7f\u3063\u3066 Twetter \u306e\u30c4\u30a4\u30fc\u30c8\u3092\u691c\u7d22\u3059\u308b Web\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u308a\u307e\u3059\u3002<\/p>\n<p>\u30de\u30a4\u30af\u30ed\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3068\u306f\u4f55\u304b\u306b\u3064\u3044\u3066\u306f<a href=\"http:\/\/postd.cc\/java-micro-frameworks-the-new-trend-you-cant-ignore\/\" target=\"_blank\">\u3053\u3061\u3089<\/a>\u306e\u8a18\u4e8b\u3092\u3054\u89a7\u4e0b\u3055\u3044\u3002<\/p>\n<p>Ninja \u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u306f <a href=\"https:\/\/maven.apache.org\/what-is-maven.html\" target=\"_blank\">Maven<\/a> \u3067\u884c\u3044\u307e\u3059\u3002<br \/>\n\u4eca\u56de\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u4f5c\u6210\u306f Linux(<a href=\"https:\/\/www.archlinux.org\/\" target=\"_blank\">Arch Linux<\/a>) \u3067\u884c\u3044\u307e\u3057\u305f\u3002\u524d\u63d0\u3068\u3057\u3066 Java, Maven \u304c\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u308b\u3082\u306e\u3068\u3057\u307e\u3059\u3002\uff08\u53c2\u8003\u2026<a href=\"http:\/\/weblabo.oscasierra.net\/install-maven-32-windows\/\" target=\"_blank\">Windows\u74b0\u5883\u3067\u306eMaven\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u65b9\u6cd5<\/a>\uff09<\/p>\n<p>\u307e\u305a\u306f Maven \u3067\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"theme:dark-terminal lang:sh decode:true \" >\r\n$ mvn archetype:generate -DarchetypeGroupId=org.ninjaframework \\\r\n-DarchetypeArtifactId=ninja-servlet-archetype-simple\r\n<\/pre>\n<p>\u5e7e\u3064\u304b\u30d1\u30e9\u30e1\u30fc\u30bf\u5165\u529b\u3092\u4fc3\u3055\u308c\u307e\u3059\u304c<a href=\"http:\/\/www.ne.jp\/asahi\/hishidama\/home\/tech\/apache\/maven\/archetype.html\" target=\"_blank\">\u3053\u3053<\/a>\u3084<a href=\"http:\/\/www.techscore.com\/tech\/Java\/ApacheJakarta\/Maven\/2-2\/\" target=\"_blank\">\u3053\u3053<\/a>\u3092\u53c2\u8003\u306b\u5165\u529b\u3057\u307e\u3059\u3002\u4eca\u56de\u306f groupId \u306f\u300ccom.example\u300d, artifactId \u306f\u300cninjaSmp\u300d, version, package \u306f\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u307e\u307e\u300c 1.0-SNAPSHOT\u300d\u304a\u3088\u3073\u300ccom.example\u300d\u306b\u3057\u307e\u3057\u305f\u3002<\/p>\n<p>\u6b21\u306b\u4f5c\u6210\u3055\u308c\u305f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u79fb\u52d5\u3057\u3066\u30b3\u30f3\u30d1\u30a4\u30eb\u3092\u5b9f\u884c\u3057\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u8d77\u52d5\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"theme:dark-terminal lang:sh decode:true \" >\r\n$ cd ninjaSmp           # \u4f5c\u6210\u3055\u308c\u305f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\r\n$ mvn clean install     # \u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u30ed\u30fc\u30ab\u30eb\u30ea\u30dd\u30b8\u30c8\u30ea\u306b\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\r\n$ mvn ninja:run         # \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u8d77\u52d5<\/pre>\n<p><a href=\"https:\/\/www.techscore.com\/blog\/wp\/wp-content\/uploads\/2015\/12\/20151211001.png\" rel=\"facebox\" rel=\"attachment wp-att-8933\"><img loading=\"lazy\" src=\"https:\/\/www.techscore.com\/blog\/wp\/wp-content\/uploads\/2015\/12\/20151211001-300x121.png\" alt=\"20151211001\" width=\"300\" height=\"121\" class=\"alignnone size-medium wp-image-8933\" srcset=\"https:\/\/www.techscore.com\/blog\/wp\/wp-content\/uploads\/2015\/12\/20151211001-300x121.png 300w, https:\/\/www.techscore.com\/blog\/wp\/wp-content\/uploads\/2015\/12\/20151211001-768x310.png 768w, https:\/\/www.techscore.com\/blog\/wp\/wp-content\/uploads\/2015\/12\/20151211001.png 1000w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a>\uff08\u30af\u30ea\u30c3\u30af\u3067\u62e1\u5927\uff09<br \/>\n\u25b2\u30b3\u30f3\u30d1\u30a4\u30eb\u304c\u5b8c\u4e86\u3057\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u304c\u8d77\u52d5\u3057\u305f\u3068\u304d\u306e\u30b3\u30f3\u30bd\u30fc\u30eb<\/p>\n<p>\u300chttp:\/\/localhost:8080\u300d\u3067\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u30b5\u30f3\u30d7\u30eb\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3053\u3068\u304c\u51fa\u6765\u307e\u3059\u3002<\/p>\n<h2>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u4f5c\u6210<\/h2>\n<p>\u30b5\u30f3\u30d7\u30eb\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306b\u624b\u3092\u52a0\u3048\u3066\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b8c\u6210\u3055\u305b\u307e\u3059\u3002<br \/>\n\u4ee5\u964d\u3067\u898b\u308b\u30b3\u30fc\u30c9\u306f\u624b\u3092\u52a0\u3048\u305f\u5b8c\u6210\u5f8c\u306e\u3082\u306e\u3067\u3059\u3002<br \/>\n\u3068\u306f\u8a00\u3063\u3066\u3082\u624b\u3092\u3044\u308c\u308b\u5185\u5bb9\u306f\u305d\u308c\u307b\u3069\u306b\u591a\u304f\u3042\u308a\u307e\u305b\u3093\u3002<\/p>\n<p>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u968e\u5c64\u306f\u4ee5\u4e0b\u306e\u69d8\u306b\u306a\u308a\u307e\u3059\u3002Maven \u306e\u6a19\u6e96\u306b\u6e96\u62e0\u3057\u3066\u3044\u308b\u306e\u3067\u3053\u306e\u307e\u307e Eclipse \u7b49\u306e IDE \u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3068\u3057\u3066\u30a4\u30f3\u30dd\u30fc\u30c8\u3059\u308b\u4e8b\u3082\u53ef\u80fd\u3067\u3059\u3002<\/p>\n<pre class=\"theme:dark-terminal lang:sh decode:true \" >ninjaSamp\r\n\u2502\r\n\u251c\u2500\u2500 pom.xml\r\n\u251c\u2500\u2500 src\r\n\u2502     \u251c\u2500\u2500 main\r\n\u2502     \u2502     \u251c\u2500\u2500 java\r\n\u2502     \u2502     \u2502     \u251c\u2500\u2500 assets\r\n\u2502     \u2502     \u2502     \u2502     \u2514\u2500\u2500 css\r\n\u2502     \u2502     \u2502     \u2502         \u2514\u2500\u2500 custom.css\r\n\u2502     \u2502     \u2502     \u251c\u2500\u2500 conf\r\n\u2502     \u2502     \u2502     \u2502     \u251c\u2500\u2500 application.conf\r\n\u2502     \u2502     \u2502     \u2502     \u251c\u2500\u2500 messages.properties\r\n\u2502     \u2502     \u2502     \u2502     \u251c\u2500\u2500 Module.java\r\n\u2502     \u2502     \u2502     \u2502     \u2514\u2500\u2500 Routes.java\r\n\u2502     \u2502     \u2502     \u251c\u2500\u2500 controllers\r\n\u2502     \u2502     \u2502     \u2502     \u2514\u2500\u2500 ApplicationController.java\r\n\u2502     \u2502     \u2502     \u2514\u2500\u2500 views\r\n\u2502     \u2502     \u2502         \u251c\u2500\u2500 ApplicationController\r\n\u2502     \u2502     \u2502         \u2502     \u251c\u2500\u2500 collect.ftl.html\r\n\u2502     \u2502     \u2502         \u2502     \u2514\u2500\u2500 index.ftl.html\r\n\u2502     \u2502     \u2502         \u251c\u2500\u2500 layout\r\n\u2502     \u2502     \u2502         \u2502     \u251c\u2500\u2500 defaultLayout.ftl.html\r\n\u2502     \u2502     \u2502         \u2502     \u251c\u2500\u2500 footer.ftl.html\r\n\u2502     \u2502     \u2502         \u2502     \u2514\u2500\u2500 header.ftl.html\r\n\u2502     \u2502     \u2502         \u2514\u2500\u2500 system\r\n\u2502     \u2502     \u2502             \u251c\u2500\u2500 403forbidden.ftl.html\r\n\u2502     \u2502     \u2502             \u2514\u2500\u2500 404notFound.ftl.html\r\n\u2502     \u2502     \u2514\u2500\u2500 webapp\r\n\u2502     \u2502         \u2514\u2500\u2500 WEB-INF\r\n\u2502     \u2502             \u2514\u2500\u2500 web.xml\r\n\u2502     \u2514\u2500\u2500 test\r\n\u2502         \u2514\u2500\u2500 java\r\n\u2502             \u2514\u2500\u2500 controllers\r\n\u2502                 \u2514\u2500\u2500 ApiControllerDocTesterTest.java\r\n\u2514\u2500\u2500 target\r\n    \u251c\u2500\u2500 classes\r\n        \u2502\r\n           \uff1c\u4ee5\u4e0b\u7701\u7565\uff1e\r\n<\/pre>\n<p>conf\/ \u4ee5\u4e0b\u306b URL \u306e\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30e1\u30c3\u30bb\u30fc\u30b8\u30d7\u30ed\u30d1\u30c6\u30a3\u3001controllers\/ \u4ee5\u4e0b\u306b\u5404\u51e6\u7406\u3092\u5236\u5fa1\u3059\u308b\u30af\u30e9\u30b9\uff08\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\uff09\u304c\u3042\u308a\u307e\u3059\u3002<br \/>\n\u753b\u9762\u307e\u308f\u308a\u306e\u30d5\u30a1\u30a4\u30eb\u306fviews\/\u4ee5\u4e0b\u306b\u3042\u308a\u307e\u3059\u3002<br \/>\n\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u30a8\u30f3\u30b8\u30f3\u3068\u3057\u3066 <a href=\"http:\/\/freemarker.incubator.apache.org\/\" target=\"_blank\">Apache FreeMaker<\/a> \u304c\u5229\u7528\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<h2>\u624b\u3092\u52a0\u3048\u305f\u7b87\u6240<\/h2>\n<h3>Routes.java<\/h3>\n<pre class=\"lang:java decode:true \" >package conf;\r\n\r\n\r\nimport ninja.AssetsController;\r\nimport ninja.Router;\r\nimport ninja.application.ApplicationRoutes;\r\nimport controllers.ApplicationController;\r\n\r\npublic class Routes implements ApplicationRoutes {\r\n\r\n    @Override\r\n    public void init(Router router) {  \r\n        \r\n        router.GET().route(\"\/\").with(ApplicationController.class, \"index\");\r\n\r\n        \/\/ \u4eca\u56de\u8ffd\u52a0\u3057\u305f\u30b3\u30fc\u30c9\r\n        router.POST().route(\"\/collect\").with(ApplicationController.class, \"collect\");\r\n        router.GET().route(\"\/collect\").with(ApplicationController.class, \"collect\");\r\n\r\n        router.GET().route(\"\/hello_world.json\").with(ApplicationController.class, \"helloWorldJson\");\r\n        \r\n \r\n        \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n        \/\/ Assets (pictures \/ javascript)\r\n        \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/    \r\n        router.GET().route(\"\/assets\/webjars\/{fileName: .*}\").with(AssetsController.class, \"serveWebJars\");\r\n        router.GET().route(\"\/assets\/{fileName: .*}\").with(AssetsController.class, \"serveStatic\");\r\n        \r\n        \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n        \/\/ Index \/ Catchall shows index page\r\n        \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n        router.GET().route(\"\/.*\").with(ApplicationController.class, \"index\");\r\n    }\r\n\r\n}\r\n<\/pre>\n<p>URL \u306b\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u30af\u30e9\u30b9\u3068\u305d\u306e\u30e1\u30bd\u30c3\u30c9\u540d\u3092\u95a2\u9023\u4ed8\u3051\u3066\u3044\u307e\u3059\u3002\u4eca\u56de\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u30b5\u30f3\u30d7\u30eb\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306b URL \"\/collect\" \u3092\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<h3>ApplicationController.java<\/h3>\n<pre class=\"lang:java decode:true \" >package controllers;\r\n\r\nimport java.util.HashMap;\r\nimport java.util.List;\r\nimport java.util.Map;\r\n\r\nimport com.google.inject.Singleton;\r\n\r\nimport ninja.Result;\r\nimport ninja.Results;\r\nimport ninja.params.Param;\r\n\r\n@Singleton\r\npublic class ApplicationController {\r\n\r\n\tpublic Result index() {\r\n\r\n\t\tMap&lt;String, Object&gt; map = new HashMap&lt;&gt;();\r\n\t\tmap.put(\"m1\", \"Honour thy error as a hidden intention.\");\r\n\t\tmap.put(\"m2\", \"You don't have to be ashamed of using your own ideas\");\r\n\t\tmap.put(\"m3\", \"Use an unacceptable color\");\r\n\t\treturn Results.html().render(map).template(\"views\/ApplicationController\/index.ftl.html\");\r\n\r\n\t}\r\n\r\n\tpublic Result helloWorldJson() {\r\n\r\n\t\tSimplePojo simplePojo = new SimplePojo();\r\n\t\tsimplePojo.content = \"Hello World! Hello Json!\";\r\n\t\treturn Results.json().render(simplePojo);\r\n\r\n\t}\r\n\r\n\tpublic static class SimplePojo {\r\n\r\n\t\tpublic String content;\r\n\r\n\t}\r\n\r\n\tpublic Result collect(@Param(\"kwd\") String arg1) {\r\n\t\tTwitterPojo twitterPojo = new TwitterPojo();\r\n\t\tList&lt;String&gt; tweets = twitterPojo.collect(arg1);\r\n\t\tMap&lt;String, List&lt;String&gt;&gt; map = new HashMap&lt;&gt;();\r\n\t\tmap.put(\"tweets\", tweets);\r\n\t\treturn Results.html().render(map).template(\"views\/ApplicationController\/collect.ftl.html\");\r\n\t}\r\n\r\n}\r\n<\/pre>\n<p>\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u30af\u30e9\u30b9\u3002Routes.java \u3067URL \u3054\u3068\u306b\u8a2d\u5b9a\u3057\u305f\u30e1\u30bd\u30c3\u30c9\u306e\u672c\u4f53\u3067\u3059\u3002<br \/>\nResults\u30af\u30e9\u30b9\u306e html() \u30e1\u30bd\u30c3\u30c9\u304c Result\u30af\u30e9\u30b9\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u8fd4\u3059\u306e\u3067\u753b\u9762\u306b\u5f15\u304d\u6e21\u3057\u305f\u3044\u5024\u304c\u683c\u7d0d\u3055\u308c\u305f\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3068\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u540d\u3092\u6e21\u3057\u307e\u3059\u3002Results\u30af\u30e9\u30b9\u306e json()\u30e1\u30bd\u30c3\u30c9\u3067 JSON \u5f62\u5f0f\u306e\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u751f\u6210\u3059\u308b\u4e8b\u304c\u51fa\u6765\u307e\u3059\u3002<\/p>\n<p>\u30e1\u30bd\u30c3\u30c9\u306e\u5f15\u6570\u306b @Param \u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u6307\u5b9a\u3059\u308b\u3068\u3001\u30ea\u30af\u30a8\u30b9\u30c8\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3068\u3057\u3066\u53d6\u5f97\u3057\u307e\u3059\u3002<br \/>\n\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u306b\u306fValidation\u7528\u306e\u3082\u306e\u3082\u7528\u610f\u3055\u308c\u3066\u3044\u307e\u3059\u3002\uff08@Required \u3084 @isInteger \u7b49\uff09<\/p>\n<p>Validation \u3068\u3057\u3066<a href=\"http:\/\/docs.oracle.com\/javaee\/6\/tutorial\/doc\/gircz.html\" target=\"_blank\">JSR 303 Bean Validation<\/a>\u3092\u5229\u7528\u3059\u308b\u4e8b\u3082\u51fa\u6765\u307e\u3059\u3002\uff08\u4f7f\u3044\u65b9\u306f\u4e0b\u8a18\u306e\u30ea\u30f3\u30af\u5148\u53c2\u7167\uff09<\/p>\n<ul>\n<li><a href=\"http:\/\/yamkazu.hatenablog.com\/entry\/20110206\/1296985545\" target=\"_blank\">JSR 303 Bean Validation \u3067\u904a\u3093\u3067\u307f\u308b\u3088\uff01<\/a><\/li>\n<\/ul>\n<p>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306eURL\u201d\/collect\u201d\u306b\u30a2\u30af\u30bb\u30b9\u3055\u308c\u305f\u6642\u306fTwitter\u306e\u30c4\u30a4\u30fc\u30c8\u3092\u691c\u7d22\u3059\u308b\u30af\u30e9\u30b9\uff08TwitterPojo\uff09\u3092\u547c\u3073\u51fa\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<h3>TwitterPojo.java<\/h3>\n<pre class=\"lang:java decode:true \" >package controllers;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\nimport java.util.StringJoiner;\r\nimport java.util.StringTokenizer;\r\n\r\nimport com.google.common.collect.Lists;\r\n\r\nimport twitter4j.Query;\r\nimport twitter4j.QueryResult;\r\nimport twitter4j.Status;\r\nimport twitter4j.Twitter;\r\nimport twitter4j.TwitterException;\r\nimport twitter4j.TwitterFactory;\r\nimport twitter4j.auth.AccessToken;\r\n\r\npublic  class TwitterPojo {\r\n\r\n\tList&lt;String&gt; collect(String param) {\r\n\r\n\t\tif (param == null || param.length() == 0) {\r\n\t\t\treturn Lists.newArrayList();\r\n\t\t}\r\n\t\tTwitter twitter = new TwitterFactory().getInstance();\r\n\t\tString acsToken=\"{ACCESS_TOKESN}\";\r\n\t\tString acsTokenSecret=\"{ACCESS_TOKESN_SECRET}\";\r\n\t\tAccessToken accessToken = new AccessToken(acsToken, acsTokenSecret);\r\n\t\tString oauthCon =\"{CONSUMER_KEY}\";\r\n\t\tString oauthConSec= \"{CONSUMER_SECRET}\";\r\n\t\ttwitter.setOAuthConsumer(oauthCon, oauthConSec);\r\n\t\ttwitter.setOAuthAccessToken(accessToken);\r\n\r\n\t\tQuery query = new Query();\r\n\t\tquery.setQuery(param);\r\n\t\tQueryResult result = null;\r\n\t\tList&lt;String&gt; ret = new ArrayList&lt;&gt;();\r\n\t\t\/\/ Max 1500 tweets\r\n\t\tfor (int i = 1; i &lt;= 15; i++) {\r\n\t\t\ttry {\r\n\t\t\t\tresult = twitter.search(query);\r\n\t\t\t} catch (TwitterException e) {\r\n\t\t\t\te.printStackTrace();\r\n\t\t\t}\r\n\r\n\t\t\tfor (Status tweet : result.getTweets()) {\r\n\t\t\t\tString str = tweet.getText();\r\n\t\t\t\tStringJoiner sj = new StringJoiner(\":\", \"[\", \"]\");\r\n\t\t\t\tString u = tweet.getUser().getName();\r\n\t\t\t\tsj.add(u);\r\n\t\t\t\tStringTokenizer sta = new StringTokenizer(str);\r\n\t\t\t\twhile (sta.hasMoreTokens()) {\r\n\t\t\t\t\tString wk = sta.nextToken();\r\n\t\t\t\t\tif (wk.indexOf(\"#\") == -1 &amp;&amp; wk.indexOf(\"http\") == -1 &amp;&amp; wk.indexOf(\"RT\") == -1\r\n\t\t\t\t\t\t\t&amp;&amp; wk.indexOf(\"@\") == -1) {\r\n\t\t\t\t\t\tsj.add(wk);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tret.add(sj.toString());\r\n\t\t\t}\r\n\t\t\tif (result.hasNext()) {\r\n\t\t\t\tquery = result.nextQuery();\r\n\t\t\t} else {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn ret;\r\n\t}\r\n}<\/pre>\n<p>Twitter \u3092\u691c\u7d22\u3059\u308b\u70ba\u306b <a href=\"http:\/\/twitter4j.org\/ja\/index.html\" target=\"_blank\">Twitter4J<\/a> \u3092\u4f7f\u3063\u3066\u3044\u307e\u3059\u3002<br \/>\n\u3053\u306e\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u4f7f\u3046\u3068\u7c21\u5358\u306b TwitterAPI \u7d4c\u7531\u3067\u30c4\u30a4\u30fc\u30c8\u3092\u53d6\u5f97\u3059\u308b\u4e8b\u304c\u51fa\u6765\u307e\u3059\u3002<\/p>\n<h2>\u753b\u9762\u307e\u308f\u308a<\/h2>\n<h3>index.ftl.html<br \/>\n<\/h3>\n<pre class=\"theme:twilight lang:js decode:true \" >&lt;#import \"..\/layout\/defaultLayout.ftl.html\" as layout&gt; \r\n&lt;@layout.myLayout \"Home page\"&gt;    \r\n\r\n\r\n&lt;h1&gt;${i18n(\"hello.world\")}&lt;\/h1&gt;\r\n&lt;ol&gt;\r\n&lt;li&gt;${m1}&lt;\/li&gt;\r\n&lt;li&gt;${m2}&lt;\/li&gt;\r\n&lt;li&gt;${m3}&lt;\/li&gt;\r\n&lt;\/ol&gt;\r\n&lt;br\/&gt;\r\n&lt;br\/&gt;\r\n&lt;br\/&gt;\r\n&lt;p&gt;${i18n(\"hello.world.json\")}&lt;\/p&gt;\r\n&lt;a href=\"\/hello_world.json\"&gt;Click&lt;\/a&gt;\r\n\r\n&lt;\/@layout.myLayout&gt;<\/pre>\n<p>\u30c8\u30c3\u30d7\u753b\u9762\u3067\u3059\u3002<br \/>\n\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30af\u30e9\u30b9\u3067\u8a2d\u5b9a\u3057\u305f\u5024\u3092\u8868\u793a\u3057\u30e1\u30c3\u30bb\u30fc\u30b8\u306f\u30d7\u30ed\u30d1\u30c6\u30a3\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u53d6\u5f97\uff08${i18n(\"...\")})\u3057\u3066\u3044\u307e\u3059\u3002<br \/>\n\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u30b5\u30f3\u30d7\u30eb\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u5c11\u3057\u5909\u66f4\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<h3>collect.ftl.html<\/h3>\n<pre class=\"theme:twilight lang:js decode:true \" >&lt;#import \"..\/layout\/defaultLayout.ftl.html\" as layout&gt; \r\n&lt;@layout.myLayout \"Home page\"&gt;    \r\n\r\n\r\n&lt;h1&gt;${i18n(\"hello.collect\")}&lt;\/h1&gt;\r\n&lt;form method=\"POST\" action=\"\/collect\"&gt;\r\n&lt;input type=\"text\" value=\"\" name=\"kwd\" placeholder=\"${i18n(\"keyword.hint\")}\" size=\"25\" \/&gt;&amp;nbsp; &lt;input type=\"submit\" value=\"collect tweets\"\/&gt;\r\n&lt;\/br&gt;\r\n&lt;\/br&gt;\r\n&lt;table&gt;\r\n\t&lt;#list tweets as tweet&gt;\r\n\t&lt;tr&gt;&lt;td&gt;${tweet}&lt;\/td&gt;&lt;\/tr&gt;\r\n\t&lt;#else&gt;\r\n\t&lt;tr&gt;&lt;td&gt;0 item&lt;\/td&gt;&lt;\/tr&gt;\r\n\t&lt;\/#list&gt;\r\n&lt;\/table&gt;\r\n&lt;br\/&gt;\r\n&lt;br\/&gt;\r\n&lt;p&gt;${i18n(\"hello.world.json\")}&lt;\/p&gt;\r\n&lt;a href=\"\/hello_world.json\"&gt;Click&lt;\/a&gt;\r\n\r\n\r\n&lt;\/@layout.myLayout&gt;<\/pre>\n<p>Twitter \u306e\u691c\u7d22\u30ef\u30fc\u30c9\u3092\u5165\u529b\u3059\u308b\u30d5\u30a9\u30fc\u30e0\u3068\u7d50\u679c\u306e\u8868\u793a\u9818\u57df\u3067\u3059\u3002<\/p>\n<h3>Message.properties<\/h3>\n<pre class=\"lang:default decode:true \" >header.title=TweetCollector\r\nheader.home=Home\r\nhello.world=Ninja\u3067\u4f5c\u3063\u305f\u753b\u9762\u306b\u3088\u3046\u3053\u305d\u3002\r\nhello.world.json=Json\u3067\u51fa\u529b\r\nhello.collect=\u805e\u3044\u3066\u307f\u3088\u3046\u3002\r\nkeyword.hint=\u691c\u7d22\u3057\u305f\u3044\u5358\u8a9e\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\r\n<\/pre>\n<p>\u753b\u9762\u306b\u8868\u793a\u3059\u308b\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u8a18\u8f09\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<h2>Web\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b<\/h2>\n<h3>\u30db\u30fc\u30e0\u753b\u9762<\/h3>\n<p><a href=\"https:\/\/www.techscore.com\/blog\/wp\/wp-content\/uploads\/2015\/12\/20151211003.png\" rel=\"facebox\" rel=\"attachment wp-att-9269\"><img loading=\"lazy\" src=\"https:\/\/www.techscore.com\/blog\/wp\/wp-content\/uploads\/2015\/12\/20151211003.png\" alt=\"20151211003\" width=\"818\" height=\"421\" class=\"alignnone size-full wp-image-9269\" srcset=\"https:\/\/www.techscore.com\/blog\/wp\/wp-content\/uploads\/2015\/12\/20151211003.png 818w, https:\/\/www.techscore.com\/blog\/wp\/wp-content\/uploads\/2015\/12\/20151211003-300x154.png 300w, https:\/\/www.techscore.com\/blog\/wp\/wp-content\/uploads\/2015\/12\/20151211003-768x395.png 768w\" sizes=\"(max-width: 818px) 100vw, 818px\" \/><\/a><br \/>\nApplicationController\u3067\u6307\u5b9a\u3055\u308c\u305f\u5024\u304c\u8868\u793a\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<h3>Tweet \u691c\u7d22\u753b\u9762<\/h3>\n<p><a href=\"https:\/\/www.techscore.com\/blog\/wp\/wp-content\/uploads\/2015\/12\/20151211004.png\" rel=\"facebox\" rel=\"attachment wp-att-9271\"><img loading=\"lazy\" src=\"https:\/\/www.techscore.com\/blog\/wp\/wp-content\/uploads\/2015\/12\/20151211004.png\" alt=\"20151211004\" width=\"818\" height=\"421\" class=\"alignnone size-full wp-image-9271\" srcset=\"https:\/\/www.techscore.com\/blog\/wp\/wp-content\/uploads\/2015\/12\/20151211004.png 818w, https:\/\/www.techscore.com\/blog\/wp\/wp-content\/uploads\/2015\/12\/20151211004-300x154.png 300w, https:\/\/www.techscore.com\/blog\/wp\/wp-content\/uploads\/2015\/12\/20151211004-768x395.png 768w\" sizes=\"(max-width: 818px) 100vw, 818px\" \/><\/a><\/p>\n<h3>Tweet \u691c\u7d22\u753b\u9762\uff08\u7d50\u679c\u8868\u793a\uff09<\/h3>\n<p><a href=\"https:\/\/www.techscore.com\/blog\/wp\/wp-content\/uploads\/2015\/12\/20151211005.png\" rel=\"facebox\" rel=\"attachment wp-att-9272\"><img loading=\"lazy\" src=\"https:\/\/www.techscore.com\/blog\/wp\/wp-content\/uploads\/2015\/12\/20151211005.png\" alt=\"20151211005\" width=\"802\" height=\"910\" class=\"alignnone size-full wp-image-9272\" srcset=\"https:\/\/www.techscore.com\/blog\/wp\/wp-content\/uploads\/2015\/12\/20151211005.png 802w, https:\/\/www.techscore.com\/blog\/wp\/wp-content\/uploads\/2015\/12\/20151211005-264x300.png 264w, https:\/\/www.techscore.com\/blog\/wp\/wp-content\/uploads\/2015\/12\/20151211005-768x871.png 768w\" sizes=\"(max-width: 802px) 100vw, 802px\" \/><\/a><br \/>\n\u300cTECHSCORE\u300d\u3067\u691c\u7d22\u3057\u3066\u307f\u307e\u3057\u305f\u3002<\/p>\n<h2>\u307e\u3068\u3081<\/h2>\n<p>Ninja \u306f\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3068\u3057\u3066\u8efd\u91cf\u5316\u304c\u56f3\u3089\u308c\u3066\u3044\u308b\u306e\u3067\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u307e\u3067\u306b\u8981\u3059\u308b\u6642\u9593\u306f\u6570\u5206\u3067\u3057\u305f\u3002<\/p>\n<p>\u30ef\u30f3\u30a2\u30a4\u30c7\u30a2\u3092 Web\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u3059\u3050\u306b\u52d5\u304b\u3057\u3066\u898b\u305f\u3044\u6642\u306b\u6e96\u5099\u306b\u6642\u9593\u304c\u304b\u304b\u3089\u306a\u3044\u3068\u3044\u3046\u4e8b\u306f\u91cd\u8981\u3067\u3059\u3002<\/p>\n<p>\u8fc5\u901f\u304b\u3064\u7c21\u5358\u306b\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u69cb\u7bc9\u3067\u304d\u308b\u30de\u30a4\u30af\u30ed\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306b\u306f\u4ed6\u306b\u3082\u300c<a href=\"http:\/\/sparkjava.com\/\" target=\"_blank\">Spark<\/a>\u300d\u300c<a href=\"http:\/\/www.slimframework.com\/\" target=\"_blank\">Slim<\/a>\u300d\u7b49\u304c\u3042\u308a\u4e00\u3064\u306e\u30c8\u30ec\u30f3\u30c9\u306b\u306a\u3063\u3066\u304d\u3066\u3044\u308b\u306e\u304b\u3082\u77e5\u308c\u307e\u305b\u3093\u3002<\/p>\n<p>\u305d\u308c\u3067\u306f\uff01<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u3053\u3093\u306b\u3061\u306f\u3001\u9577\u4e95\u3067\u3059\u3002<\/p>\n<p>\u3053\u308c\u306f TECHSCORE Advent Calendar 2015 \u306e14\u65e5\u76ee\u306e\u8a18\u4e8b\u3067\u3059\u3002<\/p>\n<p>\u672c\u8a18\u4e8b\u3067\u306fJava\u306e\u30de\u30a4\u30af\u30ed\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u300cNinja\u300d\u3092\u4f7f\u3063\u3066 Twetter \u306e\u30c4\u30a4\u30fc\u30c8\u3092\u691c\u7d22\u3059\u308b Web\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u308a\u307e\u3059\u3002<br \/><a href=\"https:\/\/www.techscore.com\/blog\/2015\/12\/14\/ninja-micro-frame-work\/\">\u7d9a\u304d\u3092\u8aad\u3080...<\/a><\/p>\n","protected":false},"author":26,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[215,18],"tags":[141,216,57,123],"_links":{"self":[{"href":"https:\/\/www.techscore.com\/blog\/wp-json\/wp\/v2\/posts\/8929"}],"collection":[{"href":"https:\/\/www.techscore.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.techscore.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.techscore.com\/blog\/wp-json\/wp\/v2\/users\/26"}],"replies":[{"embeddable":true,"href":"https:\/\/www.techscore.com\/blog\/wp-json\/wp\/v2\/comments?post=8929"}],"version-history":[{"count":136,"href":"https:\/\/www.techscore.com\/blog\/wp-json\/wp\/v2\/posts\/8929\/revisions"}],"predecessor-version":[{"id":9270,"href":"https:\/\/www.techscore.com\/blog\/wp-json\/wp\/v2\/posts\/8929\/revisions\/9270"}],"wp:attachment":[{"href":"https:\/\/www.techscore.com\/blog\/wp-json\/wp\/v2\/media?parent=8929"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.techscore.com\/blog\/wp-json\/wp\/v2\/categories?post=8929"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.techscore.com\/blog\/wp-json\/wp\/v2\/tags?post=8929"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}