﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-paulwong-随笔分类-J2EE</title><link>http://www.blogjava.net/paulwong/category/11299.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 07 Aug 2015 06:58:36 GMT</lastBuildDate><pubDate>Fri, 07 Aug 2015 06:58:36 GMT</pubDate><ttl>60</ttl><item><title>RESTful API 设计指南</title><link>http://www.blogjava.net/paulwong/archive/2015/08/07/426659.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 07 Aug 2015 06:13:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/08/07/426659.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/426659.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/08/07/426659.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/426659.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/426659.html</trackback:ping><description><![CDATA[<div id="share_button" style="margin: 0px; padding-top: 1em; padding-right: 2em; list-style-type: none; border: none; color: #111111; font-family: Georgia, serif; font-size: 12px; letter-spacing: -0.119999997317791px; line-height: 21.6000003814697px; word-spacing: 2.40000009536743px; float: right; background-color: #f5f5d5;"><a href="http://www.bshare.cn/share" style="margin: 0px; padding: 0px; list-style-type: none; text-decoration: none; border: none; color: #556677; font-stretch: normal; font-family: Helvetica, Calibri, Tahoma, Arial, 宋体, sans-serif; line-height: 18px; overflow: hidden; height: 21px; display: block; width: 51px; background: none;"><div bsstyle10"="" style="margin: 0px; list-style-type: none; text-align: center; font-weight: bold; border: none; color: #333333; cursor: pointer; zoom: 1; display: inline-block; line-height: 1.2; height: 21px; width: 51px; background: url(http://static.bshare.cn/frame/images/button_custom10-zh-Orange.gif) no-repeat transparent;"></div><div style="margin: 0px; list-style-type: none; border: none; color: #111111; zoom: 1; display: inline-block; line-height: 1.2; clear: both; background: none;"></div></a></div><div style="margin: 1.5em auto 2em; list-style-type: none; border: none; color: #111111; line-height: 0.8; font-family: Georgia, serif; font-size: 12px; letter-spacing: -0.119999997317791px; word-spacing: 2.40000009536743px; background-color: #f5f5d5;"><p author"="" style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; color: #556677; font-size: 1.6em; line-height: 28.7999992370605px;">作者：&nbsp;<a url"="" href="http://www.ruanyifeng.com/" style="margin: 0px; padding: 0px; list-style-type: none; text-decoration: none; border: none; color: #556677;">阮一峰</a></p><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; color: #556677; font-size: 1.6em; line-height: 28.7999992370605px;">日期：&nbsp;<a href="http://www.ruanyifeng.com/blog/2014/05/" style="margin: 0px; padding: 0px; list-style-type: none; text-decoration: none; border: none; color: #556677;">2014年5月22日</a></p></div><div entry-content"="" id="main-content" style="margin: 0px; list-style-type: none; border: none; color: #111111; font-family: Georgia, serif; font-size: 12px; letter-spacing: -0.119999997317791px; line-height: 21.6000003814697px; word-spacing: 2.40000009536743px; background-color: #f5f5d5;"><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">网络应用程序，分为前端和后端两个部分。当前的发展趋势，就是前端设备层出不穷（手机、平板、桌面电脑、其他专用设备......）。</p><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">因此，必须有一种统一的机制，方便不同的前端设备与后端进行通信。这导致API构架的流行，甚至出现<a href="http://www.google.com.hk/search?q=API+first" target="_blank" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #112233;">"API First"</a>的设计思想。<a href="http://en.wikipedia.org/wiki/Representational_state_transfer" target="_blank" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #112233;">RESTful API</a>是目前比较成熟的一套互联网应用程序的API设计理论。我以前写过一篇<a href="http://www.ruanyifeng.com/blog/2011/09/restful.html" target="_blank" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #112233;">《理解RESTful架构》</a>，探讨如何理解这个概念。</p><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">今天，我将介绍RESTful API的设计细节，探讨如何设计一套合理、好用的API。我的主要参考了两篇文章（<a href="http://codeplanet.io/principles-good-restful-api-design/" target="_blank" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #112233;">1</a>，<a href="https://bourgeois.me/rest/" target="_blank" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #112233;">2</a>）。</p><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;"><img src="http://image.beekka.com/blog/2014/bg2014052201.png" alt="RESTful API" title="" style="margin: 0px; padding: 0px; list-style-type: none; border: 0.3em solid #e0dfcc; border-radius: 1em;" /></p><h2>一、协议</h2><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">API与用户的通信协议，总是使用<a href="http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html" target="_blank" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #112233;">HTTPs协议</a>。</p><h2>二、域名</h2><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">应该尽量将API部署在专用域名之下。</p><blockquote style="margin: 2em; padding: 1em; list-style-type: none; border-width: 0.3em; border-color: #e0dfcc; color: #111111; border-radius: 1em; font-family: Consolas, Monaco, 'Andale Mono', monospace; text-shadow: white 0px 1px; overflow: auto; background-color: #f5f2f0;"><pre language-javascript"="" style="margin-top: 0px; margin-bottom: 0px; padding: 0em 0em 0.5em; list-style-type: none; border: none; color: black; text-shadow: white 0px 1px; font-family: Consolas, Monaco, 'Andale Mono', monospace; direction: ltr; word-spacing: normal; font-size: 1.2em; tab-size: 4; overflow: auto; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><code language-javascript"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; text-shadow: white 0px 1px; font-family: Consolas, Monaco, 'Andale Mono', monospace; direction: ltr; word-spacing: normal; font-size: 1.2em; tab-size: 4;"> https<span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">:</span><span operator"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #a67f59; background: rgba(255, 255, 255, 0.498039);">/</span><span operator"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #a67f59; background: rgba(255, 255, 255, 0.498039);">/</span>api<span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">.</span>example<span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">.</span>com </code></pre></blockquote><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">如果确定API很简单，不会有进一步扩展，可以考虑放在主域名下。</p><blockquote style="margin: 2em; padding: 1em; list-style-type: none; border-width: 0.3em; border-color: #e0dfcc; color: #111111; border-radius: 1em; font-family: Consolas, Monaco, 'Andale Mono', monospace; text-shadow: white 0px 1px; overflow: auto; background-color: #f5f2f0;"><pre language-javascript"="" style="margin-top: 0px; margin-bottom: 0px; padding: 0em 0em 0.5em; list-style-type: none; border: none; color: black; text-shadow: white 0px 1px; font-family: Consolas, Monaco, 'Andale Mono', monospace; direction: ltr; word-spacing: normal; font-size: 1.2em; tab-size: 4; overflow: auto; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><code language-javascript"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; text-shadow: white 0px 1px; font-family: Consolas, Monaco, 'Andale Mono', monospace; direction: ltr; word-spacing: normal; font-size: 1.2em; tab-size: 4;"> https<span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">:</span><span operator"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #a67f59; background: rgba(255, 255, 255, 0.498039);">/</span><span operator"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #a67f59; background: rgba(255, 255, 255, 0.498039);">/</span>example<span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">.</span>org<span regex"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #ee9900;">/api/</span> </code></pre></blockquote><h2>三、版本（Versioning）</h2><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">应该将API的版本号放入URL。</p><blockquote style="margin: 2em; padding: 1em; list-style-type: none; border-width: 0.3em; border-color: #e0dfcc; color: #111111; border-radius: 1em; font-family: Consolas, Monaco, 'Andale Mono', monospace; text-shadow: white 0px 1px; overflow: auto; background-color: #f5f2f0;"><pre language-javascript"="" style="margin-top: 0px; margin-bottom: 0px; padding: 0em 0em 0.5em; list-style-type: none; border: none; color: black; text-shadow: white 0px 1px; font-family: Consolas, Monaco, 'Andale Mono', monospace; direction: ltr; word-spacing: normal; font-size: 1.2em; tab-size: 4; overflow: auto; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><code language-javascript"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; text-shadow: white 0px 1px; font-family: Consolas, Monaco, 'Andale Mono', monospace; direction: ltr; word-spacing: normal; font-size: 1.2em; tab-size: 4;"> https<span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">:</span><span operator"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #a67f59; background: rgba(255, 255, 255, 0.498039);">/</span><span operator"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #a67f59; background: rgba(255, 255, 255, 0.498039);">/</span>api<span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">.</span>example<span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">.</span>com<span regex"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #ee9900;">/v1/</span> </code></pre></blockquote><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">另一种做法是，将版本号放在HTTP头信息中，但不如放入URL方便和直观。<a href="https://developer.github.com/v3/media/#request-specific-version" target="_blank" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #112233;">Github</a>采用这种做法。</p><h2>四、路径（Endpoint）</h2><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">路径又称"终点"（endpoint），表示API的具体网址。</p><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">在RESTful架构中，每个网址代表一种资源（resource），所以网址中不能有动词，只能有名词，而且所用的名词往往与数据库的表格名对应。一般来说，数据库中的表都是同种记录的"集合"（collection），所以API中的名词也应该使用复数。</p><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">举例来说，有一个API提供动物园（zoo）的信息，还包括各种动物和雇员的信息，则它的路径应该设计成下面这样。</p><blockquote style="margin: 2em; padding: 1em; list-style-type: none; border-width: 0.3em; border-color: #e0dfcc; color: #111111; border-radius: 1em; font-family: Consolas, Monaco, 'Andale Mono', monospace; text-shadow: white 0px 1px; overflow: auto; background-color: #f5f2f0;"><ul style="margin: 0px 0px 0px 4em; padding: 0px; list-style-type: none; border: none;"><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">https://api.example.com/v1/zoos</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">https://api.example.com/v1/animals</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">https://api.example.com/v1/employees</li></ul></blockquote><h2>五、HTTP动词</h2><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">对于资源的具体操作类型，由HTTP动词表示。</p><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">常用的HTTP动词有下面五个（括号里是对应的SQL命令）。</p><blockquote style="margin: 2em; padding: 1em; list-style-type: none; border-width: 0.3em; border-color: #e0dfcc; color: #111111; border-radius: 1em; font-family: Consolas, Monaco, 'Andale Mono', monospace; text-shadow: white 0px 1px; overflow: auto; background-color: #f5f2f0;"><ul style="margin: 0px 0px 0px 4em; padding: 0px; list-style-type: none; border: none;"><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">GET（SELECT）：从服务器取出资源（一项或多项）。</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">POST（CREATE）：在服务器新建一个资源。</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">PUT（UPDATE）：在服务器更新资源（客户端提供改变后的完整资源）。</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">PATCH（UPDATE）：在服务器更新资源（客户端提供改变的属性）。</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">DELETE（DELETE）：从服务器删除资源。</li></ul></blockquote><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">还有两个不常用的HTTP动词。</p><blockquote style="margin: 2em; padding: 1em; list-style-type: none; border-width: 0.3em; border-color: #e0dfcc; color: #111111; border-radius: 1em; font-family: Consolas, Monaco, 'Andale Mono', monospace; text-shadow: white 0px 1px; overflow: auto; background-color: #f5f2f0;"><ul style="margin: 0px 0px 0px 4em; padding: 0px; list-style-type: none; border: none;"><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">HEAD：获取资源的元数据。</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">OPTIONS：获取信息，关于资源的哪些属性是客户端可以改变的。</li></ul></blockquote><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">下面是一些例子。</p><blockquote style="margin: 2em; padding: 1em; list-style-type: none; border-width: 0.3em; border-color: #e0dfcc; color: #111111; border-radius: 1em; font-family: Consolas, Monaco, 'Andale Mono', monospace; text-shadow: white 0px 1px; overflow: auto; background-color: #f5f2f0;"><ul style="margin: 0px 0px 0px 4em; padding: 0px; list-style-type: none; border: none;"><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">GET /zoos：列出所有动物园</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">POST /zoos：新建一个动物园</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">GET /zoos/ID：获取某个指定动物园的信息</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">PUT /zoos/ID：更新某个指定动物园的信息（提供该动物园的全部信息）</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">PATCH /zoos/ID：更新某个指定动物园的信息（提供该动物园的部分信息）</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">DELETE /zoos/ID：删除某个动物园</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">GET /zoos/ID/animals：列出某个指定动物园的所有动物</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">DELETE /zoos/ID/animals/ID：删除某个指定动物园的指定动物</li></ul></blockquote><h2>六、过滤信息（Filtering）</h2><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">如果记录数量很多，服务器不可能都将它们返回给用户。API应该提供参数，过滤返回结果。</p><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">下面是一些常见的参数。</p><blockquote style="margin: 2em; padding: 1em; list-style-type: none; border-width: 0.3em; border-color: #e0dfcc; color: #111111; border-radius: 1em; font-family: Consolas, Monaco, 'Andale Mono', monospace; text-shadow: white 0px 1px; overflow: auto; background-color: #f5f2f0;"><ul style="margin: 0px 0px 0px 4em; padding: 0px; list-style-type: none; border: none;"><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">?limit=10：指定返回记录的数量</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">?offset=10：指定返回记录的开始位置。</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">?page=2&amp;per_page=100：指定第几页，以及每页的记录数。</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">?sortby=name&amp;order=asc：指定返回结果按照哪个属性排序，以及排序顺序。</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">?animal_type_id=1：指定筛选条件</li></ul></blockquote><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">参数的设计允许存在冗余，即允许API路径和URL参数偶尔有重复。比如，GET /zoo/ID/animals 与 GET /animals?zoo_id=ID 的含义是相同的。</p><h2>七、状态码（Status Codes）</h2><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">服务器向用户返回的状态码和提示信息，常见的有以下一些（方括号中是该状态码对应的HTTP动词）。</p><blockquote style="margin: 2em; padding: 1em; list-style-type: none; border-width: 0.3em; border-color: #e0dfcc; color: #111111; border-radius: 1em; font-family: Consolas, Monaco, 'Andale Mono', monospace; text-shadow: white 0px 1px; overflow: auto; background-color: #f5f2f0;"><ul style="margin: 0px 0px 0px 4em; padding: 0px; list-style-type: none; border: none;"><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">200 OK - [GET]：服务器成功返回用户请求的数据，该操作是幂等的（Idempotent）。</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">201 CREATED - [POST/PUT/PATCH]：用户新建或修改数据成功。</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">202 Accepted - [*]：表示一个请求已经进入后台排队（异步任务）</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">204 NO CONTENT - [DELETE]：用户删除数据成功。</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">400 INVALID REQUEST - [POST/PUT/PATCH]：用户发出的请求有错误，服务器没有进行新建或修改数据的操作，该操作是幂等的。</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">401 Unauthorized - [*]：表示用户没有权限（令牌、用户名、密码错误）。</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">403 Forbidden - [*] 表示用户得到授权（与401错误相对），但是访问是被禁止的。</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">404 NOT FOUND - [*]：用户发出的请求针对的是不存在的记录，服务器没有进行操作，该操作是幂等的。</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">406 Not Acceptable - [GET]：用户请求的格式不可得（比如用户请求JSON格式，但是只有XML格式）。</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">410 Gone -[GET]：用户请求的资源被永久删除，且不会再得到的。</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时，发生一个验证错误。</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">500 INTERNAL SERVER ERROR - [*]：服务器发生错误，用户将无法判断发出的请求是否成功。</li></ul></blockquote><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">状态码的完全列表参见<a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html" target="_blank" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #112233;">这里</a>。</p><h2>八、错误处理（Error handling）</h2><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">如果状态码是4xx，就应该向用户返回出错信息。一般来说，返回的信息中将error作为键名，出错信息作为键值即可。</p><blockquote style="margin: 2em; padding: 1em; list-style-type: none; border-width: 0.3em; border-color: #e0dfcc; color: #111111; border-radius: 1em; font-family: Consolas, Monaco, 'Andale Mono', monospace; text-shadow: white 0px 1px; overflow: auto; background-color: #f5f2f0;"><pre language-javascript"="" style="margin-top: 0px; margin-bottom: 0px; padding: 0em 0em 0.5em; list-style-type: none; border: none; color: black; text-shadow: white 0px 1px; font-family: Consolas, Monaco, 'Andale Mono', monospace; direction: ltr; word-spacing: normal; font-size: 1.2em; tab-size: 4; overflow: auto; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><code language-javascript"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; text-shadow: white 0px 1px; font-family: Consolas, Monaco, 'Andale Mono', monospace; direction: ltr; word-spacing: normal; font-size: 1.2em; tab-size: 4;"> <span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">{</span>     error<span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">:</span> <span string"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #669900;">"Invalid API key"</span> <span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">}</span> </code></pre></blockquote><h2>九、返回结果</h2><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">针对不同操作，服务器向用户返回的结果应该符合以下规范。</p><blockquote style="margin: 2em; padding: 1em; list-style-type: none; border-width: 0.3em; border-color: #e0dfcc; color: #111111; border-radius: 1em; font-family: Consolas, Monaco, 'Andale Mono', monospace; text-shadow: white 0px 1px; overflow: auto; background-color: #f5f2f0;"><ul style="margin: 0px 0px 0px 4em; padding: 0px; list-style-type: none; border: none;"><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">GET /collection：返回资源对象的列表（数组）</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">GET /collection/resource：返回单个资源对象</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">POST /collection：返回新生成的资源对象</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">PUT /collection/resource：返回完整的资源对象</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">PATCH /collection/resource：返回完整的资源对象</li><li style="margin: 0px; padding: 0px; list-style-type: square; text-align: left; border: none; font-size: 1.6em; line-height: 35.2000007629395px;">DELETE /collection/resource：返回一个空文档</li></ul></blockquote><h2>十、Hypermedia API</h2><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">RESTful API最好做到Hypermedia，即返回结果中提供链接，连向其他API方法，使得用户不查文档，也知道下一步应该做什么。</p><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">比如，当用户向api.example.com的根目录发出请求，会得到这样一个文档。</p><blockquote style="margin: 2em; padding: 1em; list-style-type: none; border-width: 0.3em; border-color: #e0dfcc; color: #111111; border-radius: 1em; font-family: Consolas, Monaco, 'Andale Mono', monospace; text-shadow: white 0px 1px; overflow: auto; background-color: #f5f2f0;"><pre language-javascript"="" style="margin-top: 0px; margin-bottom: 0px; padding: 0em 0em 0.5em; list-style-type: none; border: none; color: black; text-shadow: white 0px 1px; font-family: Consolas, Monaco, 'Andale Mono', monospace; direction: ltr; word-spacing: normal; font-size: 1.2em; tab-size: 4; overflow: auto; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><code language-javascript"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; text-shadow: white 0px 1px; font-family: Consolas, Monaco, 'Andale Mono', monospace; direction: ltr; word-spacing: normal; font-size: 1.2em; tab-size: 4;"> <span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">{</span><span string"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #669900;">"link"</span><span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">:</span> <span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">{</span>   <span string"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #669900;">"rel"</span><span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">:</span>   <span string"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #669900;">"collection <a url-link"="" href="https://www.example.com/zoos" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #112233;">https://www.example.com/zoos</a>"</span><span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">,</span>   <span string"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #669900;">"href"</span><span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">:</span>  <span string"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #669900;">"<a url-link"="" href="https://api.example.com/zoos" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #112233;">https://api.example.com/zoos</a>"</span><span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">,</span>   <span string"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #669900;">"title"</span><span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">:</span> <span string"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #669900;">"List of zoos"</span><span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">,</span>   <span string"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #669900;">"type"</span><span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">:</span>  <span string"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #669900;">"application/vnd.yourformat+json"</span> <span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">}</span><span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">}</span> </code></pre></blockquote><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">上面代码表示，文档中有一个link属性，用户读取这个属性就知道下一步该调用什么API了。rel表示这个API与当前网址的关系（collection关系，并给出该collection的网址），href表示API的路径，title表示API的标题，type表示返回类型。</p><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">Hypermedia API的设计被称为<a href="http://en.wikipedia.org/wiki/HATEOAS" target="_blank" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #112233;">HATEOAS</a>。Github的API就是这种设计，访问<a href="https://api.github.com/" target="_blank" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #112233;">api.github.com</a>会得到一个所有可用API的网址列表。</p><blockquote style="margin: 2em; padding: 1em; list-style-type: none; border-width: 0.3em; border-color: #e0dfcc; color: #111111; border-radius: 1em; font-family: Consolas, Monaco, 'Andale Mono', monospace; text-shadow: white 0px 1px; overflow: auto; background-color: #f5f2f0;"><pre language-javascript"="" style="margin-top: 0px; margin-bottom: 0px; padding: 0em 0em 0.5em; list-style-type: none; border: none; color: black; text-shadow: white 0px 1px; font-family: Consolas, Monaco, 'Andale Mono', monospace; direction: ltr; word-spacing: normal; font-size: 1.2em; tab-size: 4; overflow: auto; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><code language-javascript"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; text-shadow: white 0px 1px; font-family: Consolas, Monaco, 'Andale Mono', monospace; direction: ltr; word-spacing: normal; font-size: 1.2em; tab-size: 4;"> <span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">{</span>   <span string"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #669900;">"current_user_url"</span><span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">:</span> <span string"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #669900;">"<a url-link"="" href="https://api.github.com/user" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #112233;">https://api.github.com/user</a>"</span><span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">,</span>   <span string"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #669900;">"authorizations_url"</span><span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">:</span> <span string"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #669900;">"<a url-link"="" href="https://api.github.com/authorizations" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #112233;">https://api.github.com/authorizations</a>"</span><span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">,</span>  <span comment"="" spellcheck="true" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #708090;"> // ... </span><span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">}</span> </code></pre></blockquote><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">从上面可以看到，如果想获取当前用户的信息，应该去访问<a href="https://api.github.com/user" target="_blank" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #112233;">api.github.com/user</a>，然后就得到了下面结果。</p><blockquote style="margin: 2em; padding: 1em; list-style-type: none; border-width: 0.3em; border-color: #e0dfcc; color: #111111; border-radius: 1em; font-family: Consolas, Monaco, 'Andale Mono', monospace; text-shadow: white 0px 1px; overflow: auto; background-color: #f5f2f0;"><pre language-javascript"="" style="margin-top: 0px; margin-bottom: 0px; padding: 0em 0em 0.5em; list-style-type: none; border: none; color: black; text-shadow: white 0px 1px; font-family: Consolas, Monaco, 'Andale Mono', monospace; direction: ltr; word-spacing: normal; font-size: 1.2em; tab-size: 4; overflow: auto; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><code language-javascript"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; text-shadow: white 0px 1px; font-family: Consolas, Monaco, 'Andale Mono', monospace; direction: ltr; word-spacing: normal; font-size: 1.2em; tab-size: 4;"> <span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">{</span>   <span string"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #669900;">"message"</span><span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">:</span> <span string"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #669900;">"Requires authentication"</span><span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">,</span>   <span string"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #669900;">"documentation_url"</span><span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">:</span> <span string"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #669900;">"<a url-link"="" href="https://developer.github.com/v3" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #112233;">https://developer.github.com/v3</a>"</span> <span punctuation"="" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #999999;">}</span> </code></pre></blockquote><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">上面代码表示，服务器给出了提示信息，以及文档的网址。</p><h2>十一、其他</h2><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">（1）API的身份认证应该使用<a href="http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html" target="_blank" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #112233;">OAuth 2.0</a>框架。</p><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">（2）服务器返回的数据格式，应该尽量使用JSON，避免使用XML。</p><p style="margin: 1em 0px 0px 0.8em; padding: 0px; list-style-type: none; border: none; font-size: 1.6em; line-height: 28.7999992370605px;">（完）</p></div><img src ="http://www.blogjava.net/paulwong/aggbug/426659.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-08-07 14:13 <a href="http://www.blogjava.net/paulwong/archive/2015/08/07/426659.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WEB版的REST测试工具</title><link>http://www.blogjava.net/paulwong/archive/2015/05/27/425327.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 27 May 2015 06:12:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/05/27/425327.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/425327.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/05/27/425327.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/425327.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/425327.html</trackback:ping><description><![CDATA[<br /><a href="http://hackst.com/" target="_blank">http://hackst.com/</a><br /><br /><br /><a href="http://www.quadrillian.com/" target="_blank">http://www.quadrillian.com/</a><br /><img src ="http://www.blogjava.net/paulwong/aggbug/425327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-05-27 14:12 <a href="http://www.blogjava.net/paulwong/archive/2015/05/27/425327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>maven3 jetty jrebel 搭建可调式的开发环境</title><link>http://www.blogjava.net/paulwong/archive/2015/05/10/424979.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sun, 10 May 2015 12:53:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/05/10/424979.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/424979.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/05/10/424979.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/424979.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/424979.html</trackback:ping><description><![CDATA[<a href="http://my.oschina.net/edeis2012/blog/68831" target="_blank">http://my.oschina.net/edeis2012/blog/68831</a><br /><br /><a href="http://chen-rojer-gmail-com.iteye.com/blog/910748" target="_blank">http://chen-rojer-gmail-com.iteye.com/blog/910748</a><br /><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/424979.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-05-10 20:53 <a href="http://www.blogjava.net/paulwong/archive/2015/05/10/424979.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分布式配置管理平台Disconf</title><link>http://www.blogjava.net/paulwong/archive/2015/04/13/424366.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Mon, 13 Apr 2015 08:12:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/04/13/424366.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/424366.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/04/13/424366.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/424366.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/424366.html</trackback:ping><description><![CDATA[<a href="http://www.oschina.net/p/disconf" target="_blank">http://www.oschina.net/p/disconf</a><br /><br /><p style="margin: 0px 0px 10px; padding: 0px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;">Disconf 可以为各种业务平台提供统一的配置管理服务。</p><ul list-paddingleft-2"="" style="margin: 0.5em 0px 0.5em 1.5em; padding: 0px; list-style-position: inside; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;"><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">支持配置（配置项+配置文件）的分布式化管理</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">配置发布统一化</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">极简的使用方式（注解式编程 或 XML代码无代码侵入模式）</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">低侵入性或无侵入性、强兼容性</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">需要Spring编程环境</p></li></ul><p style="margin: 0px 0px 10px; padding: 0px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;"><img src="https://camo.githubusercontent.com/d611dae3ab52d32afa5d98e8455fac17e399ee0c/687474703a2f2f7777332e73696e61696d672e636e2f626d6964646c652f3630633936323066677731656964617870716479336a32307072306a72676e6f2e6a7067" alt="" data-canonical-src="http://ww3.sinaimg.cn/bmiddle/60c9620fgw1eidaxpqdy3j20pr0jrgno.jpg" data-bd-imgshare-binded="1" style="margin: 0px; padding: 0px; border: 0px; max-width: 100%;" /></p><h3>重要功能特点</h3><ul list-paddingleft-2"="" style="margin: 0.5em 0px 0.5em 1.5em; padding: 0px; list-style-position: inside; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;"><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;"><strong style="margin: 0px; padding: 0px;">支持配置（配置项+配置文件）的分布式化管理</strong></p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;"><strong style="margin: 0px; padding: 0px;">配置发布统一化</strong></p></li><ul list-paddingleft-2"="" style="margin: 0.5em 0px 0.5em 1.5em; padding: 0px; list-style-type: square; list-style-position: inside;"><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">配置发布、更新统一化（云端存储、发布）:配置存储在云端系统，用户统一在平台上进行发布、更新配置。</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">配置更新自动化：用户在平台更新配置，使用该配置的系统会自动发现该情况，并应用新配置。特殊地，如果用户为此配置定义了回调函数类，则此函数类会被自动调用。</p></li></ul><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;"><strong style="margin: 0px; padding: 0px;">配置异构系统管理</strong></p></li><ul list-paddingleft-2"="" style="margin: 0.5em 0px 0.5em 1.5em; padding: 0px; list-style-type: square; list-style-position: inside;"><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">异构包部署统一化：这里的异构系统是指一个系统部署多个实例时，由于配置不同，从而需要多个部署包（jar或war）的情况（下同）。使用 Disconf后，异构系统的部署只需要一个部署包，不同实例的配置会自动分配。特别地，在业界大量使用部署虚拟化（如JPAAS系统，SAE，BAE） 的情况下，同一个系统使用同一个部署包的情景会越来越多，Disconf可以很自然地与他天然契合。</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">异构主备自动切换：如果一个异构系统存在主备机，主机发生挂机时，备机可以自动获取主机配置从而变成主机。</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">异构主备机Context共享工具：异构系统下，主备机切换时可能需要共享Context。可以使用Context共享工具来共享主备的Context。</p></li></ul><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;"><strong style="margin: 0px; padding: 0px;">极简的使用方式（注解式编程 或 XML代码无代码侵入模式）</strong>：我们追求的是极简的、用户编程体验良好的编程方式。目前支持两种开发模式：基于XML配置或才基于注解，即可完成复杂的配置分布式化。</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;"><strong style="margin: 0px; padding: 0px;">需要Spring编程环境</strong></p></li></ul><p style="margin: 0px 0px 10px; padding: 0px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;">注：配置项是指某个类里的某个Field字段。</p><p style="margin: 0px 0px 10px; padding: 0px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;"><strong style="margin: 0px; padding: 0px;">Disconf的功能特点描述图：</strong></p><p style="margin: 0px 0px 10px; padding: 0px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;"><a href="https://camo.githubusercontent.com/ca29510843721567e6f8f09e0d9d252fa5331ed9/687474703a2f2f7777312e73696e61696d672e636e2f626d6964646c652f36306339363230666777316568693777776b64746f6a32306e7730667a3075682e6a7067" target="_blank" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;"><img src="https://camo.githubusercontent.com/ca29510843721567e6f8f09e0d9d252fa5331ed9/687474703a2f2f7777312e73696e61696d672e636e2f626d6964646c652f36306339363230666777316568693777776b64746f6a32306e7730667a3075682e6a7067" alt="" data-canonical-src="http://ww1.sinaimg.cn/bmiddle/60c9620fgw1ehi7wwkdtoj20nw0fz0uh.jpg" data-bd-imgshare-binded="1" style="margin: 0px; padding: 0px; border: 0px; max-width: 100%;" /></a></p><p style="margin: 0px 0px 10px; padding: 0px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;"><a textvalue="查看大图" target="_blank" href="http://ww1.sinaimg.cn/mw1024/60c9620fgw1ehi7wwkdtoj20nw0fz0uh.jpg" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">查看大图</a></p><h3>其它功能特点</h3><ul list-paddingleft-2"="" style="margin: 0.5em 0px 0.5em 1.5em; padding: 0px; list-style-position: inside; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;"><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;"><strong style="margin: 0px; padding: 0px;">低侵入性或无侵入性、强兼容性</strong>：</p></li><ul list-paddingleft-2"="" style="margin: 0.5em 0px 0.5em 1.5em; padding: 0px; list-style-type: square; list-style-position: inside;"><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">低侵入性：通过极少的注解式代码撰写，即可实现分布式配置。</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">无侵入性：通过XML简单配置，即可实现分布式配置。</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">强兼容性：为程序添加了分布式配置注解后，开启Disconf则使用分布式配置；若关闭Disconf则使用本地配置；若开启Disconf后disconf-web不能正常Work，则Disconf使用本地配置。</p></li></ul><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;"><strong style="margin: 0px; padding: 0px;">支持配置项多个项目共享，支持批量处理项目配置</strong>。</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;"><strong style="margin: 0px; padding: 0px;">配置监控</strong>：平台提供自校验功能（进一步提高稳定性），可以定时校验应用系统的配置是否正确。</p></li></ul><h2></h2><h2>模块架构图</h2><p style="margin: 0px 0px 10px; padding: 0px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;"><a href="https://camo.githubusercontent.com/e05c0e51eab78d18fbc7b61d35a59f71d60e835c/687474703a2f2f7777312e73696e61696d672e636e2f626d6964646c652f36306339363230666a773165716937636e686a70306a323065343039377766712e6a7067" target="_blank" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;"><img src="https://camo.githubusercontent.com/e05c0e51eab78d18fbc7b61d35a59f71d60e835c/687474703a2f2f7777312e73696e61696d672e636e2f626d6964646c652f36306339363230666a773165716937636e686a70306a323065343039377766712e6a7067" alt="" data-canonical-src="http://ww1.sinaimg.cn/bmiddle/60c9620fjw1eqi7cnhjp0j20e4097wfq.jpg" data-bd-imgshare-binded="1" style="margin: 0px; padding: 0px; border: 0px; max-width: 100%;" /></a></p><img src ="http://www.blogjava.net/paulwong/aggbug/424366.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-04-13 16:12 <a href="http://www.blogjava.net/paulwong/archive/2015/04/13/424366.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVAEE资源</title><link>http://www.blogjava.net/paulwong/archive/2014/12/26/421859.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 26 Dec 2014 08:29:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/12/26/421859.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/421859.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/12/26/421859.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/421859.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/421859.html</trackback:ping><description><![CDATA[<br />
<a href="http://www.importnew.com/12408.html">http://www.importnew.com/12408.html</a><br />
<br />
Java EE + MongoDb with Apache TomEE and Jongo Starter Project<br />
<a href="http://www.javacodegeeks.com/2014/09/java-ee-mongodb-with-apache-tomee-and-jongo-starter-project.html" target="_blank">http://www.javacodegeeks.com/2014/09/java-ee-mongodb-with-apache-tomee-and-jongo-starter-project.html</a><br />
<br />
<div>From Spring to Java EE 6</div>
<a href="http://www.javacodegeeks.com/2011/11/from-spring-to-java-ee-6.html" target="_blank">http://www.javacodegeeks.com/2011/11/from-spring-to-java-ee-6.html</a>
<br /><br /><br />Java EE 7 and WebSocket API for Java (JSR 356) with AngularJS on WildFly<br /><a href="http://www.javacodegeeks.com/2014/01/java-ee-7-and-websocket-api-for-java-jsr-356-with-angularjs-on-wildfly.html" target="_blank">http://www.javacodegeeks.com/2014/01/java-ee-7-and-websocket-api-for-java-jsr-356-with-angularjs-on-wildfly.html</a><br /><br /><br /><br />lll<img src ="http://www.blogjava.net/paulwong/aggbug/421859.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-12-26 16:29 <a href="http://www.blogjava.net/paulwong/archive/2014/12/26/421859.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分布式调度QUARTZ+SPRING</title><link>http://www.blogjava.net/paulwong/archive/2014/11/14/420104.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 14 Nov 2014 10:46:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/11/14/420104.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/420104.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/11/14/420104.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/420104.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/420104.html</trackback:ping><description><![CDATA[使用SPRING的定时任务框架，如果是在分布式的环境下，由于有多台节点，会产生相同的任务，会被多个节点执行，这时需引入分布式的QUARTZ。<br />触发器：存放时间排程<br />任务：蔟业务代码<br />排程器：负责调度，即在指定的时间执行对应的任务<br /><br />如果是分布式QUARTZ，则各个节点会上报任务，存到数据库中，执行时会从数据库中取出触发器来执行，如果触发器的名称和执行时间相同，则只有一个节点去执行此任务。<br />如果此节点执行失败，则此任务则会被分派到另一节点执行。<br /><br /><div>quartz.properties</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #008000; ">#</span><span style="color: #008000; ">============================================================================</span><span style="color: #008000; "><br />#</span><span style="color: #008000; ">&nbsp;Configure&nbsp;JobStore&nbsp;&nbsp;</span><span style="color: #008000; "><br />#</span><span style="color: #008000; ">&nbsp;Using&nbsp;Spring&nbsp;datasource&nbsp;in&nbsp;quartzJobsConfig.xml</span><span style="color: #008000; "><br />#</span><span style="color: #008000; ">&nbsp;Spring&nbsp;uses&nbsp;LocalDataSourceJobStore&nbsp;extension&nbsp;of&nbsp;JobStoreCMT</span><span style="color: #008000; "><br />#</span><span style="color: #008000; ">============================================================================</span><span style="color: #008000; "><br /></span>org.quartz.jobStore.useProperties=true<br />org.quartz.jobStore.tablePrefix&nbsp;=&nbsp;QRTZ_<br />org.quartz.jobStore.isClustered&nbsp;=&nbsp;true<br />org.quartz.jobStore.clusterCheckinInterval&nbsp;=&nbsp;5000<br />org.quartz.jobStore.misfireThreshold&nbsp;=&nbsp;60000<br />org.quartz.jobStore.txIsolationLevelReadCommitted&nbsp;=&nbsp;true<br />&nbsp;<br /><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;Change&nbsp;this&nbsp;to&nbsp;match&nbsp;your&nbsp;DB&nbsp;vendor</span><span style="color: #008000; "><br /></span>org.quartz.jobStore.<span style="color: #0000FF; ">class</span>&nbsp;=&nbsp;org.quartz.impl.jdbcjobstore.JobStoreTX<br />org.quartz.jobStore.driverDelegateClass&nbsp;=&nbsp;org.quartz.impl.jdbcjobstore.StdJDBCDelegate<br />&nbsp;<br /><br /><span style="color: #008000; ">#</span><span style="color: #008000; ">============================================================================</span><span style="color: #008000; "><br />#</span><span style="color: #008000; ">&nbsp;Configure&nbsp;Main&nbsp;Scheduler&nbsp;Properties&nbsp;&nbsp;</span><span style="color: #008000; "><br />#</span><span style="color: #008000; ">&nbsp;Needed&nbsp;to&nbsp;manage&nbsp;cluster&nbsp;instances</span><span style="color: #008000; "><br />#</span><span style="color: #008000; ">============================================================================</span><span style="color: #008000; "><br /></span>org.quartz.scheduler.instanceId=AUTO<br />org.quartz.scheduler.instanceName=MY_CLUSTERED_JOB_SCHEDULER<br />org.quartz.scheduler.rmi.export&nbsp;=&nbsp;false<br />org.quartz.scheduler.rmi.proxy&nbsp;=&nbsp;false<br /><br /><br /><span style="color: #008000; ">#</span><span style="color: #008000; ">============================================================================</span><span style="color: #008000; "><br />#</span><span style="color: #008000; ">&nbsp;Configure&nbsp;ThreadPool&nbsp;&nbsp;</span><span style="color: #008000; "><br />#</span><span style="color: #008000; ">============================================================================</span><span style="color: #008000; "><br /></span>org.quartz.threadPool.<span style="color: #0000FF; ">class</span>&nbsp;=&nbsp;org.quartz.simpl.SimpleThreadPool<br />org.quartz.threadPool.threadCount&nbsp;=&nbsp;10<br />org.quartz.threadPool.threadPriority&nbsp;=&nbsp;5<br />org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread&nbsp;=&nbsp;true</div><br /><br /><div>web-schedule-applicationcontext.xml</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">&lt;?</span><span style="color: #FF00FF; ">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000FF; ">?&gt;</span><br /><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">beans&nbsp;</span><span style="color: #FF0000; ">xmlns</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/beans"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #0000FF; ">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #FF0000; ">&nbsp;xmlns:context</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/context"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:mongo</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/data/mongo"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/context<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/context/spring-context-3.0.xsd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/data/mongo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/data/mongo/spring-mongo-1.3.xsd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/beans<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"</span><span style="color: #0000FF; ">&gt;</span><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;增加定时器配置&nbsp;</span><span style="color: #008000; ">--&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;线程执行器配置，用于任务注册&nbsp;</span><span style="color: #008000; ">--&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="executor"</span><span style="color: #FF0000; ">&nbsp;class</span><span style="color: #0000FF; ">="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="corePoolSize"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="10"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="maxPoolSize"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="100"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="queueCapacity"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="500"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;设置调度&nbsp;</span><span style="color: #008000; ">--&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="webScheduler"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000FF; ">="org.springframework.scheduling.quartz.SchedulerFactoryBean"</span><span style="color: #0000FF; ">&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="configLocation"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="classpath:/properties/config/quartz.properties"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="dataSource"</span><span style="color: #FF0000; ">&nbsp;ref</span><span style="color: #0000FF; ">="dataSourceCMS"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="transactionManager"</span><span style="color: #FF0000; ">&nbsp;ref</span><span style="color: #0000FF; ">="txManager"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;This&nbsp;name&nbsp;is&nbsp;persisted&nbsp;as&nbsp;SCHED_NAME&nbsp;in&nbsp;db.&nbsp;for&nbsp;local&nbsp;testing&nbsp;could&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;change&nbsp;to&nbsp;unique&nbsp;name&nbsp;to&nbsp;avoid&nbsp;collision&nbsp;with&nbsp;dev&nbsp;server&nbsp;</span><span style="color: #008000; ">--&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="schedulerName"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="quartzScheduler"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;Will&nbsp;update&nbsp;database&nbsp;cron&nbsp;triggers&nbsp;to&nbsp;what&nbsp;is&nbsp;in&nbsp;this&nbsp;jobs&nbsp;file&nbsp;on&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;each&nbsp;deploy.&nbsp;Replaces&nbsp;all&nbsp;previous&nbsp;trigger&nbsp;and&nbsp;job&nbsp;data&nbsp;that&nbsp;was&nbsp;in&nbsp;the&nbsp;database.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;YMMV&nbsp;</span><span style="color: #008000; ">--&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="overwriteExistingJobs"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="true"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="startupDelay"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="5"</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="applicationContextSchedulerContextKey"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="applicationContext"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="jobFactory"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">class</span><span style="color: #0000FF; ">="com.tcl.project7.boss.common.scheduling.AutowiringSpringBeanJobFactory"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">property</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="triggers"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">list</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">ref&nbsp;</span><span style="color: #FF0000; ">bean</span><span style="color: #0000FF; ">="springQuertzClusterTaskSchedulerTesterTigger"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">list</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">property</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="jobDetails"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">list</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">ref&nbsp;</span><span style="color: #FF0000; ">bean</span><span style="color: #0000FF; ">="springQuertzClusterTaskSchedulerTesterJobDetail"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">list</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">property</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="taskExecutor"</span><span style="color: #FF0000; ">&nbsp;ref</span><span style="color: #0000FF; ">="executor"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;触发器&nbsp;</span><span style="color: #008000; ">--&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="springQuertzClusterTaskSchedulerTesterTigger"</span><span style="color: #FF0000; ">&nbsp;class</span><span style="color: #0000FF; ">="common.scheduling.PersistableCronTriggerFactoryBean"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="jobDetail"</span><span style="color: #FF0000; ">&nbsp;ref</span><span style="color: #0000FF; ">="springQuertzClusterTaskSchedulerTesterJobDetail"</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="cronExpression"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="*&nbsp;*&nbsp;*&nbsp;*&nbsp;*&nbsp;?"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="springQuertzClusterTaskSchedulerTesterJobDetail"</span><span style="color: #FF0000; ">&nbsp;class</span><span style="color: #0000FF; ">="org.springframework.scheduling.quartz.JobDetailBean"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="jobClass"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="common.scheduling.SpringQuertzClusterTaskSchedulerTester"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;fail-over&nbsp;重写执行失败的任务,default=false&nbsp;</span><span style="color: #008000; ">--&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="requestsRecovery"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="false"</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">beans</span><span style="color: #0000FF; ">&gt;</span></div><br /><br />JOB文件：SpringQuertzClusterTaskSchedulerTester.java<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;common.scheduling;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Date;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.quartz.JobExecutionContext;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.quartz.JobExecutionException;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.slf4j.Logger;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.slf4j.LoggerFactory;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.beans.factory.annotation.Autowired;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.scheduling.quartz.QuartzJobBean;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;com.tcl.project7.boss.common.util.UrlUtil;<br /><span style="color: #0000FF; ">import</span>&nbsp;com.tcl.project7.boss.common.util.time.TimeUtils;<br /><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&lt;p&gt;Title:SpringQuertzClusterTaskSchedulerTester&lt;/p&gt;<br />&nbsp;*&nbsp;&lt;p&gt;Description:<br />&nbsp;*&nbsp;应为要持久化等特性操作,需要继承&nbsp;QuartzJobBean<br />&nbsp;*&nbsp;&lt;br&gt;由于要被持久化,所以不能存放xxxxManager类似对象,<br />&nbsp;*&nbsp;只能从每次从QuartzJobBean注入的ApplicationContext&nbsp;中去取出<br />&nbsp;*<br />&nbsp;*&nbsp;&lt;/p&gt;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;*<br />&nbsp;*<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;SpringQuertzClusterTaskSchedulerTester&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;QuartzJobBean&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Logger&nbsp;logger&nbsp;=&nbsp;LoggerFactory.getLogger(SpringQuertzClusterTaskSchedulerTester.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;UrlUtil&nbsp;urlUtil;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">protected</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;executeInternal(JobExecutionContext&nbsp;arg0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;JobExecutionException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.info("------"&nbsp;+&nbsp;TimeUtils.formatTime(<span style="color: #0000FF; ">new</span>&nbsp;Date())&nbsp;+&nbsp;"------"&nbsp;+&nbsp;urlUtil.getNginxHost());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("------"&nbsp;+&nbsp;TimeUtils.formatTime(<span style="color: #0000FF; ">new</span>&nbsp;Date())&nbsp;+&nbsp;"------"&nbsp;+&nbsp;urlUtil.getNginxHost());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />}</div><br /><br />如果JOB中有需要调用SPRING的BEAN，则需要此文件AutowiringSpringBeanJobFactory.java<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;common.scheduling;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.quartz.spi.TriggerFiredBundle;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.beans.factory.config.AutowireCapableBeanFactory;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.ApplicationContext;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.ApplicationContextAware;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.scheduling.quartz.SpringBeanJobFactory;<br /><br /><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;*&nbsp;Autowire&nbsp;Quartz&nbsp;Jobs&nbsp;with&nbsp;Spring&nbsp;context&nbsp;dependencies<br />&nbsp;*&nbsp;</span><span style="color: #808080; ">@see</span><span style="color: #008000; ">&nbsp;</span><span style="color: #008000; text-decoration: underline; ">http://stackoverflow.com/questions/6990767/inject-bean-reference-into-a-quartz-job-in-spring/15211030</span><span style="color: #008000; ">#15211030<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;AutowiringSpringBeanJobFactory&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;SpringBeanJobFactory&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;ApplicationContextAware&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">transient</span>&nbsp;AutowireCapableBeanFactory&nbsp;beanFactory;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setApplicationContext(<span style="color: #0000FF; ">final</span>&nbsp;ApplicationContext&nbsp;context)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;beanFactory&nbsp;=&nbsp;context.getAutowireCapableBeanFactory();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">protected</span>&nbsp;Object&nbsp;createJobInstance(<span style="color: #0000FF; ">final</span>&nbsp;TriggerFiredBundle&nbsp;bundle)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;Object&nbsp;job&nbsp;=&nbsp;<span style="color: #0000FF; ">super</span>.createJobInstance(bundle);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;beanFactory.autowireBean(job);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;job;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br /><br />由于JOB需要存储到数据库中，会产生PROPERTY的问题，需剔除JOB-DATA，需此文件PersistableCronTriggerFactoryBean.java<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;common.scheduling;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.scheduling.quartz.CronTriggerFactoryBean;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.scheduling.quartz.JobDetailAwareTrigger;<br /><br /><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;*&nbsp;Needed&nbsp;to&nbsp;set&nbsp;Quartz&nbsp;useProperties=true&nbsp;when&nbsp;using&nbsp;Spring&nbsp;classes,<br />&nbsp;*&nbsp;because&nbsp;Spring&nbsp;sets&nbsp;an&nbsp;object&nbsp;reference&nbsp;on&nbsp;JobDataMap&nbsp;that&nbsp;is&nbsp;not&nbsp;a&nbsp;String<br />&nbsp;*&nbsp;<br />&nbsp;*&nbsp;</span><span style="color: #808080; ">@see</span><span style="color: #008000; ">&nbsp;</span><span style="color: #008000; text-decoration: underline; ">http://site.trimplement.com/using-spring-and-quartz-with-jobstore-properties/</span><span style="color: #008000; "><br />&nbsp;*&nbsp;</span><span style="color: #808080; ">@see</span><span style="color: #008000; ">&nbsp;</span><span style="color: #008000; text-decoration: underline; ">http://forum.springsource.org/showthread.php?130984-Quartz-error-IOException</span><span style="color: #008000; "><br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;PersistableCronTriggerFactoryBean&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;CronTriggerFactoryBean&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;afterPropertiesSet()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">super</span>.afterPropertiesSet();<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">Remove&nbsp;the&nbsp;JobDetail&nbsp;element</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getJobDataMap().remove(JobDetailAwareTrigger.JOB_DETAIL_KEY);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br /><br />建表语句，MYSQL：quartzTables.sql<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#<br />#&nbsp;Quartz&nbsp;seems&nbsp;<span style="color: #0000FF; ">to</span>&nbsp;<span style="color: #0000FF; ">work</span>&nbsp;best&nbsp;<span style="color: #0000FF; ">with</span>&nbsp;the&nbsp;driver&nbsp;mm.mysql<span style="color: #808080; ">-</span><span style="color: #800000; font-weight: bold; ">2.0</span>.<span style="color: #800000; font-weight: bold; ">7</span><span style="color: #808080; ">-</span>bin.jar<br />#<br />#&nbsp;<span style="color: #808080; ">In</span>&nbsp;your&nbsp;Quartz&nbsp;properties&nbsp;<span style="color: #0000FF; ">file</span>,&nbsp;you<span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">ll&nbsp;need&nbsp;to&nbsp;set&nbsp;<br />#&nbsp;org.quartz.jobStore.driverDelegateClass&nbsp;=&nbsp;org.quartz.impl.jdbcjobstore.StdJDBCDelegate<br />#<br /><br />DROP&nbsp;TABLE&nbsp;IF&nbsp;EXISTS&nbsp;QRTZ_JOB_LISTENERS;<br />DROP&nbsp;TABLE&nbsp;IF&nbsp;EXISTS&nbsp;QRTZ_TRIGGER_LISTENERS;<br />DROP&nbsp;TABLE&nbsp;IF&nbsp;EXISTS&nbsp;QRTZ_FIRED_TRIGGERS;<br />DROP&nbsp;TABLE&nbsp;IF&nbsp;EXISTS&nbsp;QRTZ_PAUSED_TRIGGER_GRPS;<br />DROP&nbsp;TABLE&nbsp;IF&nbsp;EXISTS&nbsp;QRTZ_SCHEDULER_STATE;<br />DROP&nbsp;TABLE&nbsp;IF&nbsp;EXISTS&nbsp;QRTZ_LOCKS;<br />DROP&nbsp;TABLE&nbsp;IF&nbsp;EXISTS&nbsp;QRTZ_SIMPLE_TRIGGERS;<br />DROP&nbsp;TABLE&nbsp;IF&nbsp;EXISTS&nbsp;QRTZ_CRON_TRIGGERS;<br />DROP&nbsp;TABLE&nbsp;IF&nbsp;EXISTS&nbsp;QRTZ_BLOB_TRIGGERS;<br />DROP&nbsp;TABLE&nbsp;IF&nbsp;EXISTS&nbsp;QRTZ_TRIGGERS;<br />DROP&nbsp;TABLE&nbsp;IF&nbsp;EXISTS&nbsp;QRTZ_JOB_DETAILS;<br />DROP&nbsp;TABLE&nbsp;IF&nbsp;EXISTS&nbsp;QRTZ_CALENDARS;<br /><br /><br />CREATE&nbsp;TABLE&nbsp;QRTZ_JOB_DETAILS<br />&nbsp;&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;JOB_NAME&nbsp;&nbsp;VARCHAR(200)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;JOB_GROUP&nbsp;VARCHAR(200)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;DESCRIPTION&nbsp;VARCHAR(250)&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;JOB_CLASS_NAME&nbsp;&nbsp;&nbsp;VARCHAR(250)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;IS_DURABLE&nbsp;VARCHAR(1)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;IS_VOLATILE&nbsp;VARCHAR(1)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;IS_STATEFUL&nbsp;VARCHAR(1)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;REQUESTS_RECOVERY&nbsp;VARCHAR(1)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;JOB_DATA&nbsp;BLOB&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;PRIMARY&nbsp;KEY&nbsp;(JOB_NAME,JOB_GROUP)<br />);<br /><br />CREATE&nbsp;TABLE&nbsp;QRTZ_JOB_LISTENERS<br />&nbsp;&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;JOB_NAME&nbsp;&nbsp;VARCHAR(200)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;JOB_GROUP&nbsp;VARCHAR(200)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;JOB_LISTENER&nbsp;VARCHAR(200)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;PRIMARY&nbsp;KEY&nbsp;(JOB_NAME,JOB_GROUP,JOB_LISTENER),<br />&nbsp;&nbsp;&nbsp;&nbsp;FOREIGN&nbsp;KEY&nbsp;(JOB_NAME,JOB_GROUP)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REFERENCES&nbsp;QRTZ_JOB_DETAILS(JOB_NAME,JOB_GROUP)<br />);<br /><br />CREATE&nbsp;TABLE&nbsp;QRTZ_TRIGGERS<br />&nbsp;&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;TRIGGER_NAME&nbsp;VARCHAR(200)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;TRIGGER_GROUP&nbsp;VARCHAR(200)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;JOB_NAME&nbsp;&nbsp;VARCHAR(200)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;JOB_GROUP&nbsp;VARCHAR(200)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;IS_VOLATILE&nbsp;VARCHAR(1)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;DESCRIPTION&nbsp;VARCHAR(250)&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;NEXT_FIRE_TIME&nbsp;BIGINT(13)&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;PREV_FIRE_TIME&nbsp;BIGINT(13)&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;PRIORITY&nbsp;INTEGER&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;TRIGGER_STATE&nbsp;VARCHAR(16)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;TRIGGER_TYPE&nbsp;VARCHAR(8)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;START_TIME&nbsp;BIGINT(13)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;END_TIME&nbsp;BIGINT(13)&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;CALENDAR_NAME&nbsp;VARCHAR(200)&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;MISFIRE_INSTR&nbsp;SMALLINT(2)&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;JOB_DATA&nbsp;BLOB&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;PRIMARY&nbsp;KEY&nbsp;(TRIGGER_NAME,TRIGGER_GROUP),<br />&nbsp;&nbsp;&nbsp;&nbsp;FOREIGN&nbsp;KEY&nbsp;(JOB_NAME,JOB_GROUP)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REFERENCES&nbsp;QRTZ_JOB_DETAILS(JOB_NAME,JOB_GROUP)<br />);<br /><br />CREATE&nbsp;TABLE&nbsp;QRTZ_SIMPLE_TRIGGERS<br />&nbsp;&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;TRIGGER_NAME&nbsp;VARCHAR(200)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;TRIGGER_GROUP&nbsp;VARCHAR(200)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;REPEAT_COUNT&nbsp;BIGINT(7)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;REPEAT_INTERVAL&nbsp;BIGINT(12)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;TIMES_TRIGGERED&nbsp;BIGINT(10)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;PRIMARY&nbsp;KEY&nbsp;(TRIGGER_NAME,TRIGGER_GROUP),<br />&nbsp;&nbsp;&nbsp;&nbsp;FOREIGN&nbsp;KEY&nbsp;(TRIGGER_NAME,TRIGGER_GROUP)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REFERENCES&nbsp;QRTZ_TRIGGERS(TRIGGER_NAME,TRIGGER_GROUP)<br />);<br /><br />CREATE&nbsp;TABLE&nbsp;QRTZ_CRON_TRIGGERS<br />&nbsp;&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;TRIGGER_NAME&nbsp;VARCHAR(200)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;TRIGGER_GROUP&nbsp;VARCHAR(200)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;CRON_EXPRESSION&nbsp;VARCHAR(200)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;TIME_ZONE_ID&nbsp;VARCHAR(80),<br />&nbsp;&nbsp;&nbsp;&nbsp;PRIMARY&nbsp;KEY&nbsp;(TRIGGER_NAME,TRIGGER_GROUP),<br />&nbsp;&nbsp;&nbsp;&nbsp;FOREIGN&nbsp;KEY&nbsp;(TRIGGER_NAME,TRIGGER_GROUP)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REFERENCES&nbsp;QRTZ_TRIGGERS(TRIGGER_NAME,TRIGGER_GROUP)<br />);<br /><br />CREATE&nbsp;TABLE&nbsp;QRTZ_BLOB_TRIGGERS<br />&nbsp;&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;TRIGGER_NAME&nbsp;VARCHAR(200)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;TRIGGER_GROUP&nbsp;VARCHAR(200)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;BLOB_DATA&nbsp;BLOB&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;PRIMARY&nbsp;KEY&nbsp;(TRIGGER_NAME,TRIGGER_GROUP),<br />&nbsp;&nbsp;&nbsp;&nbsp;FOREIGN&nbsp;KEY&nbsp;(TRIGGER_NAME,TRIGGER_GROUP)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REFERENCES&nbsp;QRTZ_TRIGGERS(TRIGGER_NAME,TRIGGER_GROUP)<br />);<br /><br />CREATE&nbsp;TABLE&nbsp;QRTZ_TRIGGER_LISTENERS<br />&nbsp;&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;TRIGGER_NAME&nbsp;&nbsp;VARCHAR(200)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;TRIGGER_GROUP&nbsp;VARCHAR(200)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;TRIGGER_LISTENER&nbsp;VARCHAR(200)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;PRIMARY&nbsp;KEY&nbsp;(TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_LISTENER),<br />&nbsp;&nbsp;&nbsp;&nbsp;FOREIGN&nbsp;KEY&nbsp;(TRIGGER_NAME,TRIGGER_GROUP)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REFERENCES&nbsp;QRTZ_TRIGGERS(TRIGGER_NAME,TRIGGER_GROUP)<br />);<br /><br /><br />CREATE&nbsp;TABLE&nbsp;QRTZ_CALENDARS<br />&nbsp;&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;CALENDAR_NAME&nbsp;&nbsp;VARCHAR(200)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;CALENDAR&nbsp;BLOB&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;PRIMARY&nbsp;KEY&nbsp;(CALENDAR_NAME)<br />);<br /><br /><br /><br />CREATE&nbsp;TABLE&nbsp;QRTZ_PAUSED_TRIGGER_GRPS<br />&nbsp;&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;TRIGGER_GROUP&nbsp;&nbsp;VARCHAR(200)&nbsp;NOT&nbsp;NULL,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;PRIMARY&nbsp;KEY&nbsp;(TRIGGER_GROUP)<br />);<br /><br />CREATE&nbsp;TABLE&nbsp;QRTZ_FIRED_TRIGGERS<br />&nbsp;&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;ENTRY_ID&nbsp;VARCHAR(95)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;TRIGGER_NAME&nbsp;VARCHAR(200)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;TRIGGER_GROUP&nbsp;VARCHAR(200)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;IS_VOLATILE&nbsp;VARCHAR(1)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;INSTANCE_NAME&nbsp;VARCHAR(200)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;FIRED_TIME&nbsp;BIGINT(13)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;PRIORITY&nbsp;INTEGER&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;STATE&nbsp;VARCHAR(16)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;JOB_NAME&nbsp;VARCHAR(200)&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;JOB_GROUP&nbsp;VARCHAR(200)&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;IS_STATEFUL&nbsp;VARCHAR(1)&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;REQUESTS_RECOVERY&nbsp;VARCHAR(1)&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;PRIMARY&nbsp;KEY&nbsp;(ENTRY_ID)<br />);<br /><br />CREATE&nbsp;TABLE&nbsp;QRTZ_SCHEDULER_STATE<br />&nbsp;&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;INSTANCE_NAME&nbsp;VARCHAR(200)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;LAST_CHECKIN_TIME&nbsp;BIGINT(13)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;CHECKIN_INTERVAL&nbsp;BIGINT(13)&nbsp;NOT&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;PRIMARY&nbsp;KEY&nbsp;(INSTANCE_NAME)<br />);<br /><br />CREATE&nbsp;TABLE&nbsp;QRTZ_LOCKS<br />&nbsp;&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;LOCK_NAME&nbsp;&nbsp;VARCHAR(40)&nbsp;NOT&nbsp;NULL,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;PRIMARY&nbsp;KEY&nbsp;(LOCK_NAME)<br />);<br /><br /><br />INSERT&nbsp;INTO&nbsp;QRTZ_LOCKS&nbsp;values(</span><span style="color: #FF0000; ">'</span>TRIGGER_ACCESS<span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">);<br />INSERT&nbsp;INTO&nbsp;QRTZ_LOCKS&nbsp;values(</span><span style="color: #FF0000; ">'</span>JOB_ACCESS<span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">);<br />INSERT&nbsp;INTO&nbsp;QRTZ_LOCKS&nbsp;values(</span><span style="color: #FF0000; ">'</span>CALENDAR_ACCESS<span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">);<br />INSERT&nbsp;INTO&nbsp;QRTZ_LOCKS&nbsp;values(</span><span style="color: #FF0000; ">'</span>STATE_ACCESS<span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">);<br />INSERT&nbsp;INTO&nbsp;QRTZ_LOCKS&nbsp;values(</span><span style="color: #FF0000; ">'</span>MISFIRE_ACCESS<span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">);<br /><br /><br />commit;</span></div><br /><br />参考：<br /><a href="http://wenku.baidu.com/view/82e3bcbdfd0a79563c1e7223.html">http://wenku.baidu.com/view/82e3bcbdfd0a79563c1e7223.html</a><br /><br />Quartz集成springMVC 的方案二（持久化任务、集群和分布式）<br /><a href="http://blog.csdn.net/congcong68/article/details/39256307">http://blog.csdn.net/congcong68/article/details/39256307</a><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/420104.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-11-14 18:46 <a href="http://www.blogjava.net/paulwong/archive/2014/11/14/420104.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring对HttpSession的重新封闭</title><link>http://www.blogjava.net/paulwong/archive/2014/08/19/417090.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 19 Aug 2014 01:13:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/08/19/417090.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/417090.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/08/19/417090.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/417090.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/417090.html</trackback:ping><description><![CDATA[<a href="https://github.com/spring-projects/spring-session/tree/master/samples" target="_blank">https://github.com/spring-projects/spring-session/tree/master/samples</a><img src ="http://www.blogjava.net/paulwong/aggbug/417090.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-08-19 09:13 <a href="http://www.blogjava.net/paulwong/archive/2014/08/19/417090.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转（探讨分布式系统与集群的区别）</title><link>http://www.blogjava.net/paulwong/archive/2014/05/23/414022.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 23 May 2014 05:27:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/05/23/414022.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/414022.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/05/23/414022.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/414022.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/414022.html</trackback:ping><description><![CDATA[<p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">简单说，分布式是以缩短单个任务的执行时间来提升效率的，而集群则是通过提高单位时间内执行的任务数来提升效率。</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　例如：如果一个任务由10个子任务组成，每个子任务单独执行需1小时，则在一台<a href="http://product.it168.com/list/b/0402_1.shtml" target="_blank" rel="nofollow" style="padding: 0px; margin: 0px; color: #ff8373; outline: 0px; font-size: 12px;">服务器</a>上执行改任务需10小时。</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　采用分布式方案，提供10台<a href="http://product.pcpop.com/Server/10734_1.html" target="_blank" rel="nofollow" style="padding: 0px; margin: 0px; color: #ff8373; outline: 0px; font-size: 12px;">服务器</a>，每台服务器只负责处理一个子任务，不考虑子任务间的依赖关系，执行完这个任务只需一个小时。</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　而采用集群方案，同样提供10台服务器，每台服务器都能独立处理这个任务。假设有10个任务同时到达，10个服务器将同时工作，10小后，10个任务同时完成，这样，整身来看，还是1小时内完成一个任务!</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　<strong style="padding: 0px; margin: 0px;">集群概念</strong></p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　<strong style="padding: 0px; margin: 0px;">1. 两大关键特性</strong></p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　集群是一组协同工作的服务实体，用以提供比单一服务实体更具扩展性与可用性的服务平台。在客户端看来，一个集群就象是一个服务实体，但事实上集群由一组服务实体组成。与单一服务实体相比较，集群提供了以下两个关键特性：</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　<strong style="padding: 0px; margin: 0px;">&#183; 可扩展性--</strong>集群的性能不限于单一的服务实体，新的服务实体可以动态地加入到集群，从而增强集群的性能。</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　<strong style="padding: 0px; margin: 0px;">&#183; 高可用性--</strong>集 群通过服务实体冗余使客户端免于轻易遇到out of service的警告。在集群中，同样的服务可以由多个服务实体提供。如果一个服务实体失败了，另一个服务实体会接管失败的服务实体。集群提供的从一个出 错的服务实体恢复到另一个服务实体的功能增强了应用的可用性。</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　<strong style="padding: 0px; margin: 0px;">2. 两大能力</strong></p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　为了具有可扩展性和高可用性特点，集群的必须具备以下两大能力：</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　<strong style="padding: 0px; margin: 0px;">&#183;&nbsp;<a href="http://product.it168.com/list/b/0462_1.shtml" target="_blank" rel="nofollow" style="padding: 0px; margin: 0px; color: #ff8373; outline: 0px; font-size: 12px;">负载均衡</a>--</strong><a href="http://product.pcpop.com/LoadBalancer/10734_1.html" target="_blank" rel="nofollow" style="padding: 0px; margin: 0px; color: #ff8373; outline: 0px; font-size: 12px;">负载均衡</a>能把任务比较均衡地分布到集群环境下的计算和网络资源。</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　<strong style="padding: 0px; margin: 0px;">&#183; 错误恢复--</strong>由于某种原因，执行某个任务的资源出现故障，另一服务实体中执行同一任务的资源接着完成任务。这种由于一个实体中的资源不能工作，另一个实体中的资源透明的继续完成任务的过程叫错误恢复。</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　负载均衡和错误恢复都要求各服务实体中有执行同一任务的资源存在，而且对于同一任务的各个资源来说，执行任务所需的信息视图(信息上下文)必须是一样的。</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　<strong style="padding: 0px; margin: 0px;">3. 两大技术</strong></p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　实现集群务必要有以下两大技术：</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　<strong style="padding: 0px; margin: 0px;">&#183; 集群地址--</strong>集 群由多个服务实体组成，集群客户端通过访问集群的集群地址获取集群内部各服务实体的功能。具有单一集群地址(也叫单一影像)是集群的一个基 本特征。维护集群地址的设置被称为负载均衡器。负载均衡器内部负责管理各个服务实体的加入和退出，外部负责集群地址向内部服务实体地址的转换。有的负载均 衡器实现真正的负载均衡算法，有的只支持任务的转换。只实现任务转换的负载均衡器适用于支持ACTIVE-STANDBY的集群环境，在那里，集群中只有 一个服务实体工作，当正在工作的服务实体发生故障时，负载均衡器把后来的任务转向另外一个服务实体。</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　<strong style="padding: 0px; margin: 0px;">&#183; 内部通信--</strong>为了能协同工作、实现负载均衡和错误恢复，集群各实体间必须时常通信，比如负载均衡器对服务实体心跳测试信息、服务实体间任务执行上下文信息的通信。</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　具有同一个集群地址使得客户端能访问集群提供的计算服务，一个集群地址下隐藏了各个服务实体的内部地址，使得客户要求的计算服务能在各个服务实体之间分布。内部通信是集群能正常运转的基础，它使得集群具有均衡负载和错误恢复的能力。</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　<strong style="padding: 0px; margin: 0px;">集群分类</strong></p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　 　Linux集群主要分成三大类( 高可用集群， 负载均衡集群，科学计算集群)，高可用集群( High Availability Cluster)，负载均衡集群(Load Balance Cluster)，科学计算集群(High Performance Computing Cluster)</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　具体包括：</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　Linux High Availability 高可用集群：普通两节点双机热备，多节点HA集群，RAC, shared, share-nothing集群等；Linux Load Balance 负载均衡集群：LVS等....；Linux High Performance Computing 高性能科学计算集群：Beowulf 类集群....；分布式存储；其他类linux集群：如Openmosix, rendering farm 等..</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　详细介绍</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　<strong style="padding: 0px; margin: 0px;">1. 高可用集群(High Availability Cluster)</strong></p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　常见的就是2个节点做成的HA集群，有很多通俗的不科学的名称，比如"双机热备", "双机互备", "双机".</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　高可用集群解决的是保障用户的应用程序持续对外提供服务的能力。 (请注意高可用集群既不是用来保护业务数据的，保护的是用户的业务程序对外不间断提供服务，把因软件/硬件/人为造成的故障对业务的影响降低到最小程度)。</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　<strong style="padding: 0px; margin: 0px;">2. 负载均衡集群(Load Balance Cluster)</strong></p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　负载均衡系统：集群中所有的节点都处于活动状态，它们分摊系统的工作负载。一般Web服务器集群、数据库集群和应用服务器集群都属于这种类型。</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　负载均衡集群一般用于相应网络请求的网页服务器，数据库服务器。这种集群可以在接到请求时，检查接受请求较少，不繁忙的服务器，并把请求转到这些服务器上。从检查其他服务器状态这一点上看，负载均衡和容错集群很接近，不同之处是数量上更多。</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　<strong style="padding: 0px; margin: 0px;">3. 科学计算集群(High Performance Computing Cluster)</strong></p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　高性能计算(High Perfermance Computing)集群，简称HPC集群。这类集群致力于提供单个计算机所不能提供的强大的计算能力。</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　<strong style="padding: 0px; margin: 0px;">高性能计算分类</strong></p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　<strong style="padding: 0px; margin: 0px;">高吞吐计算(High-throughput Computing)</strong></p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　 　有一类高性能计算，可以把它分成若干可以并行的子任务，而且各个子任务彼此间没有什么关联。象在家搜寻外星人( SETI<a href="http://my.oschina.net/xaxyf" target="_blank" style="padding: 0px; margin: 0px; color: #ff8373; outline: 0px; font-size: 12px;">@HOME</a>&nbsp;-- Search for Extraterrestrial Intelligence at Home )就是这一类型应用。这一项目是利用Internet上的闲置的计算资源来搜寻外星人。SETI项目的服务器将一组数据和数据模式发给Internet上 参加SETI的计算节点，计算节点在给定的数据上用给定的模式进行搜索，然后将搜索的结果发给服务器。服务器负责将从各个计算节点返回的数据汇集成完整的 数据。因为这种类型应用的一个共同特征是在海量数据上搜索某些模式，所以把这类计算称为高吞吐计算。所谓的Internet计算都属于这一类。按照 Flynn的分类，高吞吐计算属于SIMD(Single Instruction/Multiple Data)的范畴。</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　<strong style="padding: 0px; margin: 0px;">分布计算(Distributed Computing)</strong></p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　另一类计算刚好和高吞吐计算相反，它们虽然可以给分成若干并行的子任务，但是子任务间联系很紧密，需要大量的数据交换。按照Flynn的分类，分布式的高性能计算属于MIMD(Multiple Instruction/Multiple Data)的范畴。</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　<strong style="padding: 0px; margin: 0px;">4. 分布式(集群)与集群的联系与区别</strong></p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　分布式是指将不同的业务分布在不同的地方。而集群指的是将几台服务器集中在一起，实现同一业务。分布式中的每一个节点，都可以做集群。而集群并不一定就是分布式的。</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　举例：就比如新浪网，访问的人多了，他可以做一个群集，前面放一个响应服务器，后面几台服务器完成同一业务，如果有业务访问的时候，响应服务器看哪台服务器的负载不是很重，就将给哪一台去完成。</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　而分布式，从窄意上理解，也跟集群差不多， 但是它的组织比较松散，不像集群，有一个组织性，一台服务器垮了，其它的服务器可以顶上来。</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">　　分布式的每一个节点，都完成不同的业务，一个节点垮了，哪这个业务就不可访问了。</p><img src ="http://www.blogjava.net/paulwong/aggbug/414022.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-05-23 13:27 <a href="http://www.blogjava.net/paulwong/archive/2014/05/23/414022.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>整合测试</title><link>http://www.blogjava.net/paulwong/archive/2014/04/20/412701.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sun, 20 Apr 2014 02:33:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/04/20/412701.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/412701.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/04/20/412701.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/412701.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/412701.html</trackback:ping><description><![CDATA[<a href="http://arquillian.org/guides/getting_started_zh_cn/" target="_blank">http://arquillian.org/guides/getting_started_zh_cn/</a>
<img src ="http://www.blogjava.net/paulwong/aggbug/412701.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-04-20 10:33 <a href="http://www.blogjava.net/paulwong/archive/2014/04/20/412701.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java EE 应用开发平台 Koala </title><link>http://www.blogjava.net/paulwong/archive/2014/04/17/412553.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 17 Apr 2014 01:18:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/04/17/412553.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/412553.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/04/17/412553.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/412553.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/412553.html</trackback:ping><description><![CDATA[<p style="margin: 0px 0px 10px; padding: 0px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13px; text-align: left; background-color: #ffffff; ">Koala (考拉) 是一款应用在 Java EE 企业级应用开发领域，用于帮助架构师简化系统设计，降低框架耦合度，提高系统灵活性，提供开发工程师工作效率，降低成本的平台工具。</p>
<p style="margin: 0px 0px 10px; padding: 0px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13px; text-align: left; background-color: #ffffff; "><img src="http://static.oschina.net/uploads/space/2013/0902/185150_MB5g_12.jpg" alt="" style="margin: 0px; padding: 0px; border: 0px; max-width: 700px; " /></p>
<p style="margin: 0px 0px 10px; padding: 0px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13px; text-align: left; background-color: #ffffff; "><img src="http://static.oschina.net/uploads/space/2013/0903/151102_s4sJ_947559.png" alt="" style="margin: 0px; padding: 0px; border: 0px; max-width: 700px; " /></p>
<p style="margin: 0px 0px 10px; padding: 0px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13px; text-align: left; background-color: #ffffff; ">为什么使用 Koala：</p>
<ul style="margin: 0.5em 0px 0.5em 1.5em; padding: 0px; list-style-position: inside; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13px; text-align: left; background-color: #ffffff; ">
    <li style="margin: 0px; padding: 0px; ">开源免费的开发平台，允许你任意修改源码并扩展功能</li>
    <li style="margin: 0px; padding: 0px; ">以DDD领域驱动思想为核心，抛弃传统的以数据库为中心的四层编码模型</li>
    <li style="margin: 0px; padding: 0px; ">丰富的基础组件支持，包括：国际化、异常、缓存等</li>
    <li style="margin: 0px; padding: 0px; ">向导式的搭建项目过程，支持各种技术选择，JPA,Mybstis,SpringMVC,struts2MVC等</li>
    <li style="margin: 0px; padding: 0px; ">向导式的数据库到实体的生成过程</li>
    <li style="margin: 0px; padding: 0px; ">向导式的实体生成CURD功能</li>
    <li style="margin: 0px; padding: 0px; ">向导式的服务发布一键无缝发布成war、EJB、webservice(SOAP/REST)<span style="margin: 0px; padding: 0px; color: #ff0000; ">&nbsp;</span>多种服务形式</li>
    <li style="margin: 0px; padding: 0px; ">基于RBAC3模型的权限子系统</li>
    <li style="margin: 0px; padding: 0px; ">监控子系统轻松协助你监控URL,方法，数据库，内存等状态</li>
    <li style="margin: 0px; padding: 0px; ">使用通用查询子系统轻松定制完成查询功能</li>
    <li style="margin: 0px; padding: 0px; ">基于IP过滤，用户名验证及方法权限控制的WS安全子系统</li>
    <li style="margin: 0px; padding: 0px; ">基于<a href="http://www.oschina.net/p/jbpm" target="_blank" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px; ">JBPM5</a>的流程子系统</li>
