﻿<?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-Jason ---分享,共同进步</title><link>http://www.blogjava.net/agun/</link><description>激情成就梦想，努力创造未来</description><language>zh-cn</language><lastBuildDate>Wed, 29 Apr 2026 19:26:36 GMT</lastBuildDate><pubDate>Wed, 29 Apr 2026 19:26:36 GMT</pubDate><ttl>60</ttl><item><title>java web 导出excel </title><link>http://www.blogjava.net/agun/archive/2012/11/03/390722.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Sat, 03 Nov 2012 04:45:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2012/11/03/390722.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/390722.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2012/11/03/390722.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/390722.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/390722.html</trackback:ping><description><![CDATA[<p>看到这个标题，会很疑问，java导出excel 有很多文章呀，都知道怎么用呀，呵呵，我也是这么认为，我们常用的就是jxl 或者poi ，现在jxl 代码不在更新不支持2007，一般都采用poi 进行excel的操作，今天在看系统（架构struts+ spring+ hibernate），需要做一个excel导出，一个简单的方法，这个方法只适用于excel简单的导出，直接通过输出的页面，然后设置页面为输出流的文件格式，这样当action转向到jsp页面的时候，直接就是将页面输出。</p>
<p>&nbsp;</p>
<p>jsp页面的代码：</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://agun.iteye.com/admin/blogs/1714955#"><img alt="复制代码" src="http://agun.iteye.com/images/icon_copy.gif" /></a></div></div>
<ol class="dp-j"><li><span>&lt;%@&nbsp;page&nbsp;language=</span><span class="string">"java"</span><span>&nbsp;pageEncoding=</span><span class="string">"UTF8"</span><span>%&gt; &nbsp;&nbsp;</span></li><li><span>&lt;html:html&nbsp;locale=</span><span class="string">"true"</span><span>&gt; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;head&gt;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;LogExport&lt;/title&gt; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;meta&nbsp;http-equiv=</span><span class="string">"pragma"</span><span>&nbsp;content=</span><span class="string">"no-cache"</span><span>&gt; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;meta&nbsp;http-equiv=</span><span class="string">"cache-control"</span><span>&nbsp;content=</span><span class="string">"no-cache"</span><span>&gt; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;meta&nbsp;http-equiv=</span><span class="string">"expires"</span><span>&nbsp;content=</span><span class="string">"0"</span><span>&gt; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;meta&nbsp;http-equiv=</span><span class="string">"Content-Type"</span><span>&nbsp;content=</span><span class="string">"text/html;&nbsp;charset=UTF-8"</span><span>&gt; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;% &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setCharacterEncoding(</span><span class="string">"UTF-8"</span><span>); &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setContentType(</span><span class="string">"application/vnd.ms-excel;"</span><span>);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setHeader(</span><span class="string">"Content-Disposition"</span><span>,&nbsp;</span><span class="string">"attachment;filename=\""</span><span>+</span><span class="keyword">new</span><span>&nbsp;String(</span><span class="string">"Log.xls"</span><span>.getBytes(),</span><span class="string">"ISO-8859-1"</span><span>)+</span><span class="string">"\""</span><span>); &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/head&gt; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;body&gt; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;form&nbsp;action=</span><span class="string">"/Action_export.do"</span><span>&gt; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;table&nbsp;width=</span><span class="string">"100%"</span><span>&nbsp;border=</span><span class="string">"1"</span><span>&nbsp;cellspacing=</span><span class="string">"0"</span><span>&nbsp;cellpadding=</span><span class="string">"0"</span><span>&nbsp;id=</span><span class="string">"datagrid"</span><span>&gt; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;thead&gt; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&nbsp;</span><span class="keyword">class</span><span>=</span><span class="string">"HeaderStyle"</span><span>&nbsp;style=</span><span class="string">"font-weight:&nbsp;normal;"</span><span>&gt; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;用户&lt;/th&gt; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;姓名&lt;/th&gt; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;日期&lt;/th&gt; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;登录IP&lt;/th&gt; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;主机名&lt;/th&gt; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&nbsp;colspan=</span><span class="string">"3"</span><span>&gt; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;table&nbsp;width=</span><span class="string">'100%'</span><span>&nbsp;&nbsp;border=</span><span class="string">"1"</span><span>&nbsp;cellspacing=</span><span class="string">"3"</span><span>&nbsp;cellpadding=</span><span class="string">"0"</span><span>&nbsp;frame=</span><span class="string">'void'</span><span>&nbsp;&gt;&nbsp; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;&lt;td&nbsp;colspan=</span><span class="string">"3"</span><span>&nbsp;style=</span><span class="string">'background:transparent;'</span><span>&nbsp;align=</span><span class="string">"center"</span><span>&gt;操作信息&lt;/td&gt;&lt;/tr&gt; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&nbsp;style=</span><span class="string">'background:transparent;'</span><span>&gt; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&nbsp;width=</span><span class="string">"40px"</span><span>&nbsp;align=</span><span class="string">"center"</span><span>&gt;操作&lt;/td&gt; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&nbsp;width=</span><span class="string">"100px"</span><span>&nbsp;align=</span><span class="string">"center"</span><span>&gt;标题&lt;/td&gt; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&nbsp;align=</span><span class="string">"center"</span><span>&gt;扩展信息&lt;/td&gt; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/table&gt; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/th&gt; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/thead&gt; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;jsp:include&nbsp;page=</span><span class="string">"common.jsp"</span><span>&nbsp;flush=</span><span class="string">"true"</span><span>&nbsp;/&gt; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/table&gt; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/form&gt; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/body&gt; &nbsp;&nbsp;</span></li><li><span>&lt;/html:html&gt;&nbsp;&nbsp;</span></li></ol></div><img src ="http://www.blogjava.net/agun/aggbug/390722.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2012-11-03 12:45 <a href="http://www.blogjava.net/agun/archive/2012/11/03/390722.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vb控件开发随笔</title><link>http://www.blogjava.net/agun/archive/2012/02/29/370953.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Wed, 29 Feb 2012 01:03:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2012/02/29/370953.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/370953.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2012/02/29/370953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/370953.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/370953.html</trackback:ping><description><![CDATA[<p>项目需要使用一些本地控件，所以这几天又折腾把以前的vb拿出来，做一个空间的例子。vb制作控件很简单，这里也不再多说，我开发的控件名称叫做test.ocx发布好，会生成相应的test.cab和test.hmtl测试页面。</p>
<p>&nbsp;</p>
<p>我要把这个控件发布的web工程中</p>
<p>&nbsp;</p>
<p>1，首先复制cab到web目录下，然后再页面中添加控件信息，如下图，</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Html代码 <a title="复制代码" href="http://agun.iteye.com/admin/blogs/1431227#"><img alt="复制代码" src="http://agun.iteye.com/images/icon_copy.gif" /></a></div></div>
<ol class="dp-xml"><li><span>&lt;!--&nbsp;如果这页上的任何控件需要授权，您必须 &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;创建一个授权包文件。&nbsp;运行&nbsp;LPK_TOOL.EXE&nbsp;来创建 &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;要求的&nbsp;LPK&nbsp;文件。&nbsp;LPK_TOOL.EXE&nbsp;将从&nbsp;ActiveX&nbsp;SDK&nbsp;中找到， &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;http://www.microsoft.com/intdev/sdk/sdk.htm.&nbsp;如果您有&nbsp;Visual &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;Basic&nbsp;6.0&nbsp;CD,&nbsp;您可以在\Tools\LPK_TOOL&nbsp;目录下找到它。 &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;下面是对象标记的例子： &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">OBJECT</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">CLASSID</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"clsid:5220cb21-c88d-11cf-b347-00aa00a28331"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">PARAM</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">NAME</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"LPKPath"</font></span><span>&nbsp;</span><span class="attribute"><font color="#ff0000">VALUE</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"LPKfilename.LPK"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">OBJECT</span><span class="tag">&gt;</span></font></strong><span>&nbsp;&nbsp;</span></span></li><li><span>--</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">OBJECT</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">ID</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"test"</font></span><span>&nbsp;&nbsp;</span></span></li><li><span></span><span class="attribute"><font color="#ff0000">CLASSID</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"CLSID:7E0ED402-E1D4-4E40-95C2-FEA17B4FA60E"</font></span><span>&nbsp;&nbsp;</span></span></li><li><span></span><span class="attribute"><font color="#ff0000">CODEBASE</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"test.CAB#version=1,0,0,1"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">OBJECT</span><span class="tag">&gt;</span></font></strong><span>&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none" class="html" name="code">&lt;!--	如果这页上的任何控件需要授权，您必须
	创建一个授权包文件。 运行 LPK_TOOL.EXE 来创建
	要求的 LPK 文件。 LPK_TOOL.EXE 将从 ActiveX SDK 中找到，
	http://www.microsoft.com/intdev/sdk/sdk.htm. 如果您有 Visual
	Basic 6.0 CD, 您可以在\Tools\LPK_TOOL 目录下找到它。

	下面是对象标记的例子：

&lt;OBJECT CLASSID="clsid:5220cb21-c88d-11cf-b347-00aa00a28331"&gt;
	&lt;PARAM NAME="LPKPath" VALUE="LPKfilename.LPK"&gt;
&lt;/OBJECT&gt;
--&gt;

&lt;OBJECT ID="test"
CLASSID="CLSID:7E0ED402-E1D4-4E40-95C2-FEA17B4FA60E"
CODEBASE="test.CAB#version=1,0,0,1"&gt;
&lt;/OBJECT&gt;</pre>
<p>&nbsp;其中上面注释掉的lpk这段根据他的描述生成了相应的lpk文件，将代码放到jsp页面中，部署。</p>
<p>&nbsp;</p>
<p>2，部署后查看测试效果，但是效果不尽如人意，提示&#8220;非安全控件&#8221;而且也无法安装，这是由于控件没有认证，认证还是需要花钱的，自然不行。</p>
<p>&nbsp;</p>
<p>3，只能通过本地注册控件的方式，这样就不需要ie的认证，但是控件提示的信息也是&#8220;无法识别的控件&#8221;。</p>
<p>4，使用installshield9来制作客户端注册包，具体的不说了只要注意一个个问题。注册控件的脚步</p>
<p>&nbsp;</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">C代码 <a title="复制代码" href="http://agun.iteye.com/admin/blogs/1431227#"><img alt="复制代码" src="http://agun.iteye.com/images/icon_copy.gif" /></a></div></div>
<ol class="dp-cpp"><li><span>function&nbsp;OnEnd()&nbsp;&nbsp; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;szDLL,&nbsp;szReg,&nbsp;szCmd;&nbsp; &nbsp;&nbsp;</span></li><li><span>begin&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;szReg&nbsp;=&nbsp;WINSYSDIR&nbsp;^&nbsp;</span><span class="string">"regsvr32.exe"</span><span>; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;szDLL&nbsp;=&nbsp;TARGETDIR&nbsp;^&nbsp;</span><span class="string">"test.ocx"</span><span>;&nbsp;</span><span class="comment">//如果是MSI工程，可以用INSTALLDIR代替TARGETDIR </span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;szCmd&nbsp;=&nbsp;</span><span class="string">"/s&nbsp;\""</span><span>&nbsp;+&nbsp;szDLL&nbsp;+&nbsp;</span><span class="string">"\""</span><span>;&nbsp;</span><span class="comment">//增加静默参数s,&nbsp;增加&nbsp;\&#8221;&nbsp;防止目录路径含空格的情况。&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(!REMOVEONLY)&nbsp;then&nbsp; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LaunchAppAndWait(szReg,&nbsp;szCmd,&nbsp;WAIT);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;endif;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li><li><span>end;&nbsp;&nbsp;</span></li></ol></div><pre style="display: none" class="c" name="code">function OnEnd()  
    string szDLL, szReg, szCmd; 
begin   
    szReg = WINSYSDIR ^ "regsvr32.exe";
    szDLL = TARGETDIR ^ "test.ocx"; //如果是MSI工程，可以用INSTALLDIR代替TARGETDIR
    szCmd = "/s \"" + szDLL + "\""; //增加静默参数s, 增加 \&#8221; 防止目录路径含空格的情况。  
    
    if (!REMOVEONLY) then 
        LaunchAppAndWait(szReg, szCmd, WAIT);     
    endif;    
end;</pre>
<p>&nbsp;</p>
<p>这样注册后，客户端使用就不会有提示，我上面提到了，我自己生成了lpk文件，我也加到页面中了。</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Html代码 <a title="复制代码" href="http://agun.iteye.com/admin/blogs/1431227#"><img alt="复制代码" src="http://agun.iteye.com/images/icon_copy.gif" /></a></div></div>
<ol class="dp-xml"><li><span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">OBJECT</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">CLASSID</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"clsid:5220cb21-c88d-11cf-b347-00aa00a28331"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">PARAM</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">NAME</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"LPKPath"</font></span><span>&nbsp;</span><span class="attribute"><font color="#ff0000">VALUE</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"LPKfilename.LPK"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">OBJECT</span><span class="tag">&gt;</span></font></strong><span>&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none" class="html" name="code">&lt;OBJECT CLASSID="clsid:5220cb21-c88d-11cf-b347-00aa00a28331"&gt;
	&lt;PARAM NAME="LPKPath" VALUE="LPKfilename.LPK"&gt;
