﻿<?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-JLive开发团队</title><link>http://JLive.blogjava.net/</link><description>JLive开发团队是由国内知名论坛CSDN上的众多资深人员组成的，长期从事软件外包工作，经验丰富！</description><language>zh-cn</language><lastBuildDate>Tue, 09 Jun 2026 23:25:09 GMT</lastBuildDate><pubDate>Tue, 09 Jun 2026 23:25:09 GMT</pubDate><ttl>60</ttl><item><title> Fabric 1.1源代码分析(3) 系统链码执行过程示例(弟弟篇）</title><link>http://www.blogjava.net/fool/archive/2018/06/13/433279.html</link><dc:creator>傻  瓜</dc:creator><author>傻  瓜</author><pubDate>Wed, 13 Jun 2018 06:37:00 GMT</pubDate><guid>http://www.blogjava.net/fool/archive/2018/06/13/433279.html</guid><description><![CDATA[<div style="color: #d4d4d4; background-color: #1e1e1e; font-family: Consolas, &quot;Courier New&quot;, monospace; line-height: 19px; white-space: pre;"><div><span style="color: #569cd6;font-weight: bold;"># Fabric 1.1源代码分析(3) 系统链码执行过程</span></div><div><span style="color: #569cd6;font-weight: bold;">## 1、系统链码执行过程</span></div><div><span style="color: #6796e6;">*</span>  以peer channel join -b gensis.block命令为例。该命令结果是peer节点加入通道.    </div><div>这个命令会单独启一个进程.在该进程中会构建一个名称为cscc的链码消息传到peer节点.  </div><div>通过grpc调用最终会进到endorser.go中的ProcessProposal函数进行处理。</div><div>   参考Fabric 1.1源代码分析(2)http://www.blogjava.net/fool/archive/2018/06/12/433277.html   <br />系统链码初始化过程,可以找到../shim/handler.go中</div><div>的handleTransaction()函数.最终会调用res := handler.cc.Invoke(stub).这里的</div><div>cc就是importsysccs.go文件中systemChaincodes数组中的cscc系统链码的.&nbsp;&nbsp;&nbsp;&nbsp;  </div><div>Chaincode,其实例是&amp;cscc.PeerConfiger{},实现在cscc/configure.go文件中。每个系统</div><div>链码都实现了这个Chaincode接口()</div><div>```go</div><div><span style="color: #569cd6;">type</span> <span style="color: #4ec9b0;">Chaincode</span> <span style="color: #569cd6;">interface</span> {</div><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #608b4e;">// Init is called during Instantiate transaction after the chaincode container</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #608b4e;">// has been established for the first time, allowing the chaincode to</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #608b4e;">// initialize its internal data</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;Init(stub ChaincodeStubInterface) pb.Response</div><br /><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #608b4e;">// Invoke is called to update or query the ledger in a proposal transaction.</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #608b4e;">// Updated state variables are not committed to the ledger until the</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #608b4e;">// transaction is committed.</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;Invoke(stub ChaincodeStubInterface) pb.Response</div><div>}</div><div>```</div><br /><div><span style="color: #6796e6;">*</span>  至此就可以清晰地看到每一个系统链码都会启动一对协程，通过chan通信。系统链码消息由    </div><div>shim/handler.go中的函数处理.并且这里最终调用各自的具体实现的Ivoke方法进行业务处理  </div><br /><div><span style="color: #569cd6;font-weight: bold;">## 2、peer channel join命令处理流程图</span></div><div><span style="color: #6796e6;">*</span> peer channel join命令会调用configure.go中的Excute方法。对应cscc系统链码的处理，  </div><div>原因如下，以下流程图大致可以了解cscc都做了些什么</div><div>![](<span style="text-decoration-line: underline;">cscc.png</span>)<br /><img src="http://www.blogjava.net/images/blogjava_net/fool/cscc.png" border="0" alt="" width="1000" height="459" /></div><br /><div><span style="color: #569cd6;font-weight: bold;">## 3、小结</span></div><br /><div><span style="color: #6796e6;">*</span> 上面的流程图也不是非常地强细，忽略掉了一些方法。但是有了整个流程的理解，就能理解其  </div><div>它系统链码的调用过程，需要时直接细读其实现就好了。从上流程图中可以看到文件末尾添加区  </div><div>区块，leveldb中记录了区块号，索引位置信息等等。另外因为系统链码跟一般链码虽然经过</div><div>的文件基本一样，但最终处理方式还是不一样，一个是协程，一个是grpc.可能参考Fabric 1.1  </div><div>源代码分析之 Chaincode（链码）初始化 http://www.blogjava.net/fool/archive/2018/06/12/433275.html</div></div><img src ="http://JLive.blogjava.net/aggbug/433279.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fool/" target="_blank">傻  瓜</a> 2018-06-13 14:37 <a href="http://www.blogjava.net/fool/archive/2018/06/13/433279.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Fabric 1.1源代码分析之 系统链码初始化过程(哥哥篇)</title><link>http://www.blogjava.net/fool/archive/2018/06/12/433277.html</link><dc:creator>傻  瓜</dc:creator><author>傻  瓜</author><pubDate>Tue, 12 Jun 2018 07:00:00 GMT</pubDate><guid>http://www.blogjava.net/fool/archive/2018/06/12/433277.html</guid><description><![CDATA[<div style="color: #d4d4d4; background-color: #1e1e1e; font-family: Consolas, &quot;Courier New&quot;, monospace; line-height: 19px; white-space: pre;"><div style="line-height: 19px;"><div><span style="color: #569cd6;font-weight: bold;"># Fabric 1.1源代码分析之 Fabric 1.1源代码分析 系统链码初始化过程<br /><br />* 链码这一块的代码非常的绕。基本上就是一个大循环。限于水平或者其它原因，差露可能难免，各位看官包涵则个...</span></div><br /><div><span style="color: #569cd6;font-weight: bold;">## 1、系统链码</span></div><br /><div><span style="color: #6796e6;">*</span> 系统链码跟智能合约链码涉及到的文件差不多，流程也差不多。只是智能合约是grpc,系统链码是chan实现调用.</div><div>LSCC Lifecycle system chaincode，处理生命周期请求。我理解的生命周期请求应该指的是一个chaincode的安装，实例化，升级，</div><div>卸载等对其生命周期起关键作用的一系列操作请求。</div><div>CSCC Configuration system chaincode，处理在peer程序端的channel配置。</div><div>QSCC Query system chaincode，提供账本查询接口，如获取块和交易信息。</div><div>ESCC Endorsement system chaincode，通过对交易申请的应答信息进行签名，来提供背书功能。</div><div>VSCC Validation system chaincode，处理交易校验，包括检查背书策略和版本在并发时的控制。</div><br /><div><span style="color: #569cd6;font-weight: bold;">## 2、系统链码注册</span></div><div><span style="color: #6796e6;">*</span> 在/core/chaincode/shim/interfaces_stable.go中实现了下面的接口</div><div>```go</div><div><span style="color: #569cd6;">type</span> <span style="color: #4ec9b0;">Chaincode</span> <span style="color: #569cd6;">interface</span> {</div><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #608b4e;">// Init is called during Instantiate transaction after the chaincode container</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #608b4e;">// has been established for the first time, allowing the chaincode to</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #608b4e;">// initialize its internal data</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;Init(stub ChaincodeStubInterface) pb.Response</div><br /><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #608b4e;">// Invoke is called to update or query the ledger in a proposal transaction.</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #608b4e;">// Updated state variables are not committed to the ledger until the</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #608b4e;">// transaction is committed.</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;Invoke(stub ChaincodeStubInterface) pb.Response</div><div>}</div><div>```</div><br /><div><span style="color: #6796e6;">*</span> 在core/scc/sysccapi.go中定义了SystemChaincode结构体，其中定义了 Chaincode接口变量</div><div>```go</div><div><span style="color: #569cd6;">type</span> <span style="color: #4ec9b0;">SystemChaincode</span> <span style="color: #569cd6;">struct</span> {</div><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #608b4e;">//Unique name of the system chaincode</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;Name <span style="color: #4ec9b0;">string</span></div><br /><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #608b4e;">//Path to the system chaincode; currently not used</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;Path <span style="color: #4ec9b0;">string</span></div><br /><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #608b4e;">//InitArgs initialization arguments to startup the system chaincode</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;InitArgs [][]<span style="color: #4ec9b0;">byte</span></div><br /><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #608b4e;">// Chaincode is the actual chaincode object</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;Chaincode shim.Chaincode</div><br /><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #608b4e;">// InvokableExternal keeps track of whether</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #608b4e;">// this system chaincode can be invoked</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #608b4e;">// through a proposal sent to this peer</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;InvokableExternal <span style="color: #4ec9b0;">bool</span></div><br /><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #608b4e;">// InvokableCC2CC keeps track of whether</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #608b4e;">// this system chaincode can be invoked</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #608b4e;">// by way of a chaincode-to-chaincode</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #608b4e;">// invocation</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;InvokableCC2CC <span style="color: #4ec9b0;">bool</span></div><br /><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #608b4e;">// Enabled a convenient switch to enable/disable system chaincode without</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #608b4e;">// having to remove entry from importsysccs.go</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;Enabled <span style="color: #4ec9b0;">bool</span></div><div>}</div><div>```</div><br /><div><span style="color: #6796e6;">*</span> 在 core/scc/importsysccs.go文件中对系统链码进行了初始化，并且每个Chainoce指定了具体实现 </div><div>在</div><div>```go</div><div><span style="color: #608b4e;">//see systemchaincode_test.go for an example using "sample_syscc"</span></div><div><span style="color: #569cd6;">var</span> systemChaincodes = []*SystemChaincode{</div><div>&nbsp;&nbsp;&nbsp;&nbsp;{</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enabled:           <span style="color: #569cd6;">true</span>,</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name:              <span style="color: #ce9178;">"cscc"</span>,</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path:              <span style="color: #ce9178;">"github.com/hyperledger/fabric/core/scc/cscc"</span>,</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitArgs:          [][]<span style="color: #4ec9b0;">byte</span>{[]byte(<span style="color: #ce9178;">""</span>)},</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Chaincode:         &amp;cscc.PeerConfiger{},</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InvokableExternal: <span style="color: #569cd6;">true</span>, <span style="color: #608b4e;">// cscc is invoked to join a channel</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;},</div><div>&nbsp;&nbsp;&nbsp;&nbsp;{</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enabled:           <span style="color: #569cd6;">true</span>,</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name:              <span style="color: #ce9178;">"lscc"</span>,</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path:              <span style="color: #ce9178;">"github.com/hyperledger/fabric/core/scc/lscc"</span>,</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitArgs:          [][]<span style="color: #4ec9b0;">byte</span>{[]byte(<span style="color: #ce9178;">""</span>)},</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Chaincode:         lscc.NewLifeCycleSysCC(),</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InvokableExternal: <span style="color: #569cd6;">true</span>, <span style="color: #608b4e;">// lscc is invoked to deploy new chaincodes</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InvokableCC2CC:    <span style="color: #569cd6;">true</span>, <span style="color: #608b4e;">// lscc can be invoked by other chaincodes</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;},</div><div>&nbsp;&nbsp;&nbsp;&nbsp;{</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enabled:   <span style="color: #569cd6;">true</span>,</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name:      <span style="color: #ce9178;">"escc"</span>,</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path:      <span style="color: #ce9178;">"github.com/hyperledger/fabric/core/scc/escc"</span>,</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitArgs:  [][]<span style="color: #4ec9b0;">byte</span>{[]byte(<span style="color: #ce9178;">""</span>)},</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Chaincode: &amp;escc.EndorserOneValidSignature{},</div><div>&nbsp;&nbsp;&nbsp;&nbsp;},</div><div>&nbsp;&nbsp;&nbsp;&nbsp;{</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enabled:   <span style="color: #569cd6;">true</span>,</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name:      <span style="color: #ce9178;">"vscc"</span>,</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path:      <span style="color: #ce9178;">"github.com/hyperledger/fabric/core/scc/vscc"</span>,</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitArgs:  [][]<span style="color: #4ec9b0;">byte</span>{[]byte(<span style="color: #ce9178;">""</span>)},</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Chaincode: &amp;vscc.ValidatorOneValidSignature{},</div><div>&nbsp;&nbsp;&nbsp;&nbsp;},</div><div>&nbsp;&nbsp;&nbsp;&nbsp;{</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enabled:           <span style="color: #569cd6;">true</span>,</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name:              <span style="color: #ce9178;">"qscc"</span>,</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path:              <span style="color: #ce9178;">"github.com/hyperledger/fabric/core/chaincode/qscc"</span>,</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitArgs:          [][]<span style="color: #4ec9b0;">byte</span>{[]byte(<span style="color: #ce9178;">""</span>)},</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Chaincode:         &amp;qscc.LedgerQuerier{},</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InvokableExternal: <span style="color: #569cd6;">true</span>, <span style="color: #608b4e;">// qscc can be invoked to retrieve blocks</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InvokableCC2CC:    <span style="color: #569cd6;">true</span>, <span style="color: #608b4e;">// qscc can be invoked to retrieve blocks also by a cc</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;},</div><div>}</div><div>```</div><div><span style="color: #6796e6;">*</span> 注册流程图</div><div>![](<span style="text-decoration-line: underline;">systemcoderegist.png</span>)<br /><br /><img src="http://www.blogjava.net/images/blogjava_net/fool/systemcoderegist.png" border="0" alt="" /></div><br /><div><span style="color: #569cd6;font-weight: bold;">## 3、系统链码初始化</span></div><div><span style="color: #6796e6;">*</span> 系统注册完成后会对链码初始化.跟一般chaincode稍有不同的是chaincode在合约里通过grpc与peer节点交互。</div><div>而系统链码则是在协程里通过chan 实现交互.下面代码创建两个&nbsp;peerRcvCCSend := make(chan *pb.ChaincodeMessage)</div><div>&nbsp;&nbsp;&nbsp;&nbsp;ccRcvPeerSend := make(chan *pb.ChaincodeMessage)  ，是客户端和服务端共同的参数</div><div>```go</div><br /><div><span style="color: #569cd6;">func</span> (ipc *inprocContainer) launchInProc(ctxt context.Context, id <span style="color: #4ec9b0;">string</span>, args []<span style="color: #4ec9b0;">string</span>, env []<span style="color: #4ec9b0;">string</span>, ccSupport ccintf.CCSupport) <span style="color: #569cd6;">error</span> {</div><div>&nbsp;&nbsp;&nbsp;&nbsp;peerRcvCCSend := <span style="color: #dcdcaa;">make</span>(<span style="color: #569cd6;">chan</span> *pb.ChaincodeMessage)</div><div>&nbsp;&nbsp;&nbsp;&nbsp;ccRcvPeerSend := <span style="color: #dcdcaa;">make</span>(<span style="color: #569cd6;">chan</span> *pb.ChaincodeMessage)</div><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #569cd6;">var</span> err error</div><div>&nbsp;&nbsp;&nbsp;&nbsp;ccchan := <span style="color: #dcdcaa;">make</span>(<span style="color: #569cd6;">chan</span> <span style="color: #569cd6;">struct</span>{}, <span style="color: #b5cea8;">1</span>)</div><div>&nbsp;&nbsp;&nbsp;&nbsp;ccsupportchan := <span style="color: #dcdcaa;">make</span>(<span style="color: #569cd6;">chan</span> <span style="color: #569cd6;">struct</span>{}, <span style="color: #b5cea8;">1</span>)</div><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #608b4e;">//启动客户端处理</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #c586c0;">go</span> <span style="color: #569cd6;">func</span>() {</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #c586c0;">defer</span> <span style="color: #dcdcaa;">close</span>(ccchan)</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inprocLogger.Debugf(<span style="color: #ce9178;">"chaincode started for %s"</span>, id)</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #c586c0;">if</span> args == <span style="color: #569cd6;">nil</span> {</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;args = ipc.args</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #c586c0;">if</span> env == <span style="color: #569cd6;">nil</span> {</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;env = ipc.env</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err := _shimStartInProc(env, args, ipc.chaincode, ccRcvPeerSend, peerRcvCCSend)</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #c586c0;">if</span> err != <span style="color: #569cd6;">nil</span> {</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err = fmt.Errorf(<span style="color: #ce9178;">"chaincode-support ended with err: %s"</span>, err)</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_inprocLoggerErrorf(<span style="color: #ce9178;">"%s"</span>, err)</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inprocLogger.Debugf(<span style="color: #ce9178;">"chaincode ended with for  %s with err: %s"</span>, id, err)</div><div>&nbsp;&nbsp;&nbsp;&nbsp;}()</div><div>    <span style="color: #608b4e;">//启动服务端处理</span></div><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #c586c0;">go</span> <span style="color: #569cd6;">func</span>() {</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #c586c0;">defer</span> <span style="color: #dcdcaa;">close</span>(ccsupportchan)</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inprocStream := newInProcStream(peerRcvCCSend, ccRcvPeerSend)</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inprocLogger.Debugf(<span style="color: #ce9178;">"chaincode-support started for  %s"</span>, id)</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err := ccSupport.HandleChaincodeStream(ctxt, inprocStream)</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #c586c0;">if</span> err != <span style="color: #569cd6;">nil</span> {</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err = fmt.Errorf(<span style="color: #ce9178;">"chaincode ended with err: %s"</span>, err)</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_inprocLoggerErrorf(<span style="color: #ce9178;">"%s"</span>, err)</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inprocLogger.Debugf(<span style="color: #ce9178;">"chaincode-support ended with for  %s with err: %s"</span>, id, err)</div><div>&nbsp;&nbsp;&nbsp;&nbsp;}()</div><br /><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #c586c0;">select</span> {</div><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #c586c0;">case</span> &lt;-ccchan:</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #dcdcaa;">close</span>(peerRcvCCSend)</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inprocLogger.Debugf(<span style="color: #ce9178;">"chaincode %s quit"</span>, id)</div><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #c586c0;">case</span> &lt;-ccsupportchan:</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #dcdcaa;">close</span>(ccRcvPeerSend)</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inprocLogger.Debugf(<span style="color: #ce9178;">"chaincode support %s quit"</span>, id)</div><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #c586c0;">case</span> &lt;-ipc.stopChan:</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #dcdcaa;">close</span>(ccRcvPeerSend)</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #dcdcaa;">close</span>(peerRcvCCSend)</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inprocLogger.Debugf(<span style="color: #ce9178;">"chaincode %s stopped"</span>, id)</div><div>&nbsp;&nbsp;&nbsp;&nbsp;}</div><div>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #c586c0;">return</span> err</div><div>}</div><br /><div>```</div><br /><br /><div><span style="color: #6796e6;">*</span> 初始化流程图</div><div>![](<span style="text-decoration-line: underline;">systemcodeinit.png</span>)</div><img src="http://www.blogjava.net/images/blogjava_net/fool/systemcodeinit.png" border="0" alt="" /><br /><br /><div><span style="color: #569cd6;font-weight: bold;">## 4、系统链码的执行</span></div><div>...</div></div></div><img src ="http://JLive.blogjava.net/aggbug/433277.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fool/" target="_blank">傻  瓜</a> 2018-06-12 15:00 <a href="http://www.blogjava.net/fool/archive/2018/06/12/433277.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Fabric 1.1源代码分析之 Chaincode（链码）初始化</title><link>http://www.blogjava.net/fool/archive/2018/06/12/433275.html</link><dc:creator>傻  瓜</dc:creator><author>傻  瓜</author><pubDate>Tue, 12 Jun 2018 06:51:00 GMT</pubDate><guid>http://www.blogjava.net/fool/archive/2018/06/12/433275.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: # Fabric 1.1源代码分析之 Chaincode（链码）初始化 #ChaincodeSupport（链码支持服务端）## 1、Endorser概述1、Endorser相关代码分布在protos/peer/peer.pb.go和core/endorser目录。* 在peer/node/start.go的serve（） 方法中注册了 endoser服务 serverEndorser := en...&nbsp;&nbsp;<a href='http://www.blogjava.net/fool/archive/2018/06/12/433275.html'>阅读全文</a><img src ="http://JLive.blogjava.net/aggbug/433275.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fool/" target="_blank">傻  瓜</a> 2018-06-12 14:51 <a href="http://www.blogjava.net/fool/archive/2018/06/12/433275.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源区块链Hyperleger Fabric之链码开发调试模式在IDE里debug链码</title><link>http://www.blogjava.net/fool/archive/2018/05/23/433231.html</link><dc:creator>傻  瓜</dc:creator><author>傻  瓜</author><pubDate>Wed, 23 May 2018 06:17:00 GMT</pubDate><guid>http://www.blogjava.net/fool/archive/2018/05/23/433231.html</guid><description><![CDATA[能在IDE里调试链码自然是比较痛快。本文前提是了解fabric合约布署过程。链码调试开发步骤如下：<br />1,启动order<br />&nbsp; &nbsp; orderer start<br />2, 使用开发模式启动peer节点<br />&nbsp; &nbsp;peer node start --peer-chaincodedev=true<br />3,创建通道<br />4,启动链码程序<br />这一步可以在IDE里启动链码，这样就可以debug了<br /><div>cd examples/chaincode/go/chaincode_example02</div><div>go build</div><div>CORE_CHAINCODE_LOGLEVEL=debug CORE_PEER_ADDRESS=127.0.0.1:7052 CORE_CHAINCODE_ID_NAME=mycc:0 ./chaincode_example02<br />5,安装链码<div>peer chaincode install -n mycc -v 0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02<br />6,初始化链码</div><div>peer chaincode instantiate -n mycc -v 0 -c '{"Args":["init","a","100","b","200"]}' -o 127.0.0.1:7050 -C ch1<br />7,链码调用和测试</div><div></div></div><img src ="http://JLive.blogjava.net/aggbug/433231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fool/" target="_blank">傻  瓜</a> 2018-05-23 14:17 <a href="http://www.blogjava.net/fool/archive/2018/05/23/433231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源区块链Hyperleger Fabric之通过Composer开发框架快速搭建开发环境</title><link>http://www.blogjava.net/fool/archive/2018/03/12/433093.html</link><dc:creator>傻  瓜</dc:creator><author>傻  瓜</author><pubDate>Mon, 12 Mar 2018 08:44:00 GMT</pubDate><guid>http://www.blogjava.net/fool/archive/2018/03/12/433093.html</guid><description><![CDATA[Composer是Hyperleder的子项目。用来开发布署智能合约,开发流程如下<img src="http://www.blogjava.net/images/blogjava_net/fool/composer2.png" border="0" alt="" /><br />准备工作：(自行百度）<br /><p style="margin-left:18.0pt"><span style="font-size:10.5pt">开发环境必备软件：</span></p>  <p style="margin-left:42.0pt;text-indent:-24.0pt;"><span style="font-size:10.5pt;font-family:Wingdings;"><span style="font-stretch: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman';">&nbsp;</span></span><span style="font-size:10.5pt">composer-cli</span></p>  <p style="margin-left:42.0pt;text-indent:-24.0pt;"><span style="font-size:10.5pt;font-family:Wingdings;"><span style="font-stretch: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman';">&nbsp;</span></span><span style="font-size:10.5pt">generator-hyperledger-composr</span></p>  <p style="margin-left:42.0pt;text-indent:-24.0pt;"><span style="font-size:10.5pt">composer-rest-server<br /></span><span style="font-size: 10.5pt; text-indent: -24pt;">Yeoman<br /><br /></span></p><p style="margin-left: 42pt; text-indent: -24pt;"><span style="font-size: 10.5pt;">安装playground</span></p><div style="display: inline-block;"></div><p>&nbsp;</p><div style="text-indent: -32px;">Installing and running Hyperledger Composer Playground locally<br />docker ps -aq | xargs docker rm -f<br />docker images -aq | xargs docker rmi -f<br />curl -sSL https://hyperledger.github.io/composer/install-hlfv1.sh | bash &nbsp;&nbsp;</div><div>执行install-hlfv1.sh 安装运行fabric1.06版.并运行 playground服务 打开流览器http://xxxx:8080显示如下</div><p style="margin-left: 42pt; text-indent: -24pt;"><span style="font-size: 10.5pt;"><br /><img src="http://www.blogjava.net/images/blogjava_net/fool/composer3.jpg" border="0" alt="" /><br /></span></p><p style="line-height: 150%; margin: 0pt 0in 0pt 0.28in; text-indent: 0in; direction: ltr; unicode-bidi: embed; vertical-align: baseline; word-break: normal;"><span style="font-size:12.0pt;
font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:微软雅黑;
mso-bidi-font-family:+mn-cs;color:#0070C0;mso-color-index:4;mso-font-kerning:
12.0pt;language:en-US">1,playground</span><span style="font-size:12.0pt;
font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:微软雅黑;
mso-bidi-font-family:+mn-cs;color:#0070C0;mso-color-index:4;mso-font-kerning:
12.0pt;language:zh-CN"> 的</span><span style="font-size:12.0pt;font-family:Arial;
mso-ascii-font-family:Arial;mso-fareast-font-family:微软雅黑;mso-bidi-font-family:
+mn-cs;color:#0070C0;mso-color-index:4;mso-font-kerning:12.0pt;language:en-US">Web
Browser</span><span style="font-size:12.0pt;font-family:微软雅黑;mso-ascii-font-family:
Arial;mso-fareast-font-family:微软雅黑;mso-bidi-font-family:+mn-cs;color:#0070C0;
mso-color-index:4;mso-font-kerning:12.0pt;language:zh-CN">区域提供了在页面定义模型、测试模型的能力。并不保存。但可以导出</span><span style="font-size:12.0pt;font-family:Arial;mso-ascii-font-family:Arial;
mso-fareast-font-family:微软雅黑;mso-bidi-font-family:+mn-cs;color:#0070C0;
mso-color-index:4;mso-font-kerning:12.0pt;language:en-US">bna</span><span style="font-size:12.0pt;font-family:微软雅黑;mso-ascii-font-family:Arial;
mso-fareast-font-family:微软雅黑;mso-bidi-font-family:+mn-cs;color:#0070C0;
mso-color-index:4;mso-font-kerning:12.0pt;language:zh-CN">文件</span><span style="font-size:12.0pt;font-family:Arial;mso-ascii-font-family:Arial;
mso-fareast-font-family:微软雅黑;mso-bidi-font-family:+mn-cs;color:#0070C0;
mso-color-index:4;mso-font-kerning:12.0pt;language:en-US">
</span></p><p style="line-height: 150%; margin: 0pt 0in 0pt 0.28in; text-indent: 0in; direction: ltr; unicode-bidi: embed; vertical-align: baseline; word-break: normal;"><span style="font-size: 12pt; font-family: Arial; color: #0070c0; letter-spacing: 0pt; vertical-align: baseline;">2,connection</span><span style="font-size: 12pt; font-family: 微软雅黑; color: #0070c0; letter-spacing: 0pt; vertical-align: baseline;">区域</span><span style="font-size:12.0pt;font-family:微软雅黑;mso-ascii-font-family:Arial;
mso-fareast-font-family:微软雅黑;mso-bidi-font-family:+mn-cs;color:#0070C0;
mso-color-index:4;mso-font-kerning:12.0pt;language:zh-CN;vertical-align:baseline;
mso-text-raise:0%">提供了在开发环境布署合约，会生成一个智能合约的docker运行环境.<br /></span><span style="font-size: 12pt; font-family: Arial; color: #0070c0; letter-spacing: 0pt; vertical-align: baseline;">
3,可以在上图中上部分的</span>My Business Networks 工作区点击虚业部分Deploy a new business network<br /></p><p style="line-height: 150%; margin: 0pt 0in 0pt 0.28in; text-indent: 0in; direction: ltr; unicode-bidi: embed; vertical-align: baseline; word-break: normal;"><span style="font-size: 12pt; font-family: Arial; color: #0070c0; letter-spacing: 0pt; vertical-align: baseline;">4，在接下来页面中选中一个示例。如 marble neetworkd. &nbsp;选择&nbsp;</span><span style="color: #19273c; font-family: 'Open Sans', 'Helvetica Neue for IBM', 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 0.9rem; line-height: 15px; orphans: 2; widows: 2; background-color: #fdfdfd;">ID and Secret 填入admin 和 adminpw<br /></span></p><p style="line-height: 150%; margin: 0pt 0in 0pt 0.28in; text-indent: 0in; direction: ltr; unicode-bidi: embed; vertical-align: baseline; word-break: normal;"><span style="font-size: 12pt; font-family: Arial; color: #0070c0; letter-spacing: 0pt; vertical-align: baseline;">5，点击Deploy按钮后会发布一个合约.并跳到测试页如下图:<br /><img src="http://www.blogjava.net/images/blogjava_net/fool/compose4.png" border="0" alt="" /><br /><br /></span></p><p style="margin-left: 42pt; text-indent: -24pt;">