</ul>
<div style="text-align: left; "><font face="微软雅黑, Verdana, sans-serif, 宋体" size="2"><br />
</font></div>
<div style="text-align: left; "><font face="微软雅黑, Verdana, sans-serif, 宋体" size="2"><a href="http://wiki.openkoala.org/pages/viewpage.action?pageId=3932164" target="_blank">http://wiki.openkoala.org/pages/viewpage.action?pageId=3932164</a><br />
</font></div><img src ="http://www.blogjava.net/paulwong/aggbug/412553.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-04-17 09:18 <a href="http://www.blogjava.net/paulwong/archive/2014/04/17/412553.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javaee7-samples</title><link>http://www.blogjava.net/paulwong/archive/2014/04/06/411982.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sun, 06 Apr 2014 00:33:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/04/06/411982.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/411982.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/04/06/411982.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/411982.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/411982.html</trackback:ping><description><![CDATA[<a href="http://git.oschina.net/ld/javaee7-samples" target="_blank">http://git.oschina.net/ld/javaee7-samples</a><img src ="http://www.blogjava.net/paulwong/aggbug/411982.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-04-06 08:33 <a href="http://www.blogjava.net/paulwong/archive/2014/04/06/411982.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>也谈基于Web的含工作流项目的一般开发流程(转)</title><link>http://www.blogjava.net/paulwong/archive/2014/04/04/411925.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 04 Apr 2014 00:23:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/04/04/411925.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/411925.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/04/04/411925.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/411925.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/411925.html</trackback:ping><description><![CDATA[<div class="postbody" style="font-family: Arial; background-color: #ffffff; ">
该项目包含的通用模块代码等我有时间一并剥离贡献出来（基于WebSocket的通知引擎，工作流整合模块，自定义表单（<a href="http://cxlh.iteye.com/blog/306952" target="_blank" style="color: #1d58d1; text-decoration: none; ">详见这里</a>），基于RBAC权限设计），最近太忙了，Web项目有一段时间没碰，有点生疏的感觉，主要在忙GQT项目，一套基于桌面开发的框架，<a href="http://cxlh.iteye.com/blog/2021463" target="_blank" style="color: #1d58d1; text-decoration: none; ">详见这里</a>，写代码写的有点手酸的感觉。
&nbsp;</div>
<div class="postbody" style="font-family: Arial; background-color: #ffffff; "><br />
</div>
<div class="postbody" style="font-family: Arial; background-color: #ffffff; ">
基于Web的含工作流的项目看起来并不如想象的那么简单，主要需求：
<ol style="line-height: 1.4em; margin: 0px 0px 1.5em; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; ">
     <li style="font-size: 1em; margin: 0px 0px 0.25em 30px; padding: 0px; "><span data-mce-style="line-height: 21px;" style="line-height: 21px; ">灵活定制工作流，并跟踪流程进度；</span></li>
     <li style="font-size: 1em; margin: 0px 0px 0.25em 30px; padding: 0px; "><span data-mce-style="line-height: 21px;" style="line-height: 21px; ">每个Order含有历史轨迹记录，可在历史中查看；</span></li>
     <li style="font-size: 1em; margin: 0px 0px 0.25em 30px; padding: 0px; "><span data-mce-style="line-height: 21px;" style="line-height: 21px; ">工作流的Action灵活，认领任务不一定非要先提取表单，因为很多节点都只有几个动作，直接按钮操作即可；</span></li>
     <li style="font-size: 1em; margin: 0px 0px 0.25em 30px; padding: 0px; "><span data-mce-style="line-height: 21px;" style="line-height: 21px; ">待办事宜列表在不刷新页面情况下也能变动；</span></li>