&lt;/OBJECT&gt;
</pre>
<p>&nbsp;</p>
<p>但是如果加这句虽然控件可以使用，但是总会有安全提示，很影响使用效果。所以暂时把它去掉了。</p><img src ="http://www.blogjava.net/agun/aggbug/370953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2012-02-29 09:03 <a href="http://www.blogjava.net/agun/archive/2012/02/29/370953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>list合并单元格</title><link>http://www.blogjava.net/agun/archive/2011/10/17/361437.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Mon, 17 Oct 2011 06:44:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2011/10/17/361437.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/361437.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2011/10/17/361437.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/361437.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/361437.html</trackback:ping><description><![CDATA[<div class="blog_content">
<p>1，在今天整理代码的时候，发现原来的一段代码，前台合并单元格。</p>
<p>&nbsp;</p>
<p>需要在后端，原来的列表基础上，再增加一层。</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://agun.iteye.com/admin/blogs/1198422#"><img alt="复制代码" src="http://agun.iteye.com/images/icon_copy.gif" /></a></div></div>
<ol class="dp-j"><li><span>List&lt;CASEListVO&gt;&nbsp;list2&nbsp;=&nbsp;</span><span class="keyword"><font color="#7f0055">super</font></span><span>.doFind(hql.toString(),&nbsp;params.toArray(),&nbsp;currPage,&nbsp;pageSize); &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;ArrayList&lt;List&lt;CASEListVO&gt;&gt;&nbsp;linkedList&nbsp;=&nbsp;</span><span class="keyword"><font color="#7f0055">new</font></span><span>&nbsp;ArrayList&lt;List&lt;CASEListVO&gt;&gt;(); &nbsp;&nbsp;</span></span></li><li><span>List&lt;String&gt;&nbsp;keyList&nbsp;=&nbsp;</span><span class="keyword"><font color="#7f0055">new</font></span><span>&nbsp;ArrayList&lt;String&gt;(); &nbsp;&nbsp;</span></span></li><li><span></span><span class="keyword"><font color="#7f0055">for</font></span><span>&nbsp;(CASEListVO&nbsp;vo&nbsp;:&nbsp;list2) &nbsp;&nbsp;</span></span></li><li><span>{ &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;String&nbsp;key&nbsp;=&nbsp;vo.getItemCode(); &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;List&lt;CASEListVO&gt;&nbsp;tempList&nbsp;=&nbsp;</span><span class="keyword"><font color="#7f0055">new</font></span><span>&nbsp;ArrayList&lt;CASEListVO&gt;(); &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword"><font color="#7f0055">if</font></span><span>&nbsp;(keyList.indexOf(key)&nbsp;==&nbsp;-</span><span class="number"><font color="#c00000">1</font></span><span>) &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keyList.add(key); &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword"><font color="#7f0055">else</font></span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><font color="#7f0055">continue</font></span><span>; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword"><font color="#7f0055">for</font></span><span>&nbsp;(CASEListVO&nbsp;vo1&nbsp;:&nbsp;list2) &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><font color="#7f0055">if</font></span><span>&nbsp;(vo1.getItemCode().endsWith(key)) &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempList.add(vo1); &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;linkedList.add(tempList); &nbsp;&nbsp;</span></li><li><span>} &nbsp;&nbsp;</span></li><li><span>page.setList(linkedList);</span><span class="comment">//返回的列表</span><span>&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none" class="java" name="code">            List&lt;CASEListVO&gt; list2 = super.doFind(hql.toString(), params.toArray(), currPage, pageSize);
               ArrayList&lt;List&lt;CASEListVO&gt;&gt; linkedList = new ArrayList&lt;List&lt;CASEListVO&gt;&gt;();
            List&lt;String&gt; keyList = new ArrayList&lt;String&gt;();
            for (CASEListVO vo : list2)
            {
               String key = vo.getItemCode();
               List&lt;CASEListVO&gt; tempList = new ArrayList&lt;CASEListVO&gt;();
               if (keyList.indexOf(key) == -1)
               {
                  keyList.add(key);
               }
               else
               {
                  continue;
               }
               for (CASEListVO vo1 : list2)
               {
                  if (vo1.getItemCode().endsWith(key))
                  {
                     tempList.add(vo1);
                  }
               }
               linkedList.add(tempList);
            }
            page.setList(linkedList);//返回的列表</pre>
<p>&nbsp;页面上操作，struts2 </p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Html代码 <a title="复制代码" href="http://agun.iteye.com/admin/blogs/1198422#"><img alt="复制代码" src="http://agun.iteye.com/images/icon_copy.gif" /></a></div></div>
<ol class="dp-xml"><li><span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">s:iterator</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">value</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"page"</font></span><span>&nbsp;</span><span class="attribute"><font color="#ff0000">id</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"list"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">c:forEach</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">var</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"recordList"</font></span><span>&nbsp;</span><span class="attribute"><font color="#ff0000">items</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"${list}"</font></span><span>&nbsp;</span><span class="attribute"><font color="#ff0000">varStatus</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"varStatus"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">c:forEach</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">var</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"record"</font></span><span>&nbsp;</span><span class="attribute"><font color="#ff0000">items</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"${recordList}"</font></span><span>&nbsp;</span><span class="attribute"><font color="#ff0000">varStatus</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"status"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">tr</span><span class="tag">&gt;</span></font></strong><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">td</span><span class="tag">&gt;</span></font></strong><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">input</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">name</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"selectIds"</font></span><span>&nbsp;</span><span class="attribute"><font color="#ff0000">type</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"checkbox"</font></span><span>&nbsp;</span><span class="attribute"><font color="#ff0000">value</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"${record.ltVo.listTmpId}"</font></span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute"><font color="#ff0000">oldValue</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"${record.estTmpId&nbsp;}"</font></span><span>&nbsp;</span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">td</span><span class="tag">&gt;</span></font></strong><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;${status.index&nbsp;}-- &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><strong><font color="#006699">&lt;</font></strong></span><span>%=((List)&nbsp;pageContext.getAttribute("recordList")).size()%</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">c:if</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">test</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"${status.index&nbsp;eq&nbsp;0}"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">td</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">rowspan</font></span><span>="</span><span class="tag"><strong><font color="#006699">&lt;</font></strong></span><span>%=((List)&nbsp;pageContext.getAttribute("recordList</span><span class="attribute-value"><font color="#0000ff">")).size()%&gt;"</font></span><span>&nbsp;</span><span class="attribute"><font color="#ff0000">style</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"width:&nbsp;240px;text-align:&nbsp;center;"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;${record.listName} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">td</span><span class="tag">&gt;</span></font></strong><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">c:if</span><span class="tag">&gt;</span></font></strong><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">td</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">style</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"text-align:&nbsp;center;width:200px;"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;${record.itemCode} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">td</span><span class="tag">&gt;</span></font></strong><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">td</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">style</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"text-align:&nbsp;center;width:&nbsp;200px;"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;${record.projectName} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">td</span><span class="tag">&gt;</span></font></strong><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">td</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">style</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"text-align:&nbsp;right;width:&nbsp;200px"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">fmt:formatNumber</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">value</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"${record.rate}"</font></span><span>&nbsp;</span><span class="attribute"><font color="#ff0000">pattern</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"##0.00"</font></span><span>&nbsp;</span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">td</span><span class="tag">&gt;</span></font></strong><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">tr</span><span class="tag">&gt;</span></font></strong><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">c:forEach</span><span class="tag">&gt;</span></font></strong><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">c:forEach</span><span class="tag">&gt;</span></font></strong><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">s:iterator</span><span class="tag">&gt;</span></font></strong><span>&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none" class="html" name="code">	&lt;s:iterator value="page" id="list"&gt;
					&lt;c:forEach var="recordList" items="${list}" varStatus="varStatus"&gt;
						&lt;c:forEach var="record" items="${recordList}" varStatus="status"&gt;
							&lt;tr&gt;
								&lt;td&gt;
									&lt;input name="selectIds" type="checkbox" value="${record.ltVo.listTmpId}"
										oldValue="${record.estTmpId }" /&gt;
								&lt;/td&gt;
								${status.index }--
								&lt;%=((List) pageContext.getAttribute("recordList")).size()%&gt;
								&lt;c:if test="${status.index eq 0}"&gt;
									&lt;td rowspan="&lt;%=((List) pageContext.getAttribute("recordList")).size()%&gt;" style="width: 240px;text-align: center;"&gt;
										${record.listName}
									&lt;/td&gt;
								&lt;/c:if&gt;
								&lt;td style="text-align: center;width:200px;"&gt;
									${record.itemCode}
								&lt;/td&gt;
								&lt;td style="text-align: center;width: 200px;"&gt;
									${record.projectName}
								&lt;/td&gt;
								&lt;td style="text-align: right;width: 200px"&gt;
									&lt;fmt:formatNumber value="${record.rate}" pattern="##0.00" /&gt;
								&lt;/td&gt;
							&lt;/tr&gt;
						&lt;/c:forEach&gt;
					&lt;/c:forEach&gt;
				&lt;/s:iterator&gt;</pre>
<p>&nbsp;</p>
<p>这样根据code在页面上就会显示分组合并单元格的效果。</p></div><img src ="http://www.blogjava.net/agun/aggbug/361437.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2011-10-17 14:44 <a href="http://www.blogjava.net/agun/archive/2011/10/17/361437.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> hibernate 一对多集合 set查询问题</title><link>http://www.blogjava.net/agun/archive/2011/08/19/356882.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Fri, 19 Aug 2011 09:21:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2011/08/19/356882.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/356882.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2011/08/19/356882.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/356882.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/356882.html</trackback:ping><description><![CDATA[<div class="blog_content">
<p>今天解决了一个问题（如题），这个问题一致没有解决，以前的项目中也遇到过但是都没有花时间去研究，这回彻底的整理了一下。问题如：一个老师类（Teacher）和一个学生类（User），一个老师有多个学生，当然这个例子不够好，不管怎样就是这个意思，老是对应多个学生，oneto many </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;set name="users" inverse="true" order-by="column" &gt;&lt;!-- sort="natural"&nbsp;&nbsp; --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="teacher_id" length="36"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;comment&gt;老师表主键&lt;/comment&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/column&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/key&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;one-to-many class="User" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/set&gt;</p>
<p>&nbsp;</p>
<p>以前遇到这个问题，都是通过lazy=false来实现，虽然能实现效果但是效率上会有问题也会产生N+1的查询问题。</p>
<p>我一致比较喜欢使用 hibernate的 left join fetch 方式来抓取结构，但是我现在是要在查询老师的列表中显示他所有的学生，如果用 select teacher from Teacher teacher left join fetch teacher.users这样的方式来得到学生集合，这样老师的数据集合会有重复数据，不知我这样说是否理解，如果遇到我这样的问题应该比较了解了，使用了很多方法也没有通过，当然实现这个效果可以有别的方式（虚列方式，或这采用 native sql ），我现在就是针对这种抓取的方式（暂时还是没有找到方案，如果知道的可以告诉我），我现在采用的方式还是上面的抓取方式，出现的重复数据，我把结果集拿出来之后，把重复的数据过滤掉，这样暂时能解决问题。然后是后面的出去的users 排序的问题，默认我们使用的set set大家都知道是没有顺序的，我们一种方式是 order-by="column" 上面的，采用这种方式来实现排序，另一种方式是采用 sort="natural"&nbsp;方式来实现，但是如果要用sort方式就需要实现compareble 接口 实现 compareTo 方法 来自定义比较的规则，第二种方式我试验一下有点问题，他们的原理都是通过这两个规则 指定set最后的实现类 。</p></div><img src ="http://www.blogjava.net/agun/aggbug/356882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2011-08-19 17:21 <a href="http://www.blogjava.net/agun/archive/2011/08/19/356882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate lazy</title><link>http://www.blogjava.net/agun/archive/2011/08/12/356365.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Fri, 12 Aug 2011 05:17:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2011/08/12/356365.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/356365.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2011/08/12/356365.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/356365.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/356365.html</trackback:ping><description><![CDATA[<p>今天项目组有要使用的hibernate lazy的，我一直对这种lazy的方式是不赞成使用的，所以我的项目组内是明确不能使lazy，包括true和false当然hibernate 默认的模式是true ，但是在程序中我们是可以控制，当然如果不做配置话，也无法在前端使用，其实在项目中，用到lazy的时候并不是特别多（个人观点），大部分的数据都是明确的要在后台查询出来的。用lazy也并不复杂，在web.xml中配置</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Xml代码 <a title="复制代码" href="#"><img alt="复制代码" src="http://www.blogjava.net/images/icon_copy.gif" /></a></div></div>
<ol class="dp-xml"><li><span class="tag">&lt;</span><span class="tag-name">filter</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">filter-name</span><span class="tag">&gt;</span><span>hibernateFilter</span><span class="tag">&lt;/</span><span class="tag-name">filter-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">filter-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.springframework.orm.hibernate3.support.OpenSessionInViewFilter &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">filter-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>singleSession</span><span class="tag">&lt;/</span><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>false</span><span class="tag">&lt;/</span><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li><span></span><span class="tag">&lt;/</span><span class="tag-name">filter</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li><span></span><span class="tag">&lt;</span><span class="tag-name">filter-mapping</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">filter-name</span><span class="tag">&gt;</span><span>hibernateFilter</span><span class="tag">&lt;/</span><span class="tag-name">filter-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">url-pattern</span><span class="tag">&gt;</span><span>*.do</span><span class="tag">&lt;/</span><span class="tag-name">url-pattern</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li><span></span><span class="tag">&lt;/</span><span class="tag-name">filter-mapping</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none" class="xml" name="code">	&lt;filter&gt;
		&lt;filter-name&gt;hibernateFilter&lt;/filter-name&gt;
		&lt;filter-class&gt;
			org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
		&lt;/filter-class&gt;
		&lt;init-param&gt;
			&lt;param-name&gt;singleSession&lt;/param-name&gt;
			&lt;param-value&gt;false&lt;/param-value&gt;
		&lt;/init-param&gt;
	&lt;/filter&gt;

	&lt;filter-mapping&gt;
		&lt;filter-name&gt;hibernateFilter&lt;/filter-name&gt;
		&lt;url-pattern&gt;*.do&lt;/url-pattern&gt;
	&lt;/filter-mapping&gt;</pre>
<p>&nbsp;</p>
<p>就可以使用延迟加载了，spring通过filter的方式对绑定hibernate session 到request的线程中。</p>
<p>that binds a Hibernate Session to the thread for the entire processing of the request</p>
<p>&nbsp;</p>
<p>刚开始我是把上面这段配置随便放到web.xml中，一致不成功总报session 关闭，不起作用，最后查了一下，我把这个filter放到了struts的filter之上，就可以了。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>说明FlushMode有五种属性<br /><br />1 <code><span style="font-family: NSimsun">NEVEL&nbsp;&nbsp; <br /></span></code></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">已经废弃了，被MANUAL取代了</span></div>
<p><br /><span style="font-family: NSimsun"><code>2 MANUAL </code><br /></span></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">spring3.x中的opensessioninviewfilter已经将默认的FlushMode设置为MANUAL了；<br />如果FlushMode是MANUAL或NEVEL,在操作过程中hibernate会将事务设置为readonly，所以在</span><span style="color: #000000">增加、删除或修改</span><span style="color: #000000">操作过程中会出现如下错误<br />org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read</span><span style="color: #000000">-</span><span style="color: #000000">only mode (FlushMode.NEVER) </span><span style="color: #000000">-</span><span style="color: #000000"> turn your Session into FlushMode.AUTO or remove </span><span style="color: #000000">'</span><span style="color: #000000">readOnly</span><span style="color: #000000">'</span><span style="color: #000000"> marker from transaction definition；<br />解决办法网上有很多；<br /></span><span style="color: #000000">1</span><span style="color: #000000"> 配置事务，spring会读取事务中的各种配置来覆盖hibernate的session中的FlushMode；<br /></span><span style="color: #000000">2</span><span style="color: #000000"> 先编程式修改FlushMode，比如session.setFlushMode(FlushMode.AUTO); 这样hibernate就会自动去除readonly限制；<br /></span><span style="color: #000000">3</span><span style="color: #000000"> 直接修改opensessioninviewfilter过滤器的配置，配置过滤器的时候配置<br /></span><span style="color: #000000">&lt;</span><span style="color: #000000">filter</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000">openSession</span><span style="color: #000000">&lt;/</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #0000ff">class</span><span style="color: #000000">&gt;</span><span style="color: #000000">org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</span><span style="color: #000000">&lt;/</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #0000ff">class</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">init</span><span style="color: #000000">-</span><span style="color: #000000">param</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">param</span><span style="color: #000000">-</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000">flushMode</span><span style="color: #000000">&lt;/</span><span style="color: #000000">param</span><span style="color: #000000">-</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">param</span><span style="color: #000000">-</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000">AUTO</span><span style="color: #000000">&lt;/</span><span style="color: #000000">param</span><span style="color: #000000">-</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">init</span><span style="color: #000000">-</span><span style="color: #000000">param</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">filter</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span></div>
<p><code><span style="font-family: NSimsun">3 AUTO<br /></span></code></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">设置成auto之后，当程序进行查询、提交事务或者调用session.flush()的时候，都会使缓存和数据库进行同步，也就是刷新数据库</span></div>
<p><code><span style="font-family: NSimsun">4 COMMIT<br /></span></code></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">提交事务或者session.flush()时，刷新数据库；查询不刷新</span></div>
<p><br /><code><span style="font-family: NSimsun">5 ALWAYS<br /></span></code></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">每次进行查询、提交事务、session.flush()的时候都会刷数据库<br /><strong>这里需要说一下和AUTO的区别，当hibernate缓存中的对象被改动之后，会被标记为脏数据（即与数据库不同步了）。当session设置为FlushMode.AUTO时，hibernate在进行查询的时候会判断缓存中的数据是否为脏数据，是则刷数据库，不是则不刷，而always是直接刷新，不进行任何判断。很显然auto比always要高效得多。</strong><br /></span></div>
<p>&nbsp;</p><img src ="http://www.blogjava.net/agun/aggbug/356365.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2011-08-12 13:17 <a href="http://www.blogjava.net/agun/archive/2011/08/12/356365.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2 泛型 Hibernate</title><link>http://www.blogjava.net/agun/archive/2011/05/08/349767.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Sun, 08 May 2011 01:20:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2011/05/08/349767.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/349767.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2011/05/08/349767.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/349767.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/349767.html</trackback:ping><description><![CDATA[<p>今天在整理代码的时候，我的Action 和 DAO基类都是使用的泛型：如Action&lt;T&gt; DAO&lt;T&gt;。</p>
<p>&nbsp;</p>
<p>我用的是Struts2基类代码，如下</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://agun.iteye.com/blog/1036013#"><img alt="复制代码" src="http://agun.iteye.com/images/icon_copy.gif" /></a>&nbsp;<a title="收藏这段代码" onclick="code_favorites_do_favorite(this);return false;" href="javascript:void()"><img class="star" alt="收藏代码" src="http://agun.iteye.com/images/icon_star.png" /><img class="spinner" style="display: none" src="http://agun.iteye.com/images/spinner.gif"  alt="" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">abstract</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;BaseStrutsAction&nbsp;</span><span class="keyword">extends</span><span>&nbsp;ActionSupport&nbsp;</span><span class="keyword">implements</span><span>&nbsp;ModelDriven&lt;BaseStrutsForm&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;Logger&nbsp;log&nbsp;=&nbsp;Logger.getLogger(BaseStrutsAction.</span><span class="keyword">class</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" title="struts2 泛型 Hibernate" style="display: none" name="code" pre_index="0" source_url="http://agun.iteye.com/blog/1036013" codeable_type="Post" codeable_id="2090345">public abstract class BaseStrutsAction extends ActionSupport implements ModelDriven&lt;BaseStrutsForm&gt;
{
public static final Logger log = Logger.getLogger(BaseStrutsAction.class);
}</pre>
<p>&nbsp;先说一下：</p>
<p><span style="color: #ff0000"><span style="font-size: small">一，struts2的ModelDriven</span> （下面来源网络）</span></p>
<p>&nbsp;</p>
<p style="text-indent: 2em">可以根据Action属性的不同将它分为两类：Field-Driven（属性驱动） Action和Model-Driven（模型驱动） Action。 <br />
一、Field-Driven（属性驱动）Action，Action拥有自己的属性，这些属性一般是Java的基本类型。表单字段直接和Action的属性 对应。</p>
<p style="text-indent: 2em">二、实现了modelDriven接口可以在action中直接获得例如User对象，它会将Object getModel()取得的User放到ValueStack中。可以理解为将这个User的属性追加到Action中。它主要是作用是实现类似 Struts的FormBean功能。</p>
<p style="text-indent: 2em">在struts2中，提供了一种直接使用领域对象的方式，就是让action实现com.opensymphony.xwork2.ModelDriven接口，ModelDriven让你可以直接操作应用程序中的领域对象，允许你在web层和业务层使用相同的对象。</p>
<p style="text-indent: 2em">ModelDriven接口只有一个方法</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Object getModel() {<br />
return null;<br />
}</p>
<p style="text-indent: 2em">该方法返回一个用于接收用户输入数据的对象模型，在这个模型对象中的属性可以直接通过(属性名)userName来访问，而不需要使用（对象名.属 性名）user.userName这种格式来访问了，在action也不需要对对象提供getter和setter方法了，但是必须要在action中进 行new操作</p>
<p style="text-indent: 2em">如下</p>
<p style="text-indent: 2em">//&nbsp;ModelDriven要使用泛型哦</p>
<p style="text-indent: 2em">public class LoginAction extends ActionSupport<span style="color: #ff0000"> implements ModelDriven&lt;User&gt;</span>{</p>
<p style="text-indent: 2em">private static final long serialVersionUID = -6434128483294080524L;</p>
<p style="text-indent: 2em">//这里必须要new<br />
private User user=new User();<br />
public String login() throws Exception {<br />
// TODO Auto-generated method stub&nbsp;&nbsp;<br />
return SUCCESS;<br />
}</p>
<p style="text-indent: 2em">//这里是实现接口方法</p>
<p style="text-indent: 2em">@Override<br />
public User getModel() {<br />
// TODO Auto-generated method stub</p>
<p style="text-indent: 2em">//别忘记了，要把返回值写上哦<br />
return user;<br />
}<br />
}</p>
<p style="text-indent: 2em">这样一个ModelDriven就实现完毕了</p>
<p style="text-indent: 2em">和属性驱动的Action有很大的区别，下面一一列举：</p>
<p style="text-indent: 2em">（1）模型驱动的Action必须实现ModelDriven接口，而且要提供相应的泛型，这里当然就是具体使用的Java Bean了。</p>
<p style="text-indent: 2em">（2）实现ModelDriven的getModel方法，其实就是简单的返回泛型的一个对象。</p>
<p style="text-indent: 2em">（3）在Action提供一个泛型的私有对象，这里就是定义一个User的user对象，并提供相应的getter与setter。</p>
<p style="text-indent: 2em">好了，上面的三件事做完之后，Action就会去自动调用User的setter将表单中的name属性的值赋给User中的属性。而Action的后续处理的Jsp页面后者是Servlet就可以使用user对象了。</p>
<p style="text-indent: 2em">到底是用属性驱动和是模型驱动呢？ </p>
<p style="text-indent: 2em">这个问题困扰了很多Struts2的初学者，我这里提供一些建议：</p>
<p style="text-indent: 2em">（1）请你统一整个系统中的Action使用的驱动模型，即要么都是用属性驱动，要么都是用模型驱动。</p>
<p style="text-indent: 2em">（2）如果你的DB中的持久层的对象与表单中的属性都是一一对应的话，那么就使用模型驱动吧，毕竟看起来代码要整洁得多。</p>
<p style="text-indent: 2em">（3）如果表单的属性不是一一对应的话，那么就应该使用属性驱动，否则，你的系统就必须提供两个Bean，一个对应表单提交的数据，另一个用与持久层。</p>
<p style="text-indent: 2em"><span style="font-size: small; color: #ff0000">二，持久层基类 HibernateDao</span></p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em"><span style="font-size: x-small">代码如：</span></p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://agun.iteye.com/blog/1036013#"><img alt="复制代码" src="http://agun.iteye.com/images/icon_copy.gif" /></a>&nbsp;<a title="收藏这段代码" onclick="code_favorites_do_favorite(this);return false;" href="javascript:void()"><img class="star" alt="收藏代码" src="http://agun.iteye.com/images/icon_star.png" /><img class="spinner" style="display: none" src="http://agun.iteye.com/images/spinner.gif"  alt="" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;HibernateDao&lt;T,&nbsp;PK&nbsp;</span><span class="keyword">extends</span><span>&nbsp;Serializable&gt;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;用于Dao层子类的构造函数. </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;通过子类的泛型定义取得对象类型Class. </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;eg. </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;public&nbsp;class&nbsp;UserDao&nbsp;extends&nbsp;HibernateDao&lt;User,&nbsp;Long&gt;{ </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;} </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;HibernateDao()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">super</span><span>(); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" title="struts2 泛型 Hibernate" style="display: none" name="code" pre_index="1" source_url="http://agun.iteye.com/blog/1036013" codeable_type="Post" codeable_id="2090345">public class HibernateDao&lt;T, PK extends Serializable&gt;  {
/**
* 用于Dao层子类的构造函数.
* 通过子类的泛型定义取得对象类型Class.
* eg.
* public class UserDao extends HibernateDao&lt;User, Long&gt;{
* }
*/
public HibernateDao() {
super();
}
</pre>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em"><span style="color: #ff0000">上面的代码，基类没有使用HibernateDaoSupport，我们需要自己引入SessionFactory。</span></p>
<p style="text-indent: 2em">持久层基类，一般Spring的Hibernate ORM <a href="http://agun.iteye.com/view/66971.htm" target="_blank">框架</a>带来了方便的HibernateDaoSupport类,你的<a href="http://agun.iteye.com/view/160596.htm" target="_blank">DAO</a>类可以继承它: </p>
<p style="text-indent: 2em">　　public class DaoHibernate extends HibernateDaoSupport { </p>
<p style="text-indent: 2em">　　................. </p>
<p style="text-indent: 2em">　　} </p>
<p style="text-indent: 2em">　　<span style="color: #ff0000">如果你选择这种设计,就需要动态注入SessionFactory而HibernateDaoSupport包含这个属性</span>.这个类提供了一个方便的方法getHibernateTemplate(); 就能得到HibernateTemplate的一个实例.它也有getSession()和releaseSession,以便于你应为某些原因而不使用HibernateTempate的情况下执行Hibernate操作。 </p>
<p style="text-indent: 2em">　　HibernateDaoSupport提供了基于AOP事务的自动处理，程序员完全可以不用理会事务的开始与提交。在JDBC中一个Connection对象使用一个事务，那么在Hibernate中一个事务肯定要关联一个SessionFactory了，然而这个SessionFactory却没有在DAO中体现。其实主要的原因是HibernateDaoSupport类已经默默地做了封装的工作，它用一个setSessionFactory方法将SessionFactory进行注入，所以继承自HibernateDaoSupport类的DAO都会具有SessionFactory的属性，从而可以通过SessionFactory创建Session实例操作数据库。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">如果使用像 public class HibernateDao&lt;T, PK extends Serializable&gt;&nbsp; 这样的泛型基类就会有问题，可以拿个T代表任意类型，Java的泛型拿不到T.class，就无法得到类对象，&nbsp;如下面的clazz，</p>
<p style="text-indent: 2em">public T get(final PK id) {<br />
&nbsp;&nbsp;Assert.notNull(id, "id不能为空");<br />
&nbsp;&nbsp;return (T) getSession().load(<span style="color: #ff0000">clazz</span>, id);<br />
&nbsp;}</p>
<p style="text-indent: 2em">最后在网上找到了解决方案，可以使用泛型public class HibernateDao&lt;T, PK extends Serializable&gt;基类了。</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://agun.iteye.com/blog/1036013#"><img alt="复制代码" src="http://agun.iteye.com/images/icon_copy.gif" /></a>&nbsp;<a title="收藏这段代码" onclick="code_favorites_do_favorite(this);return false;" href="javascript:void()"><img class="star" alt="收藏代码" src="http://agun.iteye.com/images/icon_star.png" /><img class="spinner" style="display: none" src="http://agun.iteye.com/images/spinner.gif"  alt="" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">abstract</span><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;BaseHibernateEntityDao&lt;T&gt;&nbsp;</span><span class="keyword">extends</span><span>&nbsp;HibernateDaoSupport&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;</span><span class="keyword">private</span><span>&nbsp;Class&lt;T&gt;&nbsp;entityClass; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;BaseHibernateEntityDao()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;SPAN&nbsp;style=</span><span class="string">"COLOR:&nbsp;#000000"</span><span>&gt;entityClass&nbsp;=(Class&lt;T&gt;)&nbsp;((ParameterizedType)&nbsp;getClass() &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getGenericSuperclass()).getActualTypeArguments()[</span><span class="number">0</span><span>];&lt;/SPAN&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;T&nbsp;get(Serializable&nbsp;id)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;o&nbsp;=&nbsp;(T)&nbsp;getHibernateTemplate().get(entityClass,&nbsp;id); &nbsp;&nbsp;</span></li>
    <li><span>} &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" title="struts2 泛型 Hibernate" style="display: none" name="code" pre_index="2" source_url="http://agun.iteye.com/blog/1036013" codeable_type="Post" codeable_id="2090345">abstract public class BaseHibernateEntityDao&lt;T&gt; extends HibernateDaoSupport {
private Class&lt;T&gt; entityClass;
public BaseHibernateEntityDao() {
<span style="color: #000000">entityClass =(Class&lt;T&gt;) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];</span>
}
public T get(Serializable id) {
T o = (T) getHibernateTemplate().get(entityClass, id);
}
}</pre>
<p style="text-indent: 2em"><span style="color: #ff0000">重点这句：&nbsp;entityClass =(Class&lt;T&gt;) ((ParameterizedType) getClass()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .getGenericSuperclass()).getActualTypeArguments()[0];<br />
</span></p>
<img src ="http://www.blogjava.net/agun/aggbug/349767.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2011-05-08 09:20 <a href="http://www.blogjava.net/agun/archive/2011/05/08/349767.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数字签名流程</title><link>http://www.blogjava.net/agun/archive/2011/04/24/348921.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Sun, 24 Apr 2011 08:27:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2011/04/24/348921.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/348921.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2011/04/24/348921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/348921.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/348921.html</trackback:ping><description><![CDATA[<img height="361" alt="" src="http://dl.iteye.com/upload/attachment/469822/bc2d7cac-5717-3356-bfb3-62cbed24214f.jpg" width="609" border="0" /><br />
<p>数字签名流程个图</p>
<p>&nbsp;</p>
<p>上面的图描述了用户A和用户B间通讯流程。</p>
<p>1，用户A将明文通过hash运算（散列）生成<span style="color: #ff0000">数字摘要1</span>，用户A用自己的私钥对摘要进行加密生成<span style="color: #ff0000">数字签名1.</span></p>
<p><span style="color: #000000">2，用户A将明文+<span style="color: #ff0000">数字签名1</span>+A用户的公钥（证书），准备将这些信息发到B用户，但是这个过程中，用户A明文是不安全的是可见的，我们需要对这三个文件进行加密。</span></p>
<p>3，用户A通过一个&#8220;对称加密&#8221;（对称加密速度很快，知道密钥就可以解密）对其进行加密将其生成<span style="color: #ff0000">秘文1</span>，要想这次加密成功关键就是要保护这个<span style="color: #ff0000">对称加密的密钥1</span>。</p>
<p>4，为了保证上面的加密安全，使用用户B的公钥对&#8220;<span style="color: #ff0000">对称加密的密钥1</span>&#8221;进行了一次加密处理，生成一个<span style="color: #ff0000">数字信封1</span>，此时这个<span style="color: #ff0000">数字信封1</span>+<span style="color: #ff0000">秘文1</span><span style="color: #000000">打包装入就可以发送给用B了。</span></p>
<p>5，用户B接收到信，看到<span style="color: #ff0000">数字信封1<span style="color: #000000">+</span><span style="color: #ff0000">秘文1</span></span><span style="color: #000000">，用户B用私钥解密</span><span style="color: #ff0000">数字信封1</span><span style="color: #000000">，得到了&#8220;<span style="color: #ff0000">对称加密的密钥1</span>&#8221;，通过这个对称加密密钥对<span style="color: #ff0000">秘文1</span>解密，就可以解开密文。</span></p>
<p>6，解开<span style="color: #ff0000">秘文1</span><span style="color: #000000">解则看到了A将明文+<span style="color: #ff0000">数字签名1</span>+A用户的公钥（证书），这三个文件，这个时候已经可以确认是用户A发的信息了，但是还要验证文件在传输过程中是否被篡改。</span></p>
<p>7，用户B将明文通过hash运算（散列）生成<span style="color: #ff0000">数字摘要2</span><span style="color: #000000">，同时用得到的A用户的公钥（证书）对</span><span style="color: #ff0000">数字签名1</span><span style="color: #000000">进行解密生成原来的</span><span style="color: #ff0000">数字摘要1</span><span style="color: #000000">，如果此时的</span><span style="color: #ff0000">数字摘要1<span style="color: #000000">同</span>数字摘要2</span><span style="color: #000000">相同那么说明整个过程是安全而有效的。</span></p>
<p>&nbsp;</p>
 <img src ="http://www.blogjava.net/agun/aggbug/348921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2011-04-24 16:27 <a href="http://www.blogjava.net/agun/archive/2011/04/24/348921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数字签名</title><link>http://www.blogjava.net/agun/archive/2011/04/24/348918.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Sun, 24 Apr 2011 06:40:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2011/04/24/348918.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/348918.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2011/04/24/348918.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/348918.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/348918.html</trackback:ping><description><![CDATA[<div class="blog_content">
