﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-老天</title><link>http://www.blogjava.net/stone840/</link><description>学我者生，像我者死</description><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 01:17:51 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 01:17:51 GMT</pubDate><ttl>60</ttl><item><title>JPA注解记录</title><link>http://www.blogjava.net/stone840/archive/2013/03/05/396062.html</link><dc:creator>老天</dc:creator><author>老天</author><pubDate>Tue, 05 Mar 2013 03:51:00 GMT</pubDate><guid>http://www.blogjava.net/stone840/archive/2013/03/05/396062.html</guid><wfw:comment>http://www.blogjava.net/stone840/comments/396062.html</wfw:comment><comments>http://www.blogjava.net/stone840/archive/2013/03/05/396062.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/stone840/comments/commentRss/396062.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone840/services/trackbacks/396062.html</trackback:ping><description><![CDATA[<strong>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br />@NotFound(action=NotFoundAction.IGNORE)</strong><br /><div style="padding-bottom: 10px; clear: both;">使用hibernate <br />注解配置实体类的关联关系，在many-to-one,one-to-one关联中，一边引用自另一边的属性，如果属性值为某某的数据在数据库不存在了，hibernate默认会抛出异常。解决此问题，加上如下注解就可以了：</div><div style="padding-bottom: 10px; clear: both;">@NotFound(action=NotFoundAction.IGNORE)，意思是找不到引用的外键数据时忽略，NotFound默认是exception<br /><br /><strong>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</strong><br /><strong>cascade = CascadeType.REFRESH，cascade=CascadeType.ALL<br /></strong><p><span style="line-height: 18px; font-family: Arial, sans-serif, Helvetica, Tahoma;"><span style="font-size: small;">cascade表示级联操作&nbsp;&nbsp; </span></span></p><p><span style="line-height: 18px; font-family: Arial, sans-serif, Helvetica, Tahoma;"><span style="font-size: small;"><br />&nbsp;&nbsp; CascadeType.MERGE级联更新：若items属性修改了那么order对象保存时同时修改items里的对象。对应EntityManager的merge方法 </span></span></p><p><span style="line-height: 18px; font-family: Arial, sans-serif, Helvetica, Tahoma;"><span style="font-size: small;">&nbsp; <br />&nbsp;&nbsp; CascadeType.PERSIST级联刷新：获取order对象里也同时也重新获取最新的items时的对象。对应EntityManager的refresh(object)方法有效。即会重新查询数据库里的最新数据&nbsp;&nbsp; <br />&nbsp;&nbsp; </span></span></p><p><span style="line-height: 18px; font-family: Arial, sans-serif, Helvetica, Tahoma;"><span style="font-size: small;">&nbsp; CascadeType.REFRESH级联保存：对order对象保存时也对items里的对象也会保存。对应EntityManager的presist方法&nbsp;&nbsp; <br />&nbsp;&nbsp; </span></span></p><p><span style="line-height: 18px; font-family: Arial, sans-serif, Helvetica, Tahoma;"><span style="font-size: small;">&nbsp; CascadeType.REMOVE级联删除：对order对象删除也对items里的对象也会删除。对应EntityManager的remove方法</span>&nbsp;&nbsp; </span></p>CascadeType.PERSIST只有A类新增时，会级联B对象新增。若B对象在数据库存（跟新）在则抛异常（让B变为持久态） <p>CascadeType.MERGE指A类新增或者变化，会级联B对象（新增或者变化） </p><p>CascadeType.REMOVE只有A类删除时，会级联删除B类； </p><p>CascadeType.ALL包含所有； </p><p>CascadeType.REFRESH没用过。 </p><p>综上：大多数情况用CascadeType.MERGE就能达到级联跟新又不报错，用CascadeType.ALL时要斟酌下CascadeType.REMOVE </p><p>@Fetch: </p><p>定义了加载关联关系的获取策略. FetchMode 可以是 </p><p>SELECT (在需要加载关联的时候触发select操作),&nbsp;&nbsp;&nbsp;&nbsp; SUBSELECT(只对集合有效,使用了子查询策略,详情参考Hibernate参考文档) </p><p>JOIN (在加载主实体(owner entity)的时候使用SQL JOIN来加载关联关系). </p><p>JOIN 将覆写任何延迟属性 (通过 JOIN策略加载的关联将不再具有延迟性).</p><br /><br /><strong>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</strong><br /><strong>fetch=FetchType.LAZY</strong><br /><span style="font-size: medium;">Hibernate的数据加载方式： </span><br /><span style="font-size: small;">1.即时加载 immediately loading</span><p><span style="font-size: small;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 实体<span style="color: rgb(255, 0, 0);">加载完成后</span>，立即加载其关联的数据。</span><br />2.延迟加载lazy loading </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 实体相关联的数据在<span style="color: rgb(255, 0, 0);">第一次访问</span>时再进行读取。 <br />3.预先加载 eager loading </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与immediately loading类似，但实体和相关联的数据是通过<span style="color: rgb(255, 0, 0);">一条sql</span>同时读取。<br />4.批量加载 batch loading <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ？<br /><br /><br /><br /></p><strong><strong>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br /></strong>EntityManager 的API <br /></strong>下面是EntityManager的一些主要的接口方法： <br />void <strong>persist</strong>(Object entity) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过调用EntityManager的persist()方法，新实体实例将转换为受控状态。这意谓着当persist()方法所在的事务提交时，实体的数据将保存到数据库中。如果实体已经被持久化，那么调用persist()操作不会发生任何事情。如果对一个已经删除的实体调用persist()操作，删除态的实体又转变为受控态。如果对游离状的实体执行persist()操作，将抛出IllegalArgumentException。 在一个实体上调用persist()操作，将广播到和实体关联的实体上，执行相应的级联持久化操作； <br /><br />void <strong>remove</strong>(Object entity) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过调用remove()方法删除一个受控的实体。如果实体声明为级联删除(cascade=REMOVE 或者cascade=ALL )，被关联的实体也会被删除。在一个新建状态的实体上调用remove()操作，将被忽略。如果在游离实体上调用remove()操作，将抛出IllegalArgumentException，相关的事务将回滚。如果在已经删除的实体上执行remove()操作，也会被忽略； <br /><br />void <strong>flush</strong>() <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将受控态的实体数据同步到数据库中； <br /><br />T <strong>merge</strong>(T entity) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将一个游离态的实体持久化到数据库中，并转换为受控态的实体； <br /><br />T <strong>find</strong>(Class entityClass, Object primaryKey) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以主键查询实体对象，entityClass是实体的类，primaryKey是主键值，如以下的代码查询Topic实体： Topic t = em.find(Topic.class,1); Query createQuery(String qlString) 根据JPA的查询语句创建一个查询对象Query，如下面的代码： <br />Query q= em.createQuery(""SELECT t FROM Topic t   WHERE t.topicTitle LIKE :topicTitle")"); Query createNativeQuery(String sqlString) <br />使用本地数据库的SQL语句创建一个Query对象，Query通过getResultList()方法执行查询后，返回一个List结果集，每一行数据对应一个Vector。 <br />使用本地数据库的SQL语句创建一个Query对象，Query通过getResultList()方法执行查询后，返回一个List结果集，每一行数据对应一个Vector。 <br />看来要学习的东东还有好多啊~~努力吧！<p><br />&nbsp;</p></div><img src ="http://www.blogjava.net/stone840/aggbug/396062.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone840/" target="_blank">老天</a> 2013-03-05 11:51 <a href="http://www.blogjava.net/stone840/archive/2013/03/05/396062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ssh框架整合开发杂记</title><link>http://www.blogjava.net/stone840/archive/2013/01/15/394256.html</link><dc:creator>老天</dc:creator><author>老天</author><pubDate>Tue, 15 Jan 2013 08:54:00 GMT</pubDate><guid>http://www.blogjava.net/stone840/archive/2013/01/15/394256.html</guid><wfw:comment>http://www.blogjava.net/stone840/comments/394256.html</wfw:comment><comments>http://www.blogjava.net/stone840/archive/2013/01/15/394256.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/stone840/comments/commentRss/394256.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone840/services/trackbacks/394256.html</trackback:ping><description><![CDATA[<div><font style="background-color: #c7edcc">Struts2的下载地址：<br /><a href="http://struts.apache.org/download.cgi">http://struts.apache.org/download.cgi</a><br />目前建议下载版本：2.2.1GA版<br /><br />Hibernate下载地址：<br /><a href="http://www.hibernate.org/downloads">http://www.hibernate.org/downloads<br /></a>目前建议下载版本：3.6.0 Final版<br /><br />Spring的下载地址：<br /><a href="http://www.springsource.org/download">http://www.springsource.org/download<br /></a>目前建议下载版本：稳定版3.0.5<br /><br /></font></div>
<div><font style="background-color: #c7edcc"></font>&nbsp;</div>
<div><font style="background-color: #c7edcc"></font>&nbsp;</div>
<div><font style="background-color: #c7edcc"></font>&nbsp;</div>
<div><font style="background-color: #c7edcc">2013-1-15&nbsp;&nbsp; <br />1、struts2&nbsp; top关键字理解。&nbsp; <br />1).top 指代当前迭代元素，可以为对象；<br />2).这里的top可用[0].top替代，但不能使用[0];[0]代表整个栈对象。如果单纯调用[0]将会调用其 toString()方法输出对象信息；<br /><br /><br /><br />2、删除信息时错误日志：<br /><font size="2"><font color="#cc0000">java.lang.IllegalArgumentException:</font> <font color="#cc0000">Removing</font> <font color="#cc0000">a</font> <font color="#cc0000">detached</font> <font color="#cc0000">instance<br /><br />&nbsp;Detached - a detached instance is an object that has been persistent, but its Session has been closed. The reference to the </div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; object is still valid, of course, and the detached instance might even be modified in this state. A detached instance can be </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reattached to a new Session at a later point in time, making it (and all the modifications) persistent again</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在应该明白了吧，在删除之前把这个Detached instance绑定到当前的Sesssion，在用当前Sesssion删除此instance。修改后的代码如</p>
<div><br />解决办法：<br />public void delete(SASVo&nbsp; vo) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entityManager.remove( entityManager.merge(vo));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></font></font></div><img src ="http://www.blogjava.net/stone840/aggbug/394256.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone840/" target="_blank">老天</a> 2013-01-15 16:54 <a href="http://www.blogjava.net/stone840/archive/2013/01/15/394256.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DOM、JDOM、DOM4J的区别 .</title><link>http://www.blogjava.net/stone840/archive/2012/12/17/393109.html</link><dc:creator>老天</dc:creator><author>老天</author><pubDate>Mon, 17 Dec 2012 08:19:00 GMT</pubDate><guid>http://www.blogjava.net/stone840/archive/2012/12/17/393109.html</guid><wfw:comment>http://www.blogjava.net/stone840/comments/393109.html</wfw:comment><comments>http://www.blogjava.net/stone840/archive/2012/12/17/393109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stone840/comments/commentRss/393109.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone840/services/trackbacks/393109.html</trackback:ping><description><![CDATA[<div id="article_content" class="article_content">
<p><strong>dom是解析xml的底层接口之一(另一种是sax)&nbsp;&nbsp; <br />而jdom和dom4j则是基于底层api的更高级封装&nbsp;&nbsp;&nbsp; <br />dom是通用的，而jdom和dom4j则是面向java语言的&nbsp;</strong>&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; <span style="color: indigo">DOM 是用与平台和语言无关的方式表示 XML 文档的官方 W3C 标准。DOM 是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构，然后才能做任何工作。由于它是基于信息层次的，因而 DOM 被认为是基于树或基于对象的。DOM 以及广义的基于树的处理具有几个优点。首先，由于树在内存中是持久的，因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航，而不是像 SAX 那样是一次性的处理。DOM 使用起来也要简单得多。</span> <br /><strong>XML的四种解析器(dom,sax,jdom,dom4j)原理及性能比较</strong>(转自zsq)&nbsp;&nbsp;&nbsp;&nbsp; <br /><span style="color: green"><strong>1、DOM </strong></span><br />&nbsp;&nbsp;&nbsp; DOM 是用与平台和语言无关的方式表示 XML 文档的官方 W3C 标准。DOM 是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构，然后才能做任何工作。由于它是基于信息层次的，因而 DOM 被认为是基于树或基于对象的。DOM 以及广义的基于树的处理具有几个优点。<br />&nbsp;&nbsp;&nbsp; 首先，由于树在内存中是持久的，因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航，而不是像 SAX 那样是一次性的处理。DOM 使用起来也要简单得多。<br />&nbsp;&nbsp;&nbsp; 另一方面，对于特别大的文档，解析和加载整个文档可能很慢且很耗资源，因此使用其他手段来处理这样的数据会更好。这些基于事件的模型，比如 SAX。 <br /><span style="color: green"><strong>2、SAX&nbsp;</strong></span><br />&nbsp;&nbsp;&nbsp; 这种处理的优点非常类似于流媒体的优点。分析能够立即开始，而不是等待所有的数据被处理。而且，由于应用程序只是在读取数据时检查数据，因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上，应用程序甚至不必解析整个文档；它可以在某个条件得到满足时停止解析。一般来说，SAX 还比它的替代者 DOM 快许多。<br /><span style="color: green"><strong>3、选择 DOM 还是选择 SAX ？</strong></span>&nbsp;<br />&nbsp;&nbsp;&nbsp; 对于需要自己编写代码来处理 XML 文档的开发人员来说，选择 DOM 还是 SAX 解析模型是一个非常重要的设计决策。&nbsp;<br />&nbsp;&nbsp;&nbsp; DOM 采用建立树形结构的方式访问 XML 文档，而 SAX 采用的事件模型。&nbsp;<br />&nbsp;&nbsp;&nbsp; DOM 解析器把 XML 文档转化为一个包含其内容的树，并可以对树进行遍历。用 DOM 解析模型的优点是编程容易，开发人员只需要调用建树的指令，然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用 DOM 解析器的时候需要处理整个 XML 文档，所以对性能和内存的要求比较高，尤其是遇到很大的 XML 文件的时候。由于它的遍历能力，DOM 解析器常用于 XML 文档需要频繁的改变的服务中。<br />&nbsp;&nbsp;&nbsp; SAX 解析器采用了基于事件的模型，它在解析 XML 文档的时候可以触发一系列的事件，当发现给定的tag的时候，它可以激活一个回调方法，告诉该方法制定的标签已经找到。SAX 对内存的要求通常会比较低，因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时，SAX 这种扩展能力得到了更好的体现。但用 SAX 解析器的时候编码工作会比较困难，而且很难同时访问同一个文档中的多处不同数据。<br /><span style="color: green"><strong>4、JDOM</strong></span>&nbsp;<br />&nbsp;&nbsp;&nbsp; JDOM的目的是成为 Java 特定文档模型，它简化与 XML 的交互并且比使用 DOM 实现更快。由于是第一个 Java 特定模型，JDOM 一直得到大力推广和促进。正在考虑通过&#8220;Java 规范请求 JSR-102&#8221;将它最终用作&#8220;Java 标准扩展&#8221;。从 2000 年初就已经开始了 JDOM 开发。<br />&nbsp;&nbsp;&nbsp; JDOM 与 DOM 主要有两方面不同。首先，JDOM 仅使用具体类而不使用接口。这在某些方面简化了 API，但是也限制了灵活性。第二，API 大量使用了 Collections 类，简化了那些已经熟悉这些类的 Java 开发者的使用。<br />&nbsp;&nbsp;&nbsp; JDOM 文档声明其目的是&#8220;使用 20%（或更少）的精力解决 80%（或更多）Java/XML 问题&#8221;（根据学习曲线假定为 20%）。JDOM 对于大多数 Java/XML 应用程序来说当然是有用的，并且大多数开发者发现 API 比 DOM 容易理解得多。JDOM 还包括对程序行为的相当广泛检查以防止用户做任何在 XML 中无意义的事。然而，它仍需要您充分理解 XML 以便做一些超出基本的工作（或者甚至理解某些情况下的错误）。这也许是比学习 DOM 或 JDOM 接口都更有意义的工作。<br />&nbsp;&nbsp;&nbsp; JDOM 自身不包含解析器。它通常使用 SAX2 解析器来解析和验证输入 XML 文档（尽管它还可以将以前构造的 DOM 表示作为输入）。它包含一些转换器以将 JDOM 表示输出成 SAX2 事件流、DOM 模型或 XML 文本文档。JDOM 是在 Apache 许可证变体下发布的开放源码。<br /><span style="color: green"><strong>5、DOM4J</strong></span>&nbsp;<br />&nbsp;&nbsp;&nbsp; 虽然 DOM4J 代表了完全独立的开发结果，但最初，它是 JDOM 的一种智能分支。它合并了许多超出基本 XML 文档表示的功能，包括集成的 XPath 支持、XML Schema 支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项，它通过 DOM4J API 和标准 DOM 接口具有并行访问功能。从 2000 下半年开始，它就一直处于开发之中。<br />&nbsp;&nbsp;&nbsp; 为支持所有这些功能，DOM4J 使用接口和抽象基本类方法。DOM4J 大量使用了 API 中的 Collections 类，但是在许多情况下，它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是，虽然 DOM4J 付出了更复杂的 API 的代价，但是它提供了比 JDOM 大得多的灵活性。<br />&nbsp;&nbsp;&nbsp; 在添加灵活性、XPath 集成和对大文档处理的目标时，DOM4J 的目标与 JDOM 是一样的：针对 Java 开发者的易用性和直观操作。它还致力于成为比 JDOM 更完整的解决方案，实现在本质上处理所有 Java/XML 问题的目标。在完成该目标时，它比 JDOM 更少强调防止不正确的应用程序行为。<br />&nbsp;&nbsp;&nbsp; DOM4J 是一个非常非常优秀的Java XML API，具有性能优异、功能强大和极端易用使用的特点，同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML，特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J。<br /><span style="color: green"><strong>6、总述</strong></span>&nbsp;<br />&nbsp;&nbsp;&nbsp; JDOM 和 DOM 在性能测试时表现不佳，在测试 10M 文档时内存溢出。在小文档情况下还值得考虑使用 DOM 和 JDOM。虽然 JDOM 的开发者已经说明他们期望在正式发行版前专注性能问题，但是从性能观点来看，它确实没有值得推荐之处。另外，DOM 仍是一个非常好的选择。DOM 实现广泛应用于多种编程语言。它还是许多其它与 XML 相关的标准的基础，因为它正式获得 W3C 推荐（与基于非标准的 Java 模型相对），所以在某些类型的项目中可能也需要它（如在 javascript 中使用 DOM）。<br />&nbsp;&nbsp;&nbsp; SAX表现较好，这要依赖于它特定的解析方式。一个 SAX 检测即将到来的XML流，但并没有载入到内存（当然当XML流被读入时，会有部分文档暂时隐藏在内存中）。<br />&nbsp;&nbsp;&nbsp; 无疑，DOM4J是最好的，目前许多开源项目中大量采用 DOM4J，例如大名鼎鼎的 Hibernate 也用 DOM4J 来读取 XML 配置文件。如果不考虑可移植性，那就采用DOM4J吧！</p></div><img src ="http://www.blogjava.net/stone840/aggbug/393109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone840/" target="_blank">老天</a> 2012-12-17 16:19 <a href="http://www.blogjava.net/stone840/archive/2012/12/17/393109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4j配置详细讲解</title><link>http://www.blogjava.net/stone840/archive/2012/12/05/392505.html</link><dc:creator>老天</dc:creator><author>老天</author><pubDate>Wed, 05 Dec 2012 09:00:00 GMT</pubDate><guid>http://www.blogjava.net/stone840/archive/2012/12/05/392505.html</guid><wfw:comment>http://www.blogjava.net/stone840/comments/392505.html</wfw:comment><comments>http://www.blogjava.net/stone840/archive/2012/12/05/392505.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stone840/comments/commentRss/392505.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone840/services/trackbacks/392505.html</trackback:ping><description><![CDATA[<div class="postTitle"><a id="viewpost1_TitleUrl" class="postTitle2" href="http://www.blogjava.net/kit-soft/archive/2009/08/28/292977.html">log4j配置祥解</a> </div>
<div style="font-size: 12px" id="blogDetailDiv"><span style="line-height: 1.3em; font-family: '宋体'">第一步：加入log4j-1.2.8.jar到lib下。</span><wbr><br /><br /><span style="line-height: 1.3em; font-family: '宋体'">第二步：在CLASSPATH下建立log4j.properties。内容如下：</span><wbr><br /><br />1 log4j.rootCategory=INFO, stdout , R<br /><br />2<br /><br />3 log4j.appender.stdout=org.apache.log4j.ConsoleAppender<br /><br />4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout<br /><br />5 log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n<br /><br />6<br /><br />7 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender<br /><br />8 log4j.appender.R.File=D:\Tomcat 5.5\logs\qc.log<br /><br />9 log4j.appender.R.layout=org.apache.log4j.PatternLayout<br /><br />10 log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n<br /><br />11<br /><br />12 log4j.logger.com.neusoft=DEBUG<br /><br />13 log4j.logger.com.opensymphony.oscache=ERROR<br /><br />14 log4j.logger.net.sf.navigator=ERROR<br /><br />15 log4j.logger.org.apache.commons=ERROR<br /><br />16 log4j.logger.org.apache.struts=WARN<br /><br />17 log4j.logger.org.displaytag=ERROR<br /><br />18 log4j.logger.org.springframework=DEBUG<br /><br />19 log4j.logger.com.ibatis.db=WARN<br /><br />20 log4j.logger.org.apache.velocity=FATAL<br /><br />21<br /><br />22 log4j.logger.com.canoo.webtest=WARN<br /><br />23<br /><br />24 log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN<br /><br />25 log4j.logger.org.hibernate=DEBUG<br /><br />26 log4j.logger.org.logicalcobwebs=WARN<br /><br /><span style="line-height: 1.3em; font-family: '宋体'">第三步：相应的修改其中属性，修改之前就必须知道这些都是干什么的，在第二部分讲解。</span><wbr><br /><br /><span style="line-height: 1.3em; font-family: '宋体'">第四步：在要输出日志的类中加入相关语句：</span><wbr><br /><br /><span style="line-height: 1.3em; font-family: '宋体'">定义属性：protected final Log log = LogFactory.getLog(getClass());</span><wbr><br /><br /><span style="line-height: 1.3em; font-family: '宋体'">在相应的方法中：</span><wbr><br /><br />if (log.isDebugEnabled())<br /><br />{<br /><br />log.debug(&#8220;System &#8230;..&#8221;);<br /><br />}<br /><br /><span style="line-height: 1.3em; font-family: '宋体'">二、Log4j说明</span><wbr><br /><br />1 log4j.rootCategory=INFO, stdout , R<br /><br /><span style="line-height: 1.3em; font-family: '宋体'">此句为将等级为INFO的日志信息输出到 stdout和R这两个目的地，stdout和R的定义在下面的代码，可以任意起名。等级可分为OFF、 FATAL、ERROR、WARN、INFO、DEBUG、ALL，如果配置OFF则不打出任何信息，如果配置为INFO这样只显示INFO, WARN, ERROR的log信息，而DEBUG信息不会被显示，具体讲解可参照第三部分定义配置文件中的logger。</span><wbr><br /><br />3 log4j.appender.stdout=org.apache.log4j.ConsoleAppender<br /><br /><span style="line-height: 1.3em; font-family: '宋体'">此句为定义名为stdout的输出端是哪种类型，可以是</span><wbr><br /><br />org.apache.log4j.ConsoleAppender<span style="line-height: 1.3em; font-family: '宋体'">（控制台），</span><wbr><br /><br />org.apache.log4j.FileAppender<span style="line-height: 1.3em; font-family: '宋体'">（文件），</span><wbr><br /><br />org.apache.log4j.DailyRollingFileAppender<span style="line-height: 1.3em; font-family: '宋体'">（每天产生一个日志文件），</span><wbr><br /><br />org.apache.log4j.RollingFileAppender<span style="line-height: 1.3em; font-family: '宋体'">（文件大小到达指定尺寸的时候产生一个新的文件）</span><wbr><br /><br />org.apache.log4j.WriterAppender<span style="line-height: 1.3em; font-family: '宋体'">（将日志信息以流格式发送到任意指定的地方）</span><wbr><br /><br /><span style="line-height: 1.3em; font-family: '宋体'">具体讲解可参照第三部分定义配置文件中的Appender。</span><wbr><br /><br />4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout<br /><br /><span style="line-height: 1.3em; font-family: '宋体'">此句为定义名为stdout的输出端的layout是哪种类型，可以是</span><wbr><br /><br />org.apache.log4j.HTMLLayout<span style="line-height: 1.3em; font-family: '宋体'">（以HTML表格形式布局），</span><wbr><br /><br />org.apache.log4j.PatternLayout<span style="line-height: 1.3em; font-family: '宋体'">（可以灵活地指定布局模式），</span><wbr><br /><br />org.apache.log4j.SimpleLayout<span style="line-height: 1.3em; font-family: '宋体'">（包含日志信息的级别和信息字符串），</span><wbr><br /><br />org.apache.log4j.TTCCLayout<span style="line-height: 1.3em; font-family: '宋体'">（包含日志产生的时间、线程、类别等等信息）</span><wbr><br /><br /><span style="line-height: 1.3em; font-family: '宋体'">具体讲解可参照第三部分定义配置文件中的Layout。</span><wbr><br /><br />5 log4j.appender.stdout.layout.ConversionPattern= [QC] %p [%t] %C.%M(%L) | %m%n<br /><br /><span style="line-height: 1.3em; font-family: '宋体'">如果使用pattern布局就要指定的打印信息的具体格式ConversionPattern，打印参数如下：</span><wbr><br /><br />%m <span style="line-height: 1.3em; font-family: '宋体'">输出代码中指定的消息</span><wbr><br /><br />%p <span style="line-height: 1.3em; font-family: '宋体'">输出优先级，即DEBUG，INFO，WARN，ERROR，FATAL</span><wbr><br /><br />%r <span style="line-height: 1.3em; font-family: '宋体'">输出自应用启动到输出该log信息耗费的毫秒数</span><wbr><br /><br />%c <span style="line-height: 1.3em; font-family: '宋体'">输出所属的类目，通常就是所在类的全名</span><wbr><br /><br />%t <span style="line-height: 1.3em; font-family: '宋体'">输出产生该日志事件的线程名</span><wbr><br /><br />%n <span style="line-height: 1.3em; font-family: '宋体'">输出一个回车换行符，Windows平台为&#8220;rn&#8221;，Unix平台为&#8220;n&#8221;</span><wbr><br /><br />%d <span style="line-height: 1.3em; font-family: '宋体'">输出日志时间点的日期或时间，默认格式为ISO8601，也可以在其后指定格式，比如：%d{yyyy MMM dd HH:mm:ss,SSS}，输出类似：2002年10月18日 22：10：28，921</span><wbr><br /><br />%l <span style="line-height: 1.3em; font-family: '宋体'">输出日志事件的发生位置，包括类目名、发生的线程，以及在代码中的行数。</span><wbr><br /><br />[QC]<span style="line-height: 1.3em; font-family: '宋体'">是log信息的开头，可以为任意字符，一般为项目简称。</span><wbr><br /><br /><span style="line-height: 1.3em; font-family: '宋体'">输出的信息</span><wbr><br /><br />[TS] DEBUG [main] AbstractBeanFactory.getBean(189) | Returning cached instance of singleton bean 'MyAutoProxy'<br /><br /><span style="line-height: 1.3em; font-family: '宋体'">具体讲解可参照第三部分定义配置文件中的格式化日志信息。</span><wbr><br /><br />7 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender<br /><br /><span style="line-height: 1.3em; font-family: '宋体'">此句与第3行一样。定义名为R的输出端的类型为每天产生一个日志文件。</span><wbr><br /><br />8 log4j.appender.R.File=D:\Tomcat 5.5\logs\qc.log<br /><br /><span style="line-height: 1.3em; font-family: '宋体'">此句为定义名为R的输出端的文件名为D:\Tomcat 5.5\logs\qc.log</span><wbr><br /><br /><span style="line-height: 1.3em; font-family: '宋体'">可以自行修改。</span><wbr><br /><br />9 log4j.appender.R.layout=org.apache.log4j.PatternLayout<br /><br /><span style="line-height: 1.3em; font-family: '宋体'">与第4行相同。</span><wbr><br /><br />10 log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n<br /><br /><span style="line-height: 1.3em; font-family: '宋体'">与第5行相同。</span><wbr><br /><br />12 log4j.logger.com. neusoft =DEBUG<br /><br /><span style="line-height: 1.3em; font-family: '宋体'">指定com.neusoft包下的所有类的等级为DEBUG。</span><wbr><br /><br /><span style="line-height: 1.3em; font-family: '宋体'">可以把com.neusoft改为自己项目所用的包名。</span><wbr><br /><br />13 log4j.logger.com.opensymphony.oscache=ERROR<br /><br />14 log4j.logger.net.sf.navigator=ERROR<br /><br /><span style="line-height: 1.3em; font-family: '宋体'">这两句是把这两个包下出现的错误的等级设为ERROR，如果项目中没有配置EHCache，则不需要这两句。</span><wbr><br /><br />15 log4j.logger.org.apache.commons=ERROR<br /><br />16 log4j.logger.org.apache.struts=WARN<br /><br /><span style="line-height: 1.3em; font-family: '宋体'">这两句是struts的包。</span><wbr><br /><br />17 log4j.logger.org.displaytag=ERROR<br /><br /><span style="line-height: 1.3em; font-family: '宋体'">这句是displaytag的包。（QC问题列表页面所用）</span><wbr><br /><br />18 log4j.logger.org.springframework=DEBUG<br /><br /><span style="line-height: 1.3em; font-family: '宋体'">此句为Spring的包。</span><wbr><br /><br />24 log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN<br /><br />25 log4j.logger.org.hibernate=DEBUG<br /><br /><span style="line-height: 1.3em; font-family: '宋体'">此两句是hibernate的包。</span><wbr><br /><br /><span style="line-height: 1.3em; font-family: '宋体'">以上这些包的设置可根据项目的实际情况而自行定制。</span><wbr><br /><br /><span style="line-height: 1.3em; font-family: '宋体'">三、log4j详解</span><wbr><br /><br />1<span style="line-height: 1.3em; font-family: '宋体'">、定义配置文件</span><wbr><br /><br />Log4j<span style="line-height: 1.3em; font-family: '宋体'">支持两种配置文件格式，一种是XML格式的文件，一种是Java特性文件log4j.properties（键=值）。下面将介绍使用log4j.properties文件作为配置文件的方法:</span><wbr><br /><br />&#9312;<span style="line-height: 1.3em; font-family: '宋体'">、配置根Logger</span><wbr><br /><br />Logger <span style="line-height: 1.3em; font-family: '宋体'">负责处理日志记录的大部分操作。</span><wbr><br /><br /><span style="line-height: 1.3em; font-family: '宋体'">其语法为：</span><wbr><br /><br />log4j.rootLogger = [ level ] , appenderName, appenderName, &#8230;<br /><br /><span style="line-height: 1.3em; font-family: '宋体'">其中，level 是日志记录的优先级，分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别。Log4j建议只使用四个级别，优 先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别，您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定 义了INFO级别，只有等于及高于这个级别的才进行处理，则应用程序中所有DEBUG级别的日志信息将不被打印出来。ALL:打印所有的日志，OFF：关 闭所有的日志输出。 appenderName就是指定日志信息输出到哪个地方。可同时指定多个输出目的地。</span><wbr><br /><br />&#9313;<span style="line-height: 1.3em; font-family: '宋体'">、配置日志信息输出目的地 Appender</span><wbr><br /><br />Appender <span style="line-height: 1.3em; font-family: '宋体'">负责控制日志记录操作的输出。</span><wbr><br /><br /><span style="line-height: 1.3em; font-family: '宋体'">其语法为：</span><wbr><br /><br />log4j.appender.appenderName = fully.qualified.name.of.appender.class<br /><br />log4j.appender.appenderName.option1 = value1<br /><br />&#8230;<br /><br />log4j.appender.appenderName.optionN = valueN<br /><br /><span style="line-height: 1.3em; font-family: '宋体'">这里的appenderName为在&#9312;里定义的，可任意起名。</span><wbr><br /><br /><span style="line-height: 1.3em; font-family: '宋体'">其中，Log4j提供的appender有以下几种：</span><wbr><br /><br />org.apache.log4j.ConsoleAppender<span style="line-height: 1.3em; font-family: '宋体'">（控制台），</span><wbr><br /><br />org.apache.log4j.FileAppender<span style="line-height: 1.3em; font-family: '宋体'">（文件），</span><wbr><br /><br />org.apache.log4j.DailyRollingFileAppender<span style="line-height: 1.3em; font-family: '宋体'">（每天产生一个日志文件），</span><wbr><br /><br />org.apache.log4j.RollingFileAppender<span style="line-height: 1.3em; font-family: '宋体'">（文件大小到达指定尺寸的时候产生一个新的文件），可通过 log4j.appender.R.MaxFileSize=100KB设置文件大小，还可通过 log4j.appender.R.MaxBackupIndex=1设置为保存一个备份文件。</span><wbr><br /><br />org.apache.log4j.WriterAppender<span style="line-height: 1.3em; font-family: '宋体'">（将日志信息以流格式发送到任意指定的地方）</span><wbr><br /><br /><span style="line-height: 1.3em; font-family: '宋体'">例如：log4j.appender.stdout=org.apache.log4j.ConsoleAppender</span><wbr><br /><br /><span style="line-height: 1.3em; font-family: '宋体'">定义一个名为stdout的输出目的地，ConsoleAppender为控制台。</span><wbr><br /><br />&#9314;<span style="line-height: 1.3em; font-family: '宋体'">、配置日志信息的格式（布局）Layout</span><wbr><br /><br />Layout <span style="line-height: 1.3em; font-family: '宋体'">负责格式化Appender的输出。</span><wbr><br /><br /><span style="line-height: 1.3em; font-family: '宋体'">其语法为：</span><wbr><br /><br />log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class<br /><br />log4j.appender.appenderName.layout.option1 = value1<br /><br />&#8230;<br /><br />log4j.appender.appenderName.layout.optionN = valueN<br /><br /><span style="line-height: 1.3em; font-family: '宋体'">其中，Log4j提供的layout有以下几种：</span><wbr><br /><br />org.apache.log4j.HTMLLayout<span style="line-height: 1.3em; font-family: '宋体'">（以HTML表格形式布局），</span><wbr><br /><br />org.apache.log4j.PatternLayout<span style="line-height: 1.3em; font-family: '宋体'">（可以灵活地指定布局模式），</span><wbr><br /><br />org.apache.log4j.SimpleLayout<span style="line-height: 1.3em; font-family: '宋体'">（包含日志信息的级别和信息字符串），</span><wbr><br /><br />org.apache.log4j.TTCCLayout<span style="line-height: 1.3em; font-family: '宋体'">（包含日志产生的时间、线程、类别等等信息）</span><wbr><br /><br />2<span style="line-height: 1.3em; font-family: '宋体'">、格式化日志信息</span><wbr><br /><br />Log4J<span style="line-height: 1.3em; font-family: '宋体'">采用类似C语言中的printf函数的打印格式格式化日志信息，打印参数如下：</span><wbr><br /><br />%m <span style="line-height: 1.3em; font-family: '宋体'">输出代码中指定的消息</span><wbr><br /><br />%p <span style="line-height: 1.3em; font-family: '宋体'">输出优先级，即DEBUG，INFO，WARN，ERROR，FATAL</span><wbr><br /><br />%r <span style="line-height: 1.3em; font-family: '宋体'">输出自应用启动到输出该log信息耗费的毫秒数</span><wbr><br /><br />%c <span style="line-height: 1.3em; font-family: '宋体'">输出所属的类目，通常就是所在类的全名</span><wbr><br /><br />%t <span style="line-height: 1.3em; font-family: '宋体'">输出产生该日志事件的线程名</span><wbr><br /><br />%n <span style="line-height: 1.3em; font-family: '宋体'">输出一个回车换行符，Windows平台为&#8220;rn&#8221;，Unix平台为&#8220;n&#8221;</span><wbr><br /><br />%d <span style="line-height: 1.3em; font-family: '宋体'">输出日志时间点的日期或时间，默认格式为ISO8601，也可以在其后指定格式，比如：%d{yyyy MMM dd HH:mm:ss,SSS}，输出类似：2002年10月18日 22：10：28，921</span><wbr><br /><br />%l <span style="line-height: 1.3em; font-family: '宋体'">输出日志事件的发生位置，包括类目名、发生的线程，以及在代码中的行数。</span><wbr><br /><br />3<span style="line-height: 1.3em; font-family: '宋体'">、在代码中使用Log4j</span><wbr><br /><br /><span style="line-height: 1.3em; font-family: '宋体'">我们在需要输出日志信息的类中做如下的三个工作：</span><wbr><br /><br />1<span style="line-height: 1.3em; font-family: '宋体'">、导入所有需的commongs-logging类：</span><wbr><br /><br />import org.apache.commons.logging.Log;<br /><br />import org.apache.commons.logging.LogFactory;<br /><br />2<span style="line-height: 1.3em; font-family: '宋体'">、在自己的类中定义一个org.apache.commons.logging.Log类的私有静态类成员：</span><wbr><br /><br />private final Log log = LogFactory.getLog(getClass());<br /><br />LogFactory.getLog()<span style="line-height: 1.3em; font-family: '宋体'">方法的参数使用的是当前类的class。</span><wbr><br /><br />3<span style="line-height: 1.3em; font-family: '宋体'">、使用org.apache.commons.logging.Log类的成员方法输出日志信息：</span><wbr><br /><br />if (log.isDebugEnabled())<br />{<br />log.debug("111");<br />}<br />if (log.isInfoEnabled())<br />{<br />log.info("222");<br />}<br />if (log.isWarnEnabled())<br />{<br />log.warn("333");<br />}<br />if (log.isErrorEnabled())<br />{<br />log.error("444");<br />}<br />if (log.isFatalEnabled())<br />{<br />log.fatal("555")<br />} </div><img src ="http://www.blogjava.net/stone840/aggbug/392505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone840/" target="_blank">老天</a> 2012-12-05 17:00 <a href="http://www.blogjava.net/stone840/archive/2012/12/05/392505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SSH里的注释集锦</title><link>http://www.blogjava.net/stone840/archive/2012/12/03/392359.html</link><dc:creator>老天</dc:creator><author>老天</author><pubDate>Mon, 03 Dec 2012 03:09:00 GMT</pubDate><guid>http://www.blogjava.net/stone840/archive/2012/12/03/392359.html</guid><wfw:comment>http://www.blogjava.net/stone840/comments/392359.html</wfw:comment><comments>http://www.blogjava.net/stone840/archive/2012/12/03/392359.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stone840/comments/commentRss/392359.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone840/services/trackbacks/392359.html</trackback:ping><description><![CDATA[<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#49;&#64;&#84;&#114;&#97;&#110;&#115;&#105;&#101;&#110;&#116;">1、@Transient</a>&nbsp; <br />使用场景：一般在模型中对应某一个字段的属性中的set和get方法中。作用是数据与数据库中不一一对应。如：<br /><a>/*@Transient</a><br />&nbsp;public String getModulename() {<br />&nbsp;&nbsp;return modulename;<br />&nbsp;}<br />&nbsp;public void setModulename(String modulename) {<br />&nbsp;&nbsp;this.modulename = modulename;<br />&nbsp;}*/<br /><br />2、@ManyToOne<br />多对一。可以把另一个模型对应过来。在查询时，无需要联表查询。<br />&nbsp;@JoinColumn(name="moduleid",insertable=false,updatable=false)<br />&nbsp;@NotFound(action=NotFoundAction.IGNORE)<br />&nbsp;public CateModule getCateModule() {<br />&nbsp;&nbsp;return cateModule;<br />&nbsp;}<br />&nbsp;public void setCateModule(CateModule cateModule) {<br />&nbsp;&nbsp;this.cateModule = cateModule;<br />&nbsp;}<img src ="http://www.blogjava.net/stone840/aggbug/392359.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone840/" target="_blank">老天</a> 2012-12-03 11:09 <a href="http://www.blogjava.net/stone840/archive/2012/12/03/392359.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>循环模型中set和get方法里的属性</title><link>http://www.blogjava.net/stone840/archive/2012/12/03/392357.html</link><dc:creator>老天</dc:creator><author>老天</author><pubDate>Mon, 03 Dec 2012 02:49:00 GMT</pubDate><guid>http://www.blogjava.net/stone840/archive/2012/12/03/392357.html</guid><wfw:comment>http://www.blogjava.net/stone840/comments/392357.html</wfw:comment><comments>http://www.blogjava.net/stone840/archive/2012/12/03/392357.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stone840/comments/commentRss/392357.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone840/services/trackbacks/392357.html</trackback:ping><description><![CDATA[private Object filterHTMLTag(Object obj) throws Exception{<br />&nbsp;&nbsp;if(obj==null) return obj;<br />&nbsp;&nbsp;Class objCls=obj.getClass();<br />&nbsp;&nbsp;Field[] allFields=objCls.getDeclaredFields();<br />&nbsp;&nbsp;if(allFields!=null &amp;&amp; allFields.length!=0){<br />&nbsp;&nbsp;&nbsp;HTMLFilter filter=new HTMLFilter();<br />&nbsp;&nbsp;&nbsp;for(Field field: allFields){<br />&nbsp;&nbsp;&nbsp;&nbsp;if(field!=null){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(field.getType().equals(String.class)){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String getMethod="get"+upperCaseFirstChar(field.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String setMethod="set"+upperCaseFirstChar(field.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//String value=(String)objCls.getMethod(getMethod).invoke(obj);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//value=filter.filter(value);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//objCls.getMethod(setMethod, value.getClass()).invoke(obj, value);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch (Exception e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw e;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return obj;<br />&nbsp;}<img src ="http://www.blogjava.net/stone840/aggbug/392357.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone840/" target="_blank">老天</a> 2012-12-03 10:49 <a href="http://www.blogjava.net/stone840/archive/2012/12/03/392357.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL语句记录</title><link>http://www.blogjava.net/stone840/archive/2012/11/28/392154.html</link><dc:creator>老天</dc:creator><author>老天</author><pubDate>Wed, 28 Nov 2012 10:21:00 GMT</pubDate><guid>http://www.blogjava.net/stone840/archive/2012/11/28/392154.html</guid><wfw:comment>http://www.blogjava.net/stone840/comments/392154.html</wfw:comment><comments>http://www.blogjava.net/stone840/archive/2012/11/28/392154.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/stone840/comments/commentRss/392154.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone840/services/trackbacks/392154.html</trackback:ping><description><![CDATA[<p>ALTER TABLE "public"."base_contract"<br />ADD COLUMN "isrejected" int2 DEFAULT 0 NOT NULL;</p>
<p>ALTER TABLE "public"."base_contract"<br />ADD COLUMN "userid" int8 DEFAULT 0 NOT NULL;</p>
<p>ALTER TABLE "public"."base_user"<br />ADD COLUMN "telphone" varchar(20) DEFAULT ''::character varying NOT NULL;</p>
<p><br />INSERT INTO "base_role" VALUES ('21', '代理商', '只能查看对属于自己的所有合同');</p>
<p>update base_contract a set userid=(SELECT b.userid from base_user b where a.username=b.username LIMIT 1)</p>
<p>delete from base_menu;</p>
<p>BEGIN;<br />INSERT INTO "base_menu" VALUES ('1', 'infoMenu', null, '公用菜单', null, null, null, null, 'Y', '0');<br />INSERT INTO "base_menu" VALUES ('2', 'ediUser', 'infoMenu', '修改个人资料', 'Note', 'ediUser.jsp', 'top', '2', 'N', '0');<br />COMMIT;</p>
<p>&nbsp;</p><img src ="http://www.blogjava.net/stone840/aggbug/392154.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone840/" target="_blank">老天</a> 2012-11-28 18:21 <a href="http://www.blogjava.net/stone840/archive/2012/11/28/392154.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Centos6.0下Nginx+Resin配置</title><link>http://www.blogjava.net/stone840/archive/2012/11/20/391659.html</link><dc:creator>老天</dc:creator><author>老天</author><pubDate>Tue, 20 Nov 2012 10:40:00 GMT</pubDate><guid>http://www.blogjava.net/stone840/archive/2012/11/20/391659.html</guid><wfw:comment>http://www.blogjava.net/stone840/comments/391659.html</wfw:comment><comments>http://www.blogjava.net/stone840/archive/2012/11/20/391659.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/stone840/comments/commentRss/391659.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone840/services/trackbacks/391659.html</trackback:ping><description><![CDATA[Resin是CAUCHO公司的产品，是一个非常流行的application server，对servlet和JSP提供了良好的支持，性能也比较优良，resin自身采用JAVA语言开发！ 
<p>一、安装环境：<br />系统版本:Centos 6.0 x86_64<br />Nginx版本：1.0.11<br />Jdk版本：1.7.0<br />Resin版本：4.0.23<br />首先下载需要安装的软件：【JDK可以去java官网下载】<br />wget <a href="http://nginx.org/download/nginx-1.1.11.tar.gz ">http://nginx.org/download/nginx-1.1.11.tar.gz </a>下载nginx<br />wget <a href="http://www.caucho.com/download/resin-pro-4.0.23.tar.gz">http://www.caucho.com/download/resin-pro-4.0.23.tar.gz</a> 下载resin<br />下载到/usr/src 下<br />二、安装nginx<br />useradd www ;yum install pcre-devel &amp;&amp; tar -xzf nginx-1.0.10.tar.gz &amp;&amp; cd nginx-1.0.11; sed -i -e &#8216;s/1.0.11//g&#8217; -e &#8216;s/nginx\//TDWS/g&#8217; -e &#8216;s/&#8221;NGINX&#8221;/&#8221;TDWS&#8221;/g&#8217; src/core/nginx.h &amp;&amp;./configure &#8211;user=www &#8211;group=www &#8211;prefix=/usr/local/nginx &#8211;with-http_stub_status_module &#8211;with-http_ssl_module &amp;&amp;make &amp;&amp;make install </p>
<p>三、安装jdk并且配置resin<br />下载jdk1.7.0，并且解压到/usr/java/下:结果显示为 /usr/java/jdk1.7.0<br />cd /usr/src/ &amp;&amp; tar xzf resin-pro-4.0.23.tar.gz &amp;&amp;cd resin-pro-4.0.23 &amp;&amp;./configure &#8211;with-java-home=/usr/java/jdk1.7.0 &amp;&amp;make &amp;&amp;make install 即可！<br />安装完后resin的日志目录在 /var/log/resin/下<br />启动resin命令如下 /etc/init.d/resin start 即可，然后访问http://ip:8080</p>
<p>四、nginx整合resin的方式跟nginx整合tomcat一样，再这里就不重复了！<br />提供我上一篇文章地址:<a href="http://chinaapp.sinaapp.com/?p=1922">http://chinaapp.sinaapp.com/?p=1922</a></p>
<p>五、resin配置优化:<br />以下是我的配置文件:贴出一部分修改的，其他的保持不变，在回复下面！</p><img src ="http://www.blogjava.net/stone840/aggbug/391659.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone840/" target="_blank">老天</a> 2012-11-20 18:40 <a href="http://www.blogjava.net/stone840/archive/2012/11/20/391659.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>freemarker 基本指令 </title><link>http://www.blogjava.net/stone840/archive/2012/11/15/391367.html</link><dc:creator>老天</dc:creator><author>老天</author><pubDate>Thu, 15 Nov 2012 03:30:00 GMT</pubDate><guid>http://www.blogjava.net/stone840/archive/2012/11/15/391367.html</guid><wfw:comment>http://www.blogjava.net/stone840/comments/391367.html</wfw:comment><comments>http://www.blogjava.net/stone840/archive/2012/11/15/391367.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stone840/comments/commentRss/391367.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone840/services/trackbacks/391367.html</trackback:ping><description><![CDATA[<p>一：if指令：<br />&lt;#if condition&gt;...<br />&lt;#elseif condition2&gt;...<br />&lt;#elseif condition3&gt;...<br />...&lt;#else&gt;...<br />&lt;/#if&gt;</p>
<p>二：switch<br />&lt;#switch value&gt;<br />&lt;#case refValue1&gt;...&lt;#break&gt;<br />&lt;#case refValue2&gt;...&lt;#break&gt;...<br />&lt;#case refValueN&gt;...&lt;#break&gt;<br />&lt;#default&gt;...&lt;/#switch&gt;</p>
<p>三：list，break<br />&lt;#list sequence as item&gt;<br />...<br />&lt;/#list&gt;<br />两个特殊的循环变量：<br />item_index: 当前变量的索引值。<br />item_has_next: 是否存在下一个对象。</p>
<p>可以用&lt;#break/&gt;指令离开loop循环。</p>
<p>四：include指令<br />&lt;#include filename&gt;或者<br />&lt;#include filenameoptions&gt;<br />filename: 表达式转换为字符串<br />options: encoding=encoding, parse=parse encoding: 表达式转换为字符串<br />parse: 表达式转换为逻辑值，是否作为ftl文件解析。<br />&lt;#include "/common/navbar.html" parse=false encoding="Shift_JIS"&gt;</p>
<p>&lt;#include "*/footer.ftl"&gt;表示当前目录下以及所有父目录下的文件。如果当前模版在/foo/bar/template.ftl ，那么查找footer.ftl的顺序为：/foo/bar/footer.ftl<br />/foo/footer.ftl/footer.ftl这种方式讲允许设计者将通用的模版放在父文件夹里面。<br />也可以只指定部分路径：&lt;#include "*/commons/footer.ftl"&gt;</p>
<p>五：import指令&lt;#import path as hash&gt;<br />六：noparse<br />&lt;#noparse&gt;<br />...<br />&lt;/#noparse&gt;</p>
<p>七：compress<br />&lt;#compress&gt;<br />...<br />&lt;/#compress&gt;<br />八：escape，noescape<br />&lt;#escape identifier as expression&gt;<br />...<br />&lt;#noescape&gt;...&lt;/#noescape&gt;<br />...<br />&lt;/#escape&gt;</p>
<p>escape指令body区的ftl的interpolations都会被自动加上escape表达式。但是不会影响字符串内的interpolations。而且也只会影响到body内出现的interpolations，比如不会影响到include的ftl的interpolations。<br />&lt;#escape x as x?html&gt;<br />First name: ${firstName}<br />Last name: ${lastName}<br />Maiden name: ${maidenName}&lt;/#escape&gt;<br />等同于：</p>
<p>First name: ${firstName?html}<br />Last name: ${lastName?html}<br />Maiden name: ${maidenName?html}</p>
<p>escape指令在解析模版时起作用，而不是运行时起作用。</p>
<p>escape指令还能嵌套使用，子继承父的escape规则。</p>
<p>&lt;#escape x as x?html&gt;<br />Customer Name: ${customerName}<br />Items to ship:<br />&lt;#escape x as itemCodeToNameMap[x]&gt;<br />${itemCode1}<br />${itemCode2}<br />${itemCode3}<br />${itemCode4}<br />&lt;/#escape&gt;&lt;/#escape&gt;<br />等同于：Customer Name: ${customerName?html}<br />Items to ship:<br />${itemCodeToNameMap[itemCode1]?html}<br />${itemCodeToNameMap[itemCode2]?html}<br />${itemCodeToNameMap[itemCode3]?html}<br />${itemCodeToNameMap[itemCode4]?html}</p>
<p>九：assign指令<br />&lt;#assign name=value&gt;or&lt;#assign name1=value1name2=value2... nameN=valueN&gt;or&lt;#assign same as above... in namespacehash&gt;or&lt;#assign name&gt; capture this&lt;/#assign&gt;or&lt;#assign name in namespacehash&gt; capture this&lt;/#assign&gt;创建或者替换一个已经存在的变量，只能作用于顶层变量。不好的做法：&lt;#assign x&gt;Hello ${user}!&lt;/#assign&gt;更改为：&lt;#assign x="Hello ${user}!"&gt;<br />十：global指令<br />&lt;#global name=value&gt;<br />or<br />&lt;#global name1=value1name2=value2... nameN=valueN&gt;or&lt;#global name&gt;<br />capture this<br />&lt;/#global&gt;<br />十一：local指令<br />&lt;#local name=value&gt;<br />or<br />&lt;#local name1=value1name2=value2... nameN=valueN&gt;or&lt;#local name&gt;<br />capture this<br />&lt;/#local&gt;只能用于macro的定义body中。</p>
<p><br />十二：setting指令：</p>
<p>&lt;#setting name=value&gt;<br />name的取值范围：<br />local：number_format：<br />boolean_format:缺省值为"true,false"<br />date_format, time_format, datetime_format<br />time_zone：url_escaping_charset<br />classic_compatible</p>
<p>十三：用户自定义指令<br />&lt;@macro_or_transfparam1=val1param2=val2...paramN=valN/&gt;&lt;@macro_or_transfparam1=val1param2=val2...paramN=valN ; lv1, lv2, ..., lvN/&gt;&lt;@macro_or_transf...&gt; ...&lt;<a>/@macro_or_transf&gt;&lt;@macro_or_transf</a>...&gt; ...&lt;<a>/@&gt;&lt;@macro_or_transfval1</a>, val2, ..., valN/&gt;<br />十四：macro,nested,return<br />&lt;#macro nameparam1param2... paramN&gt;<br />...<br />&lt;#nested loopvar1, loopvar2, ..., loopvarN&gt;<br />...<br />&lt;#return&gt;<br />...<br />&lt;/#macro&gt;</p>
<p>十五：function, return<br />&lt;#function nameparam1param2... paramN&gt;<br />... &lt;#return returnValue&gt;<br />...<br />&lt;/#function&gt;</p>
<p>&lt;#function avg x y&gt;<br />&lt;#return (x + y) / 2&gt;<br />&lt;/#function&gt;<br />${avg(10, 20)}</p>
<p>十六：flush<br />&lt;#flush&gt;</p>
<p>十七：stop<br />&lt;#stop&gt;<br />or<br />&lt;#stop reason&gt;取消处理模版。</p>
<p>十八：ftl指令<br />&lt;#ftl param1=value1param2=value2...paramN=valueN&gt;<br />ftl指令必须放在ftl文件的最上面。</p>
<p>参数范围：<br />encoding：<br />strip_whitespace<br />strip_text<br />strict_syntax</p>
<p>十九：t, lt, rt<br />二十：attempt, recover<br />&lt;#attempt&gt;<br />attempt block&lt;#recover&gt; <br />recover block<br />&lt;/#attempt&gt;</p>
<p>&lt;#attempt&gt;<br />Optional content: ${thisMayFails}<br />&lt;#recover&gt;<br />Ops! The optional content is not available.<br />&lt;/#attempt&gt;</p><img src ="http://www.blogjava.net/stone840/aggbug/391367.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone840/" target="_blank">老天</a> 2012-11-15 11:30 <a href="http://www.blogjava.net/stone840/archive/2012/11/15/391367.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决png在ie6中透明的效果</title><link>http://www.blogjava.net/stone840/archive/2012/11/15/391359.html</link><dc:creator>老天</dc:creator><author>老天</author><pubDate>Thu, 15 Nov 2012 02:26:00 GMT</pubDate><guid>http://www.blogjava.net/stone840/archive/2012/11/15/391359.html</guid><wfw:comment>http://www.blogjava.net/stone840/comments/391359.html</wfw:comment><comments>http://www.blogjava.net/stone840/archive/2012/11/15/391359.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stone840/comments/commentRss/391359.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone840/services/trackbacks/391359.html</trackback:ping><description><![CDATA[<span>&nbsp; 
<p><font color="#666666">&lt;!-- <a href="http://www.iefans.net/ie8-filteralpha-png-touming/"><font color="#333333" size="2">http://www.iefans.net/ie8-filteralpha-png-touming/</font></a>&nbsp; </font></p>
<p>IE8里可以这样写　-ms-filter:&#8221;progid:DXImageTransform.Microsoft.Alpha(opacity=50)&#8221;;</p>
<p>IE7里可以这样写　filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);</p>
<p><a href="http://www.iefans.net/ie6-liulanqi-xiazai/"><font color="#333333" size="2">IE6</font></a>,IE7,IE8里都可以这样写　filter:alpha(opacity=50)</p>
<p>--&gt;</p>
<p><font color="#666666"></font>&nbsp;</p>
<p><font color="#666666"></font>&nbsp;</p>
<p><font color="#666666"></font>&nbsp;</p>
<p><font color="#666666"></font>&nbsp;</p>
<p><font color="#666666">from:http://unc0pyrightable.blog.163.com/blog/static/1313300602010021526561/</font></p>
<p><font color="#666666">今天推荐一个最完美让ie6支持png透明的js,为什么说它最完美呢？</font></p>
<p><font color="#666666">只因为它<strong>支持background-position和background-repeat</strong></font></p>
<p><font color="#666666" size="+0">这是市面上的其它方法比不上的</font></p>
<p><font color="#666666" size="+0">首先,要在网页中引用js</font></p>
<p><font color="#666666">&lt;!--[if IE 6]&gt;<br />&lt;script src="<font size="+0">http://www.dillerdesign.com/experiment/DD_belatedPNG/DD_belatedPNG_0.0.8a-min.js</font>"&gt;&lt;/script&gt;<br />&lt;script&gt;<br />DD_belatedPNG.fix('<strong>.png_bg</strong>');<br />&lt;/script&gt;<br />&lt;![endif]--&gt;</font></p>
<p><font color="#666666">上面那个js路径是绝对路径,大家最好还是把它下下来,以防网站挂了.</font></p>
<p><font color="#666666">引用之后就是更改第二个&lt;script&gt;里的.png为你要实现效果的选择器.</font></p>
<p><font color="#666666">就比如,你#header引用了一个background,那你上面就要改为:</font></p>
<p><font color="#666666">DD_belatedPNG.fix('<strong>#header</strong>');</font></p>
<p><font color="#666666">并且它还支持组选择器,如:</font></p>
<p><font color="#666666">DD_belatedPNG.fix('<strong>#header,h1,h2,h3,#content</strong>');</font></p>
<p><font color="#666666">很简单吧,只要把有透明png的标签或选择器写在里面就行</font></p>
<p><font color="#666666">至于这里面能不能支持css3就不得而知了.</font></p>
<p><font color="#666666">官网:</font><a href="http://www.dillerdesign.com/experiment/DD_belatedPNG/" target="_blank"><em><font color="#666666" size="2">http://www.dillerdesign.com/experiment/DD_belatedPNG/</font></em></a></p>
<p><font size="2"></font></p>
<p><font size="2"></font></p>
<p>这个JS内容（<font color="#666666" size="3">DD_belatedPNG_0.0.8a-min.js</font>），备存：</p>
<p>/**<br />* DD_belatedPNG: Adds IE6 support: PNG images for CSS background-image and HTML &lt;IMG/&gt;.<br />* Author: Drew Diller<br />* Email: <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#100;&#114;&#101;&#119;&#46;&#100;&#105;&#108;&#108;&#101;&#114;&#64;&#103;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;"><font color="#333333" size="2">drew.diller@gmail.com</font></a><br />* URL: <a href="http://www.dillerdesign.com/experiment/DD_belatedPNG/"><font color="#333333" size="2">http://www.dillerdesign.com/experiment/DD_belatedPNG/</font></a><br />* Version: 0.0.8a<br />* Licensed under the MIT License: <a href="http://dillerdesign.com/experiment/DD_belatedPNG/#license"><font color="#333333" size="2">http://dillerdesign.com/experiment/DD_belatedPNG/#license</font></a><br />*<br />* Example usage:<br />* DD_belatedPNG.fix('.png_bg'); // argument is a CSS selector<br />* DD_belatedPNG.fixPng( someNode ); // argument is an HTMLDomElement<br />**/<br />var DD_belatedPNG={<br />ns:"DD_belatedPNG",imgSize:{<br />},delay:10,nodesFixed:0,createVmlNameSpace:function () {<br />&nbsp;&nbsp; if(document.namespaces&amp;&amp;!document.namespaces[this.ns]) {<br />&nbsp;&nbsp;&nbsp; document.namespaces.add(this.ns,"urn:schemas-microsoft-com:vml")<br />&nbsp;&nbsp; }<br />},createVmlStyleSheet:function () {<br />&nbsp;&nbsp; var b,a;<br />&nbsp;&nbsp; b=document.createElement("style");<br />&nbsp;&nbsp; b.setAttribute("media","screen");<br />&nbsp;&nbsp; document.documentElement.firstChild.insertBefore(b,document.documentElement.firstChild.firstChild);<br />&nbsp;&nbsp; if(b.styleSheet) {<br />&nbsp;&nbsp;&nbsp; b=b.styleSheet;<br />&nbsp;&nbsp;&nbsp; b.addRule(this.ns+"<a><u><font color="#333333" size="2">\\:*","{behavior:url(#default#VML</font></u></a>)}");<br />&nbsp;&nbsp;&nbsp; b.addRule(this.ns+"<a><u><font color="#333333" size="2">\\:shape","position:absolute</font></u></a>;");<br />&nbsp;&nbsp;&nbsp; b.addRule("img."+this.ns+"_sizeFinder","behavior:none; border:none; position:absolute; z-index:-1; top:-10000px; visibility:hidden;");<br />&nbsp;&nbsp;&nbsp; this.screenStyleSheet=b;<br />&nbsp;&nbsp;&nbsp; a=document.createElement("style");<br />&nbsp;&nbsp;&nbsp; a.setAttribute("media","print");<br />&nbsp;&nbsp;&nbsp; document.documentElement.firstChild.insertBefore(a,document.documentElement.firstChild.firstChild);<br />&nbsp;&nbsp;&nbsp; a=a.styleSheet;<br />&nbsp;&nbsp;&nbsp; a.addRule(this.ns+"<a><u><font color="#333333" size="2">\\:*","{display</font></u></a>: none !important;}");<br />&nbsp;&nbsp;&nbsp; a.addRule("img."+this.ns+"_sizeFinder","{display: none !important;}")<br />&nbsp;&nbsp; }<br />},readPropertyChange:function () {<br />&nbsp;&nbsp; var b,c,a;<br />&nbsp;&nbsp; b=event.srcElement;<br />&nbsp;&nbsp; if(!b.vmlInitiated) {<br />&nbsp;&nbsp;&nbsp; return<br />&nbsp;&nbsp; }if(event.propertyName.search("background")!=-1||event.propertyName.search("border")!=-1) {<br />&nbsp;&nbsp;&nbsp; DD_belatedPNG.applyVML(b)<br />&nbsp;&nbsp; }if(event.propertyName=="style.display") {<br />&nbsp;&nbsp;&nbsp; c=(b.currentStyle.display=="none")?"none":"block";<br />&nbsp;&nbsp;&nbsp; for(a in b.vml) {<br />&nbsp;&nbsp;&nbsp;&nbsp; if(b.vml.hasOwnProperty (a)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.vml[a].shape.style.display=c<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp; }if(event.propertyName.search("filter")!=-1) {<br />&nbsp;&nbsp;&nbsp; DD_belatedPNG.vmlOpacity(b)<br />&nbsp;&nbsp; }<br />},vmlOpacity:function (b) {<br />&nbsp;&nbsp; if(b.currentStyle.filter.search("lpha")!=-1) {<br />&nbsp;&nbsp;&nbsp; var a=b.currentStyle.filter;<br />&nbsp;&nbsp;&nbsp; a=parseInt(a.substring(a.lastIndexOf("=")+1,a.lastIndexOf(")")),10)/100;<br />&nbsp;&nbsp;&nbsp; b.vml.color.shape.style.filter=b.currentStyle.filter;<br />&nbsp;&nbsp;&nbsp; b.vml.image.fill.opacity=a<br />&nbsp;&nbsp; }<br />},handlePseudoHover:function (a) {<br />&nbsp;&nbsp; setTimeout(function () {<br />&nbsp;&nbsp;&nbsp; DD_belatedPNG.applyVML(a)<br />&nbsp;&nbsp; },1)<br />},fix:function (a) {<br />&nbsp;&nbsp; if(this.screenStyleSheet) {<br />&nbsp;&nbsp;&nbsp; var c,b;<br />&nbsp;&nbsp;&nbsp; c=a.split(",");<br />&nbsp;&nbsp;&nbsp; for(b=0;b&lt;c.length;b++) {<br />&nbsp;&nbsp;&nbsp;&nbsp; this.screenStyleSheet.addRule(c[b],"behavior:expression(DD_belatedPNG.fixPng(this))")<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp; }<br />},applyVML:function (a) {<br />&nbsp;&nbsp; a.runtimeStyle.cssText="";<br />&nbsp;&nbsp; this.vmlFill(a);<br />&nbsp;&nbsp; this.vmlOffsets(a);<br />&nbsp;&nbsp; this.vmlOpacity(a);<br />&nbsp;&nbsp; if(a.isImg) {<br />&nbsp;&nbsp;&nbsp; this.copyImageBorders(a)<br />&nbsp;&nbsp; }<br />},attachHandlers:function (i) {<br />&nbsp;&nbsp; var d,c,g,e,b,f;<br />&nbsp;&nbsp; d=this;<br />&nbsp;&nbsp; c={<br />&nbsp;&nbsp;&nbsp; resize:"vmlOffsets",move:"vmlOffsets"<br />&nbsp;&nbsp; };<br />&nbsp;&nbsp; if(i.nodeName=="A") {<br />&nbsp;&nbsp;&nbsp; e={<br />&nbsp;&nbsp;&nbsp;&nbsp; mouseleave:"handlePseudoHover",mouseenter:"handlePseudoHover",focus:"handlePseudoHover",blur:"handlePseudoHover"<br />&nbsp;&nbsp;&nbsp; };<br />&nbsp;&nbsp;&nbsp; for(b in e) {<br />&nbsp;&nbsp;&nbsp;&nbsp; if(e.hasOwnProperty (b)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c[b]=e[b]<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp; }for(f in c) {<br />&nbsp;&nbsp;&nbsp; if(c.hasOwnProperty (f)) {<br />&nbsp;&nbsp;&nbsp;&nbsp; g=function () {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d[c[f]](i)<br />&nbsp;&nbsp;&nbsp;&nbsp; };<br />&nbsp;&nbsp;&nbsp;&nbsp; i.attachEvent("on"+f,g)<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp; }i.attachEvent("onpropertychange",this.readPropertyChange)<br />},giveLayout:function (a) {<br />&nbsp;&nbsp; a.style.zoom=1;<br />&nbsp;&nbsp; if(a.currentStyle.position=="static") {<br />&nbsp;&nbsp;&nbsp; a.style.position="relative"<br />&nbsp;&nbsp; }<br />},copyImageBorders:function (b) {<br />&nbsp;&nbsp; var c,a;<br />&nbsp;&nbsp; c={<br />&nbsp;&nbsp;&nbsp; borderStyle:true,borderWidth:true,borderColor:true<br />&nbsp;&nbsp; };<br />&nbsp;&nbsp; for(a in c) {<br />&nbsp;&nbsp;&nbsp; if(c.hasOwnProperty (a)) {<br />&nbsp;&nbsp;&nbsp;&nbsp; b.vml.color.shape.style[a]=b.currentStyle[a]<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp; }<br />},vmlFill:function (e) {<br />&nbsp;&nbsp; if(!e.currentStyle) {<br />&nbsp;&nbsp;&nbsp; return<br />&nbsp;&nbsp; }else {<br />&nbsp;&nbsp;&nbsp; var d,f,g,b,a,c;<br />&nbsp;&nbsp;&nbsp; d=e.currentStyle<br />&nbsp;&nbsp; }for(b in e.vml) {<br />&nbsp;&nbsp;&nbsp; if(e.vml.hasOwnProperty (b)) {<br />&nbsp;&nbsp;&nbsp;&nbsp; e.vml[b].shape.style.zIndex=d.zIndex<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp; }e.runtimeStyle.backgroundColor="";<br />&nbsp;&nbsp; e.runtimeStyle.backgroundImage="";<br />&nbsp;&nbsp; f=true;<br />&nbsp;&nbsp; if(d.backgroundImage!="none"||e.isImg) {<br />&nbsp;&nbsp;&nbsp; if(!e.isImg) {<br />&nbsp;&nbsp;&nbsp;&nbsp; e.vmlBg=d.backgroundImage;<br />&nbsp;&nbsp;&nbsp;&nbsp; e.vmlBg=e.vmlBg.substr(5,e.vmlBg.lastIndexOf('")')-5)<br />&nbsp;&nbsp;&nbsp; }else {<br />&nbsp;&nbsp;&nbsp;&nbsp; e.vmlBg=e.src<br />&nbsp;&nbsp;&nbsp; }g=this;<br />&nbsp;&nbsp;&nbsp; if(!g.imgSize[e.vmlBg]) {<br />&nbsp;&nbsp;&nbsp;&nbsp; a=document.createElement("img");<br />&nbsp;&nbsp;&nbsp;&nbsp; g.imgSize[e.vmlBg]=a;<br />&nbsp;&nbsp;&nbsp;&nbsp; a.className=g.ns+"_sizeFinder";<br />&nbsp;&nbsp;&nbsp;&nbsp; a.runtimeStyle.cssText="behavior:none; position:absolute; left:-10000px; top:-10000px; border:none; margin:0; padding:0;";<br />&nbsp;&nbsp;&nbsp;&nbsp; c=function () {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.width=this.offsetWidth;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.height=this.offsetHeight;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.vmlOffsets(e)<br />&nbsp;&nbsp;&nbsp;&nbsp; };<br />&nbsp;&nbsp;&nbsp;&nbsp; a.attachEvent("onload",c);<br />&nbsp;&nbsp;&nbsp;&nbsp; a.src=e.vmlBg;<br />&nbsp;&nbsp;&nbsp;&nbsp; a.removeAttribute("width");<br />&nbsp;&nbsp;&nbsp;&nbsp; a.removeAttribute("height");<br />&nbsp;&nbsp;&nbsp;&nbsp; document.body.insertBefore(a,document.body.firstChild)<br />&nbsp;&nbsp;&nbsp; }e.vml.image.fill.src=e.vmlBg;<br />&nbsp;&nbsp;&nbsp; f=false<br />&nbsp;&nbsp; }e.vml.image.fill.on=!f;<br />&nbsp;&nbsp; e.vml.image.fill.color="none";<br />&nbsp;&nbsp; e.vml.color.shape.style.backgroundColor=d.backgroundColor;<br />&nbsp;&nbsp; e.runtimeStyle.backgroundImage="none";<br />&nbsp;&nbsp; e.runtimeStyle.backgroundColor="transparent"<br />},vmlOffsets:function (d) {<br />&nbsp;&nbsp; var h,n,a,e,g,m,f,l,j,i,k;<br />&nbsp;&nbsp; h=d.currentStyle;<br />&nbsp;&nbsp; n={<br />&nbsp;&nbsp;&nbsp; W:d.clientWidth+1,H:d.clientHeight+1,w:this.imgSize[d.vmlBg].width,h:this.imgSize[d.vmlBg].height,L:d.offsetLeft,T:d.offsetTop,bLW:d.clientLeft,bTW:d.clientTop<br />&nbsp;&nbsp; };<br />&nbsp;&nbsp; a=(n.L+n.bLW==1)?1:0;<br />&nbsp;&nbsp; e=function (b,p,q,c,s,u) {<br />&nbsp;&nbsp;&nbsp; b.coordsize=c+","+s;<br />&nbsp;&nbsp;&nbsp; b.coordorigin=u+","+u;<br />&nbsp;&nbsp;&nbsp; b.path="m0,0l"+c+",0l"+c+","+s+"l0,"+s+" xe";<br />&nbsp;&nbsp;&nbsp; b.style.width=c+"px";<br />&nbsp;&nbsp;&nbsp; b.style.height=s+"px";<br />&nbsp;&nbsp;&nbsp; b.style.left=p+"px";<br />&nbsp;&nbsp;&nbsp; b.style.top=q+"px"<br />&nbsp;&nbsp; };<br />&nbsp;&nbsp; e(d.vml.color.shape,(n.L+(d.isImg?0:n.bLW)),(n.T+(d.isImg?0:n.bTW)),(n.W-1),(n.H-1),0);<br />&nbsp;&nbsp; e(d.vml.image.shape,(n.L+n.bLW),(n.T+n.bTW),(n.W),(n.H),1);<br />&nbsp;&nbsp; g={<br />&nbsp;&nbsp;&nbsp; X:0,Y:0<br />&nbsp;&nbsp; };<br />&nbsp;&nbsp; if(d.isImg) {<br />&nbsp;&nbsp;&nbsp; g.X=parseInt(h.paddingLeft,10)+1;<br />&nbsp;&nbsp;&nbsp; g.Y=parseInt(h.paddingTop,10)+1<br />&nbsp;&nbsp; }else {<br />&nbsp;&nbsp;&nbsp; for(j in g) {<br />&nbsp;&nbsp;&nbsp;&nbsp; if(g.hasOwnProperty (j)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.figurePercentage(g,n,j,h["backgroundPosition"+j])<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp; }d.vml.image.fill.position=(g.X/n.W)+","+(g.Y/n.H);<br />&nbsp;&nbsp; m=h.backgroundRepeat;<br />&nbsp;&nbsp; f={<br />&nbsp;&nbsp;&nbsp; T:1,R:n.W+a,B:n.H,L:1+a<br />&nbsp;&nbsp; };<br />&nbsp;&nbsp; l={<br />&nbsp;&nbsp;&nbsp; X:{<br />&nbsp;&nbsp;&nbsp;&nbsp; b1:"L",b2:"R",d:"W"<br />&nbsp;&nbsp;&nbsp; },Y:{<br />&nbsp;&nbsp;&nbsp;&nbsp; b1:"T",b2:"B",d:"H"<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp; };<br />&nbsp;&nbsp; if(m!="repeat"||d.isImg) {<br />&nbsp;&nbsp;&nbsp; i={<br />&nbsp;&nbsp;&nbsp;&nbsp; T:(g.Y),R:(g.X+n.w),B:(g.Y+n.h),L:(g.X)<br />&nbsp;&nbsp;&nbsp; };<br />&nbsp;&nbsp;&nbsp; if(m.search("repeat-")!=-1) {<br />&nbsp;&nbsp;&nbsp;&nbsp; k=m.split("repeat-")[1].toUpperCase();<br />&nbsp;&nbsp;&nbsp;&nbsp; i[l[k].b1]=1;<br />&nbsp;&nbsp;&nbsp;&nbsp; i[l[k].b2]=n[l[k].d]<br />&nbsp;&nbsp;&nbsp; }if(i.B&gt;n.H) {<br />&nbsp;&nbsp;&nbsp;&nbsp; i.B=n.H<br />&nbsp;&nbsp;&nbsp; }d.vml.image.shape.style.clip="rect("+i.T+"px "+(i.R+a)+"px "+i.B+"px "+(i.L+a)+"px)"<br />&nbsp;&nbsp; }else {<br />&nbsp;&nbsp;&nbsp; d.vml.image.shape.style.clip="rect("+f.T+"px "+f.R+"px "+f.B+"px "+f.L+"px)"<br />&nbsp;&nbsp; }<br />},figurePercentage:function (d,c,f,a) {<br />&nbsp;&nbsp; var b,e;<br />&nbsp;&nbsp; e=true;<br />&nbsp;&nbsp; b=(f=="X");<br />&nbsp;&nbsp; switch(a) {<br />&nbsp;&nbsp;&nbsp; case "left":case "top":d[f]=0;<br />&nbsp;&nbsp;&nbsp; break;<br />&nbsp;&nbsp;&nbsp; case "center":d[f]=0.5;<br />&nbsp;&nbsp;&nbsp; break;<br />&nbsp;&nbsp;&nbsp; case "right":case "bottom":d[f]=1;<br />&nbsp;&nbsp;&nbsp; break;<br />&nbsp;&nbsp;&nbsp; default:if(a.search("%")!=-1) {<br />&nbsp;&nbsp;&nbsp;&nbsp; d[f]=parseInt(a,10)/100<br />&nbsp;&nbsp;&nbsp; }else {<br />&nbsp;&nbsp;&nbsp;&nbsp; e=false<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp; }d[f]=Math.ceil(e?((c[b?"W":"H"]*d[f])-(c[b?"w":"h"]*d[f])):parseInt(a,10));<br />&nbsp;&nbsp; if(d[f]%2===0) {<br />&nbsp;&nbsp;&nbsp; d[f]++<br />&nbsp;&nbsp; }return d[f]<br />},fixPng:function (c) {<br />&nbsp;&nbsp; c.style.behavior="none";<br />&nbsp;&nbsp; var g,b,f,a,d;<br />&nbsp;&nbsp; if(c.nodeName=="BODY"||c.nodeName=="TD"||c.nodeName=="TR") {<br />&nbsp;&nbsp;&nbsp; return<br />&nbsp;&nbsp; }c.isImg=false;<br />&nbsp;&nbsp; if(c.nodeName=="IMG") {<br />&nbsp;&nbsp;&nbsp; if(c.src.toLowerCase().search(/\.png$/)!=-1) {<br />&nbsp;&nbsp;&nbsp;&nbsp; c.isImg=true;<br />&nbsp;&nbsp;&nbsp;&nbsp; c.style.visibility="hidden"<br />&nbsp;&nbsp;&nbsp; }else {<br />&nbsp;&nbsp;&nbsp;&nbsp; return<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp; }else {<br />&nbsp;&nbsp;&nbsp; if(c.currentStyle.backgroundImage.toLowerCase().search(".png")==-1) {<br />&nbsp;&nbsp;&nbsp;&nbsp; return<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp; }g=DD_belatedPNG;<br />&nbsp;&nbsp; c.vml={<br />&nbsp;&nbsp;&nbsp; color:{<br />&nbsp;&nbsp;&nbsp; },image:{<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp; };<br />&nbsp;&nbsp; b={<br />&nbsp;&nbsp;&nbsp; shape:{<br />&nbsp;&nbsp;&nbsp; },fill:{<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp; };<br />&nbsp;&nbsp; for(a in c.vml) {<br />&nbsp;&nbsp;&nbsp; if(c.vml.hasOwnProperty (a)) {<br />&nbsp;&nbsp;&nbsp;&nbsp; for(d in b) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(b.hasOwnProperty (d)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f=g.ns+":"+d;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.vml[a][d]=document.createElement(f)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; }c.vml[a].shape.stroked=false;<br />&nbsp;&nbsp;&nbsp;&nbsp; c.vml[a].shape.appendChild(c.vml[a].fill);<br />&nbsp;&nbsp;&nbsp;&nbsp; c.parentNode.insertBefore(c.vml[a].shape,c)<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp; }c.vml.image.shape.fillcolor="none";<br />&nbsp;&nbsp; c.vml.image.fill.type="tile";<br />&nbsp;&nbsp; c.vml.color.fill.on=false;<br />&nbsp;&nbsp; g.attachHandlers(c);<br />&nbsp;&nbsp; g.giveLayout(c);<br />&nbsp;&nbsp; g.giveLayout(c.offsetParent);<br />&nbsp;&nbsp; c.vmlInitiated=true;<br />&nbsp;&nbsp; g.applyVML(c)<br />}<br />};<br />try{<br />document.execCommand("BackgroundImageCache",false,true)<br />}catch(r) {<br />}DD_belatedPNG.createVmlNameSpace();<br />DD_belatedPNG.createVmlStyleSheet();</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>或者：</p>
<p><font style="font-size: 12px" color="#ff0000">让IE6支持PNG格式的图片</font></p>
<p><font color="#ff0000"><font style="font-size: 12px"><strong>用法：<br /><br /></strong></font>先复制下面的代码在记事本中，然后另存为pngbehavior.htc（名字可以任意）：<br /><br />&lt;public:componentlightWeight="true"&gt;<br />&lt;public:attach event="onpropertychange"onevent="propertyChanged()" /&gt;<br />&lt;public:attach event="onbeforeprint"onevent="beforePrint()" for="window"/&gt;<br />&lt;public:attach event="onafterprint"onevent="afterPrint()" for="window"/&gt;<br />&lt;script&gt;<br /><br /><br /><br />var supported = /MSIE ((5\.5)|[6789])/.test(navigator.userAgent)&amp;&amp;<br />navigator.platform== "Win32";<br /><br />var realSrc;<br />var blankSrc = "blank.gif";<br />var isPrinting = false;<br /><br />if (supported) fixImage();<br /><br />function propertyChanged() {<br />if (!supported || isPrinting) return;<br /><br />var pName = event.propertyName;<br />if (pName != "src") return;<br />// if not set to blank<br />if (!new RegExp(blankSrc).test(src))<br />fixImage();<br />};<br /><br />function fixImage() {<br />// get src<br />var src = element.src;<br /><br />// check for real change<br />if (src == realSrc&amp;&amp; /\.png$/i.test(src)) {<br />element.src =blankSrc;<br />return;<br />}<br /><br />if ( ! new RegExp(blankSrc).test(src)) {<br />// backup old src<br />realSrc = src;<br />}<br /><br />// test for png<br />if (/\.png$/i.test(realSrc)) {<br />// set blank image<br />element.src =blankSrc;<br />// set filter<br />element.runtimeStyle.filter= "progid:DXImageTransform.Microsoft." +<br />"AlphaImageLoader(src='"+ src + "',sizingMethod='scale')";<br />}<br />else {<br />// remove filter<br />element.runtimeStyle.filter= "";<br />}<br />}<br /><br />function beforePrint() {<br />isPrinting = true;<br />element.src = realSrc;<br />element.runtimeStyle.filter = "";<br />realSrc = null;<br />}<br /><br />function afterPrint() {<br />isPrinting = false;<br />fixImage();<br />}<br /><br />&lt;/script&gt;<br />&lt;/public:component&gt;<br /><br /><br />最后在你的css文件里面加上这么一段代码：</font></p><pre><span style="font-size: large"><span style="font-size: medium"><font style="font-size: 12px" color="#ff0000" size="3">img {<br />behavior: url("pngbehavior.htc");<br />}<br /></font></span></span></pre></span><img src ="http://www.blogjava.net/stone840/aggbug/391359.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone840/" target="_blank">老天</a> 2012-11-15 10:26 <a href="http://www.blogjava.net/stone840/archive/2012/11/15/391359.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>