</ol>
<span data-mce-style="line-height: 21px;">项目要求：</span>
<ol style="line-height: 1.4em; margin: 0px 0px 1.5em; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; ">
     <li style="font-size: 1em; margin: 0px 0px 0.25em 30px; padding: 0px; "><span data-mce-style="line-height: 21px;" style="line-height: 21px; ">操作简单高效；</span></li>
     <li style="font-size: 1em; margin: 0px 0px 0.25em 30px; padding: 0px; "><span data-mce-style="line-height: 21px;" style="line-height: 21px; ">权限细节到按钮级别；</span></li>
     <li style="font-size: 1em; margin: 0px 0px 0.25em 30px; padding: 0px; "><span data-mce-style="line-height: 21px;" style="line-height: 21px; ">并发数少，不超过3000个在线用户；</span></li>
</ol>
<span data-mce-style="line-height: 21px;">主要可能使用到技术：</span>
<ol style="line-height: 1.4em; margin: 0px 0px 1.5em; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; ">
     <li style="font-size: 1em; margin: 0px 0px 0.25em 30px; padding: 0px; "><span data-mce-style="line-height: 21px;" style="line-height: 21px; ">工作流引擎，我这里选用Activiti5，很灵活好用；</span></li>
     <li style="font-size: 1em; margin: 0px 0px 0.25em 30px; padding: 0px; "><span data-mce-style="line-height: 21px;" style="line-height: 21px; ">权限使用Spring Security，基于标签式管理权限很方便；</span></li>
     <li style="font-size: 1em; margin: 0px 0px 0.25em 30px; padding: 0px; "><span data-mce-style="line-height: 21px;" style="line-height: 21px; ">通知引擎使用WebSocket，基于Flash实时通信，基于socket.io；</span></li>
     <li style="font-size: 1em; margin: 0px 0px 0.25em 30px; padding: 0px; "><span data-mce-style="line-height: 21px;" style="line-height: 21px; ">权限粒度基于经典的RBAC；</span></li>
     <li style="font-size: 1em; margin: 0px 0px 0.25em 30px; padding: 0px; "><span data-mce-style="line-height: 21px;" style="line-height: 21px; ">总体框架Spring MVC+Mybatis；</span></li>