<p>好的文章 <a href="http://www.ibm.com/developerworks/cn/java/l-security/">http://www.ibm.com/developerworks/cn/java/l-security/</a></p>
<p>&nbsp;</p>
<p>数字签名以电子形式存在于数据信息之中的，或作为其附件的或逻辑上与之有联系的数据，可用于辨别数据签署人的身份，并表明签署人对数据信息中包含的信息的认可。（摘自百度）</p>
<p>&nbsp;</p>
<p>数字签名（又称<a href="http://agun.iteye.com/view/355291.htm" target="_blank">公钥</a>数字签名、电子签章）是一种类似写在纸上的普通的物理签名，但是使用了公钥加密领域的技术实现，用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算，一个用于签名，另一个用于验证</p>
<p>&nbsp;</p>
<p><span class="headline-content">基本介绍</span>　　数字签名不是指将你的签名扫描成数字图像，或者用<a href="http://agun.iteye.com/view/741084.htm" target="_blank">触摸板</a>获取的签名，更不是你的<a href="http://agun.iteye.com/view/704241.htm" target="_blank">落款</a>。 </p>
<p>　　数字签名了的文件的完整性是很容易验证的（不需要骑缝章，骑缝签名，也不需要笔迹专家），而且数字签名具有<a href="http://agun.iteye.com/view/992756.htm" target="_blank">不可抵赖性</a>（不需要笔迹专家来验证）。 </p>
<p>　　简单地说,所谓数字签名就是附加在<a href="http://agun.iteye.com/view/2191734.htm" target="_blank">数据单元</a>上的一些数据,或是对数据单元所作的<a href="http://agun.iteye.com/view/7411.htm" target="_blank">密码</a>变换。这种数据或变换允许数据单元的接收者用以确认数据单元的来源和数据单元的完整性并保护数据,防止被人(例如接收者)进行伪造。它是对电子形式的消息进行签名的一种方法,一个签名消息能在一个<a href="http://agun.iteye.com/view/71985.htm" target="_blank">通信网络</a>中传输。基于公钥密码体制和<a href="http://agun.iteye.com/view/493846.htm" target="_blank">私钥</a>密码体制都可以获得数字签名,目前主要是基于公钥密码体制的数字签名。包括普通数字签名和特殊数字签名。普通数字签名<a href="http://agun.iteye.com/view/7420.htm" target="_blank">算法</a>有RSA、ElGamal、Fiat-Shamir、Guillou- Quisquarter、Schnorr、Ong-Schnorr-Shamir数字签名算法、Des/DSA,椭圆曲线数字签名算法和有限自动机数字签名算法等。特殊数字签名有<a href="http://agun.iteye.com/view/1344005.htm" target="_blank">盲签名</a>、代理签名、<a href="http://agun.iteye.com/view/3080709.htm" target="_blank">群签名</a>、不可否认签名、公平盲签名、门限签名、具有消息恢复功能的签名等,它与具体应用环境密切相关。显然,数字签名的应用涉及到法律问题,<a href="http://agun.iteye.com/view/2645643.htm" target="_blank">美国联邦政府</a>基于有限域上的离散对数问题制定了自己的<a href="http://agun.iteye.com/view/4444449.htm" target="_blank">数字签名标准</a>(DSS)。 </p>
<p>　　数字签名（Digital Signature）技术是<a href="http://agun.iteye.com/view/7595.htm" target="_blank">不对称加密算法</a>的典型应用。数字签名的应用过程是，数据源发送方使用自己的私钥对数据校验和或其他与数据内容有关的变量进行加密处理，完成对数据的合法&#8220;签名&#8221;，数据接收方则利用对方的<a href="http://agun.iteye.com/view/355291.htm" target="_blank">公钥</a>来解读收到的&#8220;数字签名&#8221;，并将解读结果用于对<a href="http://agun.iteye.com/view/702953.htm" target="_blank">数据完整性</a>的检验，以确认签名的合法性。<a href="http://agun.iteye.com/view/297231.htm" target="_blank">数字签名技术</a>是在网络系统虚拟环境中确认<a href="http://agun.iteye.com/view/1034208.htm" target="_blank">身份</a>的重要技术，完全可以代替现实过程中的&#8220;亲笔签字&#8221;，在技术和法律上有保证。在数字签名应用中，发送者的公钥可以很方便地得到，但他的私钥则需要严格保密。 </p>
<h2 class="headline-1 bk-sidecatalog-title"><span class="headline-content">主要功能</span></h2>
<p>　　保证信息传输的完整性、发送者的<a href="http://agun.iteye.com/view/1014826.htm" target="_blank">身份认证</a>、防止交易中的抵赖发生。 </p>
<p>　　数字签名技术是将摘要信息用发送者的私钥加密，与<a href="http://agun.iteye.com/view/1455951.htm" target="_blank">原文</a>一起传送给接收者。接收者只有用发送的公钥才能解密被加密的摘要信息，然后用HASH函数对收到的原文产生一个摘要信息，与解密的摘要信息对比。如果相同，则说明收到的信息是完整的，在传输过程中没有被修改，否则说明信息被修改过，因此数字签名能够验证信息的完整性。 </p>
<p>　　数字签名是个加密的过程，数字签名验证是个解密的过程。 </p>
<h2 class="headline-1 bk-sidecatalog-title"><span class="headline-content">签名过程</span></h2>
<p>　　报文的发送方用一个哈希函数从报文文本中生成报文摘要（散列值）。发送方用自己的私人密钥对这个散列值进行加密。然后，这个加密后的散列值将作为报文的附件和报文一起发送给报文的接收方。报文的接收方首先用与发送方一样的哈希函数从接收到的原始报文中计算出报文摘要，接着再用发送方的公用密钥来对报文附加的数字签名进行解密。如果两个散列值相同、那么接收方就能确认该数字签名是发送方的。通过数字签名能够实现对原始报文的鉴别。 </p>
<p>　　数字签名有两种功效：一是能确定消息确实是由发送方签名并发出来的，因为别人假冒不了发送方的签名。二是数字签名能确定消息的完整性。因为数字签名的特点是它代表了文件的特征，文件如果发生改变，数字签名的值也将发生变化。不同的文件将得到不同的数字签名。 一次数字签名涉及到一个哈希函数、发送者的公钥、发送者的私钥。 </p>
<h2 class="headline-1 bk-sidecatalog-title"><span class="headline-content">个人安全邮件证书</span></h2>
<p>　　具有数字签名功能的个人安全邮件证书是用户证书的一种，是指单位用户收发电子邮件时采用证书机制保证安全所必须具备的证书。个人安全<a href="http://agun.iteye.com/view/1545813.htm" target="_blank">电子邮件证书</a>是符合x.509标准的数字安全证书，结合<a href="http://agun.iteye.com/view/16501.htm" target="_blank">数字证书</a>和<a href="http://agun.iteye.com/view/487770.htm" target="_blank">S/MIME</a>技术对普通电子邮件做加密和数字签名处理，确保电子邮件内容的<a href="http://agun.iteye.com/view/421194.htm" target="_blank">安全性</a>、机密性、发件人身份确认性和不可抵赖性。 具有数字签名功能的 个人安全邮件证书中包含证书持有人的<a href="http://agun.iteye.com/view/126647.htm" target="_blank">电子邮件地址</a>、证书持有人的公钥、颁发者(CA)以及颁发者对该证书的签名。个人安全邮件证书功能的实现决定于用户使用的邮件系统是否支持相应功能。目前， MS Outlook 、Outlook Express、Foxmail及CA安全<a href="http://agun.iteye.com/view/2296101.htm" target="_blank">电子邮件系统</a>均支持相应功能。使用个人安全邮件证书可以收发加密和数字签名邮件，保证电子邮件传输中的机密性、完整性和不可否认性，确保电子邮件通信各方身份的真实性。 </p>
<h2 class="headline-1 bk-sidecatalog-title"><span class="headline-content">用数字签名识别病毒</span></h2>
<p>　　<sup>[1]</sup><a name="ref_%5B1%5D"></a><sup>[2]</sup><a name="ref_%5B2%5D"></a>如何区分数字签名攻击呢？有两个方法： </p>
<p>　　1.查看数字签名的详细信息，我们应该查看该数字签名的详细信息，点击&#8220;详细信息&#8221;按钮即可。 </p>
<p>　　我们会发现正常EXE和感染（或捆绑<a href="http://agun.iteye.com/view/931.htm" target="_blank">木马</a>）后的EXE数字签名的区别 </p>
<p>　　正常EXE的数字签名详细信息 </p>
<p>　　被篡改后的EXE数字签名信息无效 </p>
<p>　　方法2，使用数字签名验证<a href="http://agun.iteye.com/view/17674.htm" target="_blank">程序</a>sigcheck.exe （可以百度一下找这个工具，著名系统工具包Sysinternals Suite的组件之一。） </p>
<p>　　数字签名异常的结果为： </p>
<p>　　C:\Documents and Settings\litiejun\??\modify.exe: </p>
<p>　　Verified: Unsigned </p>
<p>　　File date: 15:46 2008-5-23 </p>
<p>　　Publisher: n/a </p>
<p>　　Description: n/a </p>
<p>　　Product: n/a </p>
<p>　　Version: n/a </p>
<p>　　File version: n/a </p>
<p>　　数字签名正常的结果为： </p>
<p>　　C:\Documents and Settings\litiejun\??\che.exe: </p>
<p>　　Verified: Signed </p>
<p>　　Signing date: 16:28 2008-4-29 </p>
<p>　　Publisher: n/a </p>
<p>　　Description: n/a </p>
<p>　　Product: n/a </p>
<p>　　Version: n/a </p>
<p>　　File version: n/a </p>
<h2 class="headline-1 bk-sidecatalog-title"><span class="headline-content">原因分析</span></h2>
<p>　　1，精心设计的感染 </p>
<p>　　当EXE被感染时，是很容易破坏文件的数字签名信息的，如果攻击者感染或破坏文件时，有意不去破坏EXE中有关数字签名的部分，就可能出现感染后，数字签名看上去正常的<a href="http://agun.iteye.com/view/780206.htm" target="_blank">情况</a>。但认真查看<a href="http://agun.iteye.com/view/1229816.htm" target="_blank">文件属性</a>或校验文件的HASH值，你会发现该EXE程序已经不是最原始的版本了。 </p>
<p>　　2.该<a href="http://agun.iteye.com/view/37.htm" target="_blank">软件</a>发行商的数字签名文件被盗，攻击者可以把捆绑木马或感染病毒后的EXE程序，也打包上数字签名，这种情况下就更严重了。企业如果申请了数字签名证书，一定要妥善保管，否则后患无穷。 </p>
<h2 class="headline-1 bk-sidecatalog-title"><span class="headline-content">使用方法</span></h2>
<p>　　你可以对你发出的每一封电子邮件进行数字签名。这不是指落款，普遍把落款讹误成签名。 </p>
<p>　　在我国大陆，数字签名是具<a href="http://agun.iteye.com/view/21562.htm" target="_blank">法律效力</a>的，正在被普遍使用。2000年，中华人民共和国的新《<a href="http://agun.iteye.com/view/1552.htm" target="_blank">合同法</a>》首次确认了<a href="http://agun.iteye.com/view/1139813.htm" target="_blank">电子合同</a>、<a href="http://agun.iteye.com/view/15288.htm" target="_blank">电子签名</a>的法律效力。2005年4月1日起，中华人民共和国首部《<a href="http://agun.iteye.com/view/732139.htm" target="_blank">电子签名法</a>》正式实施。 </p>
<h2 class="headline-1 bk-sidecatalog-title"><span class="headline-content">原理特点</span></h2>
<p>　　每个人都有一对&#8220;钥匙&#8221;（数字身份），其中一个只有她/他本人知道（<a href="http://agun.iteye.com/view/934.htm" target="_blank">密钥</a>），另一个公开的（公钥）。签名的时候用密钥，验证签名的时候用公钥。又因为任何人都可以落款申称她/他就是你，因此公钥必须向接受者信任的人（身份<a href="http://agun.iteye.com/view/124043.htm" target="_blank">认证机构</a>）来注册。注册后身份认证机构给你发一数字证书。对<a href="http://agun.iteye.com/view/1365311.htm" target="_blank">文件签名</a>后，你把此数字证书连同文件及签名一起发给接受者，接受者向身份认证机构求证是否真地是用你的密钥签发的文件。 </p>
<p>　　在通讯中使用数字签名一般基于以下原因： </p>
<h3 class="headline-2 bk-sidecatalog-title"><a name="8_1"></a><span class="headline-content">鉴权</span> </h3>
<p>　　公钥加密系统允许任何人在发送信息时使用公钥进行加密，数字签名能够让信息接收者确认发送者的身份。当然，接收者不可能百分之百确信发送者的真实身份，而只能在<a href="http://agun.iteye.com/view/3114489.htm" target="_blank">密码系统</a>未被破译的情况下才有理由确信。 </p>
<p>　　鉴权的重要性在财务数据上表现得尤为突出。举个例子，假设一家<a href="http://agun.iteye.com/view/20233.htm" target="_blank">银行</a>将指令由它的分行传输到它的中央管理系统，指令的格式是(a,b)，其中a是账户的账号，而b是账户的现有金额。这时一位远程<a href="http://agun.iteye.com/view/88584.htm" target="_blank">客户</a>可以先存入100元，观察传输的结果，然后接二连三的发送格式为(a,b)的指令。这种方法被称作<a href="http://agun.iteye.com/view/1569933.htm" target="_blank">重放攻击</a>。 </p>
<h3 class="headline-2 bk-sidecatalog-title"><a name="8_2"></a><span class="headline-content">完整性</span> </h3>
<p>　　传输数据的双方都总希望确认消息未在传输的过程中被修改。加密使得第三方想要读取数据十分困难，然而第三方仍然能采取可行的方法在传输的过程中修改数据。一个通俗的例子就是同形攻击：回想一下，还是上面的那家银行从它的分行向它的中央管理系统发送格式为(a,b)的指令，其中a是账号，而b是账户中的金额。一个远程客户可以先存100元，然后拦截传输结果，再传输(a,b3)，这样他就立刻变成百万富翁了。 </p>
<h3 class="headline-2 bk-sidecatalog-title"><a name="8_3"></a><span class="headline-content">不可抵赖</span> </h3>
<p>　　在密文背景下，抵赖这个词指的是不承认与消息有关的举动（即声称消息来自第三方）。消息的接收方可以通过数字签名来防止所有后续的抵赖行为，因为接收方可以出示签名给别人看来证明信息的来源。 </p>
<h2 class="headline-1 bk-sidecatalog-title"><span class="headline-content">如何实现</span></h2>
<p>　　数字签名算法依靠<a href="http://agun.iteye.com/view/344309.htm" target="_blank">公钥加密</a>技术来实现的。在公钥加密技术里，每一个使用者有一对密钥：一把公钥和一把私钥。公钥可以自由发布，但私钥则秘密保存；还有一个要求就是要让通过公钥推算出私钥的做法不可能实现。 </p>
<p>　　普通的数字签名算法包括三种算法： </p>
<p>　　1.密码生成算法 ； </p>
<p>　　2.标记算法 ； </p>
<p>　　3.验证算法 。 </p>
<h2 class="headline-1 bk-sidecatalog-title"><span class="headline-content">Java数字签名步骤</span></h2>
<p>　　1、将applet的<a href="http://agun.iteye.com/view/3922213.htm" target="_blank">class文件</a>打包成*.jar（不会的可以在命令行中输入jar查看帮助） <sup>[3]</sup><a name="ref_%5B3%5D"></a> </p>
<p>　　2 首先我们要生成一个keystore 否则在签名的时候报如下错误 </p>
<p>　　jarsigner 错误： java.lang.RuntimeException: 密钥库装入： C:\Documents and Settings\ij2ee\.keystore (系统找不到指定的文件。). (这边的ij2ee 是我当前系统<a href="http://agun.iteye.com/view/398306.htm" target="_blank">用户名</a>) </p>
<p>　　生成keystore的语句:keytool -genkey -alias 别名你可以自己写 -keyalg RSA -keystore .keystore </p>
<p>　　比如我的就是 keytool -genkey -alias ij2ee -keyalg RSA -keystore .keystore </p>
<p>　　下面是会出现的数字签名的一些步骤操作: </p>
<p>　　输入keystore密码： </p>
<p>　　再次输入新密码: </p>
<p>　　您的<a href="http://agun.iteye.com/view/20683.htm" target="_blank">名字</a>与姓氏是什么？ </p>
<p>　　[Unknown]： ij2ee </p>
<p>　　您的组织单位名称是什么？ </p>
<p>　　[Unknown]： mtk </p>
<p>　　您的组织名称是什么？ </p>
<p>　　[Unknown]： mtk </p>
<p>　　您所在的城市或区域名称是什么？ </p>
<p>　　[Unknown]： suzhou </p>
<p>　　您所在的州或省份名称是什么？ </p>
<p>　　[Unknown]： jiangsu </p>
<p>　　该单位的两<a href="http://agun.iteye.com/view/94782.htm" target="_blank">字母</a>国家代码是什么 </p>
<p>　　[Unknown]： cn </p>
<p>　　CN=jeson, OU=mtk, O=mtk, L=suzhou, ST=jiangsu, C=cn 正确吗？ </p>
<p>　　[否]： y </p>
<p>　　输入&lt;sfcs&gt;的主密码 </p>
<p>　　（如果和 keystore 密码相同，按回车）： </p>
<p>　　这时候会在jdk的bin<a href="http://agun.iteye.com/view/637.htm" target="_blank">目录</a>下生成 .keystore 。把这个.keystore文件移动到 C:\Documents and Settings\当前<a href="http://agun.iteye.com/view/1541135.htm" target="_blank">系统用户</a> 的目录下面。 </p>
<p>　　3、创建一个数字证书 </p>
<p>　　在命令行中输入如下指令，peakCA和peakCALib自己起名字好了，3650是有效天数，就是10年左右，在创建证书的的时候，需要填写证书的一些信息和证书对应的私钥密码。这些信息包括 CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx，都是中文，一看就懂的 </p>
<p>　　keytool -genkey -alias peakCA -keyalg RSA -keysize 1024 -keystore peakCALib -validity 3650 </p>
<p>　　4、将证书导出到证书文件中 </p>
<p>　　在命令行中输入如下指令，peakCA和peakCALib自己起名字好了，******是你输入的密码 </p>
<p>　　keytool -export -alias peakCA -file peakCA.cer -keystore peakCALib -storepass ****** -rfc </p>
<p>　　5、授权jar文件，在命令行中输入如下指令 </p>
<p>　　jarsigner -keystore peakCALib myapplet.jar peakCA</p>
</div>
 <img src ="http://www.blogjava.net/agun/aggbug/348918.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2011-04-24 14:40 <a href="http://www.blogjava.net/agun/archive/2011/04/24/348918.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>加密算法</title><link>http://www.blogjava.net/agun/archive/2011/04/24/348915.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Sun, 24 Apr 2011 06:19:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2011/04/24/348915.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/348915.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2011/04/24/348915.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/348915.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/348915.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<div>