<span style="font-size: 10.5pt;"><br />6，在上图中 Test Tab页可以进行测试 ,在Define Tab页可以导出bna文件.<br />7,在第一幅图中点击下载按钮，会下载一个 .card文件，描述了连接fabric peer节点等相关连接信息.记得要导&nbsp;</span>PeerAdmin@hlfv1的card和你自己测试用的card,及bna文件<br />8,分别执行 &nbsp;composer card import -f PeerAdmin.card &nbsp;，composer card import -f admin.card &nbsp;.composer card list 可以查看你导入的card的name信息.<br /></p><p style="margin-left: 42pt; text-indent: -24pt;"><span style="font-size: 10.5pt;">&nbsp; &nbsp; &nbsp; &nbsp;9,</span>composer-rest-server -c admin@empty-business-network -n always -w true &nbsp;启动rest服务默认端口3000.<br /></p><p style="margin-left: 42pt; text-indent: -24pt;"><span style="font-size: 10.5pt;">&nbsp; &nbsp; &nbsp; 10,好了,可以体验一下fabric是个什么玩意了。：） 88!<br /><br /></span></p><br /><div> <img src="file:///C:\Users\hechang\AppData\Roaming\Tencent\Users\53268131\QQ\WinTemp\RichOle\$)F{G7`1~XT5F5R]B$Q~T3P.png" alt="" /></div><img src ="http://JLive.blogjava.net/aggbug/433093.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fool/" target="_blank">傻  瓜</a> 2018-03-12 16:44 <a href="http://www.blogjava.net/fool/archive/2018/03/12/433093.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源区块链Hyperleger Fabric通过SDK-JAVA动态添加通道</title><link>http://www.blogjava.net/fool/archive/2018/03/12/433090.html</link><dc:creator>傻  瓜</dc:creator><author>傻  瓜</author><pubDate>Mon, 12 Mar 2018 03:55:00 GMT</pubDate><guid>http://www.blogjava.net/fool/archive/2018/03/12/433090.html</guid><description><![CDATA[<h2><a id="viewpost1_TitleUrl" href="http://www.blogjava.net/fool/archive/2018/02/01/433032.html"></a><span style="font-weight: normal;"><a href="http://www.blogjava.net/fool/archive/2018/02/01/433032.html"><br style="color: #000000;" /><font color="#2e9ce9"><span style="font-size: 14px;">在阅读本篇之前需要理解</span></font></a><div style="color: #2e9ce9; text-decoration: none; font-size: 14px; display: inline !important;"><a id="viewpost1_TitleUrl" href="http://www.blogjava.net/fool/archive/2018/02/01/433032.html" style="color: #2e9ce9; text-decoration: none; font-size: 14px;"><span style="color: #000000;">configtxgen</span></a><span style="color: #000000;">工具使用原理.基本上能跑通</span></div></span><a href="http://www.blogjava.net/fool/archive/2018/02/01/433032.html"><font color="#2e9ce9"><span style="font-size: 14px;">开源区块链Hyperleger Fabric的SDK-JAVA新手上路指引</span></font></a></h2><div>中的内容。可以参考http://www.blogjava.net/fool/archive/2018/02/01/433032.html.<br />如果知道通过命令行工具进行智能合约的安装测试就更好了。fabric中的channel可以理解为泳道。在这个泳道中可以布署<br />多个智能合约。当然也可以安装多个channel. 顺便多一嘴，在智能合约可以调用另一个channel中的智能合约中的查询方法.<br />通过sdk动态安装通道的步骤：<br />1,通过configtxgen命令生成交易通道初始文件.<br />configtxgen --profile TestSoft --outputCreateChannelTx testsoft.tx --channelID testsoft<br />2,下载testsoft.tx到本机.<br />3,sdk安装通道代码及解释<br /><div><span style="white-space:pre">	</span>@Override</div><div><span style="white-space:pre">		</span>public boolean installChannel(String channelName) throws IOException, InvalidArgumentException, TransactionException, ProposalException {</div><div><span style="white-space:pre">			</span>// TODO Auto-generated method stub</div><div><span style="white-space:pre">			</span> &nbsp;String configPath = this.config.getConfigPath();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//初始化&nbsp;ChannelConfiguration 对象.参数是通道初始化文件路径</div><div><span style="white-space:pre">			</span> &nbsp;ChannelConfiguration channelConfiguration = new ChannelConfiguration(new File(configPath + "/"+channelName + ".tx"));</div><div><span style="white-space:pre">			</span>&nbsp; //构造orderder节点信息</div><div><span style="white-space:pre">			</span> &nbsp; &nbsp;String ordererName = orderers.get().get(0).getOrdererName();</div><div><span style="white-space:pre">				</span>Properties ordererProperties = loadOrderProperty(ordererName);</div><div><span style="white-space:pre">				</span>Orderer anOrderer = client.newOrderer(</div><div><span style="white-space:pre">						</span>ordererName,</div><div><span style="white-space:pre">						</span> orderers.get().get(0).getOrdererLocation(), ordererProperties);</div><div><span style="white-space:pre">				</span></div><div><span style="white-space:pre">		</span> &nbsp; &nbsp; &nbsp; &nbsp;//Create channel that has only one signer that is this orgs peer admin. If channel creation policy needed more signature they would need to be added too.</div><div><span style="white-space:pre">		</span> &nbsp; &nbsp; &nbsp; &nbsp;Channel channel = client.newChannel(channelName, anOrderer, channelConfiguration, client.getChannelConfigurationSignature(channelConfiguration, fabricOrg.getPeerAdmin()));<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//构造peer节点信息，并且将peer节点加入到通道中。peer节点加入通道后，才能通过该peer节点中访问通道中的智能合约</div><div><span style="white-space:pre">		</span> &nbsp; &nbsp; &nbsp; &nbsp;for (com.ygsoft.fabric.bean.Peers.Peer p : config.getInstallPeers().get()) {</div><div><span style="white-space:pre">					</span>Properties peerProperties = this.loadPeerProperties(p.getPeerName());</div><div><span style="white-space:pre">					</span>Peer peer = client.newPeer(p.getPeerName(),p.getPeerLocation(),peerProperties);</div><div><span style="white-space:pre">					</span>channel.joinPeer(peer);</div><div><span style="white-space:pre">				</span></div><div><span style="white-space:pre">				</span>}</div><div></div><div><span style="white-space:pre">				</span>for (int i = 0; i &lt; orderers.get().size(); i++) {</div><div><span style="white-space:pre">					</span>Properties ordererProperties2 = loadOrderProperty(ordererName);</div><div><span style="white-space:pre">					</span>channel.addOrderer(client.newOrderer(</div><div><span style="white-space:pre">							</span>orderers.get().get(i).getOrdererName(),</div><div><span style="white-space:pre">							</span>orderers.get().get(i)</div><div><span style="white-space:pre">									</span>.getOrdererLocation(), ordererProperties2));</div><div><span style="white-space:pre">				</span>}</div><div><span style="white-space:pre">				</span>log.debug("channel.isInitialized() = " + channel.isInitialized());</div><div><span style="white-space:pre">			</span> &nbsp; channel.initialize();</div><div><span style="white-space:pre">		</span></div><div><span style="white-space:pre">			</span> &nbsp;return true;</div><div><span style="white-space:pre">		</span>}</div><br />知道了手工命令行安装合约的过程，上面的理解还是比较简单的。安装通道后就可以调用sdk安装合约了。<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /></div><img src ="http://JLive.blogjava.net/aggbug/433090.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fool/" target="_blank">傻  瓜</a> 2018-03-12 11:55 <a href="http://www.blogjava.net/fool/archive/2018/03/12/433090.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源区块链Hyperleger Fabric的SDK-JAVA新手上路指引</title><link>http://www.blogjava.net/fool/archive/2018/02/01/433032.html</link><dc:creator>傻  瓜</dc:creator><author>傻  瓜</author><pubDate>Thu, 01 Feb 2018 01:03:00 GMT</pubDate><guid>http://www.blogjava.net/fool/archive/2018/02/01/433032.html</guid><description><![CDATA[话说有个程序员征婚，无人问津。前段时间区块链概念大火，该程序员灵机一动，借势而为，征婚上加了一行：<br />区块链工程师。不久抱得美人归。:)<br /><br />阅读本代码前，先看看fabric的多机布署,参考下面的贴子1:<br /><div>http://blog.csdn.net/songbin830/article/details/78778806 完成多机布署.<br /><br />参考贴子2: http://www.cnblogs.com/aberic/p/8206551.html ，把代码下到本地工程里。新手上路总会遇到<br />各种细节问题.重点来了：<br /><br />使用git命令从github.com上拉下SDK-JAVA源码.<br />1，源码文件中有EclipseSetup.md的文件，介绍如何把源码项目导入eclipse.<br />2，导入eclipse后发现缺少 &nbsp;org.hyperledger.fabric.protos.*文件。github上的源码里也没有。解决办法：从<br />其它网站的 SDK-JAVA打包文件中找到源码包，把org.hyperledger.fabric.protos包中的源码copy到eclipse。<br />3，在orderer节点把 &nbsp;crypto-config文件夹中的内容copy到本机.其中包含了用命令工具生成的证书，身份信息<br />等内容<br />4,贴子2中代码如何用，其实跟源码中的测试用例中的代码差不多.初始化示例如下：因为贴子2是个demo类代码，<br />我作了些改动。有些代码没放ChaincodeManager()实例化。看一下这个类的构造方法，构造对应的需要的实例类<br />也不难<br /><br /><div><span style="white-space:pre">	</span>public static ChaincodeManager init() throws Exception{</div><div><span style="white-space:pre">		</span>FabricConfig fabricConfig = new FabricConfig("E:/fabricConfig"); &nbsp;//fabricConfig文件夹中包含<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //crypto-config文件夹</div><div><span style="white-space:pre">		</span>Peers peers = new Peers(); &nbsp; //初始化peer节点</div><div><span style="white-space:pre">		</span>peers.setOrgDomainName("org1.ygsoft.com");</div><div><span style="white-space:pre">		</span>peers.setOrgMSPID("Org1MSP");</div><div><span style="white-space:pre">		</span>peers.setOrgName("Org1MSP");</div><div><span style="white-space:pre">		</span>//peers.addPeer("peer0.org1.ygsoft.com", "peer0.org1.ygsoft.com", "grpcs://10.121.60.2:7051", "grpcs://10.121.60.2:7053", null);</div><div><span style="white-space:pre">		</span>peers.addPeer("peer1.org1.ygsoft.com", "peer1.org1.ygsoft.com", "grpcs://10.121.60.3:7051", "grpcs://10.121.60.3:7053", null);</div><div><span style="white-space:pre">		</span>fabricConfig.setPeers(peers);</div><div><span style="white-space:pre">		//初始化orderer节点<br /></span></div><div><span style="white-space:pre">		</span>Orderers orders = new Orderers();</div><div><span style="white-space:pre">		</span>orders.setOrdererDomainName("ygsoft.com");</div><div><span style="white-space:pre">		</span>orders.addOrderer("orderer.ygsoft.com", "grpcs://10.121.60.1:7050");</div><div><span style="white-space:pre">		</span>fabricConfig.setOrderers(orders);</div><div><span style="white-space:pre">	</span></div><div><span style="white-space:pre">		</span>fabricConfig.setRegisterEvent(true);</div><div><span style="white-space:pre">		</span>ChaincodeManager chainManager = new ChaincodeManager(fabricConfig);</div><div><span style="white-space:pre">		</span>return chainManager;</div><div><span style="white-space:pre">	</span>}</div><br />5,其它参数，比如chaincode相关信息可以在peer节点 &nbsp;peer chaincode list --installed 命令可以查看<br />可以调用这个ChaincodeManager 的query和invoke方法了.<br /><br />6,补充内容:需要shim-client.jar包，这个需要拉下fabric的源码，在文件夹<br />\src\github.com\hyperledger\fabric\core\chaincode\shim\java 用gradle编译一个jar包出来<br /><br />7，如果grpc用了ssl的需要&nbsp;grpcs://10.121.60.3:7051，grpcs开头<br /><br />因为网上有了fabric多机布署教程,和不完善的示例代码，这里主要介绍一下其中容易遇到的问题，解决起<br />来也颇为头痛和费时。<br />本贴原地址:http://www.blogjava.net/fool .下一篇区块链贴子预告：Fabric的SDK-JAVA动态安装<br />Channel<br /><br /><br /><br /></div><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://JLive.blogjava.net/aggbug/433032.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fool/" target="_blank">傻  瓜</a> 2018-02-01 09:03 <a href="http://www.blogjava.net/fool/archive/2018/02/01/433032.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>springCloud、boot集成elk</title><link>http://www.blogjava.net/fool/archive/2017/10/08/432851.html</link><dc:creator>傻  瓜</dc:creator><author>傻  瓜</author><pubDate>Sun, 08 Oct 2017 11:15:00 GMT</pubDate><guid>http://www.blogjava.net/fool/archive/2017/10/08/432851.html</guid><description><![CDATA[elasticsearch、logstash、kibana版本均为5.6.2版,需要注意版本匹配问题<br />1,启动elashticsearch<br />2,logstash/config目录下新建log.conf文件,其内容：<br /><div>input {</div><div>&nbsp; # For detail config for log4j as input,&nbsp;</div><div>&nbsp; # See: https://www.elastic.co/guide/en/logstash/current/plugins-inputs-log4j.html</div><div></div><div>&nbsp; &nbsp; &nbsp; tcp {&nbsp;</div><div><span style="white-space:pre">	</span>&nbsp; &nbsp; mode =&gt; "server"</div><div><span style="white-space:pre">	</span>&nbsp; &nbsp; host =&gt; "127.0.0.1"</div><div>&nbsp; &nbsp; &nbsp; &nbsp; port =&gt; 4567</div><div>&nbsp; &nbsp; &nbsp; &nbsp; codec =&gt; json_lines&nbsp;</div><div>&nbsp; &nbsp; }&nbsp;&nbsp;</div><div>}</div><div>filter {</div><div>&nbsp; #Only matched data are send to output.</div><div>}</div><div>output {</div><div>&nbsp; # For detail config for elasticsearch as output,&nbsp;</div><div>&nbsp; # See: https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html</div><div>&nbsp; elasticsearch {&nbsp;&nbsp;</div><div>&nbsp; &nbsp; hosts&nbsp; =&gt; ["127.0.0.1:9200"]&nbsp; &nbsp;#ElasticSearch host, can be array.</div><div>&nbsp; &nbsp; index&nbsp; =&gt; "applog"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;#The index to write data to.</div><div>&nbsp; }</div><div>}<br />3,kibana配置.修改kibana/config文件夹中的kibana.yml的配置文件<div>server.port: 5601</div><div>server.host: "localhost"</div><div>elasticsearch.url: "http://localhost:9200"</div><div>kibana.index: ".kibana"<br /><br />4,springCload、springBoot中的logback-spring.xml文件配置将日志写入logstash<br /><br /><div>&nbsp; &nbsp; &lt;appender name="logstash2" class="net.logstash.logback.appender.LogstashTcpSocketAppender"&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &lt;remoteHost&gt;127.0.0.1&lt;/remoteHost&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &lt;port&gt;4567&lt;/port&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &lt;filter class="ch.qos.logback.classic.filter.ThresholdFilter"&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;!-- Minimum logging level to be presented in the console logs--&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;level&gt;INFO&lt;/level&gt; &lt;!--写入logstash的日志级别--&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/filter&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &lt;encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/&gt;</div><div>&nbsp; &nbsp; &lt;/appender&gt;</div><div>&nbsp; &nbsp; &#8203;</div><div>&nbsp; &nbsp; &lt;root level="INFO"&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &lt;appender-ref ref="console"/&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &lt;appender-ref ref="logstash"/&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &lt;appender-ref ref="logstash2"/&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &lt;!--&lt;appender-ref ref="flatfile"/&gt;--&gt;</div><div>&nbsp; &nbsp; &lt;/root&gt;<br /><br />后记:日志是直接写入到elashticsearch,可以集成kafka或redis作为缓冲。</div></div></div><img src ="http://JLive.blogjava.net/aggbug/432851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fool/" target="_blank">傻  瓜</a> 2017-10-08 19:15 <a href="http://www.blogjava.net/fool/archive/2017/10/08/432851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>springboot、mybatis、mycat分库实践</title><link>http://www.blogjava.net/fool/archive/2017/10/01/432841.html</link><dc:creator>傻  瓜</dc:creator><author>傻  瓜</author><pubDate>Sun, 01 Oct 2017 09:40:00 GMT</pubDate><guid>http://www.blogjava.net/fool/archive/2017/10/01/432841.html</guid><description><![CDATA[<div>1.pom文件中引入下面引入mybatis逆向工程插件</div><div><span style="white-space:pre">	</span>&lt;build&gt;</div><div><span style="white-space:pre">		</span>&lt;plugins&gt;</div><div><span style="white-space:pre">			</span>&lt;plugin&gt;</div><div><span style="white-space:pre">				</span>&lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;</div><div><span style="white-space:pre">				</span>&lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;</div><div><span style="white-space:pre">			</span>&lt;/plugin&gt;</div><div><span style="white-space:pre">			</span>&lt;plugin&gt;</div><div><span style="white-space:pre">				</span>&lt;groupId&gt;org.mybatis.generator&lt;/groupId&gt;</div><div><span style="white-space:pre">				</span>&lt;artifactId&gt;mybatis-generator-maven-plugin&lt;/artifactId&gt;</div><div><span style="white-space:pre">				</span>&lt;version&gt;1.3.4&lt;/version&gt;</div><div><span style="white-space:pre">				</span>&lt;configuration&gt;</div><div><span style="white-space:pre">					</span>&lt;verbose&gt;true&lt;/verbose&gt;</div><div><span style="white-space:pre">					</span>&lt;overwrite&gt;true&lt;/overwrite&gt;</div><div><span style="white-space:pre">				</span>&lt;/configuration&gt;</div><div><span style="white-space:pre">			</span>&lt;/plugin&gt;</div><div><span style="white-space:pre">		</span>&lt;/plugins&gt;</div><div><span style="white-space:pre">	</span>&lt;/build&gt;</div><div>&nbsp; &nbsp;2, src/main/resource 目录下引入mybatis逆向工程配置文件，这样就可以自动生成mybatis需要的xml及dao interface</div><div></div><div>&lt;?xml version="1.0" encoding="UTF-8"?&gt;</div><div>&nbsp;&lt;!DOCTYPE generatorConfiguration</div><div>&nbsp; &nbsp;PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"</div><div>&nbsp; &nbsp;"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"&gt;</div><div>&nbsp;&lt;generatorConfiguration&gt;</div><div>&nbsp; &nbsp; &nbsp;&lt;!--数据库驱动--&gt;</div><div>&nbsp; &nbsp; &nbsp;&lt;classPathEntry&nbsp; &nbsp; location="E:\\worksource\\springboot\\src\\main\\webapp\\WEB-INF\\lib\\mysql-connector-java-5.1.39.jar"/&gt;</div><div>&nbsp; &nbsp; &nbsp;&lt;context id="DB2Tables"&nbsp; &nbsp; targetRuntime="MyBatis3"&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;commentGenerator&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;property name="suppressDate" value="true"/&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;property name="suppressAllComments" value="true"/&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;/commentGenerator&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;!--数据库链接地址账号密码--&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/jeeshop" userId="root" password=""&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;/jdbcConnection&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;javaTypeResolver&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;property name="forceBigDecimals" value="false"/&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;/javaTypeResolver&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;!--生成Model类存放位置--&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;javaModelGenerator targetPackage="com.junjun.myblog.domain" targetProject="src/main/java"&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;property name="enableSubPackages" value="true"/&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;property name="trimStrings" value="true"/&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;/javaModelGenerator&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;!--生成映射文件存放位置--&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;sqlMapGenerator targetPackage="src/main/resources/mapper" targetProject="."&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;property name="enableSubPackages" value="true"/&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;/sqlMapGenerator&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;!--生成Dao类存放位置--&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;javaClientGenerator type="XMLMAPPER" targetPackage="com.junjun.myblog.dao" targetProject="src/main/java"&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;property name="enableSubPackages" value="true"/&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;/javaClientGenerator&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;!--生成对应表及类名 mapperName="AreaDao"&nbsp; 工程右键 Debug As -&gt; maven build... -&gt; mybatis-generator:generate</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;table tableName="t_area"&nbsp; &nbsp;domainObjectName="Area" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"&gt;&lt;/table&gt;</div><div>&nbsp; &nbsp; --&gt;</div><div>&lt;/context&gt;</div><div>&nbsp;&lt;/generatorConfiguration&gt;</div><div></div><div>3,application 中加上注解&nbsp; @MapperScan("com.junjun")&nbsp;</div><div>4，数据源连接mycat</div><div>spring.datasource.type=com.alibaba.druid.pool.DruidDataSource</div><div>spring.datasource.driver-class-name=com.mysql.jdbc.Driver</div><div>spring.datasource.url=jdbc:mysql://localhost:8066/MYSQL?useUnicode=true&amp;characterEncoding=UTF-8</div><div>spring.datasource.username=root</div><div>spring.datasource.password=123456</div><div></div><div>二，mycat配置</div><div>1,conf/server.xml中配置用户 和schema</div><div><span style="white-space:pre">	</span>&lt;user name="root"&gt;</div><div><span style="white-space:pre">		</span>&lt;property name="password"&gt;123456&lt;/property&gt;</div><div><span style="white-space:pre">		</span>&lt;property name="schemas"&gt;MYSQL&lt;/property&gt;<span style="white-space:pre">	</span></div><div><span style="white-space:pre">	</span>&lt;/user&gt;</div><div>2,schema.xml配置数据库和分片表分片规则</div><div><span style="white-space:pre">	</span>&lt;schema name="MYSQL" checkSQLschema="false" sqlMaxLimit="100"&gt;</div><div><span style="white-space:pre">		</span>&lt;table name="t_blogger" primaryKey="id" dataNode="dn1" &gt;&nbsp; &nbsp; &nbsp;&lt;/table&gt;&nbsp;</div><div><span style="white-space:pre">		</span> &lt;!--按需配置分片规则--&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &lt;table name="t_area" primaryKey="id" dataNode="dn1,dn2,dn3" rule="mod-long1"&gt;&nbsp; &nbsp; &nbsp;&lt;/table&gt;&nbsp;</div><div><span style="white-space:pre">		</span>&lt;table name="t_blog" primaryKey="id" dataNode="dn1" &gt;&nbsp; &nbsp; &nbsp;&lt;/table&gt;&nbsp;</div><div><span style="white-space:pre">		</span>&lt;table name="t_blogtype" primaryKey="id" dataNode="dn1" &gt;&nbsp; &nbsp; &nbsp;&lt;/table&gt;&nbsp;</div><div></div><div><span style="white-space:pre">	</span>&lt;/schema&gt;</div><div><span style="white-space:pre">	</span>&lt;!-- &lt;dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"</div><div><span style="white-space:pre">		</span>/&gt; --&gt;</div><div><span style="white-space:pre">	</span>&lt;dataNode name="dn1" dataHost="localhost1" database="jeeshop" /&gt;</div><div><span style="white-space:pre">	</span>&lt;dataNode name="dn2" dataHost="localhost2" database="jysystem" /&gt;</div><div><span style="white-space:pre">	</span>&lt;dataNode name="dn3" dataHost="localhost3" database="dn3" /&gt;</div><div></div><div><span style="white-space:pre">	</span>&lt;!--&lt;dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" /&gt;</div><div><span style="white-space:pre">	</span> &lt;dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" /&gt;</div><div><span style="white-space:pre">	</span>&lt;dataNode<span style="white-space:pre">	</span>name="jdbc_dn2" dataHost="jdbchost" database="db2" /&gt;</div><div><span style="white-space:pre">	</span>&lt;dataNode name="jdbc_dn3" <span style="white-space:pre">	</span>dataHost="jdbchost" database="db3" /&gt; --&gt;</div><div><span style="white-space:pre">	</span>&lt;dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"</div><div><span style="white-space:pre">			</span>&nbsp; writeType="0" dbType="mysql" dbDriver="native" switchType="1"&nbsp; slaveThreshold="100"&gt;</div><div><span style="white-space:pre">		</span>&lt;heartbeat&gt;select user()&lt;/heartbeat&gt;</div><div><span style="white-space:pre">		</span>&lt;!-- can have multi write hosts --&gt;</div><div><span style="white-space:pre">		</span>&lt;writeHost host="hostM1" url="localhost:3306" user="root"</div><div><span style="white-space:pre">				</span>&nbsp; &nbsp;password=""&gt;</div><div><span style="white-space:pre">			</span>&lt;!-- can have multi read hosts&nbsp;</div><div><span style="white-space:pre">			</span>&lt;readHost host="hostS2" url="192.168.1.200:3306" user="root" password="" /&gt; --&gt;</div><div><span style="white-space:pre">		</span>&lt;/writeHost&gt;</div><div><span style="white-space:pre">		</span></div><div><span style="white-space:pre">		</span>&lt;!-- &lt;writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/&gt; --&gt;</div><div><span style="white-space:pre">	</span>&lt;/dataHost&gt;</div><div><span style="white-space:pre">	</span></div><div><span style="white-space:pre">		</span>&lt;dataHost name="localhost2" maxCon="1000" minCon="10" balance="0"</div><div><span style="white-space:pre">			</span>&nbsp; writeType="0" dbType="mysql" dbDriver="native" switchType="1"&nbsp; slaveThreshold="100"&gt;</div><div><span style="white-space:pre">		</span>&lt;heartbeat&gt;select user()&lt;/heartbeat&gt;</div><div><span style="white-space:pre">		</span>&lt;!-- can have multi write hosts --&gt;</div><div><span style="white-space:pre">		</span>&lt;writeHost host="hostM2" url="127.0.0.1:3306" user="root"</div><div><span style="white-space:pre">				</span>&nbsp; &nbsp;password=""&gt;</div><div><span style="white-space:pre">			</span>&lt;!-- can have multi read hosts&nbsp;</div><div><span style="white-space:pre">			</span>&lt;readHost host="hostS2" url="192.168.1.200:3306" user="root" password="" /&gt; --&gt;</div><div><span style="white-space:pre">		</span>&lt;/writeHost&gt;</div><div><span style="white-space:pre">		</span></div><div><span style="white-space:pre">		</span>&lt;!-- &lt;writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/&gt; --&gt;</div><div><span style="white-space:pre">	</span>&lt;/dataHost&gt;</div><div><span style="white-space:pre">	</span></div><div><span style="white-space:pre">			</span>&lt;dataHost name="localhost3" maxCon="1000" minCon="10" balance="0"</div><div><span style="white-space:pre">			</span>&nbsp; writeType="0" dbType="mysql" dbDriver="native" switchType="1"&nbsp; slaveThreshold="100"&gt;</div><div><span style="white-space:pre">		</span>&lt;heartbeat&gt;select user()&lt;/heartbeat&gt;</div><div><span style="white-space:pre">		</span>&lt;!-- can have multi write hosts --&gt;</div><div><span style="white-space:pre">		</span>&lt;writeHost host="hostM2" url="127.0.0.1:3306" user="root"</div><div><span style="white-space:pre">				</span>&nbsp; &nbsp;password=""&gt;</div><div><span style="white-space:pre">			</span>&lt;!-- can have multi read hosts&nbsp;</div><div><span style="white-space:pre">			</span>&lt;readHost host="hostS2" url="192.168.1.200:3306" user="root" password="" /&gt; --&gt;</div><div><span style="white-space:pre">		</span>&lt;/writeHost&gt;</div><div><span style="white-space:pre">		</span></div><div><span style="white-space:pre">		</span>&lt;!-- &lt;writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/&gt; --&gt;</div><div><span style="white-space:pre">	</span>&lt;/dataHost&gt;</div><div>3,rule.xml配置分片规则</div><div>&nbsp; &nbsp; 添加如下规则 按表的name字段进行分片存储</div><div><span style="white-space:pre">	</span>&lt;tableRule name="mod-long1"&gt;</div><div><span style="white-space:pre">		</span>&lt;rule&gt;</div><div><span style="white-space:pre">			</span>&lt;columns&gt;name&lt;/columns&gt;</div><div><span style="white-space:pre">			</span>&lt;algorithm&gt;mod-long&lt;/algorithm&gt;</div><div><span style="white-space:pre">		</span>&lt;/rule&gt;</div><div><span style="white-space:pre">	</span>&lt;/tableRule&gt;</div><div><span style="white-space:pre">	</span></div><div><span style="white-space:pre">	</span></div><div><span style="white-space:pre">	</span></div><div><span style="white-space:pre">	</span></div><div>备注：内容太多，记一下重点. 分库后连接查询不在同一个库是查不到数据的,真有这需要那就真需要考虑</div><div>设计是否合理了.</div><div></div><img src ="http://JLive.blogjava.net/aggbug/432841.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fool/" target="_blank">傻  瓜</a> 2017-10-01 17:40 <a href="http://www.blogjava.net/fool/archive/2017/10/01/432841.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>springboot中action绑定ServletRequest的attirbute的值传参</title><link>http://www.blogjava.net/fool/archive/2017/09/29/432838.html</link><dc:creator>傻  瓜</dc:creator><author>傻  瓜</author><pubDate>Fri, 29 Sep 2017 03:58:00 GMT</pubDate><guid>http://www.blogjava.net/fool/archive/2017/09/29/432838.html</guid><description><![CDATA[有些时候需要在后台处理一封装一些参数送到action中便于业务处理.比于app中的token验证,<br />根据token查找到对应的用户信息。比如分布式框架中获取用户信息等.springboot中可以自<br />定义参数解析器来绑定参数，通过它可以拿到ServletRequest中的attirbute中的值进行参数<br />绑定。<br /><br />自定义一个annotation,通过这个注解中的 name查找attribute中的key对应的值&nbsp;<br /><br /><div>import java.lang.annotation.ElementType;</div><div>import java.lang.annotation.Retention;</div><div>import java.lang.annotation.RetentionPolicy;</div><div>import java.lang.annotation.Target;</div><div></div><div>@Target(ElementType.PARAMETER)</div><div>@Retention(RetentionPolicy.RUNTIME)</div><div>public @interface AttributeResolve {</div><div><span style="white-space:pre">	</span>String name() default "user";</div><div>}</div><div></div><br /><div>自定义一个解析器类<br /><br /><div>import javax.servlet.http.HttpServletRequest;</div><div></div><div>import org.springframework.core.MethodParameter;</div><div>import org.springframework.web.bind.support.WebDataBinderFactory;</div><div>import org.springframework.web.context.request.NativeWebRequest;</div><div>import org.springframework.web.method.support.HandlerMethodArgumentResolver;</div><div>import org.springframework.web.method.support.ModelAndViewContainer;</div><div></div></div><div>public class AttributeArgumentResolver implements HandlerMethodArgumentResolver{</div><div></div><div><span style="white-space:pre">	</span>@Override</div><div><span style="white-space:pre">	</span>public Object resolveArgument(MethodParameter arg0, ModelAndViewContainer arg1, NativeWebRequest arg2,</div><div><span style="white-space:pre">			</span>WebDataBinderFactory arg3) throws Exception {</div><div><span style="white-space:pre">		</span>// TODO Auto-generated method stub</div><div><span style="white-space:pre">		</span> Object resultObj=null;</div><div><span style="white-space:pre">		</span> &nbsp;AttributeResolve mp = &nbsp;arg0.getParameterAnnotation(AttributeResolve.class);</div><div><span style="white-space:pre">		</span> &nbsp;if(mp!=null) {</div><div><span style="white-space:pre">			</span> String attributeName= mp.name();</div><div><span style="white-space:pre">			</span> HttpServletRequest request = arg2.getNativeRequest(HttpServletRequest.class);<span style="white-space:pre">	</span></div><div><span style="white-space:pre">			</span> resultObj = request.getAttribute(attributeName);</div><div><span style="white-space:pre">		</span> &nbsp;}</div><div><span style="white-space:pre">	</span></div><div><span style="white-space:pre">		</span>return resultObj;</div><div><span style="white-space:pre">	</span>}</div><div></div><div><span style="white-space:pre">	</span>@Override</div><div><span style="white-space:pre">	</span>public boolean supportsParameter(MethodParameter arg0) {</div><div><span style="white-space:pre">		</span>// TODO Auto-generated method stub</div><div><span style="white-space:pre">		</span>return &nbsp;arg0.hasParameterAnnotation(AttributeResolve.class);</div><div><span style="white-space:pre">	</span>}</div><br />springboot中注册自定义的参数解析器<br /><div>@Configuration</div><div>public class MyWebMvcConfig extends WebMvcConfigurerAdapter{</div><div><span style="white-space:pre">	</span>public void addArgumentResolvers(List&lt;HandlerMethodArgumentResolver&gt; argumentResolvers) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; argumentResolvers.add(new AttributeArgumentResolver());</div><div>&nbsp; &nbsp; }<br />}<br /><br /><br />使用方法.<br />需要在action调用前向HttpServletRequest中的attribute中注入值 ，可以自定义一个filter,在filter中进行处理<br />如在filter中处理app传过来的token验证后取得对应的用户信息等.下面例子简单放入一个对象<br /><div></div><div>@WebFilter(filterName = "axssFilter", urlPatterns = "/*",</div><div>initParams = {</div><div><span style="white-space:pre">		</span>@WebInitParam(name = "ignores", value = "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*")// 忽略资源</div><div>}</div><div>)</div><div>public class XssFilter implements javax.servlet.Filter{</div><div><span style="white-space:pre">	</span>private Set&lt;String&gt; prefixIignores = new HashSet&lt;String&gt;();</div><div><span style="white-space:pre">	</span>@Override</div><div><span style="white-space:pre">	</span>public void destroy() {</div><div><span style="white-space:pre">		</span>// TODO Auto-generated method stub</div><div><span style="white-space:pre">		</span></div><div><span style="white-space:pre">	</span>}</div><div></div><div><span style="white-space:pre">	</span>@Override</div><div><span style="white-space:pre">	</span>public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)</div><div><span style="white-space:pre">			</span>throws IOException, ServletException {</div><div><span style="white-space:pre">		</span>// TODO Auto-generated method stub</div><div><span style="white-space:pre">		</span>HttpServletRequest request = (HttpServletRequest) req;</div><div><span style="white-space:pre">		</span>HttpServletResponse response = (HttpServletResponse) res;</div><div>&nbsp; &nbsp; <span style="white-space:pre">	</span>&nbsp; &nbsp; &nbsp; &nbsp; Blogger user = new Blogger();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="white-space:pre">	</span>user.setUsername("asfdasdf");</div><div>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="white-space:pre">	</span>request.setAttribute("user", user);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;chain.doFilter(request, response); &nbsp;</div><div></div><div><span style="white-space:pre">	</span>}</div><div>}</div><br />action获取attribute中放入的对象<br /><div>&nbsp; &nbsp; &nbsp; &nbsp; @RequestMapping("/index")</div><div><span style="white-space:pre">	</span>public String index(@AttributeResolve(name="user") Bloggerbh,<span style="white-space: pre;">	</span>HttpServletRequest request,Model model)&nbsp;<br /><br />嗯，还算优雅</div><br /><br /></div><img src ="http://JLive.blogjava.net/aggbug/432838.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fool/" target="_blank">傻  瓜</a> 2017-09-29 11:58 <a href="http://www.blogjava.net/fool/archive/2017/09/29/432838.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>springboot中的jsp支持</title><link>http://www.blogjava.net/fool/archive/2017/09/18/432823.html</link><dc:creator>傻  瓜</dc:creator><author>傻  瓜</author><pubDate>Mon, 18 Sep 2017 01:22:00 GMT</pubDate><guid>http://www.blogjava.net/fool/archive/2017/09/18/432823.html</guid><description><![CDATA[springmvc4中零配置的用法在springboot中同样有效。pom.xml配置<br /><div><span style="white-space:pre">	</span>&nbsp; &nbsp; &nbsp; &nbsp;&lt;dependency&gt;</div><div><span style="white-space:pre">			</span>&lt;groupId&gt;javax.servlet&lt;/groupId&gt;</div><div><span style="white-space:pre">			</span>&lt;artifactId&gt;jstl&lt;/artifactId&gt;</div><div><span style="white-space:pre">	</span>&nbsp; &nbsp; &nbsp;&nbsp;&lt;/dependency&gt;</div><div><span style="white-space:pre">	</span>&nbsp; &nbsp;&lt;dependency&gt;</div><div><span style="white-space:pre">			</span>&lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;</div><div><span style="white-space:pre">			</span>&lt;artifactId&gt;spring-boot-starter-tomcat&lt;/artifactId&gt;</div><div><span style="white-space:pre">			</span>&lt;scope&gt;provided&lt;/scope&gt;</div><div><span style="white-space:pre">		</span>&lt;/dependency&gt;</div><div><span style="white-space:pre">		</span>&lt;dependency&gt;</div><div><span style="white-space:pre">			</span>&lt;groupId&gt;org.apache.tomcat.embed&lt;/groupId&gt;</div><div><span style="white-space:pre">			</span>&lt;artifactId&gt;tomcat-embed-jasper&lt;/artifactId&gt;</div><div><span style="white-space:pre">			</span>&lt;scope&gt;provided&lt;/scope&gt;</div><div><span style="white-space:pre">		</span>&lt;/dependency&gt;<br /><br />写配置类配置jsp支持<br /><div>@Configuration</div><div>public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {<br /><br /><div><span style="white-space:pre">	</span>@Bean</div><div><span style="white-space:pre">	</span>public InternalResourceViewResolver viewResolver() {</div><div><span style="white-space:pre">		</span>InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();</div><div><span style="white-space:pre">		</span>viewResolver.setPrefix("/WEB-INF/views/");</div><div><span style="white-space:pre">		</span>viewResolver.setSuffix(".jsp");</div><div><span style="white-space:pre">		</span>viewResolver.setViewClass(JstlView.class);</div><div><span style="white-space:pre">		</span>return viewResolver;</div><div><span style="white-space:pre">	</span>}<br /><br />}<br /><br />所谓零配置。。。 一言难尽<br /></div></div></div><img src ="http://JLive.blogjava.net/aggbug/432823.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fool/" target="_blank">傻  瓜</a> 2017-09-18 09:22 <a href="http://www.blogjava.net/fool/archive/2017/09/18/432823.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>js外部调用更新angularjs的ng-repeat视图问题 </title><link>http://www.blogjava.net/fool/archive/2017/09/11/432808.html</link><dc:creator>傻  瓜</dc:creator><author>傻  瓜</author><pubDate>Mon, 11 Sep 2017 13:37:00 GMT</pubDate><guid>http://www.blogjava.net/fool/archive/2017/09/11/432808.html</guid><description><![CDATA[找了个开源基础框架测试一下微信公众号。没想是用jquery做的restful风格的页面。jquery更<br />新table中数据就有些麻烦。所以用angularjs重构一下。<br />页面中angularjs展示数据 &nbsp;<br />&lt;body &nbsp; ng-controller="multi"&gt;&nbsp;<br /><div>&nbsp; &lt;table id="baseTable" class="table table-striped table-bordered table-hover" &gt;</div><div><span style="white-space:pre">					</span>&lt;thead&gt;</div><div><span style="white-space:pre">						</span>&lt;tr&gt;&lt;th style="width:10%" class="center"&gt;标题&lt;/th&gt;</div><div><span style="white-space:pre">						</span>&lt;/tr&gt;</div><div><span style="white-space:pre">					</span>&lt;/thead&gt;</div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;body &nbsp; ng-controller="multi"&gt; &nbsp;&nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;tbody&gt;<span style="white-space: pre;">	</span>&nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;tr ng-repeat="item in defaultData " &gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;td class='center hidden-480'&gt;{{item.title}}&lt;/td&gt;&nbsp; &nbsp;&nbsp;<div><span style="white-space:pre">	</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="white-space:pre">	</span> &nbsp;&lt;/tr&gt;&nbsp;</div><div><span style="white-space:pre">		</span>&nbsp; &lt;/tbody&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/body&gt;<br />&nbsp; &lt;/table&gt;<br />&lt;/body&gt;<br />外部jquery的ajax调用更新数据&nbsp;<br /><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var controllerScope = $('body[ng-controller="multi"]').scope();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; <span style="white-space:pre">	</span> &nbsp; &nbsp; controllerScope.defaultData=results;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; <span style="white-space:pre">	</span> &nbsp; &nbsp; controllerScope.$apply();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; <span style="white-space:pre">	</span>&nbsp;&nbsp;</div><div>注意：外部js不要删除了下面这段代码块。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;tr ng-repeat="item in defaultData " &gt;</div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;td class='center hidden-480'&gt;{{item.title}}&lt;/td&gt;&nbsp; &nbsp;&nbsp;<div><span style="white-space: pre;">	</span>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="white-space: pre;">	</span>&nbsp;&nbsp;&lt;/tr&gt;&nbsp;</div></div><img src ="http://JLive.blogjava.net/aggbug/432808.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fool/" target="_blank">傻  瓜</a> 2017-09-11 21:37 <a href="http://www.blogjava.net/fool/archive/2017/09/11/432808.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>业务规则与自定义规则处理库</title><link>http://www.blogjava.net/fool/archive/2017/08/20/432763.html</link><dc:creator>傻  瓜</dc:creator><author>傻  瓜</author><pubDate>Sun, 20 Aug 2017 06:52:00 GMT</pubDate><guid>http://www.blogjava.net/fool/archive/2017/08/20/432763.html</guid><description><![CDATA[前篇随笔《需求收集、分析》中简单提了一下业务规则。业务规则是很重要的一个东西，并且用户对于业务规则也极易<br />更改或者新增新的业务规则.尤其是在某些场合如促销，积分商城等场景。正因为规则如此重要，建议使用单独的文档<br />维护，规则名称编号可以与用例名称编对一一对应。<br />业务规则分类：<br />一,内禀规则：业务实体本身的规则。如订单中销售记录不能为空，数量不能为等。<br />二，全局规则：一般与所有用例相关而不是某个特定用例相关。例如系统安全方面的sql注入，ddos攻击等。<br />三，交互规则：用于用例当中。<span style="font-family: Arial; background-color: #ffffff;">它们规定了满足什么条件后业务将如何反应。有些规则需要开发成系统用例。比如人事<br />管理系统中请假业务只有工作日才计入请假天数，那么这个工作日就需要电脑来维护了，会作为一个系统用例存在，并<br />且作为请假用例的前置条件。 交互规则又是最容易引起.<br />交互规则如此灵活多变，需要良好的设计才能保证系统的扩展性和可维护性。如何做：<br />思路一：<br />&nbsp; &nbsp; 在 j</span><span style="font-family: &quot;ms shell dlg&quot;; background-color: #ffffff;">avax.swing.border包提供了</span><span style="font-family: &quot;ms shell dlg&quot;; background-color: #ffffff;">Border接口和几个不同的Boder的实现。在swing中每个组件提供了paint方法，每<br />个组件知道怎么画自己展示自己的外观。那么我们可以提供业务规则处理接口，每个具体业务规则自己知道怎么处理业务。<br />可以用简单工厂来决定调用哪一个具体业务规则。这个是策略模式的使用,缺点是新增具体业务时工厂类会修改。也可以<br />用观察者模式来实现，所有的具体业务类都来观察这个业务规则，自己判断是不是自己可以处理的，不是就不理会。<br />基于策略模式的规则实现类图:<br /><img src="http://www.blogjava.net/images/blogjava_net/fool/rule.png" border="0" alt="" /><br />思路二：<br />&nbsp; &nbsp; &nbsp;规则引擎比如drools处理一些问题 。</span><span style="color: #333333; font-family: Arial; background-color: #ffffff;">规则引擎适合于做业务规则频繁变化的场景.</span><span style="background-color: #ffffff;"><font face="ms shell dlg">把业务规则抽出来通过规则引擎来</font><br /><font face="ms shell dlg">处理。类似工作流系统的概念。</font><br /><br /><font face="ms shell dlg">自定义规则处理库:</font><br /><font face="ms shell dlg">&nbsp; &nbsp; &nbsp;一些动态的语言很适合来做这样的事情。java支持script.Mvel是一个表达式语言，drools也支持mvel来处理业务规则.</font><br /><font face="ms shell dlg">这里自定义规则引擎使用Mvel表达式语言.</font><br /><font face="ms shell dlg">&nbsp; &nbsp; &nbsp; 规则文件示例：</font><br /><font face="ms shell dlg">&nbsp; &nbsp; &nbsp;</font></span>&lt;rules&gt;<div>&nbsp; &nbsp; &nbsp; &nbsp;&lt;!--rule-set 是一个规则集,执行规则 rule1时会迭代规则集里面所有的规则(mvel-rule)--&gt;</div><div><span style="white-space:pre">	</span>&lt;rule-set name="rule1"&gt;</div><div><span style="white-space:pre">		</span>&lt;!-- id是规则的标识，也是默认的排序处理顺序。exclusive 是排它。如果为true,则当前规则执行后，不再执行后面的规则--&gt;</div><div><span style="white-space:pre">		</span>&lt;mvel-rule id="step1" &nbsp;exclusive="false"&gt;</div><div><span style="white-space:pre">			</span>&lt;block&gt;&lt;![CDATA[</div><div><span style="white-space:pre">			</span>if(salary&lt;=3500) {result=0;}</div><div><span style="white-space:pre">			</span>]]&gt;&lt;/block&gt;</div><div></div><div><span style="white-space:pre">		</span>&lt;/mvel-rule&gt;</div><div><span style="white-space:pre">		</span>&lt;mvel-rule id="step2" exclusive="false"&gt;</div><div><span style="white-space:pre">			</span>&lt;block&gt;&lt;![CDATA[if(salary&gt;3500) {result=1};]]&gt;&lt;/block&gt;</div><div></div><div><span style="white-space:pre">		</span>&lt;/mvel-rule&gt;</div><div></div><div><span style="white-space:pre">	</span>&lt;/rule-set&gt;</div><div></div><div></div><div><span style="white-space:pre">	</span>&lt;rule-set name="rule2"&gt;</div><div><span style="white-space:pre">		</span></div><div><span style="white-space:pre">		</span>&lt;mvel-rule id="step1" &nbsp;exclusive="false"&gt;</div><div><span style="white-space:pre">			</span>&lt;block&gt;&lt;![CDATA[&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;import &nbsp;com.custom.rule.*;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rs = new RuleSet();&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rs.name="asdf";</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rs.print();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;]]&gt;&lt;/block&gt;</div><div></div><div><span style="white-space:pre">		</span>&lt;/mvel-rule&gt;</div><div></div><div></div><div><span style="white-space:pre">	</span>&lt;/rule-set&gt;</div><div></div><div>&lt;/rules&gt;</div>rule2中可见mvel可以导入未知jar包并进行处理，确实强大，就有了足够的灵活性.&nbsp;<span style="background-color: #ffffff;">自定义规则库源码及使用示例<a href="/Files/fool/rules.rar">下载</a>.<a></a><br />本例依赖xstream</span>1.4.9 ,mvel2.0<span style="background-color: #ffffff;"><br /></span><span style="background-color: #ffffff;">自定义规则库除了可以应用于一般系统业务处理，当然也还可以用于大数据处理。比如hadoop/spark统计用户积分等<br />如果再定义一套配置规则的UI。。。好的，业务人员可以自己设置计算规则了。<br /><br /><br /><br /><br /></span><br /><span style="font-family: &quot;ms shell dlg&quot;; background-color: #ffffff;"><br /></span><img src ="http://JLive.blogjava.net/aggbug/432763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fool/" target="_blank">傻  瓜</a> 2017-08-20 14:52 <a href="http://www.blogjava.net/fool/archive/2017/08/20/432763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>架构设计过程分析小结</title><link>http://www.blogjava.net/fool/archive/2017/04/28/432490.html</link><dc:creator>傻  瓜</dc:creator><author>傻  瓜</author><pubDate>Fri, 28 Apr 2017 06:22:00 GMT</pubDate><guid>http://www.blogjava.net/fool/archive/2017/04/28/432490.html</guid><description><![CDATA[<p><span style="font-family:宋体;">架构设计过程简单总结：架构设计的驱动力</span>=<span style="font-family:宋体;">功能</span>+<span style="font-family:宋体;">质量</span>+<span style="font-family:宋体;">约束</span>.<span style="font-family:宋体;">功能即系统要满足的业务需求。质量包括运行期质量和开发期质量</span>. <span style="font-size:11.0pt; font-family:宋体;color:#333333;background:white">常见的运行期质量属性包括软件系统的易用性、性能、可伸缩性、持续可用性、鲁棒性、安全性等。开发期质量属性是开发人员最为关心的，要达到怎样的目标应根据项目的具体情况而定。</span><span style="font-family:宋体;">约束可能是商业预算，运行环境，使用人员水平，开发团队水平等。架构设计过程如下</span>:<br /></p><p class="MsoListParagraph" style="margin-left:21.0pt;text-indent:-21.0pt;
mso-char-indent-count:0;mso-list:l0 level1 lfo1"><!--[if !supportLists]--><span lang="EN-US">一，</span><!--[endif]--><span style="font-family:
宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:
宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin">需求收集，分析。</span></p><p style="margin-left:21.0pt;text-indent:0cm;"><span style="font-family:宋体;">此处省略</span>2000<span style="font-family:宋体;">字。。。</span><span style="text-indent: 0cm;">&nbsp;见前篇 《</span><a id="Editor_Results_rprSelectionList_ctl02_Hyperlink1" class="titlelink" href="http://www.blogjava.net/fool/archive/2017/04/28/432489.html" style="color: black; text-decoration-line: none; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: #ffffff; font-size: 12px; font-family: Arial;">需求收集、分析小结</a><span style="color: #333333; font-family: arial; font-size: 12px; background-color: #ffffff;">》</span>http://www.blogjava.net/fool/archive/2017/04/28/432489.html</p>  <p style="margin-left:21.0pt;text-indent:-21.0pt;">二，<span style="font-family: 宋体;">概念架构</span>/<span style="font-family:宋体;">概念模型</span></p>  <p style="margin-left:21.0pt;text-indent:0cm;"><span style="font-family:宋体;">从需求中找出关健、重大需求，进行概念建模</span>.<span style="font-family:宋体;">下面三个图称之鲁棒图。其中控制对象理解为</span>mvc<span style="font-family:宋体;">模式中的控制器和</span>model<span style="font-family:宋体;">。使用鲁棒图可以建立概念模型，约等于初步设计。初步设计并不关心细节。</span></p>  <p style="margin-left:21.0pt;text-indent:0cm;">&nbsp;<img src="http://www.blogjava.net/images/blogjava_net/fool/j1.png" border="0" alt="" /><br /></p><p class="MsoNormal">&nbsp;<span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:
Calibri;mso-hansi-theme-font:minor-latin">鲁棒图建立概念模型语法</span><span lang="EN-US">:<br /><img src="http://www.blogjava.net/images/blogjava_net/fool/j2.png" border="0" alt="" /><br /></span></p><p class="MsoNormal"><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">概念设计举例：</span><span lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US"><br /></span></p><p><span style="font-family:宋体;">上次谈到超市小票如何分析实体对象</span>,<span style="font-family:宋体;">本次接着举例如何对收银进行概念建模<br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/fool/j3.png" border="0" alt="" /><br /></span></p>  <p align="left"> </p>  <span style="font-size:10.5pt;font-family:宋体;Times New Roman&quot;;">如上图：具备基本收银功能的概念模型。概念模型建模可以是增量的。比如商品折扣或其它</span><br /><p class="MsoNormal"><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">促销活动等。</span><span lang="EN-US"><o:p></o:p></span></p><p><br /></p><p><span style="font-family:宋体;">概念架构的用途：</span></p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;">1）&nbsp;<span style="font-family:宋体;">可以帮助我们找出领域模型中的实体对象。</span></p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;">2）&nbsp;<span style="font-family:宋体;">检查需求用例是否正确和完善。</span></p>  <p>3<span style="font-family:宋体;">）初步设计</span>,<span style="font-family:宋体;">鲁棒图是一种初步设计技术。</span></p>  <p>4<span style="font-family:宋体;">）根据用例和概念设计划分系统、子系统、模块或者包。借助鲁棒图</span>,<span style="font-family:宋体;">初步识别功能背后的职责，规划切分系统的方式。</span></p>  <p>&nbsp;</p>  <p style="margin-left:21.0pt;text-indent:-21.0pt;">三，<span style="font-family: 宋体;">关注非功能性需求，包括运行期质量和开发期质量。</span></p>  <p style="margin-left:21.0pt;text-indent:0cm;"><span style="font-family:宋体;">运用目标</span>&#8212;<span style="font-family:宋体;">场景</span>&#8212;<span style="font-family:宋体;">决策表对非功能性需求作出决策</span>.<span style="font-family:宋体;">小举例：</span></p>  <table border="1" cellspacing="0" cellpadding="0" style="margin-left: 21pt; border-collapse: collapse; border-width: initial; border-style: none; border-color: initial;">  <tbody><tr>   <td width="189" valign="top" style="width: 142pt; border-width: 1pt; border-style: solid; border-color: windowtext; padding: 0cm 5.4pt;">   <p style="text-indent:0cm;"><span style="font-family:宋体;">目标</span></p>   </td>   <td width="189" valign="top" style="width: 142.05pt; border-top: 1pt solid windowtext; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-left: none; padding: 0cm 5.4pt;">   <p style="text-indent:0cm;"><span style="font-family:宋体;">场景</span></p>   </td>   <td width="189" valign="top" style="width: 142.05pt; border-top: 1pt solid windowtext; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-left: none; padding: 0cm 5.4pt;">   <p style="text-indent:0cm;"><span style="font-family:宋体;">决策</span></p>   </td>  </tr>  <tr>   <td width="189" valign="top" style="width: 142pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-left: 1pt solid windowtext; border-top: none; padding: 0cm 5.4pt;">   <p style="text-indent:0cm;"><span style="font-family:宋体;">易用性</span></p>   </td>   <td width="189" valign="top" style="width:142.05pt;border-top:none;border-left:   none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt">   <p style="text-indent:0cm;"><span style="font-family:宋体;">销售员需要输入条码检索商品</span>,<span style="font-family:宋体;">繁琐且速度慢</span></p>   </td>   <td width="189" valign="top" style="width:142.05pt;border-top:none;border-left:   none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt">   <p style="text-indent:0cm;"><span style="font-family:宋体;">根据条码，品名模糊匹配检索商品</span>,<span style="font-family:宋体;">提供辅助录入。</span></p>   </td>  </tr>  <tr>   <td width="189" valign="top" style="width: 142pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-left: 1pt solid windowtext; border-top: none; padding: 0cm 5.4pt;">   <p style="text-indent:0cm;"><span style="font-family:宋体;">性能</span></p>   </td>   <td width="189" valign="top" style="width:142.05pt;border-top:none;border-left:   none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt">   <p style="text-indent: 0cm;"><span style="font-family:宋体;">长时间稳定运行</span></p>   </td>   <td width="189" valign="top" style="width:142.05pt;border-top:none;border-left:   none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt">   <p style="text-indent:0cm;"><span style="font-family: 宋体;">数据库集群，服务应用集群</span><span style="font-size: 14px;">&nbsp; &nbsp;&nbsp;</span><span style="font-size: 14px;">&nbsp; &nbsp;&nbsp;</span><span style="font-size: 14px;">&nbsp; &nbsp;&nbsp;</span><span style="font-size: 14px;">&nbsp; &nbsp;&nbsp;</span><span style="font-size: 14px;">&nbsp; &nbsp;&nbsp;</span><span style="font-size: 14px;">&nbsp; &nbsp;&nbsp;</span><span style="font-size: 14px;">&nbsp; &nbsp;&nbsp;</span><span style="font-size: 14px;">&nbsp; &nbsp;&nbsp;</span><span style="font-size: 14px;">&nbsp; &nbsp;&nbsp;</span><span style="font-size: 14px;">&nbsp; &nbsp;&nbsp;</span></p>   </td>  </tr> </tbody></table>&nbsp; &nbsp; &nbsp; &nbsp; 技术选型 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 需要管理钱箱、打印机、响应速 &nbsp; &nbsp;pos系统使用c/s<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 度快<br />  <p style="margin-left: 21pt; text-indent: 0cm;">&nbsp;</p>  <p style="margin-left:21.0pt;text-indent:0cm;">&nbsp;</p><div style="display: inline-block;"></div><p>&nbsp;</p><p class="MsoNormal"><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">四，细化架构。</span><span lang="EN-US">RUP 4+1</span><span style="font-family:宋体;mso-ascii-font-family:
Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">视图法则将架构需要关注的不同的点使用不同的视图表示</span><span lang="EN-US">.</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">从不同的维度对系统进行解读</span><span lang="EN-US">,</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">从而形成统一软件过程架构描述。</span><span lang="EN-US"><o:p></o:p></span></p><p style="margin-left:21.0pt;text-indent:0cm;"></p><p><span style="font-family:宋体;">运行架构：</span></p>  <p><span style="font-family:宋体;">关心进程、线程、同步的相关设计，捕捉并发和同步特征</span></p>  <p><span style="font-family:宋体;">逻辑架构：</span></p>  <p><span style="font-family:宋体;">关心逻辑层</span>(layer)<span style="font-family:宋体;">的划分，系统</span>/<span style="font-family:宋体;">子系统的划分，划分模块及其接口的定义。功能组划分也属于逻辑架构</span>.<span style="font-family:宋体;">功能</span>:<span style="font-family:宋体;">不仅包括用户可见的功能，还包括为实现用户功能而必须提供的</span>"<span style="font-family:宋体;">辅助功能模块</span>"<span style="font-family:宋体;">；它们可能是逻辑层、功能模块等。</span></p>  <p><span style="font-family:宋体;">物理架构：</span></p>  <p><span style="font-family:宋体;">关心服务器选型，物理层划分</span>(tier)<span style="font-family:宋体;">。</span> <span style="font-family:宋体;">描述如何部署机器和网络来配合软件系统的可靠性、可伸缩性等要求</span>.layer<span style="font-family:宋体;">就运行在</span>tier<span style="font-family:宋体;">上。</span>Tier<span style="font-family:宋体;">反映系统伸缩能力。</span></p>  <p><span style="font-family:宋体;">开发架构：</span></p>  <p><span style="font-family:宋体;">描述了在开发环境中软件的静态组织结构。即开发工具下的开发视图，描述文件编译及其依赖关系。而使用</span>maven<span style="font-family:宋体;">管理开发的项目编译及依赖关系结构更加分明。</span></p>  <p><span style="font-family:宋体;">数据架构：</span></p>  <p><span style="font-family:宋体;">关心数据的存储、分布和文件的存放及数据的复制，传递，同步。数据的存放包括</span>sql,<span style="font-family:宋体;">内存数据库，</span>nosql<span style="font-family:宋体;">数据库等</span>.</p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;">逻辑架构设计举例：</span></p>  <p><span style="font-family: 宋体;">还是用收银系统简单举例，收银系统逻辑架构图如下：<br /><br /><img src="http://www.blogjava.net/images/blogjava_net/fool/j4.png" border="0" alt="" /><br /><br /></span></p><p class="MsoNormal"><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">整个系统划系统为系统，切为两个系统，一个收银员角色处理的业务，收银系统。</span><span lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal"><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">一个后台管理系统。后台管理系统包括用户管理模块，基础资料模块（产品资料等）</span><span lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal"><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">销售模块（本例对销售单）。另外，因为收银系统需要和后台系统交互，把收银系统需要使用到的相关的各模块封装成一个接口模块，专门处理和收银系统交互的模块。系统、模块之间的通讯方式应当尽量避免双向。相互依赖可能会引发很多问题。</span><span lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p><p class="MsoNormal"><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">物理架构设计举例：</span><span lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal"><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">物理架构和逻辑架构可以相互印证。描述软件系统的物理布署。<br /><br /><img src="http://www.blogjava.net/images/blogjava_net/fool/j5.png" border="0" alt="" /><br /><br /></span></p><p class="MsoNormal" align="left"><span style="font-size:12.0pt;font-family:宋体;mso-bidi-font-family:宋体;mso-font-kerning:
0pt">如果考虑运行期质量比如长时间运行布署图可能应用做集群。数据库做集群等。逻辑层<span lang="EN-US">layer</span>运行在物理层<span lang="EN-US">tier</span>之上<span lang="EN-US"><o:p></o:p></span></span></p><p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p><p class="MsoNormal"><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">运行架构和数据架构视图根据实际情况可选设计</span><span lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal">