</ol>
<span data-mce-style="line-height: 21px;">实现的WebSocket的总体思路：</span>
<ol style="line-height: 1.4em; margin: 0px 0px 1.5em; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; ">
     <li style="font-size: 1em; margin: 0px 0px 0.25em 30px; padding: 0px; "><span data-mce-style="line-height: 21px;" style="line-height: 21px; ">WebSocket Server独立于Web项目，Web Server与WebSocket Server之间的局域网通信基于简单的Socket通信，这样这个组件可以完全解耦和通用；</span></li>
     <li style="font-size: 1em; margin: 0px 0px 0.25em 30px; padding: 0px; "><span data-mce-style="line-height: 21px;" style="line-height: 21px; ">当Web项目要Push消息到Client时，通过Web Server的Socket Client向WebSocket Server的Socker Server发送消息，然后WebSocket Server收到消息后解码，广播到所有浏览器；</span></li>
</ol>
<span data-mce-style="line-height: 21px;">我们实现的事件通知非常简单，设定全局变量并让浏览器侦听：</span>
<pre name="code" style="margin: 0px 5px 5px 15px; font-size: 1em; border: 1px solid #cccccc; padding: 3px; background-color: #fafafa; ">var G_WebSocket=false; <br />
var EVENT_ORDER_CHANGE_STATUS = "orderChange"; <br />
var EVENT_ORDER_CHANGE_AMOUNT = "amountChange"; <br />
var EVENT_ORDER_CHANGE_REFUND = "refundChange"; <br />
WebSocket.init = function(callbackFunc){ <br />
socket = io.connect(connUrl, connOptions); <br />
socket.on('connect', function() { <br />
G_WebSocket=true; <br />
callbackFunc("connect",null); <br />
}); <br />
socket.on('disconnect', function() { <br />
G_WebSocket=false; <br />
callbackFunc("disconnect",null); <br />
}); <br />
socket.on('clientQuit', function(obj){ <br />
G_WebSocket=false; <br />
callbackFunc("clientQuit",obj); <br />
}); <br />
socket.on('broadcast', function(obj) { <br />
callbackFunc("broadcast",obj); <br />
});<br />
};</pre>
&nbsp;</div>
<div class="postbody" style="font-family: Arial; background-color: #ffffff; ">
<span data-mce-style="line-height: 21px;">在需要侦听WebSocket接受Web Server推送消息的地方加上一个函数即可：</span>
<pre name="code" style="margin: 0px 5px 5px 15px; font-size: 1em; border: 1px solid #cccccc; padding: 3px; background-color: #fafafa; ">	WebSocket.init(function(command,jsonObj){ <br />
if(command=="broadcast"){ <br />
if(jsonObj.e == EVENT_ORDER_CHANGE_STATUS){ <br />
//TODO:write your code here <br />
}else if(jsonObj.e == EVENT_ORDER_CHANGE_AMOUNT){ <br />
//TODO:write your code here <br />
}else if(jsonObj.e == EVENT_ORDER_CHANGE_REFUND){ <br />
//TODO:write your code here <br />
} <br />
} <br />
});</pre>
<span data-mce-style="line-height: 21px;">
<div class="postbody" style="font-family: Arial; background-color: #ffffff; "><span data-mce-style="line-height: 21px;"><br />
</span></div>
这样的结构要扩展推送服务很简单，比如按频道推送等，都可以很容易的扩展。</span>
<span data-mce-style="line-height: 21px;">再看看看工作流，我们实现了activiti通用的申请提交任务流程和自定义表单功能，提取跟踪流程图功能等，这样你要设计一个新流程也变得非常简单，只需要在eclipse里划上工作流图，在后台发布，然后通过SpringMVC的RestAPI启动实例流程，申领完成任务等，如下图：</span>
<p style="margin: 0px !important; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; "><span data-mce-style="line-height: 21px;"><br />
<img src="http://dl2.iteye.com/upload/attachment/0095/0920/fcfbd184-003b-3dc3-a0c7-d2e05e8adc3e.png" alt="" data-mce-src="http://dl2.iteye.com/upload/attachment/0095/0920/fcfbd184-003b-3dc3-a0c7-d2e05e8adc3e.png" style="border: 0px; cursor: default; " /><br />
<br />
</span></p>
<span data-mce-style="line-height: 21px;">流程走到了分支的两个节点上，这样对后续新增的工作流提供了极大的遍历。</span>
<p style="margin: 0px !important; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; "><span data-mce-style="line-height: 21px;">最后说说Spring Security，基于RBAC的权限体系搭建好后（可以用在任何管理系统中），要在页面中访问一个资源，首先判断一下是否有权限，如下HTML：</span></p>
<p style="margin: 0px !important; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; "><span data-mce-style="line-height: 21px;"><br />
</span></p>
<pre name="code" style="margin: 0px 5px 5px 15px; font-size: 1em; border: 1px solid #cccccc; padding: 3px; background-color: #fafafa; ">&lt;sec:authorize ifAllGranted="r_pd"&gt; <br />
&lt;a href="#"&gt;resource access here&lt;/a&gt; <br />
&lt;/sec:authorize&gt;</pre>
<p style="margin: 0px !important; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; ">&nbsp;</p>
<pre name="code" style="margin: 0px 5px 5px 15px; font-size: 1em; border: 1px solid #cccccc; padding: 3px; background-color: #fafafa; ">&lt;sec:authorize url="/XXX/XXX/XXX.html"&gt; <br />
&lt;a href="XXX/XXX/XXX.html'"&gt; <br />
&lt;span&gt;XXX功能&lt;/span&gt; <br />
&lt;/a&gt; <br />
&lt;/sec:authorize&gt;</pre>
<p style="margin: 0px !important; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; "><span data-mce-style="line-height: 21px;">&nbsp;&nbsp;</span></p>
<p style="margin: 0px !important; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; "><span data-mce-style="line-height: 21px;">前台由于项目比较小，没有用到js的MVC框架，如backbone等，这里就不再记录了。</span></p>
</div>
<img src ="http://www.blogjava.net/paulwong/aggbug/411925.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-04-04 08:23 <a href="http://www.blogjava.net/paulwong/archive/2014/04/04/411925.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LOGBACK TUTORIA</title><link>http://www.blogjava.net/paulwong/archive/2014/04/03/411871.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 03 Apr 2014 00:10:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/04/03/411871.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/411871.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/04/03/411871.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/411871.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/411871.html</trackback:ping><description><![CDATA[<a href="https://github.com/abdulwaheed18/Slf4jTutorial" target="_blank">https://github.com/abdulwaheed18/Slf4jTutorial</a>&nbsp;
<div><br />
</div>
<div><a href="http://stackoverflow.com/questions/10465301/tomcat-war-configure-logback-to-use-app-name-in-path" target="_blank">http://stackoverflow.com/questions/10465301/tomcat-war-configure-logback-to-use-app-name-in-path</a><br />
</div>
<div><br />
</div>
<div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">configuration</span><span style="color: #0000FF; ">&gt;</span><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">appender&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="STDOUT"</span><span style="color: #FF0000; ">&nbsp;class</span><span style="color: #0000FF; ">="ch.qos.logback.core.ConsoleAppender"</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">encoder&nbsp;</span><span style="color: #FF0000; ">class</span><span style="color: #0000FF; ">="ch.qos.logback.classic.encoder.PatternLayoutEncoder"</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">Pattern</span><span style="color: #0000FF; ">&gt;</span>%d{HH:mm:ss.SSS}&nbsp;[%thread]&nbsp;%-5level&nbsp;%logger{36}&nbsp;-&nbsp;%msg%n<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">Pattern</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">encoder</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">appender</span><span style="color: #0000FF; ">&gt;</span><br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">appender&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="FILE"</span><span style="color: #FF0000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000FF; ">="ch.qos.logback.core.rolling.RollingFileAppender"</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">file</span><span style="color: #0000FF; ">&gt;</span>testFile7.log<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">file</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">rollingPolicy&nbsp;</span><span style="color: #FF0000; ">class</span><span style="color: #0000FF; ">="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;daily&nbsp;rollover<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Once&nbsp;any&nbsp;of&nbsp;the&nbsp;below&nbsp;condition&nbsp;met,&nbsp;it&nbsp;will&nbsp;change&nbsp;the&nbsp;file&nbsp;name&nbsp;as&nbsp;below&nbsp;and&nbsp;compressed&nbsp;it.&nbsp;</span><span style="color: #008000; ">--&gt;</span><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">fileNamePattern</span><span style="color: #0000FF; ">&gt;</span>logFile.%d{yyyy-MM-dd}.%i.log.zip<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">fileNamePattern</span><span style="color: #0000FF; ">&gt;</span><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;keep&nbsp;30&nbsp;days'&nbsp;worth&nbsp;of&nbsp;history&nbsp;</span><span style="color: #008000; ">--&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">maxHistory</span><span style="color: #0000FF; ">&gt;</span>30<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">maxHistory</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;or&nbsp;whenever&nbsp;the&nbsp;file&nbsp;size&nbsp;reaches&nbsp;10MB&nbsp;</span><span style="color: #008000; ">--&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">timeBasedFileNamingAndTriggeringPolicy<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF0000; ">class</span><span style="color: #0000FF; ">="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">maxFileSize</span><span style="color: #0000FF; ">&gt;</span>10MB<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">maxFileSize</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">timeBasedFileNamingAndTriggeringPolicy</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">rollingPolicy</span><span style="color: #0000FF; ">&gt;</span><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">encoder</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">pattern</span><span style="color: #0000FF; ">&gt;</span>%-4relative&nbsp;[%thread]&nbsp;%-5level&nbsp;%logger{35}&nbsp;-&nbsp;%msg%n<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">pattern</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">encoder</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">appender</span><span style="color: #0000FF; ">&gt;</span><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">root&nbsp;</span><span style="color: #FF0000; ">level</span><span style="color: #0000FF; ">="INFO"</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">appender-ref&nbsp;</span><span style="color: #FF0000; ">ref</span><span style="color: #0000FF; ">="STDOUT"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">appender-ref&nbsp;</span><span style="color: #FF0000; ">ref</span><span style="color: #0000FF; ">="FILE"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">root</span><span style="color: #0000FF; ">&gt;</span><br />
<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">configuration</span><span style="color: #0000FF; ">&gt;</span></div>
</div>
<img src ="http://www.blogjava.net/paulwong/aggbug/411871.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-04-03 08:10 <a href="http://www.blogjava.net/paulwong/archive/2014/04/03/411871.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何在WEB应用中绑定微信公众帐号</title><link>http://www.blogjava.net/paulwong/archive/2014/04/01/411767.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 01 Apr 2014 00:41:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/04/01/411767.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/411767.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/04/01/411767.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/411767.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/411767.html</trackback:ping><description><![CDATA[<a href="http://www.chanzhi.org/book/weixin.html" target="_blank">http://www.chanzhi.org/book/weixin.html</a>
<div><br />
</div>
<div><a href="http://demo.chanzhi.org/chanzhiadmin.php?m=wechat&amp;f=admin" target="_blank">http://demo.chanzhi.org/chanzhiadmin.php?m=wechat&amp;f=admin</a><br />
</div>
<img src ="http://www.blogjava.net/paulwong/aggbug/411767.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-04-01 08:41 <a href="http://www.blogjava.net/paulwong/archive/2014/04/01/411767.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>weather API 收集整理</title><link>http://www.blogjava.net/paulwong/archive/2014/01/14/408906.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 14 Jan 2014 02:54:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/01/14/408906.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/408906.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/01/14/408906.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/408906.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/408906.html</trackback:ping><description><![CDATA[<p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><strong style="color: #222222;">腾讯</strong></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><a href="http://sou.qq.com/online/get_weather.php?callback=Weather&amp;city=南京" target="_blank">http://sou.qq.com/online/get_weather.php?callback=Weather&amp;city=南京</a></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><strong style="color: #222222;">中国天气-weather.com.cn</strong></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><a href="http://geoip.weather.com.cn/g/" target="_blank">http://geoip.weather.com.cn/g/</a>&nbsp;(根据IP查询城市ID)</p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><a href="http://m.weather.com.cn/data/101110101.html" target="_blank">http://m.weather.com.cn/data/101110101.html</a>（六天预报）</p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><a href="http://www.weather.com.cn/data/sk/101110101.html" target="_blank">http://www.weather.com.cn/data/sk/101110101.html</a>（实时天气信息）</p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><strong style="color: #222222;">google</strong></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><a href="http://www.google.com/ig/api?weather=Beijing" target="_blank">http://www.google.com/ig/api?weather=Beijing</a></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><strong style="color: #222222;">设计蜂巢</strong></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><a href="http://www.hujuntao.com/api/weather/api.php?city=南京" target="_blank">http://www.hujuntao.com/api/weather/api.php?city=南京</a></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><strong style="color: #222222;">MSN</strong></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><a href="http://weather.msn.com/data.aspx?wealocations=wc:CHXX0008&amp;weadegreetype=C" target="_blank">http://weather.msn.com/data.aspx?wealocations=wc:CHXX0008&amp;weadegreetype=C</a></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><strong style="color: #222222;">YAHOO</strong></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><a href="http://xml.weather.yahoo.com/forecastrss?p=CHXX0008&amp;u=f" target="_blank">http://xml.weather.yahoo.com/forecastrss?p=CHXX0008&amp;u=f</a></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><a href="http://weather.yahooapis.com/forecastrss?w=2459115&amp;u=f" target="_blank">http://weather.yahooapis.com/forecastrss?w=2459115&amp;u=f</a></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><strong style="color: #222222;">ThinkPage(收费)</strong></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><a href="http://www.thinkpage.cn/weather/api.svc/getWeather?city=101010100&amp;language=zh-chs&amp;provider=cma&amp;unit=c&amp;key=" target="_blank">http://www.thinkpage.cn/weather/api.svc/getWeather?city=101010100&amp;language=zh-chs&amp;provider=cma&amp;unit=c&amp;key=</a></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><strong style="color: #222222;">有道</strong></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><a href="http://www.youdao.com/smartresult-xml/search.s?type=weather&amp;jsFlag=true&amp;q=南京" target="_blank">http://www.youdao.com/smartresult-xml/search.s?type=weather&amp;jsFlag=true&amp;q=南京</a></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><strong style="color: #222222;">360</strong></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><a href="http://cdn.weather.hao.360.cn/api_weather_info.php?app=hao360&amp;_jsonp=smartloaddata101190101&amp;code=101190101" target="_blank">http://cdn.weather.hao.360.cn/api_weather_info.php?app=hao360&amp;_jsonp=smartloaddata101190101&amp;code=101190101</a></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><strong style="color: #222222;">搜狗</strong></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><a href="http://123.sogou.com/get123.php?block=wt&amp;ver=v32&amp;city=CN110100" target="_blank">http://123.sogou.com/get123.php?block=wt&amp;ver=v32&amp;city=CN110100</a></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><strong style="color: #222222;">1616</strong></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><a href="http://weather.1616.net/grab/weather/%25E5%258C%2597%25E4%25BA%25AC.js" target="_blank">http://weather.1616.net/grab/weather/%25E5%258C%2597%25E4%25BA%25AC.js</a></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><strong style="color: #222222;">毒霸</strong></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><a href="http://123.duba.net/weatherinfo/" target="_blank">http://123.duba.net/weatherinfo/</a></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><strong style="color: #222222;">淘123</strong></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><a href="http://weather.tao123.com/static/weather/weather_json.php?cb=callback" target="_blank">http://weather.tao123.com/static/weather/weather_json.php?cb=callback</a></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><strong style="color: #222222;">114啦</strong></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><a href="http://weather.api.114la.com/1901/101190101.txt" target="_blank">http://weather.api.114la.com/1901/101190101.txt</a></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><strong style="color: #222222;">2345</strong></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><a href="http://tianqi.2345.com/t/detect2009v2.php" target="_blank">http://tianqi.2345.com/t/detect2009v2.php</a></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><strong style="color: #222222;">hao123</strong></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><a href="http://app.hao123.com/weather/forecast.php" target="_blank">http://app.hao123.com/weather/forecast.php</a></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><strong style="color: #222222;">其它</strong></p><p style="margin: 1em 0px; padding: 0px; font-family: 微软雅黑, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; font-size: 16px; line-height: 25px; background-color: #ffffff;"><a href="http://weather.all2rss.com/weatherrss.asp?City=%C4%CF%BE%A9" target="_blank">http://weather.all2rss.com/weatherrss.asp?City=%C4%CF%BE%A9</a></p><img src ="http://www.blogjava.net/paulwong/aggbug/408906.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-01-14 10:54 <a href="http://www.blogjava.net/paulwong/archive/2014/01/14/408906.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAX-RS资源</title><link>http://www.blogjava.net/paulwong/archive/2013/11/27/406879.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 27 Nov 2013 04:03:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2013/11/27/406879.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/406879.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2013/11/27/406879.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/406879.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/406879.html</trackback:ping><description><![CDATA[JAX-RS是JAVA EE的一个标准，用来处理RESTFUL的WEBSERVICE。<br />
<br />
<br />
Jersey 2.4.1 User Guide<br />
<a href="https://jersey.java.net/documentation/latest/index.html" target="_blank">https://jersey.java.net/documentation/latest/index.html<br />
<br />
</a><br />
The Java EE 6 Tutorial<br />
<a href="http://docs.oracle.com/javaee/6/tutorial/doc/gkoib.html" target="_blank">http://docs.oracle.com/javaee/6/tutorial/doc/gkoib.html</a><br />
<br />
<div><br />
</div>
<div>基于JAXB注释的JSON与JAVA BEAN的互转</div>
<div><a href="http://wiki.fasterxml.com/JacksonDataBinding" target="_blank">http://wiki.fasterxml.com/JacksonDataBinding</a><br />
</div>
<div><a href="http://stackoverflow.com/questions/10699038/generating-more-json-like-json-from-jaxb-and-jersey" target="_blank">http://stackoverflow.com/questions/10699038/generating-more-json-like-json-from-jaxb-and-jersey</a><br />
</div>
<div><a href="http://wiki.fasterxml.com/JacksonJAXBAnnotations" target="_blank">http://wiki.fasterxml.com/JacksonJAXBAnnotations</a><br />
</div>
<div><br /><br />例子：<br /><a href="https://github.com/jersey/jersey/tree/2.4.1/examples" target="_blank">https://github.com/jersey/jersey/tree/2.4.1/examples</a><br /><br /><br /><br /><br /><br /><br />
</div><img src ="http://www.blogjava.net/paulwong/aggbug/406879.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2013-11-27 12:03 <a href="http://www.blogjava.net/paulwong/archive/2013/11/27/406879.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>微信公众平台开发资源</title><link>http://www.blogjava.net/paulwong/archive/2013/11/25/406817.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Mon, 25 Nov 2013 14:00:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2013/11/25/406817.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/406817.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2013/11/25/406817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/406817.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/406817.html</trackback:ping><description><![CDATA[<div>【微信公众平台改版后】Java模拟登录微信平台,主动推送消息给用户</div>
<a href="http://50vip.com/blog.php?i=349" target="_blank">http://50vip.com/blog.php?i=349</a><br />
<br />
<br />微信公众账号开发<br />
<a href="http://my.oschina.net/ywooer/blog?catalog=419479" target="_blank">http://my.oschina.net/ywooer/blog?catalog=419479</a><img src ="http://www.blogjava.net/paulwong/aggbug/406817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2013-11-25 22:00 <a href="http://www.blogjava.net/paulwong/archive/2013/11/25/406817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于springMVC+springSecurity3.x+Mybaits3.x的权限系统</title><link>http://www.blogjava.net/paulwong/archive/2013/11/24/406757.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sun, 24 Nov 2013 12:54:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2013/11/24/406757.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/406757.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2013/11/24/406757.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/406757.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/406757.html</trackback:ping><description><![CDATA[<a href="https://github.com/lanyuancom/lanyuan" target="_blank">https://github.com/lanyuancom/lanyuan</a>
@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);<img src ="http://www.blogjava.net/paulwong/aggbug/406757.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2013-11-24 20:54 <a href="http://www.blogjava.net/paulwong/archive/2013/11/24/406757.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>大型网站技术架构读书笔记</title><link>http://www.blogjava.net/paulwong/archive/2013/11/09/406160.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sat, 09 Nov 2013 03:34:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2013/11/09/406160.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/406160.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2013/11/09/406160.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/406160.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/406160.html</trackback:ping><description><![CDATA[大型网站经历的技术架构演变：<br /><ol><li>应用服务器、数据库服务器和文件服务器都安装在同一台主机</li><li>应用服务器、数据库服务器和文件服务器分别安装在不同主机</li><li>增加了分布式的缓存服务器</li><li>应用服务器增加了好几台，变成集群</li><li>增加了CDN和反射代理服务器</li><li>数据库服务器变成主从形式的服务器</li><li>数据库服务器变成分布式的服务器，文件服务器也变成分布式服务器<br /></li><li>NOSQL分布式数据库和搜索引擎的引入</li><li>应用服务器虽然是多台，但都是部署了同一应用，这时将应用拆分，每台服务器部署不同的拆分应用</li><li>虽然应用已经拆分，但每个应用都是从页面管到数据库，这时继续拆分，将存取数据库的部份独立，页面部份<br />也独立</li></ol>架构模式<br /><ol><li>分层，代码放在不同的类中</li><li>分割，应用放在不同的JVM中</li><li>分布式，部署在不同的物理机</li><li>集群，同一个应用部署到不同的主机，可以负载均衡</li><li>缓存，CND加速、反向代理、本地缓存、分布式缓存</li><li>异步，消除高并发</li><li>冗余，多处备份</li><li>安全性</li></ol><img src ="http://www.blogjava.net/paulwong/aggbug/406160.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2013-11-09 11:34 <a href="http://www.blogjava.net/paulwong/archive/2013/11/09/406160.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java EE 8愿望清单：缺少这些，Java EE将不会完美</title><link>http://www.blogjava.net/paulwong/archive/2013/11/09/406156.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sat, 09 Nov 2013 03:14:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2013/11/09/406156.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/406156.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2013/11/09/406156.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/406156.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/406156.html</trackback:ping><description><![CDATA[<div style="margin: 0px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 25px; background-color: #ffffff;"><strong style="padding: 0px; margin: 0px;">摘要：</strong>Java EE 7已于6月中旬正式发布，尽管新平台包含了诸多新的特性，但是开发者对此似乎并不满足，他们期待未来的版本Java EE 8中能够包含更完善的特性，比如更大的CDI应用范围、标准的缓存API、现代化的安全框架等。</div><div style="margin: 0px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 25px; background-color: #ffffff;"><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;"><a href="http://www.csdn.net/article/2013-06-18/2815811" target="_blank" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">Java EE 7已于6月中旬正式发布</a>，新版本提供了一个强大、完整、全面的堆栈来帮助开发者构建企业和Web应用程序&#8212;&#8212;为构建HTML5动态可伸缩应用程序提供了支持，并新增大量规范和特性来提高开发人员的生产力以及满足企业最苛刻的需求。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;"><a href="http://cms.csdnimg.cn/article/201307/15/51e3de72d3739.jpg" target="_blank" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;"></a><a href="http://static.oschina.net/uploads/img/201311/08133128_iBCa.jpg" target="_blank" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;"><img src="http://static.oschina.net/uploads/img/201311/08133128_iBCa.jpg" style="padding: 8px; margin: 10px 0px; border: 1px solid #dddddd; max-width: 640px; background-color: #f6f6f6; cursor: pointer; background-position: initial initial; background-repeat: initial initial;"  alt="" /></a></p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">下面的这个图表包含了Java EE 7中的各种组件。橙色部分为Java EE中新添加的组件。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;"><a href="http://cms.csdnimg.cn/article/201307/15/51e3de849b8a9.jpg" target="_blank" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;"></a><a href="http://static.oschina.net/uploads/img/201311/08133128_wK8X.jpg" target="_blank" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;"><img src="http://static.oschina.net/uploads/img/201311/08133128_wK8X.jpg" style="padding: 8px; margin: 10px 0px; border: 1px solid #dddddd; max-width: 640px; background-color: #f6f6f6; cursor: pointer; background-position: initial initial; background-repeat: initial initial;"  alt="" /></a></p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">尽管新的平台包含了诸多新的特性，但是开发者对此似乎并不满足，尽管他们中的大部分还没有迁移到Java EE 7（或许是由于Java EE 7的特性还不完善），但是这并不影响他们对于Java EE 8特性的设想。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">比如，在Java EE 6发布（2009年12月10日发布）后，开发者Antonio Goncalves认为该版本并没有解决一些问题，因此写了一个希望在Java EE 7中包含的<a href="http://antoniogoncalves.org/2011/02/11/java-ee-7-i-have-a-few-dreams" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">特性清单</a>。有趣的是，他写的4个特性中，其中有2个（flows和batch）已经包含在Java EE 7中了，而第3个特性（caching）原本也计划包含其中，但由于开发进度关系，在Java EE 7最终发布前被舍弃。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">此举促使开发者<a href="http://arjan-tijms.blogspot.com/" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">Arjan Tijms</a>也写了一个他希望在Java EE 8中出现的特性清单，如下。</p><ol style="padding: 0px; margin: 10px 20px; list-style-position: inside;"><li style="padding: 0px; margin: 0px;">无处不在的CDI（Contexts&nbsp;and&nbsp;Dependency&nbsp;Injection&nbsp;for Java EE，上下文与依赖注入）</li><li style="padding: 0px; margin: 0px;">更深入的Pruning（修剪）和Deprecating（弃用）</li><li style="padding: 0px; margin: 0px;">一个标准的缓存API</li><li style="padding: 0px; margin: 0px;">administrative objects（管理对象）的应用内替代品</li><li style="padding: 0px; margin: 0px;">综合的现代化的安全框架</li><li style="padding: 0px; margin: 0px;">平台范围内的配置</li></ol><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">下面就来详细阐述这些特性的必要性。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;"><strong style="padding: 0px; margin: 0px;">1.&nbsp; 无处不在的CDI</strong></p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">实际上这意味着2种不同的东西：使CDI可以用在目前不能用的其他地方、基于CDI来实现和改造其他规范中的相关技术。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;"><strong style="padding: 0px; margin: 0px;">a. 使CDI可以用在其他地方</strong></p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">与Java EE 6相比，Java EE 7中的CDI的适用范围已经扩大了很多，比如CDI注入现在可以工作在<a href="http://jdevelopment.nl/jsf-22/#763" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">大多数JSF组件（artifacts）</a>中，比如<a href="http://rmannibucau.wordpress.com/2013/07/02/bean-validation-1-1" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">基于bean validation的约束验证器</a>。不幸的是，只是大部分JSF组件，并非所有的，比如转换器和验证器就不行，尽管<a href="https://code.google.com/p/omnifaces/issues/detail?id=183" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">OmniFaces 1.6将支持这些特性</a>，但最好是在Java EE 7中能够开箱即用。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">此外，Java EE 7中的CDI也没有考虑到<a href="https://java.net/jira/browse/JASPIC_SPEC-14" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">JASPIC组件</a>，在此之中注入操作将无法工作。即使http请求和会话在Servlet Profile SAM中可用，但是当SAM被调用时，相应的CDI作用域也不会被建立。这意味着它甚至不能通过bean管理器以编程方式来检索请求或<a rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">会话</a>bean作用域。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">还有一种特殊情况是，各种各样的平台artifacts可以通过一些替代的注解（如@PersistenceUnit）来注入，但早期的注入注解（@Resource）<a href="https://java.net/jira/browse/JAVAEE_SPEC-14" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">仍然需要做很多事情</a>，比如DataSource。即使Java EE 7中引入了artifacts（如任务调度服务），但也不得不通过&#8220;古老&#8221;的@Resource来注入，而不是通过@Inject。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;"><strong style="padding: 0px; margin: 0px;">b. 基于CDI来实现和改造其他规范中的相关技术</strong></p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">CDI绝对不应该只专注于在其他规范中已经解决的那些问题，其他规范还可以在CDI之上来实现它们各自的功能，这意味着它们可以作为CDI扩展。以Java EE 7中的JSF 2.2为例，该规范中的<a href="http://jdevelopment.nl/jsf-22/#1087" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">兼容CDI的视图作用域</a>可作为CDI扩展来使用，并且其新的flow作用域也可被立即实现为CDI扩展。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">此外，JTA 1.2现在也提供了一个CDI扩展，其可以声明式地应用到CDI托管的bean中。此前EJB也提供了类似的功能，其背后技术也使用到了JTA，但是声明部分还是基于EJB规范。在这种情况下，可以通过JTA来直接处理其自身的声明性事务，但是这需要在CDI之上进行。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">尽管从EJB 3版本开始，<a rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">EJB beans</a>已经非常简单易用了，同时还相当强大，但问题是：CDI中已经提供了组件模型，EJB beans只是另一个替代品。无论各种EJB bean类型有多么实用，但是一个平台上有2个组件模型，容易让用户甚至是规范实现者混淆。通过CDI组件模型，你可以选择需要的功能，或者混合使用，并且每个注解提供了额外的功能。而EJB是一个&#8220;一体&#8221;模式，在一个单一的注解中定义了特定的bean类型，它们之间可以很好地协同工作。你可以禁用部分不想使用的功能。例如，你可以关闭bean类型中提供的事务支持，或者禁用@Stateful beans中的passivation，或者禁用<a href="http://my.oschina.net/u/674" target="_blank" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">@Singleton</a>&nbsp;beans中的容器管理锁。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">如果EJB被当做CDI的一组扩展来进行改造，可能最终会更好。这样就会只有一个组件模型，并且具有同样有效的功能。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">这意味着EJB的服务，如计时器服务（<a href="https://java.net/jira/browse/EJB_SPEC-1" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">@Schedule</a>、<a href="https://java.net/jira/browse/EJB_SPEC-2" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;"></a><a href="http://my.oschina.net/timeout" target="_blank" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">@TimeOut</a>&nbsp;）、<a href="https://java.net/jira/browse/EJB_SPEC-3" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">@Asynchronous</a>、&nbsp;<a href="https://java.net/jira/browse/EJB_SPEC-4" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;"></a><a href="http://my.oschina.net/u/858586" target="_blank" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">@Lock</a>、<a href="https://java.net/jira/browse/EJB_SPEC-19" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">@Startup/@DependsOn</a>和@RolesAllowed都应该能与CDI托管的bean一起工作。此外，现有EJB bean类型提供的隐式功能也应该被分解成可单独使用的功能。比如可以通过@Pooled来模拟@Stateless beans提供的容器池，通过@CallScoped来模拟调用@Stateless bean到不同的实例中的行为。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;"><strong style="padding: 0px; margin: 0px;">2. &nbsp;更深入的Pruning（修剪）和Deprecating（弃用）</strong></p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">在Java EE平台中，为数众多的API可能会令初学者不知所措，这也是导致Java EE如此复杂的一个重要原因。因此从Java EE 6版本开始就引入了<a href="http://infoq.com/news/2009/04/ee-pruning" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">Pruning</a>（修剪）和Deprecating（弃用）过程。在Java EE 7中，更多的技术和API成为了可选项，这意味着开发者如果需要，还可以包含进来。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">比如我个人最喜欢的是JSF本地托管bean设施、JSP视图处理程序（这早在2009年就被弃用了），以及JSF中各种各样的功能，这些功能在规范文件中很长一段时间一直被描述为&#8220;被弃用&#8221;。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">如果EJB组件模型也被修剪将会更好，但这有可能还为时过早。其实最应该做的是继续去修剪EJB 2编程模型相关的所有东西，比如在Java EE 7中依然存在的home接口。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;"><strong style="padding: 0px; margin: 0px;">3. &nbsp;一个标准化的缓存API</strong></p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">JCache缓存API原本将包含在Java EE 7中，但不幸的是，该API<a href="https://blogs.oracle.com/theaquarium/entry/jcache_to_miss_java_ee" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">错过了重要的公共审查的最后期限</a>，导致其没能成为Java EE 7的一部分。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">如果该规范能够在Java EE 8计划表的早期阶段完成，就有可能成为Java EE 8的一部分。这样，其他一些规范（如JPA）也能够在JCache之上重新构建自己的缓存API。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;"><strong style="padding: 0px; margin: 0px;">4. &nbsp;所有管理对象（administrative objects）的应用内替代品</strong></p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">Java EE中有一个概念叫&#8220;管理对象（administrative objects）&#8221;。这是一个配置在AS端而不是在应用程序本身中的资源。这个概念是有争议的。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">对于在应用服务器上运行许多外部程序的大企业而言，这可以是一个大的优势&#8212;&#8212;你通常不会想去打开一个外部获得的应用程序来改变它连接的数据库的相关细节。在传统企业中，如果在开发人员和操作之间有一个强大的分离机制，这个概念也是有益的&#8212;&#8212;这可以在系统安装时分别设置。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">但是，这对于在自己的应用服务器部署内部开发的应用程序的敏捷团队来说，这种分离方式是一个很大的障碍，不会带来任何帮助。同样，对于初学者、教育方面的应用或者云部署来说，这种设置也是非常不可取的。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">从Java EE 6的@DataSourceDefinition开始，许多资源（早期的&#8220;管理对象&#8221;）只能从应用程序内部被定义，比如JMS Destinations、email会话等。不幸的是，这并不适用于所有的管理对象。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">不过，Java EE 7中新的<a href="https://javaee7.zeef.com/#block_237" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">Concurrency Utils for Java EE</a>规范中有明确的<a href="https://javaee7.zeef.com/#block_237" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">选项使得它的资源只针对管理对象</a>。如果在Java EE 8中，允许<a href="https://java.net/jira/browse/JAVAEE_SPEC-23" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">以一个便携的方式从应用程序内部配置</a>，那么这将是非常棒的。更进一步来说，如果Java EE 8中能够定义一种规范来明确禁止资源只能被administrative，那么会更好。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;"><strong style="padding: 0px; margin: 0px;">5. &nbsp;综合的现代化的安全框架</strong></p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">在Java EE中，安全一直是一个棘手的问题。缺乏整体和全面的安全框架是<a href="http://reddit.com/r/java/comments/1b6b4m/securing_j2ee_applications" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">Java EE的主要缺点之一</a>，尤其是在讨论或评估竞争框架（如Spring）时，这些问题会被更多地提及。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">并不是Java EE没有关于安全方面的规定。事实上，它有一整套选项，比如JAAS、JASPIC、JACC、部分的Servlet安全方面的规范、部分EJB规范、JAX-RS自己的API，甚至JCA也有一些自己的安全规定。但是，这方面存在相当多的问题。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">首先，安全标准被分布在这么多规范中，且并不是所有这些规范都可以用在Java EE Web Profile中，这也导致难以推出一个综合的Java EE安全框架。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">第二，各种安全API已经相当长一段时间没有被现代化，尤其是JASPIC和JACC。长期以来，这些API只是修复了一些小的重要的问题，从来没有一个API像<a href="https://javaee7.zeef.com/#block_236" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">JMS 2</a>一样被完整地现代化。比如，JASPIC现在<a href="https://java.net/jira/browse/JASPIC_SPEC-10" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">仍然针对Java SE 1.4</a>。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">第三，个别安全API，如JAAS、JASPIC 和JACC，都是<a href="https://java.net/jira/browse/JASPIC_SPEC-17" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">比较抽象和低层次的</a>。虽然这为供应商提供了很大的灵活性，但是它们不适合普通的应用程序开发者。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">第四，最重要的问题是，Java EE中的安全机制也遭遇到了&#8220;管理对象&#8221;中同样的问题。很长一段时间，所谓的Java EE声明式安全模型主要认证过程是在AS端按照供应商特定方式来单独配置和实现的，这再次让安全设置对于敏捷团队、教育工作者和初学者来说成为一件困难的事。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">以上这些是主要的问题。虽然其中一些问题可以在最近的Java EE升级中通过增加小功能和修复问题来解决。然而，我的愿望是，能够在Java EE 8中，通过一个综合的和现代化的安全框架（尽可能地构建在现有安全基础上）将这些问题解决得更加彻底。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;"><strong style="padding: 0px; margin: 0px;">6. &nbsp;平台范围内的配置</strong></p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">Java EE应用程序可以使用部署描述文件（比如web.xml）进行配置，但该方法对于不同的开发阶段（如DEV、BETA、LIVE等）来说是比较痛苦的。针对这些阶段配置Java EE应用程序的传统的方法是通过驻留在一个特定服务器实例中的&#8220;管理对象&#8221;来实现。在该方法中，配置的是服务器，而不是应用程序。由于不同阶段会对应不同的服务器，因此这些设置也会随之自动改变。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">这种方法有一些问题。首先在AS端的配置资源是服务器特定的，这些资源可以被标准化，但是它们的配置肯定没有被标准化。这对于初学者来说，在即将发布的应用程序中进行解释说明比较困难。对于小型开发团队和敏捷开发团队而言，也增加了不必要的困难。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">对于配置Java EE应用程序，目前有很多可替代的方式，比如在<a rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">部署描述符</a>内使用（基于表达式语言的）占位符，并使部署描述符（或fragments）可切换。许多规范已经允许指定外部的部署描述符（如web.xml中可以指定外部的faces-config.xml文件，persistence.xml中可以指定外部的orm.xml文件），但是没有一个统一的机制来针对描述符做这些事情，并且没有办法去参数化这些包含的外部文件。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">如果Java EE 8能够以一种<a href="https://java.net/jira/browse/JAVAEE_SPEC-19" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">彻底的、统一平台的方式</a>来解决这些配置问题，将再好不过了。似乎Java EE 8开发团队<a href="https://oracleus.activeevents.com/2013/connect/sessionDetail.ww?SESSION_ID=7755" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">正在计划</a>做这样的事情。这将会非常有趣，接下来就看如何发展了。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;"><strong style="padding: 0px; margin: 0px;">结论</strong></p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">Java EE 8目前尚处于规划初期，但愿上面提到的大多数特性能够以某种方式加以解决。可能&#8220;无处不在的CDI&#8221;的几率会大一些，此方面似乎已经得到了很大的支持，且事情已经在朝着这个方向发展了。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">标准化缓存API也非常有可能，它几乎快被包含在Java EE 7中了，但愿其不会再次错过规范审查的最后期限。</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">此外，&#8220;现代化的安全框架&#8221;这一特性已经被几个Java EE开发成员提到，但是此方面工作尚未启动。这可能需要相当大的努力，以及大量其他规范的支持，这是一个整体性问题。顺便说一句，安全框架也是Antonio Goncalves关于Java EE 7愿望清单中的第4个提议，希望Java EE 8可以解决这一问题。</p></div><img src ="http://www.blogjava.net/paulwong/aggbug/406156.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2013-11-09 11:14 <a href="http://www.blogjava.net/paulwong/archive/2013/11/09/406156.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OAUTH 2.0资源</title><link>http://www.blogjava.net/paulwong/archive/2013/10/24/405595.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 24 Oct 2013 03:27:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2013/10/24/405595.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/405595.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2013/10/24/405595.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/405595.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/405595.html</trackback:ping><description><![CDATA[<a href="http://wenku.baidu.com/view/0c80c91bb7360b4c2e3f647c.html" target="_blank">http://wenku.baidu.com/view/0c80c91bb7360b4c2e3f647c.html<br /></a>
<br />
<br />
OAuth 2.0 Tutorial<br />
<a href="http://tutorials.jenkov.com/oauth2/index.html" target="_blank">http://tutorials.jenkov.com/oauth2/index.html</a><br />
<br />
<br />
New JavaScript SDK &amp; OAuth 2.0 based FBConnect Tutorial<br />
<a href="http://thinkdiff.net/facebook/new-javascript-sdk-oauth-2-0-based-fbconnect-tutorial/" target="_blank">http://thinkdiff.net/facebook/new-javascript-sdk-oauth-2-0-based-fbconnect-tutorial/</a><br />
<br />
<br />
Twitter OAuth<br />
<a href="http://robfig.github.io/revel/samples/twitter-oauth.html" target="_blank">http://robfig.github.io/revel/samples/twitter-oauth.html</a><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/paulwong/aggbug/405595.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2013-10-24 11:27 <a href="http://www.blogjava.net/paulwong/archive/2013/10/24/405595.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>启用TOMCAT的SSL</title><link>http://www.blogjava.net/paulwong/archive/2013/10/14/404941.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Mon, 14 Oct 2013 00:02:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2013/10/14/404941.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/404941.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2013/10/14/404941.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/404941.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/404941.html</trackback:ping><description><![CDATA[本教程使用 JDK 6 和 Tomcat 7，其他版本类似。<br /><br />基本步骤：<br /><br />使用 java 创建一个 keystore 文件<br />配置 Tomcat 以使用该 keystore 文件<br />测试<br />配置应用以便使用 SSL ，例如 https://localhost:8443/yourApp<br />1. 创建 keystore 文件<br /><br />执行 keytool -genkey -alias tomcat -keyalg RSA 结果如下<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->loiane:bin&nbsp;loiane$&nbsp;keytool&nbsp;-genkey&nbsp;-alias&nbsp;tomcat&nbsp;-keyalg&nbsp;RSA<br />Enter&nbsp;keystore&nbsp;password:&nbsp;&nbsp;password<br />Re-enter&nbsp;new&nbsp;password:&nbsp;password<br />What&nbsp;is&nbsp;your&nbsp;first&nbsp;and&nbsp;last&nbsp;name?<br />&nbsp;&nbsp;<span style="color: #800000; font-weight: bold; ">[</span><span style="color: #800000; ">Unknown</span><span style="color: #800000; font-weight: bold; ">]</span>:&nbsp;&nbsp;Loiane&nbsp;Groner<br />What&nbsp;is&nbsp;the&nbsp;name&nbsp;of&nbsp;your&nbsp;organizational&nbsp;unit?<br />&nbsp;&nbsp;<span style="color: #800000; font-weight: bold; ">[</span><span style="color: #800000; ">Unknown</span><span style="color: #800000; font-weight: bold; ">]</span>:&nbsp;&nbsp;home<br />What&nbsp;is&nbsp;the&nbsp;name&nbsp;of&nbsp;your&nbsp;organization?<br />&nbsp;&nbsp;<span style="color: #800000; font-weight: bold; ">[</span><span style="color: #800000; ">Unknown</span><span style="color: #800000; font-weight: bold; ">]</span>:&nbsp;&nbsp;home<br />What&nbsp;is&nbsp;the&nbsp;name&nbsp;of&nbsp;your&nbsp;City&nbsp;or&nbsp;Locality?<br />&nbsp;&nbsp;<span style="color: #800000; font-weight: bold; ">[</span><span style="color: #800000; ">Unknown</span><span style="color: #800000; font-weight: bold; ">]</span>:&nbsp;&nbsp;Sao&nbsp;Paulo<br />What&nbsp;is&nbsp;the&nbsp;name&nbsp;of&nbsp;your&nbsp;State&nbsp;or&nbsp;Province?<br />&nbsp;&nbsp;<span style="color: #800000; font-weight: bold; ">[</span><span style="color: #800000; ">Unknown</span><span style="color: #800000; font-weight: bold; ">]</span>:&nbsp;&nbsp;SP<br />What&nbsp;is&nbsp;the&nbsp;two-letter&nbsp;country&nbsp;code&nbsp;for&nbsp;this&nbsp;unit?<br />&nbsp;&nbsp;<span style="color: #800000; font-weight: bold; ">[</span><span style="color: #800000; ">Unknown</span><span style="color: #800000; font-weight: bold; ">]</span>:&nbsp;&nbsp;BR<br />Is&nbsp;CN=Loiane&nbsp;Groner,&nbsp;OU=home,&nbsp;O=home,&nbsp;L=Sao&nbsp;Paulo,&nbsp;ST=SP,&nbsp;C=BR&nbsp;correct?<br />&nbsp;&nbsp;<span style="color: #800000; font-weight: bold; ">[</span><span style="color: #800000; ">no</span><span style="color: #800000; font-weight: bold; ">]</span>:&nbsp;&nbsp;y<br />&nbsp;<br />Enter&nbsp;key&nbsp;password&nbsp;for<br />&nbsp;&nbsp;&nbsp;&nbsp;(RETURN&nbsp;if&nbsp;same&nbsp;as&nbsp;keystore&nbsp;password):&nbsp;&nbsp;password<br />Re-enter&nbsp;new&nbsp;password:&nbsp;password</div><br /><br />这样就在用户的主目录下创建了一个 .keystore 文件<br /><br />2. 配置 Tomcat 以使用 keystore 文件<br /><br />打开 server.xml 找到下面被注释的这段<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">&lt;!--</span><span style="color: #008000; "><br />&lt;Connector&nbsp;port="8443"&nbsp;protocol="HTTP/1.1"&nbsp;SSLEnabled="true"<br />&nbsp;&nbsp;&nbsp;&nbsp;maxThreads="150"&nbsp;scheme="https"&nbsp;secure="true"<br />&nbsp;&nbsp;&nbsp;&nbsp;clientAuth="false"&nbsp;sslProtocol="TLS"&nbsp;/&gt;<br /></span><span style="color: #008000; ">--&gt;</span></div><br />干掉注释，并将内容改为<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">Connector&nbsp;</span><span style="color: #FF0000; ">SSLEnabled</span><span style="color: #0000FF; ">="true"</span><span style="color: #FF0000; ">&nbsp;acceptCount</span><span style="color: #0000FF; ">="100"</span><span style="color: #FF0000; ">&nbsp;clientAuth</span><span style="color: #0000FF; ">="false"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;disableUploadTimeout</span><span style="color: #0000FF; ">="true"</span><span style="color: #FF0000; ">&nbsp;enableLookups</span><span style="color: #0000FF; ">="false"</span><span style="color: #FF0000; ">&nbsp;maxThreads</span><span style="color: #0000FF; ">="25"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;port</span><span style="color: #0000FF; ">="8443"</span><span style="color: #FF0000; ">&nbsp;keystoreFile</span><span style="color: #0000FF; ">="/Users/loiane/.keystore"</span><span style="color: #FF0000; ">&nbsp;keystorePass</span><span style="color: #0000FF; ">="password"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;protocol</span><span style="color: #0000FF; ">="org.apache.coyote.http11.Http11NioProtocol"</span><span style="color: #FF0000; ">&nbsp;scheme</span><span style="color: #0000FF; ">="https"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;secure</span><span style="color: #0000FF; ">="true"</span><span style="color: #FF0000; ">&nbsp;sslProtocol</span><span style="color: #0000FF; ">="TLS"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span></div><br />3. 测试<br /><br />启动 Tomcat 并访问 https://localhost:8443. 你将看到 Tomcat 默认的首页。<br /><br />需要注意的是，如果你访问默认的 8080 端口，还是有效的。<br /><br />4. 配置应用使用 SSL<br /><br />打开应用的 web.xml 文件，增加配置如下：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">security-constraint</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">web-resource-collection</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">web-resource-name</span><span style="color: #0000FF; ">&gt;</span>securedapp<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">web-resource-name</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">url-pattern</span><span style="color: #0000FF; ">&gt;</span>/*<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">url-pattern</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">web-resource-collection</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">user-data-constraint</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">transport-guarantee</span><span style="color: #0000FF; ">&gt;</span>CONFIDENTIAL<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">transport-guarantee</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">user-data-constraint</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">security-constraint</span><span style="color: #0000FF; ">&gt;</span></div><br />将 URL 映射设为 /* ，这样你的整个应用都要求是 HTTPS 访问，而 transport-guarantee 标签设置为 CONFIDENTIAL 以便使应用支持 SSL。<br /><br />如果你希望关闭 SSL ，只需要将 CONFIDENTIAL 改为 NONE 即可。<br /><br />如果是MAVEN的TOMCAT插件，则加入如下配置<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">build</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">finalName</span><span style="color: #0000FF; ">&gt;</span>test-dropbox<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">finalName</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">plugins</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">plugin</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>org.apache.maven.plugins<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>maven-compiler-plugin<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span>2.5.1<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">configuration</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">source</span><span style="color: #0000FF; ">&gt;</span>1.6<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">source</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">target</span><span style="color: #0000FF; ">&gt;</span>1.6<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">target</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">configuration</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">plugin</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">plugin</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>org.apache.tomcat.maven<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>tomcat7-maven-plugin<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span>2.0<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">configuration</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">httpsPort</span><span style="color: #0000FF; ">&gt;</span>8443<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">httpsPort</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">keystorePass</span><span style="color: #0000FF; ">&gt;</span>password<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">keystorePass</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">keystoreFile</span><span style="color: #0000FF; ">&gt;</span>C:\Users\PAUL\.keystore<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">keystoreFile</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">configuration</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">plugin</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">plugins</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">build</span><span style="color: #0000FF; ">&gt;</span></div><br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/404941.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2013-10-14 08:02 <a href="http://www.blogjava.net/paulwong/archive/2013/10/14/404941.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>小议JPA</title><link>http://www.blogjava.net/paulwong/archive/2013/08/14/402812.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 14 Aug 2013 10:17:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2013/08/14/402812.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/402812.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2013/08/14/402812.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/402812.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/402812.html</trackback:ping><description><![CDATA[以前和数据库打交道的标准INTERFACE是JDBC，放SQL语句，执行，就可以有结果。随着近年ORM的兴起，以对象的方式存取数据库大行其道。于是产生了JPA。<br />
<br />
也是一套INTERFACE，以ORM的方式提供，由厂商实现，如ECLIPSE LINK，HIBERNATE，OPENEJB等。<br />
<br />
ENTITYMANAGERFACTORY：根据配置文件制造ENTITYMANAGER<br />
ENTITYMANAGER：以ORM的方式提供操作数据库的功能<br />
TRANSACTION：事务保证<br />
PERSISTENCE.XML：链接数据库信息，事务类型，重定义JPA的实现厂商等的配置信息<br />
<br />
在容器环境下使用：<br /><br />
如果事务是RESOURCE_LOCAL的方式，则合用端需干所有的事情，如构造ENTITYMANAGER，打开事务，关闭事务等。类似于BMT。<br />
以下是在服务器环境中合用RESOURCE_LOCAL型的JPA<br /><br />事先要在容器中添加数据源。<br /><br />&nbsp;persistence.xml<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">&lt;?</span><span style="color: #FF00FF; ">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"&nbsp;</span><span style="color: #0000FF; ">?&gt;</span><br />
<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">persistence&nbsp;</span><span style="color: #FF0000; ">xmlns</span><span style="color: #0000FF; ">="http://java.sun.com/xml/ns/persistence"</span><span style="color: #FF0000; ">&nbsp;version</span><span style="color: #0000FF; ">="1.0"</span><span style="color: #0000FF; ">&gt;</span><br />
<br />
&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;Tutorial&nbsp;"unit"&nbsp;</span><span style="color: #008000; ">--&gt;</span><br />
&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">persistence-unit&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="Tutorial"</span><span style="color: #FF0000; ">&nbsp;transaction-type</span><span style="color: #0000FF; ">="RESOURCE_LOCAL"</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">non-jta-data-source</span><span style="color: #0000FF; ">&gt;</span>myNonJtaDataSource<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">non-jta-data-source</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">class</span><span style="color: #0000FF; ">&gt;</span>org.superbiz.jpa.Account<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">class</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">persistence-unit</span><span style="color: #0000FF; ">&gt;</span><br />
<br />
<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">persistence</span><span style="color: #0000ff;">&gt;</span></div><br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span>&nbsp;javax.persistence.EntityManagerFactory;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.persistence.EntityManager;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.persistence.EntityTransaction;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.persistence.PersistenceUnit;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;MyEjbOrServlet&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" />&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@PersistenceUnit(unitName="Tutorial")<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;EntityManagerFactory&nbsp;factory;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Proper&nbsp;exception&nbsp;handling&nbsp;left&nbsp;out&nbsp;for&nbsp;simplicity</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;ejbMethodOrServletServiceMethod()&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EntityManager&nbsp;entityManager&nbsp;=&nbsp;factory.createEntityManager();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EntityTransaction&nbsp;entityTransaction&nbsp;=&nbsp;entityManager.getTransaction();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entityTransaction.begin();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Account&nbsp;account&nbsp;=&nbsp;entityManager.find(Account.<span style="color: #0000FF; ">class</span>,&nbsp;12345);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account.setBalance(5000);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entityTransaction.commit();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />}</div><br /><br />以下是JTA方式的JPA，容器+EJB+JPA+JTA，容器会在EJB的方法调用前打开一个事务，在方法退出后，提交事务，并且如果是多个数据源的，即有多个ENTITYMANAGER的<br />可以保证一致性，即全局事务。相当于之前的先调用USERTRANSACTION，BEGIN，COMMIT。<br /><br />事先要在容器中添加数据源。<br /><br />&nbsp;persistence.xml<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">&lt;?</span><span style="color: #FF00FF; ">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"&nbsp;</span><span style="color: #0000FF; ">?&gt;</span><br /><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">persistence&nbsp;</span><span style="color: #FF0000; ">xmlns</span><span style="color: #0000FF; ">="http://java.sun.com/xml/ns/persistence"</span><span style="color: #FF0000; ">&nbsp;version</span><span style="color: #0000FF; ">="1.0"</span><span style="color: #0000FF; ">&gt;</span><br /><br />&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;Tutorial&nbsp;"unit"&nbsp;</span><span style="color: #008000; ">--&gt;</span><br />&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">persistence-unit&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="Tutorial"</span><span style="color: #FF0000; ">&nbsp;transaction-type</span><span style="color: #0000FF; ">="JTA"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">jta-data-source</span><span style="color: #0000FF; ">&gt;</span>myJtaDataSource<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">jta-data-source</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">non-jta-data-source</span><span style="color: #0000FF; ">&gt;</span>myNonJtaDataSource<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">non-jta-data-source</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">class</span><span style="color: #0000FF; ">&gt;</span>org.superbiz.jpa.Account<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">class</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">persistence-unit</span><span style="color: #0000FF; ">&gt;</span><br /><br /><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">persistence</span><span style="color: #0000FF; ">&gt;</span></div><br /><br />EJB<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span>&nbsp;javax.ejb.Stateless;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.ejb.TransactionAttribute;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.ejb.TransactionAttributeType;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.persistence.EntityManager;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.persistence.PersistenceContext;<br /><br />@Stateless<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;MyEjb&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;MyEjbInterface&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@PersistenceContext(unitName&nbsp;=&nbsp;"Tutorial")<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;EntityManager&nbsp;entityManager;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Proper&nbsp;exception&nbsp;handling&nbsp;left&nbsp;out&nbsp;for&nbsp;simplicity</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;@TransactionAttribute(TransactionAttributeType.REQUIRED)<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;ejbMethod()&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Account&nbsp;account&nbsp;=&nbsp;entityManager.find(Account.<span style="color: #0000FF; ">class</span>,&nbsp;12345);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;account.setBalance(5000);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br /><br />如果是J2SE环境下使用JPA，则又是不一样的。<br /><br /><br />persistence.xml<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">&lt;?</span><span style="color: #FF00FF; ">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000FF; ">?&gt;</span><br /><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">persistence&nbsp;</span><span style="color: #FF0000; ">xmlns</span><span style="color: #0000FF; ">="http://java.sun.com/xml/ns/persistence"</span><span style="color: #FF0000; ">&nbsp;version</span><span style="color: #0000FF; ">="1.0"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">persistence-unit&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="SimplePU"</span><span style="color: #FF0000; ">&nbsp;transaction-type</span><span style="color: #0000FF; ">="RESOURCE_LOCAL"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">provider</span><span style="color: #0000FF; ">&gt;</span>org.hibernate.ejb.HibernatePersistence<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">provider</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">class</span><span style="color: #0000FF; ">&gt;</span>com.someone.jmail.valueobject.CallActivity<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">class</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">class</span><span style="color: #0000FF; ">&gt;</span>com.someone.jmail.valueobject.Email<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">class</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">properties</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="hibernate.connection.driver_class"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="com.mysql.jdbc.Driver"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="hibernate.connection.url"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="jdbc:mysql://localhost:3306/test"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="hibernate.connection.username"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="root"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="hibernate.connection.password"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="12345"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="hibernate.dialect"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="org.hibernate.dialect.MySQL5Dialect"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="hibernate.show_sql"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="false"</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="hibernate.format_sql"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="true"</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="hibernate.use_sql_comments"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="false"</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="hibernate.hbm2ddl.auto"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="none"</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">properties</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">persistence-unit</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">persistence</span><span style="color: #0000FF; ">&gt;</span></div><br /><br />Dao:<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;UserDaoImpl&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;UserDao&nbsp;{&nbsp;<br />&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;AccountInfo&nbsp;save(AccountInfo&nbsp;accountInfo)&nbsp;{&nbsp;<br />&nbsp;EntityManagerFactory&nbsp;emf&nbsp;=&nbsp;<br />&nbsp;Persistence.createEntityManagerFactory("SimplePU");&nbsp;<br />&nbsp;EntityManager&nbsp;em&nbsp;=&nbsp;emf.createEntityManager();&nbsp;<br />&nbsp;em.getTransaction().begin();&nbsp;<br />&nbsp;em.persist(accountInfo);&nbsp;<br />&nbsp;em.getTransaction().commit();&nbsp;<br />&nbsp;emf.close();&nbsp;<br />&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;accountInfo;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;}&nbsp;</div><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/402812.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2013-08-14 18:17 <a href="http://www.blogjava.net/paulwong/archive/2013/08/14/402812.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在 Ubuntu 安裝 java Jdk</title><link>http://www.blogjava.net/paulwong/archive/2013/08/10/402655.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sat, 10 Aug 2013 05:33:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2013/08/10/402655.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/402655.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2013/08/10/402655.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/402655.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/402655.html</trackback:ping><description><![CDATA[
在 Ubuntu 安裝 java Jdk 很容易<br />
<br />
Install-Oracle-Java-7-in-Ubuntu-via-PPA-Repository<br />
<br />
安裝 java 很容易 ! (支援 Ubuntu 12.04, 11.10, 11.04 and 10.04)<br />
<br />
說在前頭 :<br />
0. 安裝 oracle java jdk (目前是 7u5 版)<br />
0-1. 包含 jdk jre 及 瀏覽器插件 (不能只安裝 jre 或 瀏覽器插件)<br />
0-2. 自動 辨識 64 bits 或 32 bits<br />
0-2. 安裝後 會自動從 ppa:webupd8team/java 套件庫 更新 已安裝套件 <br />
0-3. 以後有新版本 這個方法 自動會直接安裝新版本(例如如果有 7u6 版)<br /><br />1. 安裝指令<br /><div style="padding: 4px 5px 4px 4px; border: 1px solid rgb(204, 204, 204); width: 98%; font-size: 13px; word-break: break-all; background-color: rgb(238, 238, 238);"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp;&nbsp; apt-get install software-properties-common<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">.&nbsp;sudo&nbsp;add-apt-repository&nbsp;ppa:webupd8team/java<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">.&nbsp;sudo&nbsp;apt-get&nbsp;update<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 0);">.&nbsp;sudo&nbsp;apt-get&nbsp;install&nbsp;oracle-java7-installer(6就用这个：oracle-java6-installer)</span></div> 