<h1>一.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>简介</h1>
<p>这段时间在看书的时候，看到相关章节关于的安全方面的，里面涉及到了一些加密的算法，正好我现在的项目中也用到了相关的的东西，数字签名等。今天把相关的搜集起来。以备后用。</p>
<h1>二.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>加密算法介绍 </h1>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">根据密钥类型不同将现代密码技术分为两类：对称加密算法（秘密钥匙加密）和非对称加密算法（公开密钥加密）。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">对称钥匙加密系统是加密和解密均采用同一把秘密钥匙，而且通信双方都必须获得这把钥匙，并保持钥匙的秘密。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">非对称密钥加密系统采用的加密钥匙（公钥）和解密钥匙（私钥）是不同的。</span></p>
<h2>对称加密算法 </h2>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">对称加密算法用来对敏感数据等信息进行加密，常用的算法包括：</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">DES（Data Encryption Standard）：数据加密标准，速度较快，适用于加密大量数据的场合。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">3DES（Triple DES）：是基于DES，对一块数据用三个不同的密钥进行三次加密，强度更高。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">AES（Advanced Encryption Standard）：高级加密标准，是下一代的加密算法标准，速度快，安全级别高；</span></p>
<h3>AES </h3>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">2000年10月，NIST（美国国家标准和技术协会）宣布通过从15种侯选算法中选出的一项新的密匙加密标准。Rijndael被选中成为将来的AES。 Rijndael是在 1999 年下半年，由研究员 Joan Daemen 和 Vincent Rijmen 创建的。AES 正日益成为加密各种形式的电子数据的实际标准。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">美国标准与技术研究院 (NIST) 于 2002 年 5 月 26 日制定了新的高级加密标准 (AES) 规范。</span></p>
<h4>算法原理 </h4>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">AES 算法基于排列和置换运算。排列是对数据重新进行安排，置换是将一个数据单元替换为另一个。AES 使用几种不同的方法来执行排列和置换运算。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">AES 是一个迭代的、对称密钥分组的密码，它可以使用128、192 和 256 位密钥，并且用 128 位（16字节）分组加密和解密数据。与公共密钥密码使用密钥对不同，对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构，在该循环中重复置换和替换输入数据。</span></p>
<h4>AES与3DES的比较 </h4>
<div>
<table style="border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; width: 44.9pt; padding-top: 0cm" valign="top" width="60">
            <p><span style="color: #39658c">算法名称</span></p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 68.5pt; padding-top: 0cm" valign="top" width="91">
            <p><span style="color: #39658c">算法类型</span></p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 63pt; padding-top: 0cm" valign="top" width="84">
            <p><span style="color: #39658c">密钥长度</span></p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 27pt; padding-top: 0cm" valign="top" width="36">
            <p><span style="color: #39658c">速度</span></p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 108pt; padding-top: 0cm" valign="top" width="144">
            <p><span style="color: #39658c">解密时间（建设机器每秒尝试255个密钥）</span></p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 54pt; padding-top: 0cm" valign="top" width="72">
            <p><span style="color: #39658c">资源消耗</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; width: 44.9pt; padding-top: 0cm" valign="top" width="60">
            <p><span style="color: #39658c">AES</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 68.5pt; padding-top: 0cm" valign="top" width="91">
            <p><span style="color: #39658c">对称block密码</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 63pt; padding-top: 0cm" valign="top" width="84">
            <p><span style="color: #39658c">128、192、256位</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 27pt; padding-top: 0cm" valign="top" width="36">
            <p><span style="color: #39658c">高</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 108pt; padding-top: 0cm" valign="top" width="144">
            <p><span style="color: #39658c">1490000亿年</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 54pt; padding-top: 0cm" valign="top" width="72">
            <p><span style="color: #39658c">低</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; width: 44.9pt; padding-top: 0cm" valign="top" width="60">
            <p><span style="color: #39658c">3DES</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 68.5pt; padding-top: 0cm" valign="top" width="91">
            <p><span style="color: #39658c">对称feistel密码</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 63pt; padding-top: 0cm" valign="top" width="84">
            <p><span style="color: #39658c">112位或168位</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 27pt; padding-top: 0cm" valign="top" width="36">
            <p><span style="color: #39658c">低</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 108pt; padding-top: 0cm" valign="top" width="144">
            <p><span style="color: #39658c">46亿年</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 54pt; padding-top: 0cm" valign="top" width="72">
            <p><span style="color: #39658c">中</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<h2>非对称算法 </h2>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">常见的非对称加密算法如下：</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">RSA：由 RSA 公司发明，是一个支持变长密钥的公共密钥算法，需要加密的文件块的长度也是可变的；</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">DSA（Digital Signature Algorithm）：数字签名算法，是一种标准的 DSS（数字签名标准）；</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">ECC（Elliptic Curves Cryptography）：椭圆曲线密码编码学。</span></p>