<span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"><br /></span><span lang="EN-US"><o:p></o:p></span></p><p>









<span style="font-family: 宋体;"><br /></span></p><img src ="http://JLive.blogjava.net/aggbug/432490.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fool/" target="_blank">傻  瓜</a> 2017-04-28 14:22 <a href="http://www.blogjava.net/fool/archive/2017/04/28/432490.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>需求收集、分析小结</title><link>http://www.blogjava.net/fool/archive/2017/04/28/432489.html</link><dc:creator>傻  瓜</dc:creator><author>傻  瓜</author><pubDate>Fri, 28 Apr 2017 06:08:00 GMT</pubDate><guid>http://www.blogjava.net/fool/archive/2017/04/28/432489.html</guid><description><![CDATA[<div>绕不过去的坎---需求分析需求.分析师也好，系统分析师也好，架构师也好乃至PM都有一道绕不过去的坎，那就是需求分析。需求分析也绕不过需求收集。</div><div>需求收集的要点：</div><div>1，参与人。很重要。广义上是指各种干系人，如客户方，自己方的.具体的软件操作员可以是直接参与人，但也可能是代理参与人，比如声讯话务员，并不是系统的直接参与者，而是代理人。嗯，可以理解成别人请话员操作软件。甚至打电话进来的也是一个代理人，他帮别人办理业务。也有可能有数据权限要求。</div><div>2，用例。描述业务场景。通俗一点讲即参与人要办的事情。</div><div>3，边界。边界有两种意义。一种是技术实现层面，比如mvc模式中的V。另一种是业务层面的，指本用例需要达到的目标。</div><div>以上三点，UML中有业务用例图表示。但是仅此还不够。俺给加上第</div><div>4，业务规则。即完成业务的约束条件。这个单独抽出非常重要。有些业务规则最终可能会实现为一个系统用例。比如出国需要办理出入境业务。如果在电脑上实现预约，当然要考虑办理中心排班情况，比如除法定节假日以外星期一至星期六都工作。因为每年的法定节假日不是固定的，那我们需要做一个日期是否工作日的排班表出来。这条业务规则即变为一个系统用例，有人机交互界面。在预约出入境时就成了预约的前置条件。还有其它的业务规则比如报表的计算公式等。可见业务规则是如此重要。可以抽出来弄成单独的文档。</div><div>系统分析员或需求分析师需要根据业务需求做出系统用例。系统用例在人机交互应用中是指人做什么，然后电脑做什么的描述。</div><div>pm会跟用户聊到需求。架构师需要了然关键需求及可能存在风险的需求，尽早考虑解决方案。需求分析师也好，架构师也好，基本上应该擅长业务领域模型建模。业务领域模型可能映射成数据架构，即数据的存储方式，比如数据库和文件等。如何正确的建立领域模型？</div><div>1，不要放过业务场景中的名词。比如合同，销售单。</div><div>2，不要放过业务场景中的动名词，比如取款。描述可能一是条取款流水记录，如某人在某个时间某个地点用某种方式取了多少款。</div><div>3， 应当收集业务中用到的一些资料如销售单，出货单，甚至是公司章程如请假制度管理等。</div><div>参与人和业务规则往往容易被忽视掉，这会带来需求变更。那么问题来了，这些东西如何映射成程序中的对象？如下图中的商场的小票联.应该怎么建数据库表呢？有没有方法呢？当然有，那就是找出发票中有哪些对象。根据对象建数据表。</div><div>分析过程：</div><div>1，问问自己，小票是对象吗? 当然是.因为它有自己的属性。比如开票人，销售的商品。在商场pos系统里这个对象其实就是销售单对象。</div><div>2,销售时间是一个对象吗？不是。因为它只是一个时间字符串，本身没有其它属性。</div><div>3,可乐汽水及商品编号当然是一个对象。这容易理解。</div><div>4，金额3.1元也是一个基本属性，它属于什么对象？销售单本身吗？显然不是。它跟可乐汽水这个商品合起来才是一个对象，描述的是销售单什么价格销售了什么产品,应当单独建立一个表。如果有多个商品？那很容易扩充，销售单有一个LIST&lt;销售明细&gt; 的属性。</div><div>对象本身具有良好的继承性，换句话讲按对象模型建立的数据库表基本上都是很容易扩展的，在增加新功能的时候不至于大动干戈。架构师则根据此设计数据架构视图，比如销售单查询响应要求，大数据量的水平，垂直分库，数据库读写分离等。<br /><br /><div><img src="http://www.blogjava.net/images/blogjava_net/fool/2.jpg" border="0" alt="" /></div></div><img src ="http://JLive.blogjava.net/aggbug/432489.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fool/" target="_blank">傻  瓜</a> 2017-04-28 14:08 <a href="http://www.blogjava.net/fool/archive/2017/04/28/432489.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2 标签库讲解</title><link>http://www.blogjava.net/parable-myth/archive/2010/11/04/337235.html</link><dc:creator>无声</dc:creator><author>无声</author><pubDate>Thu, 04 Nov 2010 07:17:00 GMT</pubDate><guid>http://www.blogjava.net/parable-myth/archive/2010/11/04/337235.html</guid><description><![CDATA[<div class="bct fc05 fc11 nbw-blog ztag js-fs2">
<p>转自：http://blog.163.com/hzd_love/blog/static/131999881201082111852520/<br />
要使用Struts2的标签,只需要在JSP页面添加如下一行定义即可：</p>
<p><strong><font color="#800080">&lt;%@ taglib prefix="s" uri="/struts-tags"%&gt;</font></strong></p>
<p>struts2的标签共分为五大类：</p>
<p><strong><font color="#800080">一、逻辑控制标签</font></strong></p>
<p>用于进行逻辑控制输出。主要分以下几类：</p>
<p>1）<font color="#ff0000">条件标签</font>：用于执行基本的条件流转</p>
<p>&lt;s:if&gt;：拥有一个test属性,其表达式的值用来决定标签里内容是否显示。&lt;s:if test="#request.username=='hzd'"&gt;欢迎hzd&lt;/s:if&gt;</p>
<p>&lt;s:elseif&gt;：同上。</p>
<p>&lt;s:else&gt;</p>
<p>2）<font color="#ff0000">迭代标签</font>：用于遍历集合(java.util.Collection)或者枚举值(java.util.Iterator)类型的对象,<u><font color="#ff0000">value属性</font></u>表示集合或枚举对象,<u><font color="#ff0000">status属性</font></u>表示当前循环的对象,在循环体内部可以引用该对象的属性</p>
<p>&lt;s:iterator value="userList" status="user"&gt;</p>
<p>姓名：&lt;s:property value="user.userName" /&gt;</p>
<p>年龄：&lt;s:property value="user.age" /&gt;</p>
<p>&lt;/s:iterator&gt;</p>
<p>3）<font color="#ff0000">组合标签</font>：用于将多个枚举值对象进行叠加，形成一个新的枚举值列表</p>
<p>如将3个列表对象进行了组合，形成新的列表对象：</p>
<p>&lt;s:append var="newIteratorList"&gt;</p>
<p>&lt;s:param value="%{myList1}" /&gt;</p>
<p>&lt;s:param value="%{myList2}" /&gt;</p>
<p>&lt;s:param value="%{myList3}" /&gt;</p>
<p>&lt;/s:append&gt;</p>
<p>输出：</p>
<p>&lt;s:iterator value="%{#newIteratorList}"&gt;</p>
<p>&lt;s:property /&gt;</p>
<p>&lt;/s:iterator&gt;</p>
<p>4）<font color="#ff0000">分割标签</font>：用于将一个字符串进行分隔，产生一个枚举值列表</p>
<p>下面的代码将分隔为3个字符串，然后循环输出</p>
<p>&lt;s:generator val="%{'aaa,bbb,ccc'}"&gt;</p>
<p>&lt;s:iterator&gt;</p>
<p>&lt;s:property /&gt;</p>
<p>&lt;/s:iterator&gt;</p>
<p>&lt;/s:generator&gt;</p>
<p>5）<font color="#ff0000">合并标签</font>：用于将多个枚举值按照数组的索引位置进行合并</p>
<p>&lt;s:merge var="newMergeList"&gt;</p>
<p>&lt;s:param value="%{mylist1}"&gt;--设mylist1列表中有a,b,c三个元素</p>
<p>&lt;s:param value="%{mylist2}"&gt;--设mylist2列表中有1,2,3三个元素</p>
<p>&lt;/s:merge&gt;</p>
<p>合并后新的列表的元素及其顺序为：a,1,b,2,c,3</p>
<p>&lt;s:iterator value="%{#newMergeList}"&gt;</p>
<p>&lt;s:property /&gt;</p>
<p>&lt;/s:iterator&gt;</p>
<p>6）<font color="#ff0000">排序标签</font>：用于对一组枚举值进行排序，属性<u>comparator</u>指向一个继承自java.util.Comparator的比较器，该比较器可以是对应Action页面中的一个比较器变量,<u>source</u>指定要排序的列表对象</p>
<p>&lt;s:sort comparator="myComparator" source="myList"&gt;</p>
<p>&lt;s:iterator&gt;</p>
<p>&lt;s:property value="..."/&gt;</p>
<p>&lt;/s:iterator&gt;</p>
<p>&lt;/s:sort&gt;</p>
<p>7）<font color="#ff0000">子集标签</font>：用于取得一个枚举列表的子集，<u>source</u>用于指定检索的列表对象，<u>start</u>用于指定起始检索的索引位置，<u>count</u>用于指定检索的结果数量，<u>decider</u>属性必须是一个org.apache.struts2.util.SubsetIteratorFilter.Decider类的子类实例，用以指定检索的条件。例如在Action中提供了以下方法用来取得一个Decider对象：</p>
<p>public Decider getDecider()</p>
<p>{</p>
<p>return new Decider(){</p>
<p>public boolean decide(Object element) throws Exception{</p>
<p>int i=((Integer)element).intValue();</p>
<p>return (((i%2)==0)?true:false);</p>
<p>}</p>
<p>};</p>
<p>}</p>
<p>然后引用该对象筛选子集：</p>
<p>&lt;s:subset source="myList" decider="decider"&gt;</p>
<p>&lt;/s:subset&gt;</p>
<p>或者不使用Decider对象：</p>
<p>&lt;s:subset source="myList" count="13" start="3"&gt;</p>
<p>&lt;/s:subset&gt;</p>
<p>&nbsp;</p>
<p><strong><font color="#800080">二、数据输出标签</font></strong></p>
<p>数据输出标签用以输出页面中的元素、属性、隐含变量等，即包括静态文本的输出，也包括struts2集成的各种变量的输出。</p>
<p>1）<font color="#ff0000">链接标签</font>：用于创建一个&lt;a&gt;标签,<u>errorText</u>用于显示错误信息，<u>priInvokeJS</u>表示该链接执行时的javascript提示函数,<u>href</u>表示跳转地址.</p>
<p>&lt;s:a errorText="删除错误" preInvokeJS="confirm('确认删除?')" href="test.jsp"&gt;</p>
<p>&lt;img src="/image/delete.gif" /&gt;</p>
<p>&lt;/s:a&gt;</p>
<p>2）<font color="#ff0000">Action标签</font>：可以直接调用Action类中的函数,<u>前提是该Action类在struts.xml中有定义,name</u>属性用于指向<u>映射文件中配置的Action函数</u>,executeResult属性表示是否执行结果集的跳转</p>
<p>&lt;s:action name="LoginAction" executeResult="true" /&gt;--表示执行LoginAction的默认处理方法execute()</p>
<p>&lt;s:action name="LoginAction!login" executeResult="true" /&gt;--表示执行LoginAction的处理方法login()</p>
<p>3）<font color="#ff0000">JavaBean标签</font>：用于创建一个JavaBean对象，<u>name</u>表示JavaBean类全名，<u>var</u>表示变量的实例名，并可以包含<u>&lt;s:param</u>&gt;设置实例化输入参数</p>
<p>&lt;s:bean name="xxx,xxx,xxx" var="xxx"&gt;</p>
<p>&lt;s:param name="name" value="hzd" /&gt;--为该JavaBean的构造方法传递参数</p>
<p>&lt;/s:bean&gt;</p>
<p>4）<font color="#ff0000">日期标签</font>：用以输出一个格式化的日期对象，<u>name</u>表示要输出的对象，<u>format</u>表示输出的日期格式</p>
<p>&nbsp;&lt;s:date name="user.birthday" format="dd/MM/yyyy" /&gt;</p>
<p>&lt;s:date name="user.birthday" format="%{getText('some.i18n.key')}" /&gt;</p>
<p>&lt;s:date name="user.birthday" /&gt;--默认格式</p>
<p>5）<font color="#ff0000">调用标签</font>：用以输出页面的值栈调试信息，<font color="#ff0000">通常在进行程序调用时使用</font>，便于查找JSP页面中的错误</p>
<p>6）<font color="#ff0000">引用资源文件标签</font>：用于<font color="#ff0000">加载资源包到值栈,</font><font color="#000000">它可以允许<u>&lt;s:text&gt;</u>标签访问任何资源包的信息，而不只是当前action相关联的资源包。name属性用以指定资源包的类路径</font></p>
<p>如xxx.xxx.xxx.ApplicationMessages中定义了标签：HelloWord=欢迎您！</p>
<p>则可以这样引用：</p>
<p>&lt;s:i18n name="xxx.xxx.xxx.ApplilcationMessages"&gt;</p>
<p>&lt;s:text name="HelloWord" /&gt;</p>
<p>&lt;/s:i18n&gt;</p>
<p>7）<font color="#ff0000">包含页面标签</font>：用来包含一个Servlet的输出(Servlet或JSP页面)，使用<u>value</u>属性指定包含页名称,可以使用<u>&lt;s:param&gt;</u>传递参数给子页</p>
<p>&lt;s:include value="/test.jsp"&gt;</p>
<p>&lt;s:param name="username"&gt;hzd&lt;/s:param&gt;--参数username=hzd给test.jsp页面</p>
<p>&lt;/s:include&gt;</p>
<p>8）<font color="#ff0000">传递参数标签</font>：用来<font color="#ff0000">为其他标签提供参数</font>,所以一般是嵌套在其它标签的内部，<u>name</u>属性用来指定参数名称，<u>value</u>(可选)属性用来指定参数值</p>
<p>&lt;s:param name="username" value="hzd" /&gt;--这种方式的参数值会以String格式放入stack</p>
<p>&lt;s:param name="username"&gt;hzd&lt;/s:param&gt;--这种方式的参数值会以Object的格式放入stack</p>
<p>9）<font color="#ff0000">值栈标签</font>：用以加入一个值到值栈中</p>
<p>&lt;s:push value="user"&gt;</p>
<p>&lt;s:property value="name" /&gt;--为user指定name属性</p>
<p>&lt;s:property value="age" /&gt;--为user指定age属性</p>
<p>&lt;/s:push&gt;</p>
<p>10）<font color="#ff0000">变量赋值标签</font>：赋予变量一个特定范围内的值，<u>name</u>属性表示变量的名字，<u>scope</u>表示变量的作用域(application.session.request.page.action)，<u>value</u>变量的值</p>
<p>&lt;s:set&gt;</p>
<p>11）<font color="#ff0000">国际化标签</font>：用于输出国际化信息,<u>name</u>属性指定国际化资源文件中消息文本的key,可以与&lt;s:i18n&gt;标签结合使用</p>
<p>&lt;s:text name="HelloWord" /&gt;--它会按照一定的顺序查找资源文件,直到找到定义HellowWord标签的资源文件为止</p>
<p>12）<font color="#ff0000">链接标签</font>：用于创建一个URL链接，并可以通过&lt;s:param&gt;标签提供request参数</p>
<p>&lt;s:url id="url" value="/test.jsp"&gt;</p>
<p>&lt;s:param name="username"&gt;hzd&lt;/s:param&gt;</p>
<p>&lt;/s:url&gt;</p>
<p>13）<font color="#ff0000">属性标签</font>：用以输出<u>value</u>属性的值，并拥有一个<u>default</u>属性,在value对象不存在时显示。<u>escape</u>属性为true,来输出原始的HTML文本</p>
<p>&lt;s:property value="getText('some.key')"&gt;</p>
<p>&nbsp;</p>
<p><font color="#800080"><strong>三、HTML表单标签</strong></font></p>
<p>HTML标签都拥有以下3个设置样式的属性。</p>
<p>templateDir：执行模板路径</p>
<p>theme：指定主题名称，可选值包括simple、xhtml、ajax等</p>
<p>template：指定模板名称</p>
<p>使用HTML表单标签会生成大量格式化的HTML代码，这些代码是由struts2的模板生成的，这样的好处是可以让我们的jsp代码十分简单，只需要配置使用不同的主题模板，就可以显示不同的页面样式。</p>
<p>struts2默认提供了5种主题(在此不做详细介绍)：</p>
<p>simple主题：最简单的主题</p>
<p>XHTML主题：默认主题，使用常用的HTML技巧</p>
<p>CSS XHTML主题：使用CSS实现的XHTML主题</p>
<p>archive主题：使用文档生成主题</p>
<p>AJAX主题：基于AJAX实现的主题</p>
<p>通过在struts.properties文件中改变struts.ui.theme,struts.ui.templateDir,struts.ui.templateSuffix三个标签来自由切实可行换主题</p>
<p>由于HTML表单标签也不少,所以还是要用的时候在网上找吧...</p>
<p>&nbsp;<font color="#800080"><strong>四、HTML非表单标签</strong></font></p>
<p>主要用来输出各种错误和消息。</p>
<p>1）<font color="#ff0000">错误标签</font>：用以输出Action错误信息</p>
<p>&lt;s:actionerror /&gt;</p>
<p>2）<font color="#ff0000">消息标签</font>：用以输出Action普通消息</p>
<p>&lt;s:atcionmessage /&gt;</p>
<p>3）<font color="#ff0000">字段错误标签</font>：用以输出Action校验中<font color="#ff0000">某一个字段的错误信息</font>或所有字段的错误信息</p>
<p>&lt;s:fielderror /&gt;--输出所有字段的错误信息</p>
<p>&lt;s:fielderror&gt;</p>
<p>&lt;s:param&gt;username&lt;/s:param&gt;--输出字段username的错误信息</p>
<p>&lt;s:param&gt;password&lt;/s:param&gt;--输出字段password的错误信息</p>
<p>&lt;s:fielderror&gt;</p>
<p>4）<font color="#ff0000">DIV标签</font>：用以输出一个&lt;div&gt;标签</p>
<p>&nbsp;</p>
<p><font color="#800080"><strong>五、AJAX标签</strong></font></p>
<p>AJAX标签是struts2专门提供的一组进行AJAX操作的标签，在使用这些标签之前，需要在JSP页面中添加如下引用：</p>
<p><font color="#800080"><strong>&lt;%@ taglib prefix="sx" uri="/struts-dojo-tags"%&gt;</strong></font></p>
<p><font color="#000000">1）<font color="#ff0000">链接标签</font>：用于创建一个&lt;a&gt;链接，并且在单击该链接时执行异步的请求,该标签的url属性必须使用&lt;s:url/&gt;标签进行设置,<u>target</u>属性指向要被更新的页面组件,<u>showLoadingText</u>属性决定是否显示文本,<u>indicator</u>表示异步请求时要显示的图片</font></p>
<p>使用form标签：</p>
<p>&lt;s:div id="<font color="#ff0000">targetDiv</font>"&gt;</p>
<p>&lt;s:form action="LoginAction"&gt;</p>
<p>&lt;sx:a targets="<font color="#ff0000">targetDiv</font>"&nbsp;showLoadingText="false" indicator="loadingImage" /&gt;</p>
<p>&lt;/s:form&gt;</p>
<p>&lt;/s:div&gt;</p>
<p>使用url标签：</p>
<p>&lt;s:div id="<font color="#ff0000">targetDiv</font>"&gt;</p>
<p>&lt;s:url id="<font color="#ff00ff">ajaxTest</font>" value="/LoginAction.action"&gt;</p>
<p>&lt;sx:a targets="<font color="#ff0000">targetDiv</font>" href="%{<font color="#ff00ff">ajaxTest</font>}"&nbsp;showLoadingText="false" indicator="loadingImage" /&gt;</p>
<p>&lt;/s:div&gt;</p>
<p>2）<font color="#ff0000">自动完成标签</font>：是一个组合框组件,在文本框中输入文本，能够给出一个下拉的提示列表。<u>list</u>属性用以指定一个自动提示检索的列表集合(可以是Action中的List类型的属性)，<u>autoComplete</u>属性为true时表示进行自动提示</p>
<p>&lt;sx:autocompleter name="test" list="{'上海','湖南',广东}" autoCompleter="true" /&gt;</p>
<p>3）<font color="#ff0000">自动事件绑定标签</font>：该标签可以为多个对象的多个事件进行监听，并能够发送异步请求。<u>src</u>属性指定监听的对象源，<u>events</u>属性指定监听的事件类型(JavaScript事件),<u>target</u>属性指定异步返回内容填充的目标，<u>indicator</u>属性表示执行异步请求时显示的图片</p>
<p>&lt;s:div id="targetDiv"&gt;</p>
<p>&lt;s:form action="login"&gt;</p>
<p>&lt;s:submit id="<font color="#ff0000">bin</font>" /&gt;</p>
<p>&lt;s:bind src="<font color="#ff0000">bin</font>" <font color="#ff0000">events="onclick"</font> targets="targetDiv" showLoadingText="false" indicator="%{getText('loadingImage')}" /&gt;</p>
<p>&lt;/s:form&gt;</p>
<p>&lt;/s:div&gt;</p>
<p>4）<font color="#ff0000">日期选择标签</font>：用以弹出一个日期和时间的选择窗口，<u>displayFormat</u>属性指定要选择日期的格式,<u>name</u>表示当前组件的属性的对象,<u>value</u>表示默认值,<u>label</u>表示显示的文本</p>
<p>&lt;sx:datetimepicker name="order.date" label="Order Date" displayFormat="yyyy-MM-dd" value="%{'2006-01-01'}"&nbsp;/&gt;</p>
<p>5）<font color="#ff0000">树标签</font>：用以输出一个树形结构</p>
<p>&lt;sx:tree&gt;</p>
<p>6）<font color="#ff0000">Tab页标签</font>：使用AJAX的方式显示多个Tab页</p>
<p>&lt;s:tabbedpanel&gt;</p>
</div>
<img src ="http://JLive.blogjava.net/aggbug/337235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/parable-myth/" target="_blank">无声</a> 2010-11-04 15:17 <a href="http://www.blogjava.net/parable-myth/archive/2010/11/04/337235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>myeclipse7.1下载(转)</title><link>http://www.blogjava.net/parable-myth/archive/2009/03/20/260967.html</link><dc:creator>独上九天揽月</dc:creator><author>独上九天揽月</author><pubDate>Fri, 20 Mar 2009 01:54:00 GMT</pubDate><guid>http://www.blogjava.net/parable-myth/archive/2009/03/20/260967.html</guid><description><![CDATA[http://developer.51cto.com/art/200903/115269.htm<img src ="http://JLive.blogjava.net/aggbug/260967.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/parable-myth/" target="_blank">独上九天揽月</a> 2009-03-20 09:54 <a href="http://www.blogjava.net/parable-myth/archive/2009/03/20/260967.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>powerDesigner中如何才能删除Reference,而不删除列 </title><link>http://www.blogjava.net/parable-myth/archive/2009/03/06/258154.html</link><dc:creator>独上九天揽月</dc:creator><author>独上九天揽月</author><pubDate>Fri, 06 Mar 2009 03:13:00 GMT</pubDate><guid>http://www.blogjava.net/parable-myth/archive/2009/03/06/258154.html</guid><description><![CDATA[menu: <br />  tools\model options..., 在model options对话框中， <br /><br /> -model settings <br /> --reference        ----------点这个 <br /><br /> 然后把"auto-migrate columns"这个checkbox的勾去掉<br /><br />转自http://topic.csdn.net/u/20070323/15/331889c6-76fa-4d91-aaf3-2388211effd6.html<br /><img src ="http://JLive.blogjava.net/aggbug/258154.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/parable-myth/" target="_blank">独上九天揽月</a> 2009-03-06 11:13 <a href="http://www.blogjava.net/parable-myth/archive/2009/03/06/258154.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何删除所有隐藏的.svn目录</title><link>http://www.blogjava.net/parable-myth/archive/2009/03/03/257590.html</link><dc:creator>独上九天揽月</dc:creator><author>独上九天揽月</author><pubDate>Tue, 03 Mar 2009 08:20:00 GMT</pubDate><guid>http://www.blogjava.net/parable-myth/archive/2009/03/03/257590.html</guid><description><![CDATA[转自http://www.nocoo.us/2008/05/delete-all-svn-folders/<img src ="http://JLive.blogjava.net/aggbug/257590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/parable-myth/" target="_blank">独上九天揽月</a> 2009-03-03 16:20 <a href="http://www.blogjava.net/parable-myth/archive/2009/03/03/257590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 让透明FLASH 在FIREFOX和IE都支持 </title><link>http://www.blogjava.net/parable-myth/archive/2008/11/27/242925.html</link><dc:creator>独上九天揽月</dc:creator><author>独上九天揽月</author><pubDate>Thu, 27 Nov 2008 01:43:00 GMT</pubDate><guid>http://www.blogjava.net/parable-myth/archive/2008/11/27/242925.html</guid><description><![CDATA[
		<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<span style="color: rgb(0, 0, 0);">codebase=”http://download.macromedia.com/pub/shockwave/<br />cabs/flash/swflash.cab#version=6,0,29,0″ width=”770″ height=”148″&gt;<br /> </span>
				<span style="color: rgb(0, 0, 255);">&lt;</span>
				<span style="color: rgb(128, 0, 0);">param </span>
				<span style="color: rgb(255, 0, 0);">name</span>
				<span style="color: rgb(0, 0, 255);">=”movie” </span>
				<span style="color: rgb(255, 0, 0);">value</span>
				<span style="color: rgb(0, 0, 255);">=”swf/top.swf” </span>
				<span style="color: rgb(0, 0, 255);">/&gt;</span>
				<span style="color: rgb(0, 0, 0);">
						<br /> </span>
				<span style="color: rgb(0, 0, 255);">&lt;</span>
				<span style="color: rgb(128, 0, 0);">param </span>
				<span style="color: rgb(255, 0, 0);">name</span>
				<span style="color: rgb(0, 0, 255);">=”quality” </span>
				<span style="color: rgb(255, 0, 0);">value</span>
				<span style="color: rgb(0, 0, 255);">=”high” </span>
				<span style="color: rgb(0, 0, 255);">/&gt;</span>
				<span style="color: rgb(0, 0, 0);">
						<br /> </span>
				<span style="color: rgb(0, 0, 255);">&lt;</span>
				<span style="color: rgb(128, 0, 0);">param </span>
				<span style="color: rgb(255, 0, 0);">name</span>
				<span style="color: rgb(0, 0, 255);">=”wmode” </span>
				<span style="color: rgb(255, 0, 0);">value</span>
				<span style="color: rgb(0, 0, 255);">=”transparent” </span>
				<span style="color: rgb(0, 0, 255);">/&gt;</span>
				<span style="color: rgb(0, 0, 0);">
						<br /> </span>
				<span style="color: rgb(0, 0, 255);">&lt;</span>
				<span style="color: rgb(128, 0, 0);">embed </span>
				<span style="color: rgb(255, 0, 0);">src</span>
				<span style="color: rgb(0, 0, 255);">=”swf/top.swf” </span>
				<span style="color: rgb(255, 0, 0);">quality</span>
				<span style="color: rgb(0, 0, 255);">=”high” </span>
				<span style="color: rgb(255, 0, 0);">pluginspage</span>
				<span style="color: rgb(0, 0, 255);">=”http://www.ma<br /></span>
				<span style="color: rgb(255, 0, 0);">cromedia.com/go/getflashplayer” type</span>
				<span style="color: rgb(0, 0, 255);">=”application/x-shockwave-flash” </span>
				<span style="color: rgb(255, 0, 0);">width</span>
				<span style="color: rgb(0, 0, 255);">=”770″ </span>
				<span style="color: rgb(255, 0, 0);">height</span>
				<span style="color: rgb(0, 0, 255);">=”148″</span>
				<span style="color: rgb(0, 0, 255);">&gt;&lt;/</span>
				<span style="color: rgb(128, 0, 0);">embed</span>
				<span style="color: rgb(0, 0, 255);">&gt;</span>
				<span style="color: rgb(0, 0, 0);">
						<br />
				</span>
				<span style="color: rgb(0, 0, 255);">&lt;/</span>
				<span style="color: rgb(128, 0, 0);">object</span>
				<span style="color: rgb(0, 0, 255);">&gt;</span>
				<span style="color: rgb(0, 0, 0);">
						<br />
						<br />在FireFox中显示透明：<br /><br /></span>
				<span style="color: rgb(0, 0, 255);">&lt;</span>
				<span style="color: rgb(128, 0, 0);">object </span>
				<span style="color: rgb(255, 0, 0);">classid</span>
				<span style="color: rgb(0, 0, 255);">=”clsid:D27CDB6E-AE6D-11cf-96B8-444553540000″ </span>
				<span style="color: rgb(255, 0, 0);">codebase</span>
				<span style="color: rgb(0, 0, 255);">=”http://download.macromedia.com/pub/shockwave/cab<br /></span>
				<span style="color: rgb(255, 0, 0);">s/flash/swflash.cab#version</span>
				<span style="color: rgb(0, 0, 255);">=6,0,29,0″ </span>
				<span style="color: rgb(255, 0, 0);">width</span>
				<span style="color: rgb(0, 0, 255);">=”770″ </span>
				<span style="color: rgb(255, 0, 0);">height</span>
				<span style="color: rgb(0, 0, 255);">=”148″</span>
				<span style="color: rgb(0, 0, 255);">&gt;</span>
				<span style="color: rgb(0, 0, 0);">
						<br /> </span>
				<span style="color: rgb(0, 0, 255);">&lt;</span>
				<span style="color: rgb(128, 0, 0);">param </span>
				<span style="color: rgb(255, 0, 0);">name</span>
				<span style="color: rgb(0, 0, 255);">=”movie” </span>
				<span style="color: rgb(255, 0, 0);">value</span>
				<span style="color: rgb(0, 0, 255);">=”swf/top.swf” </span>
				<span style="color: rgb(0, 0, 255);">/&gt;</span>
				<span style="color: rgb(0, 0, 0);">
						<br /> </span>
				<span style="color: rgb(0, 0, 255);">&lt;</span>
				<span style="color: rgb(128, 0, 0);">param </span>
				<span style="color: rgb(255, 0, 0);">name</span>
				<span style="color: rgb(0, 0, 255);">=”quality” </span>
				<span style="color: rgb(255, 0, 0);">value</span>
				<span style="color: rgb(0, 0, 255);">=”high” </span>
				<span style="color: rgb(0, 0, 255);">/&gt;</span>
				<span style="color: rgb(0, 0, 0);">
						<br /> </span>
				<span style="color: rgb(0, 0, 255);">&lt;</span>
				<span style="color: rgb(128, 0, 0);">embed </span>
				<span style="color: rgb(255, 0, 0);">src</span>
				<span style="color: rgb(0, 0, 255);">=”swf/top.swf” </span>
				<span style="color: rgb(255, 0, 0);">wmode</span>
				<span style="color: rgb(0, 0, 255);">=”transparent” </span>
				<span style="color: rgb(255, 0, 0);">quality</span>
				<span style="color: rgb(0, 0, 255);">=”high” </span>
				<span style="color: rgb(255, 0, 0);">pluginspage</span>
				<span style="color: rgb(0, 0, 255);">=”http://www.macromedia.com/go/getflas<br /></span>
				<span style="color: rgb(255, 0, 0);">hplayer” type</span>
				<span style="color: rgb(0, 0, 255);">=”application/x-shockwave-flash” </span>
				<span style="color: rgb(255, 0, 0);">width</span>
				<span style="color: rgb(0, 0, 255);">=”770″ </span>
				<span style="color: rgb(255, 0, 0);">height</span>
				<span style="color: rgb(0, 0, 255);">=”148″</span>
				<span style="color: rgb(0, 0, 255);">&gt;&lt;/</span>
				<span style="color: rgb(128, 0, 0);">embed</span>
				<span style="color: rgb(0, 0, 255);">&gt;</span>
				<span style="color: rgb(0, 0, 0);">
						<br />
				</span>
				<span style="color: rgb(0, 0, 255);">&lt;/</span>
				<span style="color: rgb(128, 0, 0);">object</span>
				<span style="color: rgb(0, 0, 255);">&gt;</span>
				<span style="color: rgb(0, 0, 0);">
						<br />
						<br />在两种浏览器中都显示透明：<br /><br /></span>
				<span style="color: rgb(0, 0, 255);">&lt;</span>
				<span style="color: rgb(128, 0, 0);">object </span>
				<span style="color: rgb(255, 0, 0);">classid</span>
				<span style="color: rgb(0, 0, 255);">=”clsid:D27CDB6E-AE6D-11cf-96B8-444553540000″ </span>
				<span style="color: rgb(255, 0, 0);">codebase</span>
				<span style="color: rgb(0, 0, 255);">=”http://download.macromedia.com/pub/shockw<br /></span>
				<span style="color: rgb(255, 0, 0);">ave/cabs/flash/swflash.cab#version</span>
				<span style="color: rgb(0, 0, 255);">=6,0,29,0″ </span>
				<span style="color: rgb(255, 0, 0);">width</span>
				<span style="color: rgb(0, 0, 255);">=”770″ </span>
				<span style="color: rgb(255, 0, 0);">height</span>
				<span style="color: rgb(0, 0, 255);">=”148″</span>
				<span style="color: rgb(0, 0, 255);">&gt;</span>
				<span style="color: rgb(0, 0, 0);">
						<br /> </span>
				<span style="color: rgb(0, 0, 255);">&lt;</span>
				<span style="color: rgb(128, 0, 0);">param </span>
				<span style="color: rgb(255, 0, 0);">name</span>
				<span style="color: rgb(0, 0, 255);">=”movie” </span>
				<span style="color: rgb(255, 0, 0);">value</span>
				<span style="color: rgb(0, 0, 255);">=”swf/top.swf” </span>
				<span style="color: rgb(0, 0, 255);">/&gt;</span>
				<span style="color: rgb(0, 0, 0);">
						<br /> </span>
				<span style="color: rgb(0, 0, 255);">&lt;</span>
				<span style="color: rgb(128, 0, 0);">param </span>
				<span style="color: rgb(255, 0, 0);">name</span>
				<span style="color: rgb(0, 0, 255);">=”quality” </span>
				<span style="color: rgb(255, 0, 0);">value</span>
				<span style="color: rgb(0, 0, 255);">=”high” </span>
				<span style="color: rgb(0, 0, 255);">/&gt;</span>
				<span style="color: rgb(0, 0, 0);">
						<br /> </span>
				<span style="color: rgb(0, 0, 255);">&lt;</span>
				<span style="color: rgb(128, 0, 0);">param </span>
				<span style="color: rgb(255, 0, 0);">name</span>
				<span style="color: rgb(0, 0, 255);">=”wmode” </span>
				<span style="color: rgb(255, 0, 0);">value</span>
				<span style="color: rgb(0, 0, 255);">=”transparent” </span>
				<span style="color: rgb(0, 0, 255);">/&gt;</span>
				<span style="color: rgb(0, 0, 0);">
						<br /> </span>
				<span style="color: rgb(0, 0, 255);">&lt;</span>
				<span style="color: rgb(128, 0, 0);">embed </span>
				<span style="color: rgb(255, 0, 0);">src</span>
				<span style="color: rgb(0, 0, 255);">=”swf/top.swf” </span>
				<span style="color: rgb(255, 0, 0);">wmode</span>
				<span style="color: rgb(0, 0, 255);">=”transparent” </span>
				<span style="color: rgb(255, 0, 0);">quality</span>
				<span style="color: rgb(0, 0, 255);">=”high” </span>
				<span style="color: rgb(255, 0, 0);">pluginspage</span>
				<span style="color: rgb(0, 0, 255);">=”http://www.macromedia.com/go/getflashp<br /></span>
				<span style="color: rgb(255, 0, 0);">layer” type</span>
				<span style="color: rgb(0, 0, 255);">=”application/x-shockwave-flash” </span>
				<span style="color: rgb(255, 0, 0);">width</span>
				<span style="color: rgb(0, 0, 255);">=”770″ </span>
				<span style="color: rgb(255, 0, 0);">height</span>
				<span style="color: rgb(0, 0, 255);">=”148″</span>
				<span style="color: rgb(0, 0, 255);">&gt;&lt;/</span>
				<span style="color: rgb(128, 0, 0);">embed</span>
				<span style="color: rgb(0, 0, 255);">&gt;</span>
				<span style="color: rgb(0, 0, 0);">
						<br />
				</span>
				<span style="color: rgb(0, 0, 255);">&lt;/</span>
				<span style="color: rgb(128, 0, 0);">object</span>
				<span style="color: rgb(0, 0, 255);">&gt;</span>
		</div>
		<br />
<img src ="http://JLive.blogjava.net/aggbug/242925.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/parable-myth/" target="_blank">独上九天揽月</a> 2008-11-27 09:43 <a href="http://www.blogjava.net/parable-myth/archive/2008/11/27/242925.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>