<br />
<br />

2. 看看是否安裝成功<br /><div style="padding: 4px 5px 4px 4px; border: 1px solid rgb(204, 204, 204); width: 98%; font-size: 13px; word-break: break-all; background-color: rgb(238, 238, 238);"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: rgb(0, 0, 0);">java -version</span></div><br />
目前最新版本<br />
java version "1.7.0_05"<br />
Java(TM) SE Runtime Environment (build 1.7.0_05-b05)<br />
Java HotSpot(TM) 64-Bit Server VM (build 23.1-b03, mixed mode)<br />
<br />2-1. 如果上面的指令 得到的版本 不是剛剛安裝的版本<br />
<div style="padding: 4px 5px 4px 4px; border: 1px solid rgb(204, 204, 204); width: 98%; font-size: 13px; word-break: break-all; background-color: rgb(238, 238, 238);"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: rgb(0, 0, 0);">sudo update-java-alternatives -s java-</span><span style="color: rgb(0, 0, 0);">7</span><span style="color: rgb(0, 0, 0);">-oracle</span></div><br />
再試一次<br />
java -version<br />
<br />
3. 移除 Oracle Java 7<br />
<div style="padding: 4px 5px 4px 4px; border: 1px solid rgb(204, 204, 204); width: 98%; font-size: 13px; word-break: break-all; background-color: rgb(238, 238, 238);"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: rgb(0, 0, 0);">sudo apt-get remove oracle-java7-installer </span></div> 
 