<h3>ECC </h3>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">在1976年，由于对称加密算法已经不能满足需要，Diffie 和Hellman发表了一篇叫《密码学新动向》的文章，介绍了公匙加密的概念，由Rivet、Shamir、Adelman提出了RSA算法。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">随着分解大整数方法的进步及完善、计算机速度的提高以及计算机网络的发展，为了保障数据的安全，RSA的密钥需要不断增加，但是，密钥长度的增加导致了其加解密的速度大为降低，硬件实现也变得越来越难以忍受，这对使用RSA的应用带来了很重的负担，因此需要一种新的算法来代替RSA。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">1985年N.Koblitz和Miller提出将椭圆曲线用于密码算法，根据是有限域上的椭圆曲线上的点群中的离散对数问题ECDLP。ECDLP是比因子分解问题更难的问题，它是指数级的难度。</span></p>
<h4>原理——椭圆曲线上的难题 </h4>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #39658c">&nbsp;</span><span style="color: #000000">椭圆曲线上离散对数问题ECDLP定义如下：给定素数p和椭圆曲线E，对Q＝kP，在已知P，Q 的情况下求出小于p的正整数k。可以证明由k和P计算Q比较容易，而由Q和P计算k则比较困难。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">将椭圆曲线中的加法运算与离散对数中的模乘运算相对应，将椭圆曲线中的乘法运算与离散对数中的模幂运算相对应，我们就可以建立基于椭圆曲线的对应的密码体制。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">例如，对应Diffie-Hellman公钥系统，我们可以通过如下方式在椭圆曲线上予以实现：在E上选取生成元P，要求由P产生的群元素足够多，通信双方A和B分别选取a和b，a和b 予以保密，但将aP和bP公开，A和B间通信用的密钥为abP，这是第三者无法得知的。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">对应ELGamal密码系统可以采用如下的方式在椭圆曲线上予以实现：</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">将明文m嵌入到E上Pm点，选一点B&#8712;E，每一用户都选一整数a，0＜a＜N，N为阶数已知，a保密，aB公开。欲向A送m，可送去下面一对数偶：［kB，Pm+k(aAB)］，k是随机产生的整数。A可以从kB求得k(aAB)。通过：Pm+k(aAB)- k(aAB)=Pm恢复Pm。同样对应DSA，考虑如下等式：</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">K=kG &nbsp;[其中 K，G为Ep(a,b)上的点，k为小于n（n是点G的阶）的整数]</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">不难发现，给定k和G，根据加法法则，计算K很容易；但给定K和G，求k就相对困难了。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">这就是椭圆曲线加密算法采用的难题。我们把点G称为基点（base point），k（k&lt;n，n为基点G的阶）称为私有密钥（privte key），K称为公开密钥（public key)。</span></p>
<h4>ECC与RSA的比较 </h4>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">ECC和RSA相比，在许多方面都有对绝对的优势，主要体现在以下方面：</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">抗攻击性强。相同的密钥长度，其抗攻击性要强很多倍。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">计算量小，处理速度快。ECC总的速度比RSA、DSA要快得多。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">存储空间占用小。ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多，意味着它所占的存贮空间要小得多。这对于加密算法在IC卡上的应用具有特别重要的意义。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">带宽要求低。当对长消息进行加解密时，三类密码系统有相同的带宽要求，但应用于短消息时ECC带宽要求却低得多。带宽要求低使ECC在无线网络领域具有广泛的应用前景。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">ECC的这些特点使它必将取代RSA，成为通用的公钥加密算法。比如SET协议的制定者已把它作为下一代SET协议中缺省的公钥密码算法。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">下面两张表示是RSA和ECC的安全性和速度的比较。</span></p>
<div>
<table style="border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; width: 106.5pt; padding-top: 0cm" valign="top" width="142">
            <p style="text-align: center" align="center"><span style="color: #39658c">攻破时间(MIPS年)</span></p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 106.5pt; padding-top: 0cm" valign="top" width="142">
            <p style="text-align: center" align="center"><span style="color: #39658c">RSA/DSA(密钥长度)</span></p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 89.4pt; padding-top: 0cm" valign="top" width="119">
            <p style="text-align: center" align="center"><span style="color: #39658c">ECC密钥长度</span></p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 123.7pt; padding-top: 0cm" valign="top" width="165">
            <p style="text-align: center" align="center"><span style="color: #39658c">RSA/ECC密钥长度比</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; width: 106.5pt; padding-top: 0cm" valign="top" width="142">
            <p style="text-align: center" align="center"><span style="color: #39658c">10<sup>4</sup></span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 106.5pt; padding-top: 0cm" valign="top" width="142">
            <p style="text-align: center" align="center"><span style="color: #39658c">512</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 89.4pt; padding-top: 0cm" valign="top" width="119">
            <p style="text-align: center" align="center"><span style="color: #39658c">106</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 123.7pt; padding-top: 0cm" valign="top" width="165">
            <p style="text-align: center" align="center"><span style="color: #39658c">5：1</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; width: 106.5pt; padding-top: 0cm" valign="top" width="142">
            <p style="text-align: center" align="center"><span style="color: #39658c">10<sup>8</sup></span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 106.5pt; padding-top: 0cm" valign="top" width="142">
            <p style="text-align: center" align="center"><span style="color: #39658c">768</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 89.4pt; padding-top: 0cm" valign="top" width="119">
            <p style="text-align: center" align="center"><span style="color: #39658c">132</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 123.7pt; padding-top: 0cm" valign="top" width="165">
            <p style="text-align: center" align="center"><span style="color: #39658c">6：1</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; width: 106.5pt; padding-top: 0cm" valign="top" width="142">
            <p style="text-align: center" align="center"><span style="color: #39658c">10<sup>11</sup></span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 106.5pt; padding-top: 0cm" valign="top" width="142">
            <p style="text-align: center" align="center"><span style="color: #39658c">1024</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 89.4pt; padding-top: 0cm" valign="top" width="119">
            <p style="text-align: center" align="center"><span style="color: #39658c">160</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 123.7pt; padding-top: 0cm" valign="top" width="165">
            <p style="text-align: center" align="center"><span style="color: #39658c">7：1</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; width: 106.5pt; padding-top: 0cm" valign="top" width="142">
            <p style="text-align: center" align="center"><span style="color: #39658c">10<sup>20</sup></span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 106.5pt; padding-top: 0cm" valign="top" width="142">
            <p style="text-align: center" align="center"><span style="color: #39658c">2048</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 89.4pt; padding-top: 0cm" valign="top" width="119">
            <p style="text-align: center" align="center"><span style="color: #39658c">210</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 123.7pt; padding-top: 0cm" valign="top" width="165">
            <p style="text-align: center" align="center"><span style="color: #39658c">10：1</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; width: 106.5pt; padding-top: 0cm" valign="top" width="142">
            <p style="text-align: center" align="center"><span style="color: #39658c">10<sup>78</sup></span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 106.5pt; padding-top: 0cm" valign="top" width="142">
            <p style="text-align: center" align="center"><span style="color: #39658c">21000</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 89.4pt; padding-top: 0cm" valign="top" width="119">
            <p style="text-align: center" align="center"><span style="color: #39658c">600</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 123.7pt; padding-top: 0cm" valign="top" width="165">
            <p style="text-align: center" align="center"><span style="color: #39658c">35：1</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="margin: 7.8pt 0cm; text-indent: 21pt; text-align: center" align="center"><span style="color: #39658c">RSA和ECC安全模长得比较</span></p>
<table style="border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; width: 142pt; padding-top: 0cm" width="189" rowspan="2">
            <p style="text-align: center" align="center"><span style="color: #39658c">功能</span></p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm" width="189">
            <p style="text-align: center" align="center"><span style="color: #39658c">Security Builder 1.2</span></p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm" width="189">
            <p style="text-align: center" align="center"><span style="color: #39658c">BSAFE 3.0</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm" width="189">
            <p style="text-align: center" align="center"><span style="color: #39658c">163位ECC(ms)</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm" width="189">
            <p style="text-align: center" align="center"><span style="color: #39658c">1,023位RSA(ms)</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; width: 142pt; padding-top: 0cm" width="189">
            <p style="text-align: center" align="center"><span style="color: #39658c">密钥对生成</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm" width="189">
            <p style="text-align: center" align="center"><span style="color: #39658c">3.8</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm" width="189">
            <p style="text-align: center" align="center"><span style="color: #39658c">4,708.3</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; width: 142pt; padding-top: 0cm" width="189" rowspan="2">
            <p style="text-align: center" align="center"><span style="color: #39658c">签名</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm" width="189">
            <p style="text-align: center" align="center"><span style="color: #39658c">2.1(ECNRA)</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm" width="189" rowspan="2">
            <p style="text-align: center" align="center"><span style="color: #39658c">228.4</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm" width="189">
            <p style="text-align: center" align="center"><span style="color: #39658c">3.0(ECDSA)</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; width: 142pt; padding-top: 0cm" width="189" rowspan="2">
            <p style="text-align: center" align="center"><span style="color: #39658c">认证</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm" width="189">
            <p style="text-align: center" align="center"><span style="color: #39658c">9.9(ECNRA)</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm" width="189" rowspan="2">
            <p style="text-align: center" align="center"><span style="color: #39658c">12.7</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm" width="189">
            <p style="text-align: center" align="center"><span style="color: #39658c">10.7(ECDSA)</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; width: 142pt; padding-top: 0cm" width="189">
            <p style="text-align: center" align="center"><span style="color: #39658c">Diffie—Hellman密钥交换</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm" width="189">
            <p style="text-align: center" align="center"><span style="color: #39658c">7.3</span></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm" width="189">
            <p style="text-align: center" align="center"><span style="color: #39658c">1,654.0</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="margin: 7.8pt 0cm; text-indent: 21pt; text-align: center" align="center"><span style="color: #39658c">RSA和ECC速度比较</span></p>
