forked from zhangshun2014/jcalaBlog
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdata.sql
More file actions
15 lines (8 loc) · 58 KB
/
data.sql
File metadata and controls
15 lines (8 loc) · 58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*Data for the table `admin` */
insert into `admin`(`username`,`password`,`email`,`github`,`twitter`,`md`,`resume`,`avatar`) values ('jcala','21232f297a57a5a743894a0e4a801fc3','#','#','#','### 联系方式\r\n- **Email:** jcalaz@163.com\r\n- ** QQ:** 1142966796\r\n\r\n---\r\n\r\n###个人信息\r\n- **姓名:** 左志鹏\r\n- **性别:** 男\r\n- **学历:** 西南交通大学(2013-2017)本科,信息科学与技术学院电科专业\r\n- **技术博客:** http://www.jcala.me\r\n- **Github:** https://github.com/jcalaz\r\n- **工作年限:** 半年\r\n- **期望职位:**java web开发工程师,java后端工程师\r\n- **期望城市:**成都,天津\r\n\r\n---\r\n\r\n###优势\r\n\r\n\r\n---\r\n\r\n\r\n','<h3 id=\"h3-u8054u7CFBu65B9u5F0F\"><a name=\"联系方式\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>联系方式</h3><ul>\r\n<li><strong>Email:</strong> <a href=\"mailto:jcalaz@163.com\">jcalaz@163.com</a></li><li><strong> QQ:</strong> 1142966796</li></ul>\r\n<hr>\r\n<h3 id=\"h3-u4E2Au4EBAu4FE1u606F\"><a name=\"个人信息\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>个人信息</h3><ul>\r\n<li><strong>姓名:</strong> 左志鹏</li><li><strong>性别:</strong> 男</li><li><strong>学历:</strong> 西南交通大学(2013-2017)本科,信息科学与技术学院电科专业</li><li><strong>技术博客:</strong> <a href=\"http://www.jcala.me\">http://www.jcala.me</a></li><li><strong>Github:</strong> <a href=\"https://github.com/jcalaz\">https://github.com/jcalaz</a></li><li><strong>工作年限:</strong> 半年</li><li><strong>期望职位:</strong>java web开发工程师,java后端工程师</li><li><strong>期望城市:</strong>成都,天津</li></ul>\r\n<hr>\r\n<h3 id=\"h3-u4F18u52BF\"><a name=\"优势\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>优势</h3><hr>\r\n','/img/avatar.jpg');
/*Data for the table `blog_view` */
insert into `blog_view`(`vid`,`date`,`title`,`article`,`tags`,`md`) values (23,'2016-09-10','springBoot整合mybatis','<h4 id=\"h4--mybatis-\"><a name=\"为什么使用Mybatis?\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>为什么使用Mybatis?</h4><blockquote>\r\n<p>Mybatis是目前很火的SSM框架中的ORM组件,相比Hibernate更加灵活小巧,学习成本也更低,我觉得可维护性也更好些。</p>\r\n</blockquote>\r\n<p>但是spring boot官方更只提供了自家的spring data jpa及hibernate的整合方案,而没有给出Mybatis的整合组件。于是上Github,发现了Mybatis提供了它的spring-boot-starter。</p>\r\n<h2 id=\"h2-u6574u5408u65B9u6CD5\"><a name=\"整合方法\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>整合方法</h2><ol>\r\n<li><h4 id=\"h4-gradle-\"><a name=\"gradle中加入依赖\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>gradle中加入依赖</h4><pre class=\"prettyprint linenums prettyprinted\"><ol class=\"linenums\"><li class=\"L0\"><code class=\"lang-groovy\"><span class=\"pln\">compile</span><span class=\"pun\">(</span><span class=\"str\">\"org.mybatis.spring.boot:mybatis-spring-boot-starter:1.1.1\"</span><span class=\"pun\">)</span></code></li></ol></pre>\r\n<h6 id=\"h6-spring-boot-mybatis-spring-boot-starter-mybatis-mybatis-spring-\"><a name=\"spring.boot:mybatis-spring-boot-starter中已经包含了对mybatis和mybatis-spring的依赖\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>spring.boot:mybatis-spring-boot-starter中已经包含了对mybatis和mybatis-spring的依赖</h6></li><li><h4 id=\"h4--application-yml-mybatis\"><a name=\"在application.yml中配置mybatis\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>在application.yml中配置mybatis</h4><pre class=\"prettyprint linenums prettyprinted\"><ol class=\"linenums\"><li class=\"L0\"><code><span class=\"pln\">mybatis</span><span class=\"pun\">:</span></code></li><li class=\"L1\"><code><span class=\"pln\"> </span><span class=\"com\">#指定mapper和domain(实体)所在的包</span></code></li><li class=\"L2\"><code><span class=\"pln\"> type</span><span class=\"pun\">-</span><span class=\"pln\">aliases</span><span class=\"pun\">-</span><span class=\"kwd\">package</span><span class=\"pun\">:</span><span class=\"pln\"> me</span><span class=\"pun\">.</span><span class=\"pln\">jcala</span><span class=\"pun\">.</span><span class=\"pln\">blog</span><span class=\"pun\">.</span><span class=\"pln\">domain</span><span class=\"pun\">,</span><span class=\"pln\">me</span><span class=\"pun\">.</span><span class=\"pln\">jcala</span><span class=\"pun\">.</span><span class=\"pln\">blog</span><span class=\"pun\">.</span><span class=\"pln\">mapping</span></code></li><li class=\"L3\"><code><span class=\"pln\"> </span><span class=\"com\">#指定使用的类型转换器</span></code></li><li class=\"L4\"><code><span class=\"pln\"> type</span><span class=\"pun\">-</span><span class=\"pln\">handlers</span><span class=\"pun\">-</span><span class=\"kwd\">package</span><span class=\"pun\">:</span><span class=\"pln\"> org</span><span class=\"pun\">.</span><span class=\"pln\">apache</span><span class=\"pun\">.</span><span class=\"pln\">ibatis</span><span class=\"pun\">.</span><span class=\"pln\">type</span><span class=\"pun\">.</span><span class=\"typ\">LocalDateTypeHandler</span></code></li></ol></pre><p>除此之外mybatis还提供了一下配置</p>\r\n<pre class=\"prettyprint linenums prettyprinted\"><ol class=\"linenums\"><li class=\"L0\"><code><span class=\"pln\">mybatis</span><span class=\"pun\">:</span></code></li><li class=\"L1\"><code><span class=\"pln\"> config</span><span class=\"pun\">-</span><span class=\"pln\">location</span><span class=\"pun\">:</span><span class=\"pln\"> </span><span class=\"com\">#mybatis的xml注册文件位置</span></code></li><li class=\"L2\"><code><span class=\"pln\"> mapper</span><span class=\"pun\">-</span><span class=\"pln\">locations</span><span class=\"pun\">:</span><span class=\"pln\"> </span><span class=\"com\">#Mapper xml config files (optional)</span></code></li><li class=\"L3\"><code><span class=\"pln\"> executor</span><span class=\"pun\">-</span><span class=\"pln\">type</span><span class=\"pun\">:</span><span class=\"pln\"> </span><span class=\"com\">#执行类型为: SIMPLE, REUSE还是BATCH</span></code></li><li class=\"L4\"><code><span class=\"pln\"> configuration</span><span class=\"pun\">:</span><span class=\"pln\"> </span><span class=\"com\">#mybatis的其他配置</span></code></li></ol></pre></li><li><h4 id=\"h4--spring-boot-datasource\"><a name=\"在Spring Boot中配置好数据源DataSource\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>在Spring Boot中配置好数据源DataSource</h4>可以使用任意数据源,mybatis会自动使用spring boot中所配置的数据库连接池</li></ol>\r\n<p>以上就完成了spring boot对mybatis的整合,超级简单啊</p>\r\n<h2 id=\"h2-u6D4Bu8BD5u4E00u4E0B\"><a name=\"测试一下\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>测试一下</h2><p>因为在type-aliases-package: me.jcala.blog.domain,me.jcala.blog.mapping中指定的mapping扫描包为me.jcala.blog.mapping,所以要把写的mapper放到me.jcala.blog.mapping包下。</p>\r\n<h4 id=\"h4--me-jcala-blog-mapping-testmapper-\"><a name=\"在me.jcala.blog.mapping下新建一个TestMapper接口\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>在me.jcala.blog.mapping下新建一个TestMapper接口</h4><pre class=\"prettyprint linenums prettyprinted\"><ol class=\"linenums\"><li class=\"L0\"><code class=\"lang-java\"><span class=\"lit\">@Repository</span></code></li><li class=\"L1\"><code class=\"lang-java\"><span class=\"lit\">@Mapper</span></code></li><li class=\"L2\"><code class=\"lang-java\"><span class=\"kwd\">public</span><span class=\"pln\"> </span><span class=\"kwd\">interface</span><span class=\"pln\"> </span><span class=\"typ\">TestMapper</span><span class=\"pln\"> </span><span class=\"pun\">{</span></code></li><li class=\"L3\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"lit\">@Insert</span><span class=\"pun\">(</span><span class=\"str\">\"insert into users set username=\'zzp\',password=\'zzp105\'\"</span><span class=\"pun\">)</span></code></li><li class=\"L4\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"kwd\">void</span><span class=\"pln\"> insert</span><span class=\"pun\">();</span></code></li><li class=\"L5\"><code class=\"lang-java\"><span class=\"pun\">}</span></code></li></ol></pre>\r\n<h4 id=\"h4-u518Du968Fu4FBFu5199u4E00u4E2Au6D4Bu8BD5u7684u7C7B\"><a name=\"再随便写一个测试的类\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>再随便写一个测试的类</h4><pre class=\"prettyprint linenums prettyprinted\"><ol class=\"linenums\"><li class=\"L0\"><code><span class=\"kwd\">public</span><span class=\"pln\"> </span><span class=\"kwd\">class</span><span class=\"pln\"> </span><span class=\"typ\">TestForMapper</span><span class=\"pun\">{</span></code></li><li class=\"L1\"><code><span class=\"lit\">@Autowired</span></code></li><li class=\"L2\"><code><span class=\"typ\">TestMapper</span><span class=\"pln\"> testMapper</span><span class=\"pun\">;</span></code></li><li class=\"L3\"><code><span class=\"lit\">@Test</span></code></li><li class=\"L4\"><code><span class=\"kwd\">public</span><span class=\"pln\"> </span><span class=\"kwd\">void</span><span class=\"pln\"> testInsert</span><span class=\"pun\">(){</span></code></li><li class=\"L5\"><code><span class=\"pln\"> testMapper</span><span class=\"pun\">.</span><span class=\"pln\">insert</span><span class=\"pun\">();</span></code></li><li class=\"L6\"><code><span class=\"pln\"> </span><span class=\"pun\">}</span></code></li><li class=\"L7\"><code><span class=\"pun\">}</span></code></li></ol></pre>','spring,springBoot,java,mybatis','#### 为什么使用Mybatis?\r\n> Mybatis是目前很火的SSM框架中的ORM组件,相比Hibernate更加灵活小巧,学习成本也更低,我觉得可维护性也更好些。\r\n\r\n但是spring boot官方更只提供了自家的spring data jpa及hibernate的整合方案,而没有给出Mybatis的整合组件。于是上Github,发现了Mybatis提供了它的spring-boot-starter。\r\n##整合方法\r\n\r\n1. #### gradle中加入依赖\r\n```groovy\r\ncompile(\"org.mybatis.spring.boot:mybatis-spring-boot-starter:1.1.1\")\r\n```\r\n###### spring.boot:mybatis-spring-boot-starter中已经包含了对mybatis和mybatis-spring的依赖\r\n\r\n2. #### 在application.yml中配置mybatis\r\n```\r\nmybatis:\r\n #指定mapper和domain(实体)所在的包\r\n type-aliases-package: me.jcala.blog.domain,me.jcala.blog.mapping\r\n #指定使用的类型转换器\r\n type-handlers-package: org.apache.ibatis.type.LocalDateTypeHandler\r\n```\r\n除此之外mybatis还提供了一下配置\r\n```\r\nmybatis:\r\n config-location: #mybatis的xml注册文件位置\r\n mapper-locations: #Mapper xml config files (optional)\r\n executor-type: #执行类型为: SIMPLE, REUSE还是BATCH\r\n configuration: #mybatis的其他配置\r\n```\r\n3. #### 在Spring Boot中配置好数据源DataSource\r\n 可以使用任意数据源,mybatis会自动使用spring boot中所配置的数据库连接池\r\n\r\n以上就完成了spring boot对mybatis的整合,超级简单啊\r\n\r\n## 测试一下\r\n因为在type-aliases-package: me.jcala.blog.domain,me.jcala.blog.mapping中指定的mapping扫描包为me.jcala.blog.mapping,所以要把写的mapper放到me.jcala.blog.mapping包下。\r\n#### 在me.jcala.blog.mapping下新建一个TestMapper接口\r\n```java\r\n@Repository\r\n@Mapper\r\npublic interface TestMapper {\r\n @Insert(\"insert into users set username=\'zzp\',password=\'zzp105\'\")\r\n void insert();\r\n}\r\n```\r\n#### 再随便写一个测试的类\r\n```\r\npublic class TestForMapper{\r\n@Autowired\r\nTestMapper testMapper;\r\n@Test\r\npublic void testInsert(){\r\n testMapper.insert();\r\n }\r\n}\r\n```'),(34,'2016-10-05','undertow嵌入式web服务器初体验','<p><a href=\"https://github.com/jcalaz/nettyServer\">Github源码</a><br>做的一个项目,在这里开源,删除了大部分业务代码,将逐步改为一个基于netty5的框架,目前只算得上是一个手脚架吧</p>\r\n<blockquote>\r\n<p>netty同时处理HTTP和Websocket,并将HTTP请求路由到相应Action中;使用ehcache实现Session;spring IOC做管理容器,mybatis<br>做sql数据库ORM;spring data mongoDB做mongo的ORM;HikariCP做sql数据库连接池;Gson用于json解析和生成;logback日志处理</p>\r\n</blockquote>\r\n<h4 id=\"h4-netty-http-websocket\"><a name=\"netty处理HTTP和websocket\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>netty处理HTTP和websocket</h4><ul>\r\n<li>smart.core.netty.HttpHandler:是一个自定义的ChannelHandler用于处理HTTP<br>和Websocket请求</li><li>Handler分别处理HTTP和Websocket<pre class=\"prettyprint linenums prettyprinted\"><ol class=\"linenums\"><li class=\"L0\"><code class=\"lang-java\"><span class=\"kwd\">public</span><span class=\"pln\"> </span><span class=\"kwd\">void</span><span class=\"pln\"> messageReceived</span><span class=\"pun\">(</span><span class=\"typ\">ChannelHandlerContext</span><span class=\"pln\"> ctx</span><span class=\"pun\">,</span><span class=\"pln\"> </span><span class=\"typ\">Object</span><span class=\"pln\"> msg</span><span class=\"pun\">)</span><span class=\"pln\"> </span><span class=\"pun\">{</span></code></li><li class=\"L1\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"kwd\">if</span><span class=\"pln\"> </span><span class=\"pun\">(</span><span class=\"pln\">msg </span><span class=\"kwd\">instanceof</span><span class=\"pln\"> </span><span class=\"typ\">FullHttpRequest</span><span class=\"pun\">)</span><span class=\"pln\"> </span><span class=\"pun\">{</span><span class=\"com\">//如果是HTTP请求,进行HTTP操作</span></code></li><li class=\"L2\"><code class=\"lang-java\"><span class=\"pln\"> handleHttpRequest</span><span class=\"pun\">(</span><span class=\"pln\">ctx</span><span class=\"pun\">,</span><span class=\"pln\"> </span><span class=\"pun\">(</span><span class=\"typ\">FullHttpRequest</span><span class=\"pun\">)</span><span class=\"pln\"> msg</span><span class=\"pun\">);</span></code></li><li class=\"L3\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"pun\">}</span><span class=\"pln\"> </span><span class=\"kwd\">else</span><span class=\"pln\"> </span><span class=\"kwd\">if</span><span class=\"pln\"> </span><span class=\"pun\">(</span><span class=\"pln\">msg </span><span class=\"kwd\">instanceof</span><span class=\"pln\"> </span><span class=\"typ\">WebSocketFrame</span><span class=\"pun\">)</span><span class=\"pln\"> </span><span class=\"pun\">{</span><span class=\"com\">//如果是Websocket请求,则进行websocket操作</span></code></li><li class=\"L4\"><code class=\"lang-java\"><span class=\"pln\"> handleWebSocketFrame</span><span class=\"pun\">(</span><span class=\"pln\">ctx</span><span class=\"pun\">,</span><span class=\"pln\"> </span><span class=\"pun\">(</span><span class=\"typ\">WebSocketFrame</span><span class=\"pun\">)</span><span class=\"pln\"> msg</span><span class=\"pun\">);</span></code></li><li class=\"L5\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"pun\">}</span></code></li><li class=\"L6\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"pun\">}</span></code></li></ol></pre>\r\n</li><li>由于websocket也是基于HTTP的,需要判断是websocket后,将HTTP升级为Websocket<pre class=\"prettyprint linenums prettyprinted\"><ol class=\"linenums\"><li class=\"L0\"><code class=\"lang-java\"><span class=\"kwd\">private</span><span class=\"pln\"> </span><span class=\"kwd\">void</span><span class=\"pln\"> handleHttpRequest</span><span class=\"pun\">(</span><span class=\"typ\">ChannelHandlerContext</span><span class=\"pln\"> ctx</span><span class=\"pun\">,</span><span class=\"pln\"> </span><span class=\"typ\">FullHttpRequest</span><span class=\"pln\"> req</span><span class=\"pun\">)</span><span class=\"pln\"> </span><span class=\"pun\">{</span></code></li><li class=\"L1\"><code class=\"lang-java\"><span class=\"pln\"> logger</span><span class=\"pun\">.</span><span class=\"pln\">warn</span><span class=\"pun\">(</span><span class=\"str\">\"uri:\"</span><span class=\"pln\"> </span><span class=\"pun\">+</span><span class=\"pln\"> req</span><span class=\"pun\">.</span><span class=\"pln\">uri</span><span class=\"pun\">());</span></code></li><li class=\"L2\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"kwd\">if</span><span class=\"pln\"> </span><span class=\"pun\">(</span><span class=\"pln\">req</span><span class=\"pun\">.</span><span class=\"pln\">uri</span><span class=\"pun\">().</span><span class=\"pln\">startsWith</span><span class=\"pun\">(</span><span class=\"str\">\"/ws/join\"</span><span class=\"pun\">))</span><span class=\"pln\"> </span><span class=\"pun\">{</span><span class=\"com\">//如果urL开头为/ws/join则升级为websocket</span></code></li><li class=\"L3\"><code class=\"lang-java\"><span class=\"pln\"> mac </span><span class=\"pun\">=</span><span class=\"pln\"> wsBeforeHandler</span><span class=\"pun\">(</span><span class=\"pln\">ctx</span><span class=\"pun\">,</span><span class=\"pln\"> req</span><span class=\"pun\">);</span></code></li><li class=\"L4\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"kwd\">if</span><span class=\"pln\"> </span><span class=\"pun\">(</span><span class=\"pln\">mac </span><span class=\"pun\">==</span><span class=\"pln\"> </span><span class=\"kwd\">null</span><span class=\"pln\"> </span><span class=\"pun\">||</span><span class=\"pln\"> mac</span><span class=\"pun\">.</span><span class=\"pln\">length</span><span class=\"pun\">()</span><span class=\"pln\"> </span><span class=\"pun\"><</span><span class=\"pln\"> </span><span class=\"lit\">1</span><span class=\"pun\">)</span><span class=\"pln\"> </span><span class=\"pun\">{</span></code></li><li class=\"L5\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"typ\">RespTools</span><span class=\"pun\">.</span><span class=\"pln\">paraErrorBack</span><span class=\"pun\">(</span><span class=\"pln\">ctx</span><span class=\"pun\">,</span><span class=\"pln\">req</span><span class=\"pun\">,</span><span class=\"kwd\">null</span><span class=\"pun\">);</span></code></li><li class=\"L6\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"kwd\">return</span><span class=\"pun\">;</span></code></li><li class=\"L7\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"pun\">}</span></code></li><li class=\"L8\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"typ\">WebSocketServerHandshakerFactory</span><span class=\"pln\"> wsFactory </span><span class=\"pun\">=</span><span class=\"pln\"> </span><span class=\"kwd\">new</span><span class=\"pln\"> </span><span class=\"typ\">WebSocketServerHandshakerFactory</span><span class=\"pun\">(</span></code></li><li class=\"L9\"><code class=\"lang-java\"><span class=\"pln\"> getWebSocketLocation</span><span class=\"pun\">(</span><span class=\"pln\">req</span><span class=\"pun\">),</span><span class=\"pln\"> </span><span class=\"kwd\">null</span><span class=\"pun\">,</span><span class=\"pln\"> </span><span class=\"kwd\">true</span><span class=\"pun\">);</span></code></li><li class=\"L0\"><code class=\"lang-java\"><span class=\"pln\"> handshaker </span><span class=\"pun\">=</span><span class=\"pln\"> wsFactory</span><span class=\"pun\">.</span><span class=\"pln\">newHandshaker</span><span class=\"pun\">(</span><span class=\"pln\">req</span><span class=\"pun\">);</span></code></li><li class=\"L1\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"kwd\">if</span><span class=\"pln\"> </span><span class=\"pun\">(</span><span class=\"pln\">handshaker </span><span class=\"pun\">==</span><span class=\"pln\"> </span><span class=\"kwd\">null</span><span class=\"pun\">)</span><span class=\"pln\"> </span><span class=\"pun\">{</span></code></li><li class=\"L2\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"typ\">WebSocketServerHandshakerFactory</span><span class=\"pun\">.</span><span class=\"pln\">sendUnsupportedVersionResponse</span><span class=\"pun\">(</span><span class=\"pln\">ctx</span><span class=\"pun\">.</span><span class=\"pln\">channel</span><span class=\"pun\">());</span></code></li><li class=\"L3\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"pun\">}</span><span class=\"pln\"> </span><span class=\"kwd\">else</span><span class=\"pln\"> </span><span class=\"pun\">{</span></code></li><li class=\"L4\"><code class=\"lang-java\"><span class=\"pln\"> handshaker</span><span class=\"pun\">.</span><span class=\"pln\">handshake</span><span class=\"pun\">(</span><span class=\"pln\">ctx</span><span class=\"pun\">.</span><span class=\"pln\">channel</span><span class=\"pun\">(),</span><span class=\"pln\"> req</span><span class=\"pun\">);</span></code></li><li class=\"L5\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"pun\">}</span></code></li><li class=\"L6\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"pun\">}</span><span class=\"pln\"> </span><span class=\"kwd\">else</span><span class=\"pln\"> </span><span class=\"pun\">{</span><span class=\"com\">//是HTTP请求则路由到Action</span></code></li><li class=\"L7\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"typ\">RouteResult</span><span class=\"pun\"><</span><span class=\"typ\">Action</span><span class=\"pun\">></span><span class=\"pln\"> routeResult </span><span class=\"pun\">=</span><span class=\"pln\"> rs</span><span class=\"pun\">.</span><span class=\"pln\">getRouter</span><span class=\"pun\">().</span><span class=\"pln\">route</span><span class=\"pun\">(</span><span class=\"pln\">req</span><span class=\"pun\">.</span><span class=\"pln\">method</span><span class=\"pun\">(),</span><span class=\"pln\"> req</span><span class=\"pun\">.</span><span class=\"pln\">uri</span><span class=\"pun\">());</span></code></li><li class=\"L8\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"typ\">Action</span><span class=\"pln\"> action </span><span class=\"pun\">=</span><span class=\"pln\"> routeResult</span><span class=\"pun\">.</span><span class=\"pln\">target</span><span class=\"pun\">();</span></code></li><li class=\"L9\"><code class=\"lang-java\"><span class=\"pln\"> action</span><span class=\"pun\">.</span><span class=\"pln\">act</span><span class=\"pun\">(</span><span class=\"pln\">ctx</span><span class=\"pun\">,</span><span class=\"pln\"> req</span><span class=\"pun\">);</span></code></li><li class=\"L0\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"pun\">}</span></code></li><li class=\"L1\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"pun\">}</span></code></li></ol></pre>\r\n</li><li>websocket请求处理,这里是从websocket请求中获取客户端传来的json字符串,并将字符串转为javabean</li></ul>\r\n<pre class=\"prettyprint linenums prettyprinted\"><ol class=\"linenums\"><li class=\"L0\"><code class=\"lang-java\"><span class=\"kwd\">private</span><span class=\"pln\"> </span><span class=\"kwd\">void</span><span class=\"pln\"> handleWebSocketFrame</span><span class=\"pun\">(</span><span class=\"typ\">ChannelHandlerContext</span><span class=\"pln\"> ctx</span><span class=\"pun\">,</span><span class=\"pln\"> </span><span class=\"typ\">WebSocketFrame</span><span class=\"pln\"> frame</span><span class=\"pun\">)</span><span class=\"pln\"> </span><span class=\"pun\">{</span></code></li><li class=\"L1\"><code class=\"lang-java\"></code></li><li class=\"L2\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"com\">// Check for closing frame</span></code></li><li class=\"L3\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"kwd\">if</span><span class=\"pln\"> </span><span class=\"pun\">(</span><span class=\"pln\">frame </span><span class=\"kwd\">instanceof</span><span class=\"pln\"> </span><span class=\"typ\">CloseWebSocketFrame</span><span class=\"pun\">)</span><span class=\"pln\"> </span><span class=\"pun\">{</span></code></li><li class=\"L4\"><code class=\"lang-java\"><span class=\"pln\"> handshaker</span><span class=\"pun\">.</span><span class=\"pln\">close</span><span class=\"pun\">(</span><span class=\"pln\">ctx</span><span class=\"pun\">.</span><span class=\"pln\">channel</span><span class=\"pun\">(),</span><span class=\"pln\"> </span><span class=\"pun\">(</span><span class=\"typ\">CloseWebSocketFrame</span><span class=\"pun\">)</span><span class=\"pln\"> frame</span><span class=\"pun\">.</span><span class=\"pln\">retain</span><span class=\"pun\">());</span></code></li><li class=\"L5\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"kwd\">return</span><span class=\"pun\">;</span></code></li><li class=\"L6\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"pun\">}</span></code></li><li class=\"L7\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"kwd\">if</span><span class=\"pln\"> </span><span class=\"pun\">(</span><span class=\"pln\">frame </span><span class=\"kwd\">instanceof</span><span class=\"pln\"> </span><span class=\"typ\">PingWebSocketFrame</span><span class=\"pun\">)</span><span class=\"pln\"> </span><span class=\"pun\">{</span></code></li><li class=\"L8\"><code class=\"lang-java\"><span class=\"pln\"> ctx</span><span class=\"pun\">.</span><span class=\"pln\">write</span><span class=\"pun\">(</span><span class=\"kwd\">new</span><span class=\"pln\"> </span><span class=\"typ\">PongWebSocketFrame</span><span class=\"pun\">(</span><span class=\"pln\">frame</span><span class=\"pun\">.</span><span class=\"pln\">content</span><span class=\"pun\">().</span><span class=\"pln\">retain</span><span class=\"pun\">()));</span></code></li><li class=\"L9\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"kwd\">return</span><span class=\"pun\">;</span></code></li><li class=\"L0\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"pun\">}</span></code></li><li class=\"L1\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"kwd\">if</span><span class=\"pln\"> </span><span class=\"pun\">(</span><span class=\"pln\">frame </span><span class=\"kwd\">instanceof</span><span class=\"pln\"> </span><span class=\"typ\">TextWebSocketFrame</span><span class=\"pun\">)</span><span class=\"pln\"> </span><span class=\"pun\">{</span></code></li><li class=\"L2\"><code class=\"lang-java\"><span class=\"pln\"> devicePool</span><span class=\"pun\">.</span><span class=\"pln\">join</span><span class=\"pun\">(</span><span class=\"pln\">ctx</span><span class=\"pun\">.</span><span class=\"pln\">channel</span><span class=\"pun\">(),</span><span class=\"pln\"> mac</span><span class=\"pun\">);</span></code></li><li class=\"L3\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"typ\">String</span><span class=\"pln\"> json </span><span class=\"pun\">=</span><span class=\"pln\"> </span><span class=\"pun\">((</span><span class=\"typ\">TextWebSocketFrame</span><span class=\"pun\">)</span><span class=\"pln\"> frame</span><span class=\"pun\">).</span><span class=\"pln\">text</span><span class=\"pun\">();</span></code></li><li class=\"L4\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"typ\">Logic</span><span class=\"pun\">.</span><span class=\"typ\">ReqRespType</span><span class=\"pln\"> data</span><span class=\"pun\">=</span><span class=\"pln\"> </span><span class=\"typ\">JsonTools</span><span class=\"pun\">.</span><span class=\"pln\">read</span><span class=\"pun\">(</span><span class=\"pln\">json</span><span class=\"pun\">,</span><span class=\"typ\">Logic</span><span class=\"pun\">.</span><span class=\"typ\">ReqRespType</span><span class=\"pun\">.</span><span class=\"kwd\">class</span><span class=\"pun\">);</span></code></li><li class=\"L5\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"com\">//...</span></code></li><li class=\"L6\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"kwd\">return</span><span class=\"pun\">;</span></code></li><li class=\"L7\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"pun\">}</span></code></li><li class=\"L8\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"pun\">}</span></code></li></ol></pre>\r\n<ul>\r\n<li><p>如果是HTTP则需在RouterSetting中配置路由.<br>比如r.POST(“api/get_verify_code”, getVerifyCodeAct):<br>将url为”api/get_verify_code”的POST请求路由到LoginAct中</p>\r\n<pre class=\"prettyprint linenums prettyprinted\"><ol class=\"linenums\"><li class=\"L0\"><code class=\"lang-java\"><span class=\"kwd\">public</span><span class=\"pln\"> </span><span class=\"kwd\">class</span><span class=\"pln\"> </span><span class=\"typ\">RouterSetting</span><span class=\"pln\"> </span><span class=\"pun\">{</span></code></li><li class=\"L1\"><code class=\"lang-java\"><span class=\"pln\"> </span><a href=\"https://github.com/Autowired\" title=\"@Autowired\" class=\"at-link\"><span class=\"lit\">@Autowired</span></a></code></li><li class=\"L2\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"kwd\">private</span><span class=\"pln\"> </span><span class=\"typ\">Router</span><span class=\"pun\"><</span><span class=\"typ\">Action</span><span class=\"pun\">></span><span class=\"pln\"> router</span><span class=\"pun\">;</span></code></li><li class=\"L3\"><code class=\"lang-java\"><span class=\"pln\"> </span><a href=\"https://github.com/Autowired\" title=\"@Autowired\" class=\"at-link\"><span class=\"lit\">@Autowired</span></a></code></li><li class=\"L4\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"kwd\">private</span><span class=\"pln\"> </span><span class=\"typ\">GetVerifyCodeAct</span><span class=\"pln\"> getVerifyCodeAct</span><span class=\"pun\">;</span><span class=\"com\">//w</span></code></li><li class=\"L5\"><code class=\"lang-java\"><span class=\"pln\"> </span><a href=\"https://github.com/Autowired\" title=\"@Autowired\" class=\"at-link\"><span class=\"lit\">@Autowired</span></a></code></li><li class=\"L6\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"kwd\">private</span><span class=\"pln\"> </span><span class=\"typ\">LoginAct</span><span class=\"pln\"> loginAct</span><span class=\"pun\">;</span></code></li><li class=\"L7\"><code class=\"lang-java\"><span class=\"pln\"> </span><a href=\"https://github.com/Autowired\" title=\"@Autowired\" class=\"at-link\"><span class=\"lit\">@Autowired</span></a></code></li><li class=\"L8\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"kwd\">private</span><span class=\"pln\"> </span><span class=\"typ\">RegisterAct</span><span class=\"pln\"> registerAcc</span><span class=\"pun\">;</span></code></li><li class=\"L9\"><code class=\"lang-java\"></code></li><li class=\"L0\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"kwd\">public</span><span class=\"pln\"> </span><span class=\"typ\">Router</span><span class=\"pun\"><</span><span class=\"typ\">Action</span><span class=\"pun\">></span><span class=\"pln\"> getRouter</span><span class=\"pun\">()</span><span class=\"pln\"> </span><span class=\"pun\">{</span></code></li><li class=\"L1\"><code class=\"lang-java\"><span class=\"pln\"> routerConfig</span><span class=\"pun\">(</span><span class=\"kwd\">this</span><span class=\"pun\">.</span><span class=\"pln\">router</span><span class=\"pun\">);</span></code></li><li class=\"L2\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"kwd\">return</span><span class=\"pln\"> </span><span class=\"kwd\">this</span><span class=\"pun\">.</span><span class=\"pln\">router</span><span class=\"pun\">;</span></code></li><li class=\"L3\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"pun\">}</span></code></li><li class=\"L4\"><code class=\"lang-java\"></code></li><li class=\"L5\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"kwd\">private</span><span class=\"pln\"> </span><span class=\"kwd\">void</span><span class=\"pln\"> routerConfig</span><span class=\"pun\">(</span><span class=\"typ\">Router</span><span class=\"pun\"><</span><span class=\"typ\">Action</span><span class=\"pun\">></span><span class=\"pln\"> r</span><span class=\"pun\">)</span><span class=\"pln\"> </span><span class=\"pun\">{</span></code></li><li class=\"L6\"><code class=\"lang-java\"><span class=\"pln\"> r</span><span class=\"pun\">.</span><span class=\"pln\">POST</span><span class=\"pun\">(</span><span class=\"str\">\"api/get_verify_code\"</span><span class=\"pun\">,</span><span class=\"pln\"> getVerifyCodeAct</span><span class=\"pun\">);</span></code></li><li class=\"L7\"><code class=\"lang-java\"><span class=\"pln\"> r</span><span class=\"pun\">.</span><span class=\"pln\">ANY</span><span class=\"pun\">(</span><span class=\"str\">\"api/login\"</span><span class=\"pun\">,</span><span class=\"pln\"> loginAct</span><span class=\"pun\">);</span></code></li><li class=\"L8\"><code class=\"lang-java\"><span class=\"pln\"> r</span><span class=\"pun\">.</span><span class=\"pln\">GET</span><span class=\"pun\">(</span><span class=\"str\">\"api/register\"</span><span class=\"pun\">,</span><span class=\"pln\"> registerAcc</span><span class=\"pun\">);</span></code></li><li class=\"L9\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"pun\">}</span></code></li><li class=\"L0\"><code class=\"lang-java\"><span class=\"pun\">}</span></code></li></ol></pre>\r\n</li><li>Action处理HTTP请求并返回</li></ul>\r\n<pre class=\"prettyprint linenums prettyprinted\"><ol class=\"linenums\"><li class=\"L0\"><code class=\"lang-java\"><span class=\"lit\">@Controller</span></code></li><li class=\"L1\"><code class=\"lang-java\"><span class=\"kwd\">public</span><span class=\"pln\"> </span><span class=\"kwd\">class</span><span class=\"pln\"> </span><span class=\"typ\">LoginAct</span><span class=\"pln\"> </span><span class=\"kwd\">implements</span><span class=\"pln\"> </span><span class=\"typ\">Action</span><span class=\"pln\"> </span><span class=\"pun\">{</span></code></li><li class=\"L2\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"kwd\">private</span><span class=\"pln\"> </span><span class=\"kwd\">static</span><span class=\"pln\"> </span><span class=\"kwd\">final</span><span class=\"pln\"> </span><span class=\"typ\">Logger</span><span class=\"pln\"> logger </span><span class=\"pun\">=</span><span class=\"pln\"> </span><span class=\"typ\">LoggerFactory</span><span class=\"pun\">.</span><span class=\"pln\">getLogger</span><span class=\"pun\">(</span><span class=\"typ\">LoginAct</span><span class=\"pun\">.</span><span class=\"kwd\">class</span><span class=\"pun\">);</span></code></li><li class=\"L3\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"lit\">@Override</span></code></li><li class=\"L4\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"kwd\">public</span><span class=\"pln\"> </span><span class=\"kwd\">void</span><span class=\"pln\"> act</span><span class=\"pun\">(</span><span class=\"typ\">ChannelHandlerContext</span><span class=\"pln\"> ctx</span><span class=\"pun\">,</span><span class=\"pln\"> </span><span class=\"typ\">FullHttpRequest</span><span class=\"pln\"> req</span><span class=\"pun\">)</span><span class=\"pln\"> </span><span class=\"pun\">{</span></code></li><li class=\"L5\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"typ\">String</span><span class=\"pln\"> ip </span><span class=\"pun\">=</span><span class=\"pln\"> </span><span class=\"typ\">HttpTools</span><span class=\"pun\">.</span><span class=\"pln\">getIp</span><span class=\"pun\">(</span><span class=\"pln\">req</span><span class=\"pun\">);</span></code></li><li class=\"L6\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"typ\">String</span><span class=\"pln\"> body </span><span class=\"pun\">=</span><span class=\"pln\"> </span><span class=\"typ\">Convert</span><span class=\"pun\">.</span><span class=\"pln\">buf2Str</span><span class=\"pun\">(</span><span class=\"pln\">req</span><span class=\"pun\">.</span><span class=\"pln\">content</span><span class=\"pun\">());</span></code></li><li class=\"L7\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"typ\">Get</span><span class=\"pun\">.</span><span class=\"typ\">Login</span><span class=\"pln\"> get </span><span class=\"pun\">=</span><span class=\"pln\"> </span><span class=\"typ\">JsonTools</span><span class=\"pun\">.</span><span class=\"pln\">read</span><span class=\"pun\">(</span><span class=\"pln\">body</span><span class=\"pun\">,</span><span class=\"pln\"> </span><span class=\"typ\">Get</span><span class=\"pun\">.</span><span class=\"typ\">Login</span><span class=\"pun\">.</span><span class=\"kwd\">class</span><span class=\"pun\">);</span><span class=\"com\">//1.得到HTTP传来的json数据解析为javabean</span></code></li><li class=\"L8\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"typ\">Sub</span><span class=\"pun\">.</span><span class=\"typ\">Register</span><span class=\"pln\"> back</span><span class=\"pun\">;</span><span class=\"com\">//构建返回给客户端的javabean的实例</span></code></li><li class=\"L9\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"com\">//...</span></code></li><li class=\"L0\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"typ\">HttpTools</span><span class=\"pun\">.</span><span class=\"pln\">sendCorrectResp</span><span class=\"pun\">(</span><span class=\"pln\">ctx</span><span class=\"pun\">,</span><span class=\"pln\"> req</span><span class=\"pun\">,</span><span class=\"pln\"> back</span><span class=\"pun\">);</span><span class=\"com\">//返回给客户端HTTP Response</span></code></li><li class=\"L1\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"pun\">}</span></code></li><li class=\"L2\"><code class=\"lang-java\"><span class=\"pun\">}</span></code></li></ol></pre>\r\n<ul>\r\n<li>添加Session(依靠ehcache)</li></ul>\r\n<pre class=\"prettyprint linenums prettyprinted\"><ol class=\"linenums\"><li class=\"L0\"><code class=\"lang-java\"><span class=\"kwd\">private</span><span class=\"pln\"> </span><span class=\"kwd\">void</span><span class=\"pln\"> addSession</span><span class=\"pun\">(</span><span class=\"kwd\">long</span><span class=\"pln\"> userId</span><span class=\"pun\">,</span><span class=\"pln\"> </span><span class=\"typ\">String</span><span class=\"pln\"> ip</span><span class=\"pun\">)</span><span class=\"pln\"> </span><span class=\"pun\">{</span></code></li><li class=\"L1\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"typ\">Logic</span><span class=\"pun\">.</span><span class=\"typ\">DeviceSession</span><span class=\"pln\"> session </span><span class=\"pun\">=</span><span class=\"pln\"> </span><span class=\"kwd\">new</span><span class=\"pln\"> </span><span class=\"typ\">Logic</span><span class=\"pun\">.</span><span class=\"typ\">DeviceSession</span><span class=\"pun\">(</span><span class=\"pln\">ip</span><span class=\"pun\">,</span><span class=\"pln\"> </span><span class=\"str\">\"\"</span><span class=\"pun\">);</span></code></li><li class=\"L2\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"typ\">Cache</span><span class=\"pun\">.</span><span class=\"pln\">add</span><span class=\"pun\">(</span><span class=\"pln\">userId </span><span class=\"pun\">+</span><span class=\"pln\"> </span><span class=\"str\">\"\"</span><span class=\"pun\">,</span><span class=\"pln\"> session</span><span class=\"pun\">,</span><span class=\"pln\"> </span><span class=\"str\">\"6mn\"</span><span class=\"pun\">);</span><span class=\"com\">//设置session的缓存时间为6分钟</span></code></li><li class=\"L3\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"com\">//debugSession(userId);</span></code></li><li class=\"L4\"><code class=\"lang-java\"><span class=\"pln\"> </span><span class=\"pun\">}</span></code></li></ol></pre>\r\n<ul>\r\n<li>从HTTP请求中获取IP地址<pre class=\"prettyprint linenums prettyprinted\"><ol class=\"linenums\"><li class=\"L0\"><code><span class=\"typ\">String</span><span class=\"pln\"> ip </span><span class=\"pun\">=</span><span class=\"pln\"> </span><span class=\"typ\">HttpTools</span><span class=\"pun\">.</span><span class=\"pln\">getIp</span><span class=\"pun\">(</span><span class=\"pln\">req</span><span class=\"pun\">);</span></code></li></ol></pre><h4 id=\"h4-netty-\"><a name=\"netty参数设置\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>netty参数设置</h4><pre class=\"prettyprint linenums prettyprinted\"><ol class=\"linenums\"><li class=\"L0\"><code><span class=\"pln\">port</span><span class=\"pun\">=</span><span class=\"lit\">8090</span></code></li><li class=\"L1\"><code><span class=\"pln\">netty</span><span class=\"pun\">.</span><span class=\"pln\">boss</span><span class=\"pun\">.</span><span class=\"pln\">thread</span><span class=\"pun\">.</span><span class=\"pln\">count</span><span class=\"pun\">=</span><span class=\"lit\">2</span></code></li><li class=\"L2\"><code><span class=\"pln\">netty</span><span class=\"pun\">.</span><span class=\"pln\">worker</span><span class=\"pun\">.</span><span class=\"pln\">thread</span><span class=\"pun\">.</span><span class=\"pln\">count</span><span class=\"pun\">=</span><span class=\"lit\">1</span></code></li><li class=\"L3\"><code><span class=\"pln\">netty</span><span class=\"pun\">.</span><span class=\"pln\">so</span><span class=\"pun\">.</span><span class=\"pln\">keepalive</span><span class=\"pun\">=</span><span class=\"kwd\">true</span></code></li><li class=\"L4\"><code><span class=\"pln\">netty</span><span class=\"pun\">.</span><span class=\"pln\">so</span><span class=\"pun\">.</span><span class=\"pln\">backlog</span><span class=\"pun\">=</span><span class=\"lit\">100</span></code></li></ol></pre><h4 id=\"h4-u9879u76EEu4F9Du8D56\"><a name=\"项目依赖\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>项目依赖</h4><pre class=\"prettyprint linenums prettyprinted\"><ol class=\"linenums\"><li class=\"L0\"><code class=\"lang-groovy\"><span class=\"com\">//---------------------单元测试----------------------------</span></code></li><li class=\"L1\"><code class=\"lang-groovy\"><span class=\"pln\"> testCompile </span><span class=\"kwd\">group</span><span class=\"pun\">:</span><span class=\"pln\"> </span><span class=\"str\">\'junit\'</span><span class=\"pun\">,</span><span class=\"pln\"> name</span><span class=\"pun\">:</span><span class=\"pln\"> </span><span class=\"str\">\'junit\'</span><span class=\"pun\">,</span><span class=\"pln\"> version</span><span class=\"pun\">:</span><span class=\"pln\"> </span><span class=\"str\">\'4.11\'</span></code></li><li class=\"L2\"><code class=\"lang-groovy\"><span class=\"pln\"> </span><span class=\"com\">//--------------------数据库驱动----------------------------</span></code></li><li class=\"L3\"><code class=\"lang-groovy\"><span class=\"pln\"> compile </span><span class=\"str\">\'org.mongodb:mongodb-driver:3.2.2\'</span></code></li><li class=\"L4\"><code class=\"lang-groovy\"><span class=\"pln\"> compile </span><span class=\"str\">\'mysql:mysql-connector-java:5.1.38\'</span></code></li><li class=\"L5\"><code class=\"lang-groovy\"><span class=\"pln\"> </span><span class=\"com\">//-------------------数据库连接池---------------------------</span></code></li><li class=\"L6\"><code class=\"lang-groovy\"><span class=\"pln\"> compile </span><span class=\"str\">\'com.zaxxer:HikariCP:2.4.5\'</span></code></li><li class=\"L7\"><code class=\"lang-groovy\"><span class=\"pln\"> </span><span class=\"com\">//----------------------ORM------------------------------</span></code></li><li class=\"L8\"><code class=\"lang-groovy\"><span class=\"pln\"> compile </span><span class=\"kwd\">group</span><span class=\"pun\">:</span><span class=\"pln\"> </span><span class=\"str\">\'org.mybatis\'</span><span class=\"pun\">,</span><span class=\"pln\"> name</span><span class=\"pun\">:</span><span class=\"pln\"> </span><span class=\"str\">\'mybatis\'</span><span class=\"pun\">,</span><span class=\"pln\"> version</span><span class=\"pun\">:</span><span class=\"pln\">mybatisVersion</span></code></li><li class=\"L9\"><code class=\"lang-groovy\"><span class=\"pln\"> compile </span><span class=\"kwd\">group</span><span class=\"pun\">:</span><span class=\"pln\"> </span><span class=\"str\">\'org.mybatis\'</span><span class=\"pun\">,</span><span class=\"pln\"> name</span><span class=\"pun\">:</span><span class=\"pln\"> </span><span class=\"str\">\'mybatis-spring\'</span><span class=\"pun\">,</span><span class=\"pln\"> version</span><span class=\"pun\">:</span><span class=\"pln\">mybatisSpringVersion</span></code></li><li class=\"L0\"><code class=\"lang-groovy\"><span class=\"pln\"> </span><span class=\"com\">//-----------------------缓存----------------------------</span></code></li><li class=\"L1\"><code class=\"lang-groovy\"><span class=\"pln\"> compile </span><span class=\"kwd\">group</span><span class=\"pun\">:</span><span class=\"pln\"> </span><span class=\"str\">\'net.sf.ehcache\'</span><span class=\"pun\">,</span><span class=\"pln\"> name</span><span class=\"pun\">:</span><span class=\"pln\"> </span><span class=\"str\">\'ehcache\'</span><span class=\"pun\">,</span><span class=\"pln\"> version</span><span class=\"pun\">:</span><span class=\"pln\">ehcacheVersion</span></code></li><li class=\"L2\"><code class=\"lang-groovy\"><span class=\"pln\"> </span><span class=\"com\">//----------------------工具包----------------------------</span></code></li><li class=\"L3\"><code class=\"lang-groovy\"><span class=\"pln\"> compile </span><span class=\"str\">\'commons-httpclient:commons-httpclient:3.1-rc1\'</span></code></li><li class=\"L4\"><code class=\"lang-groovy\"><span class=\"pln\"> compile </span><span class=\"str\">\'org.javassist:javassist:3.20.0-GA\'</span></code></li><li class=\"L5\"><code class=\"lang-groovy\"><span class=\"pln\"> </span><span class=\"com\">//---------------------日志处理----------------------------</span></code></li><li class=\"L6\"><code class=\"lang-groovy\"><span class=\"pln\"> compile </span><span class=\"str\">\'org.slf4j:slf4j-api:1.7.21\'</span></code></li><li class=\"L7\"><code class=\"lang-groovy\"><span class=\"pln\"> compile </span><span class=\"str\">\'ch.qos.logback:logback-core:1.1.7\'</span></code></li><li class=\"L8\"><code class=\"lang-groovy\"><span class=\"pln\"> compile </span><span class=\"str\">\'ch.qos.logback:logback-classic:1.1.7\'</span></code></li><li class=\"L9\"><code class=\"lang-groovy\"><span class=\"pln\"> </span><span class=\"com\">//---------------------json处理---------------------------</span></code></li><li class=\"L0\"><code class=\"lang-groovy\"><span class=\"pln\"> compile </span><span class=\"str\">\'com.google.code.gson:gson:2.6.2\'</span></code></li><li class=\"L1\"><code class=\"lang-groovy\"><span class=\"pln\"> </span><span class=\"com\">//---------------------netty-----------------------------</span></code></li><li class=\"L2\"><code class=\"lang-groovy\"><span class=\"pln\"> compile </span><span class=\"kwd\">group</span><span class=\"pun\">:</span><span class=\"pln\"> </span><span class=\"str\">\'io.netty\'</span><span class=\"pun\">,</span><span class=\"pln\"> name</span><span class=\"pun\">:</span><span class=\"pln\"> </span><span class=\"str\">\'netty-all\'</span><span class=\"pun\">,</span><span class=\"pln\"> version</span><span class=\"pun\">:</span><span class=\"pln\">nettyVersion</span></code></li><li class=\"L3\"><code class=\"lang-groovy\"><span class=\"pln\"> </span><span class=\"com\">//---------------------spring----------------------------</span></code></li><li class=\"L4\"><code class=\"lang-groovy\"><span class=\"pln\"> compile </span><span class=\"kwd\">group</span><span class=\"pun\">:</span><span class=\"pln\"> </span><span class=\"str\">\'org.springframework\'</span><span class=\"pun\">,</span><span class=\"pln\"> name</span><span class=\"pun\">:</span><span class=\"pln\"> </span><span class=\"str\">\'spring-test\'</span><span class=\"pun\">,</span><span class=\"pln\"> version</span><span class=\"pun\">:</span><span class=\"pln\">springVersion</span></code></li><li class=\"L5\"><code class=\"lang-groovy\"><span class=\"pln\"> compile </span><span class=\"kwd\">group</span><span class=\"pun\">:</span><span class=\"pln\"> </span><span class=\"str\">\'org.springframework\'</span><span class=\"pun\">,</span><span class=\"pln\"> name</span><span class=\"pun\">:</span><span class=\"pln\"> </span><span class=\"str\">\'spring-jdbc\'</span><span class=\"pun\">,</span><span class=\"pln\"> version</span><span class=\"pun\">:</span><span class=\"pln\">springVersion</span></code></li><li class=\"L6\"><code class=\"lang-groovy\"><span class=\"pln\"> compile</span><span class=\"pun\">(</span><span class=\"kwd\">group</span><span class=\"pun\">:</span><span class=\"pln\"> </span><span class=\"str\">\'org.springframework\'</span><span class=\"pun\">,</span><span class=\"pln\"> name</span><span class=\"pun\">:</span><span class=\"pln\"> </span><span class=\"str\">\'spring-context\'</span><span class=\"pun\">,</span><span class=\"pln\"> version</span><span class=\"pun\">:</span><span class=\"pln\">springVersion</span><span class=\"pun\">)</span><span class=\"pln\"> </span><span class=\"pun\">{</span></code></li><li class=\"L7\"><code class=\"lang-groovy\"><span class=\"pln\"> exclude</span><span class=\"pun\">(</span><span class=\"kwd\">module</span><span class=\"pun\">:</span><span class=\"pln\"> </span><span class=\"str\">\'commons-logging\'</span><span class=\"pun\">)</span></code></li><li class=\"L8\"><code class=\"lang-groovy\"><span class=\"pln\"> </span><span class=\"pun\">}</span></code></li></ol></pre>\r\n</li></ul>\r\n','undertow','[Github源码](https://github.com/jcalaz/nettyServer)\r\n做的一个项目,在这里开源,删除了大部分业务代码,将逐步改为一个基于netty5的框架,目前只算得上是一个手脚架吧\r\n\r\n> netty同时处理HTTP和Websocket,并将HTTP请求路由到相应Action中;使用ehcache实现Session;spring IOC做管理容器,mybatis\r\n做sql数据库ORM;spring data mongoDB做mongo的ORM;HikariCP做sql数据库连接池;Gson用于json解析和生成;logback日志处理\r\n\r\n####netty处理HTTP和websocket\r\n- smart.core.netty.HttpHandler:是一个自定义的ChannelHandler用于处理HTTP\r\n和Websocket请求\r\n- Handler分别处理HTTP和Websocket\r\n```java\r\npublic void messageReceived(ChannelHandlerContext ctx, Object msg) {\r\n if (msg instanceof FullHttpRequest) {//如果是HTTP请求,进行HTTP操作\r\n handleHttpRequest(ctx, (FullHttpRequest) msg);\r\n } else if (msg instanceof WebSocketFrame) {//如果是Websocket请求,则进行websocket操作\r\n handleWebSocketFrame(ctx, (WebSocketFrame) msg);\r\n }\r\n }\r\n```\r\n- 由于websocket也是基于HTTP的,需要判断是websocket后,将HTTP升级为Websocket\r\n```java\r\nprivate void handleHttpRequest(ChannelHandlerContext ctx, FullHttpRequest req) {\r\n logger.warn(\"uri:\" + req.uri());\r\n if (req.uri().startsWith(\"/ws/join\")) {//如果urL开头为/ws/join则升级为websocket\r\n mac = wsBeforeHandler(ctx, req);\r\n if (mac == null || mac.length() < 1) {\r\n RespTools.paraErrorBack(ctx,req,null);\r\n return;\r\n }\r\n WebSocketServerHandshakerFactory wsFactory = new WebSocketServerHandshakerFactory(\r\n getWebSocketLocation(req), null, true);\r\n handshaker = wsFactory.newHandshaker(req);\r\n if (handshaker == null) {\r\n WebSocketServerHandshakerFactory.sendUnsupportedVersionResponse(ctx.channel());\r\n } else {\r\n handshaker.handshake(ctx.channel(), req);\r\n }\r\n } else {//是HTTP请求则路由到Action\r\n RouteResult<Action> routeResult = rs.getRouter().route(req.method(), req.uri());\r\n Action action = routeResult.target();\r\n action.act(ctx, req);\r\n }\r\n }\r\n```\r\n- websocket请求处理,这里是从websocket请求中获取客户端传来的json字符串,并将字符串转为javabean\r\n\r\n```java\r\nprivate void handleWebSocketFrame(ChannelHandlerContext ctx, WebSocketFrame frame) {\r\n\r\n // Check for closing frame\r\n if (frame instanceof CloseWebSocketFrame) {\r\n handshaker.close(ctx.channel(), (CloseWebSocketFrame) frame.retain());\r\n return;\r\n }\r\n if (frame instanceof PingWebSocketFrame) {\r\n ctx.write(new PongWebSocketFrame(frame.content().retain()));\r\n return;\r\n }\r\n if (frame instanceof TextWebSocketFrame) {\r\n devicePool.join(ctx.channel(), mac);\r\n String json = ((TextWebSocketFrame) frame).text();\r\n Logic.ReqRespType data= JsonTools.read(json,Logic.ReqRespType.class);\r\n //...\r\n return;\r\n }\r\n }\r\n```\r\n- 如果是HTTP则需在RouterSetting中配置路由.\r\n比如r.POST(\"api/get_verify_code\", getVerifyCodeAct):\r\n将url为\"api/get_verify_code\"的POST请求路由到LoginAct中\r\n```java\r\npublic class RouterSetting {\r\n @Autowired\r\n private Router<Action> router;\r\n @Autowired\r\n private GetVerifyCodeAct getVerifyCodeAct;//w\r\n @Autowired\r\n private LoginAct loginAct;\r\n @Autowired\r\n private RegisterAct registerAcc;\r\n\r\n public Router<Action> getRouter() {\r\n routerConfig(this.router);\r\n return this.router;\r\n }\r\n\r\n private void routerConfig(Router<Action> r) {\r\n r.POST(\"api/get_verify_code\", getVerifyCodeAct);\r\n r.ANY(\"api/login\", loginAct);\r\n r.GET(\"api/register\", registerAcc);\r\n }\r\n}\r\n```\r\n- Action处理HTTP请求并返回\r\n\r\n```java\r\n@Controller\r\npublic class LoginAct implements Action {\r\n private static final Logger logger = LoggerFactory.getLogger(LoginAct.class);\r\n @Override\r\n public void act(ChannelHandlerContext ctx, FullHttpRequest req) {\r\n String ip = HttpTools.getIp(req);\r\n String body = Convert.buf2Str(req.content());\r\n Get.Login get = JsonTools.read(body, Get.Login.class);//1.得到HTTP传来的json数据解析为javabean\r\n Sub.Register back;//构建返回给客户端的javabean的实例\r\n //...\r\n HttpTools.sendCorrectResp(ctx, req, back);//返回给客户端HTTP Response\r\n }\r\n}\r\n\r\n```\r\n- 添加Session(依靠ehcache)\r\n\r\n```java\r\nprivate void addSession(long userId, String ip) {\r\n Logic.DeviceSession session = new Logic.DeviceSession(ip, \"\");\r\n Cache.add(userId + \"\", session, \"6mn\");//设置session的缓存时间为6分钟\r\n //debugSession(userId);\r\n }\r\n```\r\n- 从HTTP请求中获取IP地址\r\n```\r\nString ip = HttpTools.getIp(req);\r\n```\r\n####netty参数设置\r\n```\r\nport=8090\r\nnetty.boss.thread.count=2\r\nnetty.worker.thread.count=1\r\nnetty.so.keepalive=true\r\nnetty.so.backlog=100\r\n```\r\n####项目依赖\r\n```groovy\r\n //---------------------单元测试----------------------------\r\n testCompile group: \'junit\', name: \'junit\', version: \'4.11\'\r\n //--------------------数据库驱动----------------------------\r\n compile \'org.mongodb:mongodb-driver:3.2.2\'\r\n compile \'mysql:mysql-connector-java:5.1.38\'\r\n //-------------------数据库连接池---------------------------\r\n compile \'com.zaxxer:HikariCP:2.4.5\'\r\n //----------------------ORM------------------------------\r\n compile group: \'org.mybatis\', name: \'mybatis\', version:mybatisVersion\r\n compile group: \'org.mybatis\', name: \'mybatis-spring\', version:mybatisSpringVersion\r\n //-----------------------缓存----------------------------\r\n compile group: \'net.sf.ehcache\', name: \'ehcache\', version:ehcacheVersion\r\n //----------------------工具包----------------------------\r\n compile \'commons-httpclient:commons-httpclient:3.1-rc1\'\r\n compile \'org.javassist:javassist:3.20.0-GA\'\r\n //---------------------日志处理----------------------------\r\n compile \'org.slf4j:slf4j-api:1.7.21\'\r\n compile \'ch.qos.logback:logback-core:1.1.7\'\r\n compile \'ch.qos.logback:logback-classic:1.1.7\'\r\n //---------------------json处理---------------------------\r\n compile \'com.google.code.gson:gson:2.6.2\'\r\n //---------------------netty-----------------------------\r\n compile group: \'io.netty\', name: \'netty-all\', version:nettyVersion\r\n //---------------------spring----------------------------\r\n compile group: \'org.springframework\', name: \'spring-test\', version:springVersion\r\n compile group: \'org.springframework\', name: \'spring-jdbc\', version:springVersion\r\n compile(group: \'org.springframework\', name: \'spring-context\', version:springVersion) {\r\n exclude(module: \'commons-logging\')\r\n }\r\n```');
/*Data for the table `project` */
insert into `project`(`id`,`name`,`url`,`tech`,`desp`,`date`) values (1,'jcalaBlog','https://github.com/jcalaz/jcalaBlog','springBoot+springMVC+undertow+mybatis+velocity+lombok\r\n+。。。','基于springboot的响应式个人博客','2016-11-16 14:40:56');
/*Data for the table `view_tag` */
insert into `view_tag`(`name`,`vid`) values ('java',23),('mybatis',23),('spring',23),('springBoot',23),('undertow',34);