<img src ="http://www.blogjava.net/paulwong/aggbug/402655.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2013-08-10 13:33 <a href="http://www.blogjava.net/paulwong/archive/2013/08/10/402655.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ECLIPSE+MAVEN+TOMCAT7 PLUGING+JNDI</title><link>http://www.blogjava.net/paulwong/archive/2013/07/15/401578.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Mon, 15 Jul 2013 05:51:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2013/07/15/401578.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/401578.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2013/07/15/401578.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/401578.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/401578.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 开发工具是ECLIPSE，由于是MAVEN WEB项目，不是ECLIPSE项目，测试用的如TOMCAT就不能使用平常的ECLIPSE加TOMCAT的方式了。只能用MAVEN的TOMCAT插件。MAVEN的这个TOMCAT插件其实就是让MAVEN去启动一个内嵌的TOMCAT服务器，如果项目和这个TOMCAT关联了，项目就可以部署上去。内嵌的服务器功能扩展，是通过插件的配置进行的。如改...&nbsp;&nbsp;<a href='http://www.blogjava.net/paulwong/archive/2013/07/15/401578.html'>阅读全文</a><img src ="http://www.blogjava.net/paulwong/aggbug/401578.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2013-07-15 13:51 <a href="http://www.blogjava.net/paulwong/archive/2013/07/15/401578.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE+ECLIPSE+JETTY PLUGIN+JNDI DATA SOURCE</title><link>http://www.blogjava.net/paulwong/archive/2013/07/14/401551.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sun, 14 Jul 2013 08:59:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2013/07/14/401551.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/401551.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2013/07/14/401551.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/401551.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/401551.html</trackback:ping><description><![CDATA[需求：<br /><br />在ECLIPSE中，启动JETTY，能部署多个WEB应用，应用间能共享JNDI 的数据源。<br /><br />Jetty/Feature/Jetty Maven Plugin<br /><a href="http://wiki.eclipse.org/Jetty/Feature/Jetty_Maven_Plugin" target="_blank">http://wiki.eclipse.org/Jetty/Feature/Jetty_Maven_Plugin</a><br /><br />Speed Up J2EE Environment Setup With Jetty Maven Plugin<br /><a href="http://owenou.com/2011/02/23/speed-up-j2ee-environment-setup-with-jetty-maven-plugin.html" target="_blank">http://owenou.com/2011/02/23/speed-up-j2ee-environment-setup-with-jetty-maven-plugin.html</a><img src ="http://www.blogjava.net/paulwong/aggbug/401551.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2013-07-14 16:59 <a href="http://www.blogjava.net/paulwong/archive/2013/07/14/401551.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle数据库备份与还原命令[转]</title><link>http://www.blogjava.net/paulwong/archive/2013/05/12/399172.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sun, 12 May 2013 07:07:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2013/05/12/399172.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/399172.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2013/05/12/399172.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/399172.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/399172.html</trackback:ping><description><![CDATA[数据导出：<br /><br />  1 将数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp中<br /><br />  exp system/manager@TEST file=d:\daochu.dmp full=y<br /><br />  2 将数据库中system用户与sys用户的表导出<br /><br />  exp system/manager@TEST file=d:\daochu.dmp owner=(system,sys)<br /><br />  3 将数据库中的表table1 、table2导出<br /><br />  exp system/manager@TEST file=d:\daochu.dmp tables=(table1,table2)<br /><br />  4 将数据库中的表table1中的字段filed1以"00"打头的数据导出<br /><br />  exp system/manager@TEST file=d:\daochu.dmp tables=(table1)query=\" where filed1 like '00%'\"<br /><br />  上面是常用的导出，对于压缩我不太在意，用winzip把dmp文件可以很好的压缩。<br /><br />  不过在上面命令后面 加上 compress=y 就可以了<br /><br />  数据的导入<br /><br />  1 将D:\daochu.dmp 中的数据导入 TEST数据库中。<br /><br />  imp system/manager@TEST file=d:\daochu.dmp<br /><br />  上面可能有点问题，因为有的表已经存在，然后它就报错，对该表就不进行导入。<br /><br />  在后面加上 ignore=y 就可以了。<br /><br />  2 将d:\daochu.dmp中的表table1 导入<br /><br />  imp system/manager@TEST file=d:\daochu.dmp tables=(table1)<br /><br />  基本上上面的导入导出够用了。不少情况我是将表彻底删除，然后导入。<br /><br />  注意：<br /><br />  你要有足够的权限，权限不够它会提示你。<br /><br />  数据库时可以连上的。可以用tnsping TEST 来获得数据库TEST能否连上<br /><br />附录一：<br /> 给用户增加导入数据权限的操作<br /> 第一,启动sql*puls<br /> 第二，以system/manager登陆<br /> 第三，create user 用户名 IDENTIFIED BY 密码 （如果已经创建过用户，这步可以省略）<br /> 第四，GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,<br />   DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,<br />      DBA,CONNECT,RESOURCE,CREATE SESSION  TO 用户名字 <br /> 第五, 运行-cmd-进入dmp文件所在的目录, <br />      imp userid=system/manager full=y file=*.dmp<br />      或者 imp userid=system/manager full=y file=filename.dmp<br /><br /> <br /><br />安装oracle9I<br />Szportdb\szportdb\szportdb<br />用sysdba 登录建立用户：szportdb 表空间可以自己设定，也可以Users<br />倒入数据库。<br /><br />Imp szportdb/szportdb@szportdb full=y C:\szportdb.dmp ignore=<img src ="http://www.blogjava.net/paulwong/aggbug/399172.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2013-05-12 15:07 <a href="http://www.blogjava.net/paulwong/archive/2013/05/12/399172.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>全方位的技术服务及相关技术解决方案（纯java解决方案）</title><link>http://www.blogjava.net/paulwong/archive/2013/05/11/399132.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 10 May 2013 16:17:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2013/05/11/399132.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/399132.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2013/05/11/399132.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/399132.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/399132.html</trackback:ping><description><![CDATA[<a href="http://www.iteye.com/topic/1128561" target="_blank">http://www.iteye.com/topic/1128561</a>
@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);<img src ="http://www.blogjava.net/paulwong/aggbug/399132.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2013-05-11 00:17 <a href="http://www.blogjava.net/paulwong/archive/2013/05/11/399132.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个不错的学习JAVA教程</title><link>http://www.blogjava.net/paulwong/archive/2013/03/29/397147.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 29 Mar 2013 05:47:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2013/03/29/397147.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/397147.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2013/03/29/397147.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/397147.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/397147.html</trackback:ping><description><![CDATA[<a href="http://tutorials.jenkov.com/java-concurrency/index.html" target="_blank">http://tutorials.jenkov.com/java-concurrency/index.html</a><img src ="http://www.blogjava.net/paulwong/aggbug/397147.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2013-03-29 13:47 <a href="http://www.blogjava.net/paulwong/archive/2013/03/29/397147.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JeeSite 企业信息管理系统基础框架</title><link>http://www.blogjava.net/paulwong/archive/2013/03/17/396555.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sun, 17 Mar 2013 04:29:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2013/03/17/396555.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/396555.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2013/03/17/396555.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/396555.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/396555.html</trackback:ping><description><![CDATA[使用技术<br />1、Services相关<br /><br />Core Framework：Spring Framework 3.2。<br />Security Framework：Apache Shiro 1.2。<br /><br /><br />2、Web相关<br /><br />MVC Framework：SpringMVC 3.2。<br />Layout Decoration：SiteMesh 2.4。<br />JavaScript Library：JQuery 1.9。<br />CSS Framework：Twitter Bootstrap 2.0.4。<br />JavaScript/CSS Compressor：YUI Compressor 2.4。<br />Front Validation：JQuery Validation Plugin 1.11。<br /><br /><br />3、Database相关<br /><br />ORM Framework：Spring-Data-JPA 1.3、Hibernate 4.1。<br />Connection Pool：BoneCP 0.7<br />Bean Validation：Hibernate Validation 4.3.0。<br />Cache：Ehcache 2.6。<br /><br /><br />4、Tools 相关<br /><br />Commons：Apache Commons<br />JSON Mapper：Jackson 2.1<br />Bean Mapper：Dozer 5.3.2<br />Full-text search：Hibernate Search 4.2（Apache Lucene 3.6）、IK Analyzer 2012_u6中文分词<br />Log Manager：Log4j 1.2<br /><br /><br /> <a href="http://thinkgem.github.com/jeesite/" target="_blank">http://thinkgem.github.com/jeesite/<br /><br /><a href="http://126.am/lRXKx0" style="margin: 0px; padding: 0px; border: 0px; font-family: 'Helvetica Neue', Helvetica, Arial, serif; font-size: 15px; line-height: 22px; vertical-align: baseline; color: #2879d0; text-decoration: none; background-color: #fafafa;">https://github.com/thinkgem/jeesite</a><br /></a><img src ="http://www.blogjava.net/paulwong/aggbug/396555.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2013-03-17 12:29 <a href="http://www.blogjava.net/paulwong/archive/2013/03/17/396555.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>