<h2>散列算法 </h2>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">散列是信息的提炼，通常其长度要比信息小得多，且为一个固定长度。加密性强的散列一定是不可逆的，这就意味着通过散列结果，无法推出任何部分的原始信息。任何输入信息的变化，哪怕仅一位，都将导致散列结果的明显变化，这称之为雪崩效应。散列还应该是防冲突的，即找不出具有相同散列结果的两条信息。具有这些特性的散列结果就可以用于验证信息是否被修改。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">单向散列函数一般用于产生消息摘要，密钥加密等，常见的有：</span></p>
<p><span style="color: #000000"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>MD5（Message Digest Algorithm 5）：是RSA数据安全公司开发的一种单向散列算法。</span></p>
<p><span style="color: #000000"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>SHA（Secure Hash Algorithm）：可以对任意长度的数据运算生成一个160位的数值；</span></p>
<h3>SHA-1 </h3>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">在1993年，安全散列算法（SHA）由美国国家标准和技术协会(NIST)提出，并作为联邦信息处理标准（FIPS PUB 180）公布；1995年又发布了一个修订版FIPS PUB 180-1，通常称之为SHA-1。SHA-1是基于MD4算法的，并且它的设计在很大程度上是模仿MD4的。现在已成为公认的最安全的散列算法之一，并被广泛使用。</span></p>
<h4><span style="color: #000000">原理</span> </h4>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">SHA-1是一种数据加密算法，该算法的思想是接收一段明文，然后以一种不可逆的方式将它转换成一段（通常更小）密文，也可以简单的理解为取一串输入码（称为预映射或信息），并把它们转化为长度较短、位数固定的输出序列即散列值（也称为信息摘要或信息认证代码）的过程。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">单向散列函数的安全性在于其产生散列值的操作过程具有较强的单向性。如果在输入序列中嵌入密码，那么任何人在不知道密码的情况下都不能产生正确的散列值，从而保证了其安全性。ＳＨＡ将输入流按照每块５１２位（６４个字节）进行分块，并产生２０个字节的被称为信息认证代码或信息摘要的输出。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">该算法输入报文的最大长度不超过264位，产生的输出是一个160位的报文摘要。输入是按512 位的分组进行处理的。SHA-1是不可逆的、防冲突，并具有良好的雪崩效应。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">通过散列算法可实现数字签名实现，数字签名的原理是将要传送的明文通过一种函数运算（Hash）转换成报文摘要（不同的明文对应不同的报文摘要），报文摘要加密后与明文一起传送给接受方，接受方将接受的明文产生新的报文摘要与发送方的发来报文摘要解密比较，比较结果一致表示明文未被改动，如果不一致表示明文已被篡改。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #39658c"><span style="color: #000000">MAC (信息认证代码)就是一个散列结果，其中部分输入信息是密码，只有知道这个密码的参与者才能再次计算和验证MAC码的合法性。MAC的产生参见下图。</span></span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span style="color: #39658c">输入信息</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span style="color: #39658c">密码</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span style="color: #39658c">散列函数</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span style="color: #39658c">信息认证代码</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
</span></p>
<h4>SHA-1与MD5的比较 </h4>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">因为二者均由MD4导出，SHA-1和MD5彼此很相似。相应的，他们的强度和其他特性也是相似，但还有以下几点不同：</span></p>
<p><span style="color: #000000"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>对强行供给的安全性：最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术，产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2<sup>128</sup>数量级的操作，而对SHA-1则是2<sup>160</sup>数量级的操作。这样，SHA-1对强行攻击有更大的强度。</span></p>
<p><span style="color: #000000"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>对密码分析的安全性：由于MD5的设计，易受密码分析的攻击，SHA-1显得不易受这样的攻击。</span></p>
<p><span style="color: #000000"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>速度：在相同的硬件上，SHA-1的运行速度比MD5慢。</span></p>
<h2>对称与非对称算法比较 </h2>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #39658c">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">以上综述了两种加密方法的原理，总体来说主要有下面几个方面的不同：</span></p>
<p><span style="color: #000000"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>在管理方面：公钥密码算法只需要较少的资源就可以实现目的，在密钥的分配上，两者之间相差一个指数级别（一个是n一个是n<sup>2</sup>）。所以私钥密码算法不适应广域网的使用，而且更重要的一点是它不支持数字签名。</span></p>
<p><span style="color: #000000"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>在安全方面：由于公钥密码算法基于未解决的数学难题，在破解上几乎不可能。对于私钥密码算法，到了AES虽说从理论来说是不可能破解的，但从计算机的发展角度来看。公钥更具有优越性。</span></p>
<p><span style="color: #000000"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>从速度上来看：AES的软件实现速度已经达到了每秒数兆或数十兆比特。是公钥的100倍，如果用硬件来实现的话这个比值将扩大到1000倍。</span></p>
<h1>三.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>加密算法的选择 </h1>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">前面的章节已经介绍了对称解密算法和非对称加密算法，有很多人疑惑：那我们在实际使用的过程中究竟该使用哪一种比较好呢？</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">我们应该根据自己的使用特点来确定，由于非对称加密算法的运行速度比对称加密算法的速度慢很多，当我们需要加密大量的数据时，建议采用对称加密算法，提高加解密速度。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">对称加密算法不能实现签名，因此签名只能非对称算法。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">由于对称加密算法的密钥管理是一个复杂的过程，密钥的管理直接决定着他的安全性，因此当数据量很小时，我们可以考虑采用非对称加密算法。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">在实际的操作过程中，我们通常采用的方式是：采用非对称加密算法管理对称算法的密钥，然后用对称加密算法加密数据，这样我们就集成了两类加密算法的优点，既实现了加密速度快的优点，又实现了安全方便管理密钥的优点。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">如果在选定了加密算法后，那采用多少位的密钥呢？一般来说，密钥越长，运行的速度就越慢，应该根据的我们实际需要的安全级别来选择，一般来说，RSA建议采用1024位的数字，ECC建议采用160位，AES采用128为即可。</span></p>
<h1>四.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>密码学在现代的应用 </h1>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">随着密码学商业应用的普及，公钥密码学受到前所未有的重视。除传统的密码应用系统外，PKI系统以公钥密码技术为主，提供加密、签名、认证、密钥管理、分配等功能。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><a name="243lfindex4"><span style="text-decoration: underline"><span style="color: #000000">保密通信：保密通信是密码学产生的动因。使用公私钥密码体制进行保密通信时，信息接收者只有知道对应的密钥才可以解密该信息。</span></span></a></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">数字签名：数字签名技术可以代替传统的手写签名，而且从安全的角度考虑，数字签名具有很好的防伪造功能。在政府机关、军事领域、商业领域有广泛的应用环境。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">秘密共享：秘密共享技术是指将一个秘密信息利用密码技术分拆成n个称为共享因子的信息，分发给n个成员，只有k(k&#8804;n)个合法成员的共享因子才可以恢复该秘密信息，其中任何一个或m(m&#8804;k)个成员合作都不知道该秘密信息。利用秘密共享技术可以控制任何需要多个人共同控制的秘密信息、命令等。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">认证功能：在公开的信道上进行敏感信息的传输，采用签名技术实现对消息的真实性、完整性进行验证，通过验证公钥证书实现对通信主体的身份验证。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">密钥管理：密钥是保密系统中更为脆弱而重要的环节，公钥密码体制是解决密钥管理工作的有力工具；利用公钥密码体制进行密钥协商和产生，保密通信双方不需要事先共享秘密信息；利用公钥密码体制进行密钥分发、保护、密钥托管、密钥恢复等。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">基于公钥密码体制可以实现以上通用功能以外，还可以设计实现以下的系统：安全电子商务系统、电子现金系统、电子选举系统、电子招投标系统、电子彩票系统等。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">公钥密码体制的产生是密码学由传统的政府、军事等应用领域走向商用、民用的基础，同时互联网、电子商务的发展为密码学的发展开辟了更为广阔的前景。</span></p>
<h1>五.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>加密算法的未来 </h1>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">随着计算方法的改进，计算机运行速度的加快，网络的发展，越来越多的算法被破解。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">在2004年国际密码学会议(Crypto&#8217;2004)上，来自中国山东大学的王小云教授做的破译MD5、HAVAL-128、MD4和RIPEMD算法的报告，令在场的国际顶尖密码学专家都为之震惊，意味着这些算法将从应用中淘汰。随后，SHA-1也被宣告被破解。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">历史上有三次对DES有影响的攻击实验。1997年，利用当时各国 7万台计算机，历时96天破解了DES的密钥。1998年，电子边境基金会（EFF）用25万美元制造的专用计算机，用56小时破解了DES的密钥。1999年，EFF用22小时15分完成了破解工作。因此。曾经有过卓越贡献的DES也不能满足我们日益增长的需求了。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">最近，一组研究人员成功的把一个512位的整数分解因子，宣告了RSA的破解。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">我们说数据的安全是相对的，可以说在一定时期一定条件下是安全的，随着硬件和网络的发展，或者是另一个王小云的出现，目前的常用加密算法都有可能在短时间内被破解，那时我们不得不使用更长的密钥或更加先进的算法，才能保证数据的安全，因此加密算法依然需要不断发展和完善，提供更高的加密安全强度和运算速度。</span></p>
<p style="margin: 7.8pt 0cm; text-indent: 21pt"><span style="color: #000000">纵观这两种算法一个从DES到3DES再到AES，一个从RSA到ECC。其发展角度无不是从密钥的简单性，成本的低廉性，管理的简易性，算法的复杂性，保密的安全性以及计算的快速性这几个方面去考虑。因此，未来算法的发展也必定是从这几个角度出发的，而且在实际操作中往往把这两种算法结合起来，也需将来一种集两种算法优点于一身的新型算法将会出现，到那个时候，电子商务的实现必将更加的快捷和安全。</span></p>
</div>
 <img src ="http://www.blogjava.net/agun/aggbug/348915.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2011-04-24 14:19 <a href="http://www.blogjava.net/agun/archive/2011/04/24/348915.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Cookie 和 Session</title><link>http://www.blogjava.net/agun/archive/2010/12/04/339792.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Sat, 04 Dec 2010 04:14:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2010/12/04/339792.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/339792.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2010/12/04/339792.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/339792.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/339792.html</trackback:ping><description><![CDATA[<p><span class="wenzhang_con" id="articlecontent" style="width: 740px">一、cookie机制和session机制的区别<br />
*************************************************************************************<br />
具体来说cookie机制采用的是在客户端保持状态的方案，而session机制采用的是在服务器端保持状态的方案。<br />
同时我们也看到，由于才服务器端保持状态的方案在客户端也需要保存一个标识，所以session<br />
机制可能需要借助于cookie机制来达到保存标识的目的，但实际上还有其他选择<br />
*************************************************************************************<br />
<br />
二、会话cookie和持久cookie的区别<br />
*************************************************************************************<br />
如果不设置过期时间，则表示这个cookie生命周期为浏览器会话期间，只要关闭浏览器窗口，cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。<br />
　　如果设置了过期时间，浏览器就会把cookie保存到硬盘上，关闭后再次打开浏览器，这些cookie依然有效直到超过设定的过期时间。<br />
　　存储在硬盘上的cookie可以在不同的浏览器进程间共享，比如两个IE窗口。而对于保存在内存的cookie，不同的浏览器有不同的处理方式。<br />
*************************************************************************************<br />
<br />
三、如何利用实现自动登录<br />
*************************************************************************************<br />
　　当用户在某个网站注册后，就会收到一个惟一用户ID的cookie。客户后来重新连接时，这个<br />
用户ID会自动返回，服务器对它进行检查，确定它是否为注册用户且选择了自动登录，从而使用户务需给出明确的用户名和密码，就可以访问服务器上的资源。<br />
*************************************************************************************<br />
<br />
四、如何根据用户的爱好定制站点<br />
*************************************************************************************<br />
　　网站可以使用cookie记录用户的意愿。对于简单的设置，网站可以直接将页面的设置存储在cookie中完成定制。然而对于更复杂的定制，网站只需仅将一个惟一的标识符发送给用户，由服务器端的数据库存储每个标识符对应的页面设置。<br />
*************************************************************************************<br />
<br />
五、cookie的发送<br />
*************************************************************************************<br />
1.创建Cookie对象<br />
2.设置最大时效<br />
3.将Cookie放入到HTTP响应报头<br />
如果你创建了一个cookie，并将他发送到浏览器，默认情况下它是一个会话级别的cookie:存储在浏览器的内存中，用户退出浏览器之后被删除。如果你希望浏览器将该cookie存储在磁盘上，则<br />
需要使用maxAge，并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。<br />
发送cookie需要使用HttpServletResponse的addCookie方法，将cookie插入到一个Set-Cookie　HTTP请求报头中。由于这个方法并不修改任何之前指定的Set-Cookie报头，而是创建新的报头，因此我们将这个方法称为是addCookie，而非setCookie。同样要记住响应报头必须在任何文档内容发送到客户端之前设置。<br />
<br />
六、cookie的读取<br />
*************************************************************************************<br />
1.调用request.getCookie<br />
要获取有浏览器发送来的cookie，需要调用HttpServletRequest的getCookies方法，这个调用返回Cookie对象的数组，对应由HTTP请求中Cookie报头输入的值。<br />
2.对数组进行循环，调用每个cookie的getName方法，直到找到感兴趣的cookie为止<br />
　cookie与你的主机(域)相关，而非你的servlet或JSP页面。因而，尽管你的servlet可能只发送了单个cookie，你也可能会得到许多不相关的cookie。<br />
例如：<br />
　　String&nbsp;cookieName&nbsp;=&nbsp;&#8220;userID&#8221;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Cookie&nbsp;cookies[]&nbsp;=&nbsp;request.getCookies();<br />
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(cookies!=null){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i=0;i&lt;cookies.length;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;Cookie&nbsp;cookie&nbsp;=&nbsp;cookies[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(cookieName.equals(cookie.getName())){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doSomethingWith(cookie.getValue());<br />
}<br />
}<br />
}<br />
*************************************************************************************<br />
<br />
七、如何使用cookie检测初访者<br />
*************************************************************************************<br />
A.调用HttpServletRequest.getCookies()获取Cookie数组<br />
B.在循环中检索指定名字的cookie是否存在以及对应的值是否正确<br />
C.如果是则退出循环并设置区别标识<br />
D.根据区别标识判断用户是否为初访者从而进行不同的操作<br />
*************************************************************************************<br />
<br />
八、使用cookie检测初访者的常见错误<br />
*************************************************************************************<br />
不能仅仅因为cookie数组中不存在在特定的数据项就认为用户是个初访者。如果cookie数组为null，客户可能是一个初访者，也可能是由于用户将cookie删除或禁用造成的结果。<br />
但是，如果数组非null,也不过是显示客户曾经到过你的网站或域，并不能说明他们曾经访问过你的servlet。其它servlet、JSP页面以及非Java&nbsp;Web应用都可以设置cookie，依据路径的设置，其中的任何cookie都有可能返回给用户的浏览器。<br />
正确的做法是判断cookie数组是否为空且是否存在指定的Cookie对象且值正确。<br />
*************************************************************************************<br />
<br />
九、使用cookie属性的注意问题<br />
*************************************************************************************<br />
　　属性是从服务器发送到浏览器的报头的一部分；但它们不属于由浏览器返回给服务器的报头。　<br />
　　因此除了名称和值之外，cookie属性只适用于从服务器输出到客户端的cookie；服务器端来自于浏览器的cookie并没有设置这些属性。　<br />
　　因而不要期望通过request.getCookies得到的cookie中可以使用这个属性。这意味着，你不能仅仅通过设置cookie的最大时效，发出它，在随后的输入数组中查找适当的cookie,读取它的值，修改它并将它存回Cookie，从而实现不断改变的cookie值。<br />
*************************************************************************************<br />
<br />
十、如何使用cookie记录各个用户的访问计数<br />
*************************************************************************************<br />
1.获取cookie数组中专门用于统计用户访问次数的cookie的值<br />
2.将值转换成int型<br />
3.将值加1并用原来的名称重新创建一个Cookie对象<br />
4.重新设置最大时效<br />
5.将新的cookie输出<br />
*************************************************************************************<br />
<br />
十一、session在不同环境下的不同含义<br />
*************************************************************************************<br />
session，中文经常翻译为会话，其本来的含义是指有始有终的一系列动作/消息，比如打电话是从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。<br />
然而当session一词与网络协议相关联时，它又往往隐含了&#8220;面向连接&#8221;和/或&#8220;保持状态&#8221;这样两个含义。<br />
　　session在Web开发环境下的语义又有了新的扩展，它的含义是指一类用来在客户端与服务器端之间保持状态的解决方案。有时候Session也用来指这种解决方案的存储结构。<br />
*************************************************************************************<br />
<br />
十二、session的机制<br />
*************************************************************************************<br />
　　session机制是一种服务器端的机制，服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。<br />
但程序需要为某个客户端的请求创建一个session的时候，服务器首先检查这个客户端的请求里是否包含了一个session标识－称为session&nbsp;id,如果已经包含一个session&nbsp;id则说明以前已经为此客户创建过session，服务器就按照session&nbsp;id把这个session检索出来使用(如果检索不到，可能会新建一个，这种情况可能出现在服务端已经删除了该用户对应的session对象，但用户人为地在请求的URL后面附加上一个JSESSION的参数)。<br />
如果客户请求不包含session&nbsp;id，则为此客户创建一个session并且生成一个与此session相关联的session&nbsp;id，这个session&nbsp;id将在本次响应中返回给客户端保存。<br />
*************************************************************************************<br />
<br />
十三、保存session&nbsp;id的几种方式<br />
*************************************************************************************<br />
A．保存session&nbsp;id的方式可以采用cookie，这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。<br />
B．由于cookie可以被人为的禁止，必须有其它的机制以便在cookie被禁止时仍然能够把session&nbsp;id传递回服务器，经常采用的一种技术叫做URL重写，就是把session&nbsp;id附加在URL路径的后面，附加的方式也有两种，一种是作为URL路径的附加信息，另一种是作为查询字符串附加在URL后面。网络在整个交互过程中始终保持状态，就必须在每个客户端可能请求的路径后面都包含这个session&nbsp;id。<br />
C．另一种技术叫做表单隐藏字段。就是服务器会自动修改表单，添加一个隐藏字段，以便在表单提交时能够把session&nbsp;id传递回服务器。<br />
*************************************************************************************<br />
<br />
十四、session什么时候被创建<br />
*************************************************************************************<br />
一个常见的错误是以为session在有客户端访问时就被创建，然而事实是直到某server端程序(如Servlet)调用HttpServletRequest.getSession(true)这样的语句时才会被创建。<br />
*************************************************************************************<br />
<br />
十五、session何时被删除<br />
*************************************************************************************<br />
session在下列情况下被删除：<br />
A．程序调用HttpSession.invalidate()<br />
B．距离上一次收到客户端发送的session&nbsp;id时间间隔超过了session的最大有效时间<br />
C．服务器进程被停止<br />
<br />
再次注意关闭浏览器只会使存储在客户端浏览器内存中的session&nbsp;cookie失效，不会使服务器端的session对象失效。<br />
*************************************************************************************<br />
<br />
十六、URL重写有什么缺点<br />
*************************************************************************************<br />
　　　对所有的URL使用URL重写，包括超链接，form的action，和重定向的URL。每个引用你的站点的URL，以及那些返回给用户的URL(即使通过间接手段，比如服务器重定向中的Location字段)都要添加额外的信息。<br />
　　　这意味着在你的站点上不能有任何静态的HTML页面(至少静态页面中不能有任何链接到站点动态页面的链接)。因此，每个页面都必须使用servlet或JSP动态生成。即使所有的页面都动态生成，如果用户离开了会话并通过书签或链接再次回来，会话的信息都会丢失，因为存储下来的链接含有错误的标识信息－该URL后面的SESSION&nbsp;ID已经过期了。　　<br />
*************************************************************************************<br />
<br />
十七、使用隐藏的表单域有什么缺点<br />
*************************************************************************************<br />
&nbsp;&nbsp;&nbsp;&nbsp;仅当每个页面都是有表单提交而动态生成时，才能使用这种方法。单击常规的&lt;A&nbsp;HREF..&gt;超文本链接并不产生表单提交，因此隐藏的表单域不能支持通常的会话跟踪，只能用于一系列特定的操作中，比如在线商店的结账过程<br />
*************************************************************************************<br />
<br />
十八、会话跟踪的基本步骤<br />
*************************************************************************************<br />
1．访问与当前请求相关的会话对象<br />
2．查找与会话相关的信息<br />
3．存储会话信息<br />
4．废弃会话数据<br />
*************************************************************************************<br />
<br />
十九、getSession()/getSession(true)、getSession(false)的区别<br />
*************************************************************************************<br />
getSession()/getSession(true)：当session存在时返回该session，否则新建一个session并返回该对象<br />
getSession(false)：当session存在时返回该session，否则不会新建session，返回null<br />
*************************************************************************************<br />
<br />
二十、如何将信息于会话关联起来<br />
*************************************************************************************<br />
　　setAttribute会替换任何之前设定的值；如果想要在不提供任何代替的情况下移除某个值，则应使用removeAttribute。这个方法会触发所有实现了HttpSessionBindingListener接口的值的valueUnbound<br />
方法。<br />
*************************************************************************************<br />
<br />
二十一、会话属性的类型有什么限制吗<br />
*************************************************************************************<br />
通常会话属性的类型只要是Object就可以了。除了null或基本类型，如int,double,boolean。<br />
如果要使用基本类型的值作为属性，必须将其转换为相应的封装类对象<br />
*************************************************************************************<br />
<br />
二十二、如何废弃会话数据<br />
*************************************************************************************<br />
A．只移除自己编写的servlet创建的数据：<br />
&nbsp;&nbsp;&nbsp;调用removeAttribute(&#8220;key&#8221;)将指定键关联的值废弃<br />
B．删除整个会话(在当前Web应用中)：<br />
&nbsp;&nbsp;&nbsp;调用invalidate，将整个会话废弃掉。这样做会丢失该用户的所有会话数据，而非仅仅由我们<br />
servlet或JSP页面创建的会话数据<br />
C．将用户从系统中注销并删除所有属于他(或她)的会话<br />
&nbsp;&nbsp;&nbsp;调用logOut，将客户从Web服务器中注销，同时废弃所有与该用户相关联的会话(每个Web应用至多一个)。这个操作有可能影响到服务器上多个不同的Web应用<br />
*************************************************************************************<br />
<br />
二十三、使用isNew来判断用户是否为新旧用户的错误做法<br />
*************************************************************************************<br />
public&nbsp;boolean&nbsp;isNew()方法如果会话尚未和客户程序(浏览器)发生任何联系，则这个方法返回true，这一般是因为会话是新建的，不是由输入的客户请求所引起的。<br />
但如果isNew返回false，只不过是说明他之前曾经访问该Web应用，并不代表他们曾访问过我们的servlet或JSP页面。<br />
因为session是与用户相关的，在用户之前访问的每一个页面都有可能创建了会话。因此isNew为false只能说用户之前访问过该Web应用，session可以是当前页面创建，也可能是由用户之前访问过的页面创建的。<br />
正确的做法是判断某个session中是否存在某个特定的key且其value是否正确<br />
*************************************************************************************<br />
<br />
二十四、Cookie的过期和Session的超时有什么区别<br />
*************************************************************************************<br />
会话的超时由服务器来维护，它不同于Cookie的失效日期。首先，会话一般基于驻留内存的cookie<br />
不是持续性的cookie，因而也就没有截至日期。即使截取到JSESSIONID&nbsp;cookie，并为它设定一个失效日期发送出去。浏览器会话和服务器会话也会截然不同。<br />
*************************************************************************************<br />
<br />
二十五、session&nbsp;cookie和session对象的生命周期是一样的吗<br />
*************************************************************************************<br />
当用户关闭了浏览器虽然session&nbsp;cookie已经消失，但session对象仍然保存在服务器端<br />
*************************************************************************************<br />
<br />
二十六、是否只要关闭浏览器，session就消失了<br />
*************************************************************************************<br />
程序一般都是在用户做log&nbsp;off的时候发个指令去删除session，然而浏览器从来不会主动在关闭之前通知服务器它将要被关闭，因此服务器根本不会有机会知道浏览器已经关闭。服务器会一直保留这个会话对象直到它处于非活动状态超过设定的间隔为止。<br />
之所以会有这种错误的认识，是因为大部分session机制都使用会话cookie来保存session&nbsp;id，而关闭浏览器后这个session&nbsp;id就消失了，再次连接到服务器时也就无法找到原来的session。<br />
如果服务器设置的cookie被保存到硬盘上，或者使用某种手段改写浏览器发出的HTTP请求报头，把原来的session&nbsp;id发送到服务器，则再次打开浏览器仍然能够找到原来的session。<br />
恰恰是由于关闭浏览器不会导致session被删除，迫使服务器为session设置了一个失效时间，当距离客户上一次使用session的时间超过了这个失效时间时，服务器就可以认为客户端已经停止了活动，才会把session删除以节省存储空间。<br />
　　由此我们可以得出如下结论：<br />
　　关闭浏览器，只会是浏览器端内存里的session&nbsp;cookie消失，但不会使保存在服务器端的session对象消失，同样也不会使已经保存到硬盘上的持久化cookie消失。<br />
*************************************************************************************<br />
<br />
<br />
二十七、打开两个浏览器窗口访问应用程序会使用同一个session还是不同的session<br />
*************************************************************************************<br />
通常session&nbsp;cookie是不能跨窗口使用的，当你新开了一个浏览器窗口进入相同页面时，系统会赋予你一个新的session&nbsp;id，这样我们信息共享的目的就达不到了。<br />
此时我们可以先把session&nbsp;id保存在persistent&nbsp;cookie中(通过设置session的最大有效时间)，然后在新窗口中读出来，就可以得到上一个窗口的session&nbsp;id了，这样通过session&nbsp;cookie和persistent&nbsp;cookie的结合我们就可以实现了跨窗口的会话跟踪。<br />
*************************************************************************************<br />
<br />
二十八、如何使用会话显示每个客户的访问次数<br />
*************************************************************************************<br />
由于客户的访问次数是一个整型的变量，但session的属性类型中不能使用int，double，boolean等基本类型的变量，所以我们要用到这些基本类型的封装类型对象作为session对象中属性的值<br />
　　但像Integer是一种不可修改(Immutable)的数据结构：构建后就不能更改。这意味着每个请求都必须创建新的Integer对象，之后使用setAttribute来代替之前存在的老的属性的值。例如：<br />
HttpSession&nbsp;session&nbsp;=&nbsp;request.getSession();<br />
SomeImmutalbeClass&nbsp;value&nbsp;=&nbsp;(SomeImmutableClass)session.getAttribute(&#8220;SomeIdentifier&#8221;);<br />
if&nbsp;(value=&nbsp;=null){<br />
&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;=&nbsp;new&nbsp;SomeImmutableClass(&#8230;);　//&nbsp;新创建一个不可更改对象<br />
}else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;=&nbsp;new&nbsp;SomeImmutableClass(calculatedFrom(value));&nbsp;//&nbsp;对value重新计算后创建新的对象<br />
}<br />
session.setAttribute(&#8220;someIdentifier&#8221;,value);&nbsp;//&nbsp;使用新创建的对象覆盖原来的老的对象<br />
*************************************************************************************<br />
<br />
二十九、如何使用会话累计用户的数据<br />
*************************************************************************************<br />
使用可变的数据结构，比如数组、List、Map或含有可写字段的应用程序专有的数据结构。通过这种方式，除非首次分配对象，否则不需要调用setAttribute。例如<br />
<br />
HttpSession&nbsp;session&nbsp;=&nbsp;request.getSession();<br />
SomeMutableClass&nbsp;value&nbsp;=&nbsp;(SomeMutableClass)session.getAttribute(&#8220;someIdentifier&#8221;);<br />
if(value&nbsp;=&nbsp;=&nbsp;null){<br />
&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;=&nbsp;new&nbsp;SomeMutableClass(&#8230;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;session.setAttribute(&#8220;someIdentifier&#8221;,value);<br />
}else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;value.updateInternalAttribute(&#8230;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果已经存在该对象则更新其属性而不需重新设置属性<br />
}<br />
*************************************************************************************<br />
<br />
三十、不可更改对象和可更改对象在会话数据更新时的不同处理<br />
*************************************************************************************<br />
不可更改对象因为一旦创建之后就不能更改，所以每次要修改会话中属性的值的时候，都需要<br />
调用setAttribute(&#8220;someIdentifier&#8221;,newValue)来代替原有的属性的值，否则属性的值不会被更新<br />
可更改对象因为其自身一般提供了修改自身属性的方法，所以每次要修改会话中属性的值的时<br />
候，只要调用该可更改对象的相关修改自身属性的方法就可以了。这意味着我们就不需要调<br />
用setAttribute方法了<br />
*************************************************************************************<br />
</span></p>
<img src ="http://www.blogjava.net/agun/aggbug/339792.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2010-12-04 12:14 <a href="http://www.blogjava.net/agun/archive/2010/12/04/339792.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring 常识2</title><link>http://www.blogjava.net/agun/archive/2010/12/04/339788.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Sat, 04 Dec 2010 03:52:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2010/12/04/339788.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/339788.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2010/12/04/339788.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/339788.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/339788.html</trackback:ping><description><![CDATA[<p><span style="color: #ff0000">1， Spring bean 定义</span></p>
<p>spring bean 定义可能包含大量的配置信息，包括容器相关的信息（比如初始化方法，静态工厂方法</p>
<p>等）、构造函数参数、属性等。如果两个bean之间的配置信息大同小异，可采用bean的继承来减少重</p>
<p>复配置工作。子bean定义可以从父bean定义继承部分配置。它也可覆盖一些配置，或者添加一些配置</p>
<p>。使用继承配置可以节省很多输入工作，实际上就是一种模板形式。</p>
<p><span style="color: #ff0000">spring中事务配置中就有这样例子，为了使用事务只要父配置了事务代理就可以了，所有需要事务的</span></p>
<p><span style="color: #ff0000">bean只要继承父就可以了。说到这个就在多说几句，父bean通常不需要实例化的，而仅仅作为子bean</span></p>
<p><span style="color: #ff0000">定的的模板使用；而ApplicationContext默认预初始化所有的singleton bean。为了阻止父bean被预</span></p>
<p><span style="color: #ff0000">初始化，可以使用abstract属性设置父bean为抽象bean。容器会忽略所有的抽象bean定义，预初始化</span></p>
<p><span style="color: #ff0000">时不初始化抽象bean</span>。</p>
<p>&nbsp;</p>
<p><span style="color: #ff0000">2， spring 事务管理</span></p>
<p>传统的J2EE开发者对事务管理可能采用两种策略</p>
<p><span style="color: #ff0000">（1），全局事务</span>：全局事务通常由应用服务器管理，使用JTA。全局事务可跨越多个事务性的资源，保证</p>
<p>在多个事务性资源间跨越时资源一致性。<br />
<span style="color: #ff0000">（2），局部事务</span>：局部事务和特定资源相关，如，一个和JDBC链接关联的事务。该事务尽能保证对该</p>
<p>JDBC连接数据库的一致性，对局部事务，应用服务器不需要参与事务管理，不能保证跨越多个资源的</p>
<p>事务正确性。</p>
<p>&nbsp;</p>
<p><span style="color: #ff0000">3，编程式事务</span></p>
<p>Spring 提供两种编程式的事务管理</p>
<p>&nbsp;</p>
<p>（1）使用TransactionTemplate事务管理</p>
<p>（2）直接使用一个PlatformTransactionManager实现类管理事务。</p>
<p>&nbsp;</p>
<p>两种编程式的事务都不需要与特定的事务API耦合，第一种更符合Spring模板式的编程模型，因此通常推荐采用第一种方式，第二种非常类似于JTA的UserTransaction的API编程，区别是减少了异常处理。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="color: #ff0000">4，声明式事务</span></p>
<p>Spring的声明式事务是通过面向切面（AOP）实现。</p>
<p>（1）使用声明式事务管理</p>
<p>通常，通过TransactionPoxyFactoryBean为目标Bean生成Spring事务代理。当bean实例的方法需要事务管理时，采用TransactionPoxyFactoryBean来自目标bean生成事务代理。<span style="color: #ff0000">每个TransactionPoxyFactoryBean为一个具体的目标bean生成代理对象，代理对象的方法改写了目标bean的方法，就是在目标bean的方法执行之前加入开始事务，在目标bean方法结束之后提交事务，遇到指定异常回滚事务</span>。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 定义事务代理bean模板</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Xml代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://agun.javaeye.com/blog/789046#"><img alt="复制代码" src="http://agun.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-xml">
    <li><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">"txProxyTemplate"</span><span>&nbsp;</span><span class="attribute">abstract</span><span>=</span><span class="attribute-value">"true"</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">class</span><span>="</span><span class="tag">&lt;</span><span class="tag-name">SPAN</span><span>&nbsp;style="</span><span class="attribute-value">COLOR</span><span>:&nbsp;#ff0000"</span><span class="tag">&gt;</span><span>org.springframework.transaction.interceptor.TransactionProxyFactoryBean</span><span class="tag">&lt;/</span><span class="tag-name">SPAN</span><span class="tag">&gt;</span><span>"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"transactionManager"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">bean</span><span>=</span><span class="attribute-value">"transactionManager"</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"transactionAttributes"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">props</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">"trans_*"</span><span class="tag">&gt;</span><span>PROPAGATION_REQUIRED</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">"query*"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROPAGATION_REQUIRED,readOnly,-Exception &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">"find*"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROPAGATION_REQUIRED,readOnly,-Exception &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">"load*"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROPAGATION_REQUIRED,readOnly,-Exception &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">"*"</span><span class="tag">&gt;</span><span>PROPAGATION_REQUIRED,-Exception</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">props</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="xml" style="display: none" name="code">	&lt;bean id="txProxyTemplate" abstract="true"
class="<span style="color: #ff0000">org.springframework.transaction.interceptor.TransactionProxyFactoryBean</span>"&gt;
&lt;property name="transactionManager"&gt;
&lt;ref bean="transactionManager" /&gt;
&lt;/property&gt;
&lt;property name="transactionAttributes"&gt;
&lt;props&gt;
&lt;prop key="trans_*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;
&lt;prop key="query*"&gt;
PROPAGATION_REQUIRED,readOnly,-Exception
&lt;/prop&gt;
&lt;prop key="find*"&gt;
PROPAGATION_REQUIRED,readOnly,-Exception
&lt;/prop&gt;
&lt;prop key="load*"&gt;
PROPAGATION_REQUIRED,readOnly,-Exception
&lt;/prop&gt;
&lt;prop key="*"&gt;PROPAGATION_REQUIRED,-Exception&lt;/prop&gt;
&lt;/props&gt;
&lt;/property&gt;
&lt;/bean&gt;</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>（2）根据BeanName自动创建事务代理</p>
<p>如果同一个应用中有很多目标bean需要生成事务代理，当然可以为每个目标bean额外配置一个TransactionPoxyFactoryBean bean.这样做的缺点是，配置文件相当臃肿而且难以维护，此时可以考虑使用自动事务代理。自动事务代理的思路是，当ApplicationContext初始化完成后，由上下文中的某个bean<span style="color: #ff0000">"后处理"</span>每个目标bean，为这些目标bean生成事务代理。</p>
<p>能为目标bean执行<span style="color: #ff0000">"后处理"</span>的bean必须实现<span style="color: #ff0000">BeanFactoryPostProcessor</span>接口，ApplicationContext完成初始化后，会自动初始化所有实现BeanFactoryPostProcessor接口的bean，并且让它<span style="color: #ff0000">&#8220;后处理&#8221;</span>其他bean.Spring提供BeanFactoryPostProcessor的实现类<span style="color: #ff0000">BeanNameAutoPoxyCreator</span>，<span style="color: #ff0000">BeanNameAutoPoxyCreator</span>可以用来处理ApplicationContext中其他bean，方法是通过名称来识别，并且把他们用事务代理包装起来。<span style="color: #ff0000">BeanNameAutoPoxyCreator</span>生成的事务代理，和使用TransactionPoxyFactoryBean生成的事务代理基本一致。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 定义事务拦截bean</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Xml代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://agun.javaeye.com/blog/789046#"><img alt="复制代码" src="http://agun.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-xml">
    <li><span><span>&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">"transactionInterceptor"</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="attribute">class</span><span>="</span><span class="tag">&lt;</span><span class="tag-name">SPAN</span><span>&nbsp;style="</span><span class="attribute-value">COLOR</span><span>:&nbsp;#ff0000"</span><span class="tag">&gt;</span><span>org.springframework.transaction.interceptor.TransactionInterceptor</span><span class="tag">&lt;/</span><span class="tag-name">SPAN</span><span class="tag">&gt;</span><span>"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"transactionManager"</span><span>&nbsp;</span><span class="attribute">ref</span><span>=</span><span class="attribute-value">"TransactionManager"</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"transactionAttributes"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">props</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">"create*"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROPAGATION_REQUIRED,-Exception &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">"delete*"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROPAGATION_REQUIRED,-Exception &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">"update*"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROPAGATION_REQUIRED,-Exception &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">"get*"</span><span class="tag">&gt;</span><span>PROPAGATION_REQUIRED</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">props</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="xml" style="display: none" name="code">&nbsp;&lt;bean id="transactionInterceptor"
&nbsp;&nbsp;class="<span style="color: #ff0000">org.springframework.transaction.interceptor.TransactionInterceptor</span>"&gt;
&nbsp;&nbsp;&lt;property name="transactionManager" ref="TransactionManager" /&gt;
&nbsp;&nbsp;
&nbsp;&nbsp;&lt;property name="transactionAttributes"&gt;
&nbsp;&nbsp;&nbsp;&lt;props&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="create*"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROPAGATION_REQUIRED,-Exception
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/prop&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="delete*"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROPAGATION_REQUIRED,-Exception
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/prop&gt;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="update*"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROPAGATION_REQUIRED,-Exception
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/prop&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="get*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;
&nbsp;&nbsp;&nbsp;&lt;/props&gt;
&nbsp;&nbsp;&lt;/property&gt;
&nbsp;&lt;/bean&gt;</pre>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Xml代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://agun.javaeye.com/blog/789046#"><img alt="复制代码" src="http://agun.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-xml">
    <li><span><span>&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="attribute">class</span><span>="</span><span class="tag">&lt;</span><span class="tag-name">SPAN</span><span>&nbsp;style="</span><span class="attribute-value">COLOR</span><span>:&nbsp;#ff0000"</span><span class="tag">&gt;</span><span>org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator</span><span class="tag">&lt;/</span><span class="tag-name">SPAN</span><span class="tag">&gt;</span><span>"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"beanNames"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>*Service</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"interceptorNames"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>transactionInterceptor</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="xml" style="display: none" name="code">&nbsp;&lt;bean
&nbsp;&nbsp;class="<span style="color: #ff0000">org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator</span>"&gt;
&nbsp;&nbsp;&lt;property name="beanNames"&gt;
&nbsp;&nbsp;&nbsp;&lt;value&gt;*Service&lt;/value&gt;
&nbsp;&nbsp;&lt;/property&gt;
&nbsp;&nbsp;&lt;property name="interceptorNames"&gt;
&nbsp;&nbsp;&nbsp;&lt;list&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;transactionInterceptor&lt;/value&gt;
&nbsp;&nbsp;&nbsp;&lt;/list&gt;
&nbsp;&nbsp;&lt;/property&gt;
&nbsp;&lt;/bean&gt;&nbsp;</pre>
<p>&nbsp;</p>
<p>次配置关键在两个bean </p>
<p>TransactionInterceptor</p>
<p>BeanNameAutoProxyCreator</p>
<p>&nbsp;</p>
<p>（3）基于注释式事务代理配置</p>
<img src ="http://www.blogjava.net/agun/aggbug/339788.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2010-12-04 11:52 <a href="http://www.blogjava.net/agun/archive/2010/12/04/339788.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring 常识1</title><link>http://www.blogjava.net/agun/archive/2010/12/04/339787.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Sat, 04 Dec 2010 03:50:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2010/12/04/339787.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/339787.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2010/12/04/339787.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/339787.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/339787.html</trackback:ping><description><![CDATA[<span style="color: #ff0000">1,实例化bean</span><br />
就Spring IoC容器而言，bean定义基本上描述了创建一个或多个实际bean对象的内容。当需要的时候，容器会从bean定义列表中取得一个指定的bean定义，并根据bean定义里面的配置元数据使用反射机制来创建一个实际的对象。因此这一节将讲解如何告知Spring IoC容器我们将要实例化的对象的类型以及如何实例化对象。
<p>当采用XML描述配置元数据时，将通过&lt;bean/&gt;元素的class属性来指定实例化对象的类型。class 属性 (对应BeanDefinition实例的Class属性)通常是必须的(不过也有两种例外的情形，&#8220;使用实例工厂方法实例化&#8221;和&#8220;bean定义的继承&#8221;)。class属性主要有两种用途：在大多数情况下，容器将直接通过反射调用指定类的构造器来创建bean(这有点等类似于在Java代码中使用new操作符)；在极少数情况下，容器将调用类的静态工厂方法来创建bean实例，class属性将用来指定实际具有静态工厂方法的类(至于调用静态工厂方法创建的对象类型是当前class还是其他的class则无关紧要)。</p>
<p><span style="color: #ff0000">2, 延迟初始化bean</span><br />
ApplicationContext实现的默认行为就是在启动时将所有singleton bean提前进行实例化。提前实例化意味着作为初始化过程的一部分，ApplicationContext实例会创建并配置所有的singleton bean。通常情况下这是件好事，因为这样在配置中的任何错误就会即刻被发现（否则的话可能要花几个小时甚至几天）。</p>
<p>有时候这种默认处理可能并不是你想要的。如果你不想让一个singleton bean在ApplicationContext实现在初始化时被提前实例化，那么可以将bean设置为延迟实例化。一个延迟初始化bean将告诉IoC 容器是在启动时还是在第一次被用到时实例化。</p>
<p>在XML配置文件中，延迟初始化将通过&lt;bean/&gt;元素中的lazy-init属性来进行控制。例如：</p>
<p>&lt;bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!-- various properties here... --&gt;<br />
&lt;/bean&gt;<br />
&nbsp; &lt;bean name="not.lazy" class="com.foo.AnotherBean"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!-- various properties here... --&gt;<br />
&lt;/bean&gt;<br />
当ApplicationContext实现加载上述配置时，设置为lazy的bean将不会在ApplicationContext启动时提前被实例化，而not.lazy却会被提前实例化。</p>
<p>需要说明的是，如果一个bean被设置为延迟初始化，而另一个非延迟初始化的singleton bean依赖于它，那么当ApplicationContext提前实例化singleton bean时，它必须也确保所有上述singleton 依赖bean也被预先初始化，当然也包括设置为延迟实例化的bean。因此，如果Ioc容器在启动的时候创建了那些设置为延迟实例化的bean的实例，你也不要觉得奇怪，因为那些延迟初始化的bean可能在配置的某个地方被注入到了一个非延迟初始化singleton bean里面。</p>
<p>在容器层次中通过在&lt;beans/&gt;元素上使用'default-lazy-init'属性来控制延迟初始化也是可能的。如下面的配置：<br />
&lt;beans default-lazy-init="true"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!-- no beans will be eagerly pre-instantiated... --&gt;<br />
&lt;/beans&gt;</p>
<p><br />
<span style="color: #ff0000">3,自动装配（autowire）协作者</span><br />
Spring IoC容器可以自动装配（autowire）相互协作bean之间的关联关系。因此，如果可能的话，可以自动让Spring通过检查BeanFactory中的内容，来替我们指定bean的协作者（其他被依赖的bean）。由于autowire可以针对单个bean进行设置，因此可以让有些bean使用autowire，有些bean不采用。autowire的方便之处在减少或者消除属性或构造器参数的设置，这样可以给我们的配置文件减减肥！[2] 在xml配置文件中，autowire一共有五种类型，可以在&lt;bean/&gt;元素中使用autowire属性指定:</p>
<p>Table 3.2. Autowiring modes</p>
<p>模式 说明 </p>
<p>&nbsp;&nbsp;&nbsp; no 不使用自动装配。必须通过ref元素指定依赖，这是默认设置。由于显式指定协作者可以使配置更灵活、更清晰，因此对于较大的部署配置，推荐采用该设置。而且在某种程度上，它也是系统架构的一种文档形式。<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; byName 根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean，并将其与属性自动装配。例如，在bean定义中将autowire设置为by name，而该bean包含master属性（同时提供setMaster(..)方法），Spring就会查找名为master的bean定义，并用它来装配给master属性。<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; byType 如果容器中存在一个与指定属性类型相同的bean，那么将与该属性自动装配。如果存在多个该类型的bean，那么将会抛出异常，并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean，则什么事都不发生，属性也不会被设置。如果你不希望这样，那么可以通过设置dependency-check="objects"让Spring抛出异常。<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; constructor 与byType的方式类似，不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean，那么将会抛出异常。<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; autodetect 通过bean类的自省机制（introspection）来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器，那么将使用byType方式。<br />
&nbsp;</p>
<p>如果直接使用property和constructor-arg注入依赖的话，那么将总是覆盖自动装配。而且目前也不支持简单类型的自动装配，这里所说的简单类型包括基本类型、String、Class以及简单类型的数组（这一点已经被设计，将考虑作为一个功能提供）。自动装配还可以与依赖检查结合使用，这样依赖检查将在自动装配完成之后被执行。</p>
<p>理解自动装配的优缺点是很重要的。其中优点包括：</p>
<p>自动装配能显著减少配置的数量。不过，采用bean模板（见这里）也可以达到同样的目的。</p>
<p>自动装配可以使配置与java代码同步更新。例如，如果你需要给一个java类增加一个依赖，那么该依赖将被自动实现而不需要修改配置。因此强烈推荐在开发过程中采用自动装配，而在系统趋于稳定的时候改为显式装配的方式。</p>
<p>自动装配的一些缺点：</p>
<p>尽管自动装配比显式装配更神奇，但是，正如上面所提到的，Spring会尽量避免在装配不明确的时候进行猜测，因为装配不明确可能出现难以预料的结果，而且Spring所管理的对象之间的关联关系也不再能清晰的进行文档化。</p>
<p>对于那些根据Spring配置文件生成文档的工具来说，自动装配将会使这些工具没法生成依赖信息。</p>
<p>如果采用by type方式自动装配，那么容器中类型与自动装配bean的属性或者构造函数参数类型一致的bean只能有一个，如果配置可能存在多个这样的bean，那么就要考虑采用显式装配了。</p>
<p>尽管使用autowire没有对错之分，但是能在一个项目中保持一定程度的一致性是最好的做法。例如，通常情况下如果没有使用自动装配，那么仅自动装配一个或两个bean定义可能会引起开发者的混淆。</p>
<img src ="http://www.blogjava.net/agun/aggbug/339787.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2010-12-04 11:50 <a href="http://www.blogjava.net/agun/archive/2010/12/04/339787.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ehcache分布式缓存</title><link>http://www.blogjava.net/agun/archive/2010/12/04/339786.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Sat, 04 Dec 2010 03:49:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2010/12/04/339786.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/339786.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2010/12/04/339786.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/339786.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/339786.html</trackback:ping><description><![CDATA[<p>Ehcache分布式缓存也是我一直比较较关注的，以前用过oscache的分布式缓存。在网上看到了相关文章记录下来。</p>
<p>&nbsp;</p>
<p>Ehcache支持的分布式缓存支持有三种RMI，JGroups，JMS</p>
<p>&nbsp;</p>
<p>这里介绍下MRI和JGrpups两种方式，Ehcache使用版本为1.5.0，关于ehcache的其他信息请参考http://ehcache.sourceforge.net/EhcacheUserGuide.html，关于jgroups的信息请参考<a href="http://www.jgroups.org/manual/html_single/index.html">http://www.jgroups.org/manual/html_single/index.html</a>。</p>
<p>&nbsp;</p>
<p>原始文章 <a href="http://www.javaeye.com/topic/335623">http://www.javaeye.com/topic/335623</a></p>
<img src ="http://www.blogjava.net/agun/aggbug/339786.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2010-12-04 11:49 <a href="http://www.blogjava.net/agun/archive/2010/12/04/339786.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ehcache缓存配置</title><link>http://www.blogjava.net/agun/archive/2010/12/04/339785.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Sat, 04 Dec 2010 03:46:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2010/12/04/339785.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/339785.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2010/12/04/339785.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/339785.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/339785.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 近期项目用到Ehcache，以前项目主要用到Oscache,并且缓存也是针对orm来处理，只要配置就好，不需要自定义缓存，不需管理缓存。下面描述一下，Spring+Ehcache来处理缓存。1，首先引入jar包就不说了环境也不说了，要引入ehcache.xml文件(ehcache配置文件)。Xml代码     &lt;ehcache&nbsp;xmlns:xsi="ht...&nbsp;&nbsp;<a href='http://www.blogjava.net/agun/archive/2010/12/04/339785.html'>阅读全文</a><img src ="http://www.blogjava.net/agun/aggbug/339785.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2010-12-04 11:46 <a href="http://www.blogjava.net/agun/archive/2010/12/04/339785.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Web Services</title><link>http://www.blogjava.net/agun/archive/2010/12/04/339784.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Sat, 04 Dec 2010 03:45:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2010/12/04/339784.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/339784.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2010/12/04/339784.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/339784.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/339784.html</trackback:ping><description><![CDATA[<p>web 服务是通过标准的web协议可以访问的一个应用程序组件。</p>
<p>它是一种可以接收从internet 或者internet 上的其他系统传递过来的请求的轻量级独立的通信技术。这种技术允许网络上的所有系统进行交互。</p>
<p>&nbsp;</p>
<p>j2ee平台是围绕web服务来构架的，其中的技术和web服务相关的有<span style="color: #ff0000">JAX-RCP 、Web Service、SAAJ 、JAXR 、EJB 、JAC</span> 等，其中Web Services for J2EE 是WEB服务总框架，JAX-RCP是J2EE的WEB服务的核心技术，SAAJ为处理带附件的SOAP消息提供了JAVA编程API.</p>
<p>&nbsp;</p>
<p><span style="color: #ff0000">在J2EE平台中，要开发WEB服务可以使用两种技术，一种基于XML远程调用的技术-JAX-RCP，另外一个基于XML的消息发送技术-JAXM</span>.</p>
<p>&nbsp;</p>
<p>这里主要针对JAX-RCP 详细说一下。</p>
<p>&nbsp;</p>
<p>JAX-RCP( JAVA API FOR XMLBASED RCP) 是一种远程方法调用（或者说远程过程调用），那么它和其他远程方法调用（RPC,COM,CORBA RMI）有什么区别呢</p>
<p>&nbsp;</p>
<p>综合比较长远的远程方法调用技术，他们有以下共性。</p>
<p>&nbsp;</p>
<p>1，在客户端和服务端有通用的编程接口。</p>
<p>&nbsp;</p>
<p>2，在客户端STUB,在服务端有SKELETON.</p>
<p>&nbsp;</p>
<p>3，客户端和服务端有专门的协议进行数据传输。</p>
<p>&nbsp;</p>
<p>对于通用接口的描述，比如CORBA 有IDL OF CORBA ，JAVA RMI 有JAVA RMI INTERFACE IN RMI ，对于基于XML的RPC 来说，IDL 就是WSDL。那么对于XML-RPC来说，这个结构中&#8220;传输协议&#8221;当然是SAOP，SOAP消息是将以传输文本为基础的协议（HTTP,SMTP FTP）作为载体来使用的。也就是说，SOAP消息的传输建立在HTTP SMTP FTP之上。</p>
<p>&nbsp;</p>
<p>&nbsp;JAX-RCP的客户端调用方法:</p>
<p>&nbsp;</p>
<p>1，基于STUB</p>
<p>2，动态代理</p>
<p>3，动态调用</p>
<img src ="http://www.blogjava.net/agun/aggbug/339784.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2010-12-04 11:45 <a href="http://www.blogjava.net/agun/archive/2010/12/04/339784.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>