﻿<?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-lqxue</title><link>http://www.blogjava.net/lqxue/</link><description /><language>zh-cn</language><lastBuildDate>Sat, 22 Nov 2008 23:19:16 GMT</lastBuildDate><pubDate>Sat, 22 Nov 2008 23:19:16 GMT</pubDate><ttl>60</ttl><item><title>java内存模型</title><link>http://www.blogjava.net/lqxue/archive/2008/11/05/238843.html</link><dc:creator>lqx</dc:creator><author>lqx</author><pubDate>Wed, 05 Nov 2008 08:39:00 GMT</pubDate><guid>http://www.blogjava.net/lqxue/archive/2008/11/05/238843.html</guid><wfw:comment>http://www.blogjava.net/lqxue/comments/238843.html</wfw:comment><comments>http://www.blogjava.net/lqxue/archive/2008/11/05/238843.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lqxue/comments/commentRss/238843.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lqxue/services/trackbacks/238843.html</trackback:ping><description><![CDATA[<p><strong><span style="font-size: small;">内存模型 (memory model)</span>
<br />
</strong>
内存模型描述的是程序中各变量（实例域、静态域和数组元素）之间的关系，以及在实际计算机系统中将变量存储到内存和从内存取出变量这样的低层细节.<br />
<br />
不同平台间的处理器架构将直接影响内存模型的结构.<br />
<br />
在C或C++中, 可以利用不同操作平台下的内存模型来编写并发程序. 但是, 这带给开发人员的是, 更高的学习成本.<br />
相比之下, java利用了自身虚拟机的优势, 使内存模型不束缚于具体的处理器架构, 真正实现了跨平台.<br />
(针对hotspot jvm, jrockit等不同的jvm, 内存模型也会不相同)<br />
<br />
<span style="font-weight: bold;">内存模型的特征:</span>
<br />
a, Visibility 可视性 (多核,多线程间数据的共享)<br />
b, Ordering 有序性 (对内存进行的操作应该是有序的)<br />
</p>
<hr style="width: 100%; height: 2px;" />
<p>
<strong><span style="font-size: small;"><br />
</span>
</strong>
<strong><span style="font-size: small;">java 内存模型</span>
</strong>
<strong><span style="font-size: small;"> (</span>
</strong>
<strong><span style="font-size: small;">java memory model</span>
</strong>
<strong><span style="font-size: small;">)<br />
</span>
</strong>
根据Java Language Specification中的说明, jvm系统中存在一个主内存(Main Memory或Java Heap Memory)，Java中所有变量都储存在主存中，对于所有线程都是共享的。<br />
<br />
每条线程都有自己的工作内存(Working Memory)，工作内存中保存的是主存中某些变量的拷贝，线程对所有变量的操作都是在工作内存中进行，线程之间无法相互直接访问，变量传递均需要通过主存完成。<br />
<br />
<img src="http://www.yesky.com/image20010518/109306.gif" alt="" />
<br />
<br />
其中, 工作内存里的变量, 在多核处理器下, 将大部分储存于处理器高速缓存中, 高速缓存在不经过内存时, 也是不可见的.<br />
<br />
<span style="font-weight: bold;"><strong>jmm怎么体现 可视性(Visibility) ?</strong>
<br />
</span>
在jmm中, 通过并发线程修改变量值, 必须将线程变量同步回主存后, 其他线程才能访问到.<br />
<strong><br />
<span style="font-weight: bold;">jmm怎么体现 有序性(Ordering) ?</span>
</strong>
<br />
通过java提供的同步机制或volatile关键字, 来保证内存的访问顺序. <span style="font-weight: bold;"><br />
</span></p>
<hr style="width: 100%; height: 2px;" />
<p>
<br />
<span style="font-weight: bold;"><strong><span style="font-size: small;">缓存一致性（cache coherency）</span>
</strong>
<br />
<br />
</span>
<strong><span style="font-weight: bold; color: #000000;"> 什么是缓存一致性?</span>
</strong>
<br />
它是一种管理多处理器系统的高速缓存区结构，其可以保证数据在高速缓存区到内存的传输中不会丢失或重复。(来自wikipedia)<br />
<br />
举例理解:<br />
假如有一个处理器有一个更新了的变量值位于其缓存中，但还没有被写入主内存，这样别的处理器就可能会看不到这个更新的值.<br />
<br />
<strong><span style="font-weight: bold; color: #000000;"> 解决缓存一致性的方法?</span>
</strong>
<br />
a, 顺序一致性模型:<br />
要求某处理器对所改变的变量值立即进行传播, 并确保该值被所有处理器接受后, 才能继续执行其他指令.<br />
<br />
b, 释放一致性模型: (类似jmm cache coherency)<br />
允许处理器将改变的变量值延迟到释放锁时才进行传播.<br />
</p>
<hr style="width: 100%; height: 2px;" />
<p>
<br />
<strong><span style="font-size: small;"><span style="font-weight: bold;">jmm缓存一致性模型 - "happens-before ordering(先行发生排序)"</span>
</span>
</strong>
<br />
<br />
一般情况下的示例程序:<br />
<br />
x = 0;<br />
y = 0;<br />
i = 0;<br />
j = 0;<br />
<br />
// thread A<br />
y = 1;<br />
x = 1;<br />
<br />
// thread B<br />
i = x;<br />
j = y;<br />
<br />
在如上程序中, 如果线程A,B在无保障情况下运行, 那么i,j各会是什么值呢?<br />
<br />
答案是, 不确定. (00,01,10,11都有可能出现)<br />
<span style="color: #ff0000;">这里没有使用java同步机制, 所以 jmm 有序性和可视性 都无法得到保障.</span>
<br />
<br />
<strong><span style="font-weight: bold;">happens-before ordering(</span>
<span style="font-weight: bold; color: #ff0000;"><span style="color: #000000;">先行发生排序)</span>
</span>
<span style="font-weight: bold;">如何避免这种情况?</span>
</strong>
<span style="color: #ff0000;"><br />
<span style="color: #000000;">排序原则已经做到:</span>
<br />
</span>
<span style="color: #ff0000;"><span style="color: #000000;">a, </span>
</span>
<span style="color: #ff0000;"><span style="color: #000000;">在程序顺序中, </span>
</span>
<span style="color: #ff0000;"><span style="color: #000000;">线程中的每一个操作, 发生在当前操作后面将要出现的每一个操作之前.<br />
b, 对象监视器的解锁发生在等待获取对象锁的线程之前.<br />
c, 对volitile关键字修饰的变量写入操作, 发生在对该变量的读取之前.<br />
d, </span>
</span>
对一个线程的 Thread.start() 调用 发生在启动的线程中的所有操作之前.<br />
e, 线程中的所有操作 发生在从这个线程的 Thread.join()成功返回的所有其他线程之前.<br />
<span style="color: #ff0000;"><br />
<span style="color: #000000;">为了实现</span>
</span>
<span style="color: #ff0000;"><span style="color: #000000;">happends-before ordering原则, java及jdk提供的工具:<br />
</span>
<span style="color: #000000;">a, synchronized关键字<br />
b, volatile关键字<br />
c, final变量<br />
d, java.util.concurrent.locks包(since jdk 1.5)<br />
e, java.util.concurrent.atmoic包(since jdk 1.5)<br />
...<br />
</span>
<br />
<span style="color: #000000;">使用了happens-before ordering的例子:</span>
</span>
<span style="color: #ff0000;"><br />
</span>
<br />
<br />
<img src="http://www.ibm.com/developerworks/cn/java/j-jtp03304/jsr133.gif" alt="" height="257" width="336" />
<img alt="" />
<br />
<br />
(1) 获取对象监视器的锁(lock)<br />
<br />
(2) <span style="color: #ff0000;">清空工作内存数据, 从主存复制变量到当前工作内存, 即同步数据 (read and load)</span>
<br />
<br />
(3) 执行代码，改变共享变量值 (use and assign)<br />
<br />
(4) 将工作内存数据刷回主存 (store and write)<br />
<br />
(5) 释放对象监视器的锁 (unlock)<br />
<br />
<span style="color: #ff0000;">注意: 其中4,5两步是同时进行的.</span>
<br />
<br />
这边最核心的就是第二步, 他同步了主内存,即前一个线程对变量改动的结果,可以被当前线程获知!(利用了happens-before ordering原则)<br />
<br />
<strong><span style="font-weight: bold;">对比之前的例子</span>
</strong>
<br />
如果多个线程同时执行一段未经锁保护的代码段，很有可能某条线程已经改动了变量的值，但是其他线程却无法看到这个改动，依然在旧的变量值上进行运算，最终导致不可预料的运算结果。<br />
</p>
<hr style="width: 100%; height: 2px;" />
<p>
<strong><br />
</strong>
<span style="font-size: small;"><span style="font-weight: bold;"><strong>经典j2ee设计模式Double-Checked Locking失效问题</strong>
<br />
</span>
<span style="font-size: x-small;">双重检查锁定失效问题,一直是JMM无法避免的缺陷之一.了解DCL失效问题, 可以帮助我们深入JMM运行原理.<br />
<br />
要展示DCL失效问题, 首先要理解一个重要概念- 延迟加载(lazy loading).<br />
<br />
非单例的单线程延迟加载示例:<br />
</span>
</span>
<span>class Foo <br />
{<br />
private Resource res = null;<br />
public Resource getResource() <br />
{<br />
&nbsp;&nbsp;&nbsp; // 普通的延迟加载<br />
if (res == null) <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; res = new Resource(); <br />
return res;<br />
}<br />
}<br />
<br />
</span>
<span style="font-size: small;"><span style="font-size: x-small;">非单例的</span>
</span>
<span>多线程延迟加载示例:<br />
</span>
<span>Class Foo <br />
{<br />
Private Resource res = null;<br />
Public <span style="color: #ff0000;">synchronized</span>
Resource getResource()<br />
{<br />
&nbsp;&nbsp;&nbsp; &nbsp; // 获取实例操作使用同步方式, 性能不高<br />
If (res == null) res = new Resource();<br />
return res;<br />
}<br />
}<br />
<br />
</span>
<span style="font-size: small;"><span style="font-size: x-small;">非单例的</span>
</span>
<span>DCL多线程延迟加载示例:<br />
</span>
<span>Class Foo <br />
{<br />
Private Resource res = null;<br />
Public Resource getResource() <br />
{<br />
If (res == null)<br />
{<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  //只有在第一次初始化时,才使用同步方式.<br />
synchronized(this)<br />
{<br />
if(res == null)<br />
{<br />
res = new Resource();<br />
}<br />
}<br />
}<br />
return res;<br />
}<br />
}<br />
<br />
</span>
Double-Checked Locking看起来是非常完美的。但是很遗憾，根据<span>Java的语言规范，上面的代码是不可靠的。<br />
<br />
</span>
<span>出现上述问题, 最重要的2个原因如下:<br />
1, 编译器优化了程序指令, 以加快cpu处理速度.<br />
2, 多核cpu动态调整指令顺序, 以加快并行运算能力.<br />
<br />
</span>
<span>问题出现的顺序:<br />
1, 线程A, 发现对象未实例化, 准备开始实例化<br />
2, 由于编译器优化了程序指令, 允许对象在构造函数未调用完前, 将</span>
共享变量的引用指向
<span>部分构造的对象, 虽然对象未完全实例化, 但已经不为null了.<br />
3, 线程B, 发现部分构造的对象已不是null, 则直接返回了该对象.<br />
<br />
</span>
<span>不过, 一些著名的开源框架, 包括jive,lenya等也都在使用DCL模式, 且未见一些极端异常.<br />
说明, DCL失效问题的出现率还是比较低的.<br />
接下来就是性能与稳定之间的选择了?<br />
<br />
<strong><span style="font-weight: bold;">DCL的替代</span>
</strong>
</span>
<strong>
<strong>Initialize-On-Demand</strong>
</strong>
<span>:<br />
<br />
public class Foo {<br />
&nbsp;&nbsp;&nbsp; // 似有静态内部类, 只有当有引用时, 该类才会被装载<br />
&nbsp;&nbsp;&nbsp; private static class LazyFoo {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; public static Foo foo = new Foo();<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public static Foo getInstance() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  return LazyFoo.foo;<br />
&nbsp;&nbsp;&nbsp; }<br />
}</span>
<br />
<span><br />
维基百科的DCL解释:<br />
</span>
<span>http://en.wikipedia.org/wiki/Double-checked_locking<br />
<br />
DCL的完美解决方案:<br />
<a href="http://www.theserverside.com/patterns/thread.tss?thread_id=39606" target="_blank">http://www.theserverside.com/patterns/thread.tss?thread_id=39606</a></span>
<strong><br />
<br />
<span style="color: #ff0000;"> 总结:<br />
多线程编程, 针对有写操作的变量, 必须 保证其所有引用点与主存中数据一致(考虑采用同步或volatile)</span>
<span style="color: #ff0000;">.<br />
<br />
</span>
</strong>
</p>
<h2><strong><a href="http://www.javaeye.com/show/109150">多核线程笔记-volatile原理与技巧</a>
</strong>
</h2>
<img src ="http://www.blogjava.net/lqxue/aggbug/238843.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lqxue/" target="_blank">lqx</a> 2008-11-05 16:39 <a href="http://www.blogjava.net/lqxue/archive/2008/11/05/238843.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 1.5 捕获线程异常</title><link>http://www.blogjava.net/lqxue/archive/2008/11/05/238829.html</link><dc:creator>lqx</dc:creator><author>lqx</author><pubDate>Wed, 05 Nov 2008 07:46:00 GMT</pubDate><guid>http://www.blogjava.net/lqxue/archive/2008/11/05/238829.html</guid><wfw:comment>http://www.blogjava.net/lqxue/comments/238829.html</wfw:comment><comments>http://www.blogjava.net/lqxue/archive/2008/11/05/238829.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lqxue/comments/commentRss/238829.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lqxue/services/trackbacks/238829.html</trackback:ping><description><![CDATA[<p>
<a href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/util/concurrent/Executor.html" title="java.util.concurrent 中的接口"><code>Executor</code></a> 提供了管理终止的方法，以及可为跟踪一个或多个异步任务执行状况而生成 <a href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/util/concurrent/Future.html" title="java.util.concurrent 中的接口"><code>Future</code></a> 的方法。
</p>
<p>
可以关闭 <tt>ExecutorService</tt>，这将导致其停止接受新任务。关闭后，执行程序将最后终止，这时没有任务在执行，也没有任务在等待执行，并且无法提交新任务。
</p>
<p> 通过创建并返回一个可用于取消执行和/或等待完成的 <a href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/util/concurrent/Future.html" title="java.util.concurrent 中的接口"><code>Future</code></a>，方法 <tt>submit</tt> 扩展了基本方法 <a href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/util/concurrent/Executor.html#execute%28java.lang.Runnable%29"><code>Executor.execute(java.lang.Runnable)</code></a>。方法 <tt>invokeAny</tt> 和 <tt>invokeAll</tt> 是批量执行的最常用形式，它们执行任务集合，然后等待至少一个，或全部任务完成（可使用 <a href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/util/concurrent/ExecutorCompletionService.html" title="java.util.concurrent 中的类"><code>ExecutorCompletionService</code></a> 类来编写这些方法的自定义变体）。
</p>
<p><a href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/util/concurrent/Executors.html" title="java.util.concurrent 中的类"><code>Executors</code></a> 类提供了用于此包中所提供的执行程序服务的工厂方法。
</p>
<h3>用法示例</h3>
下面给出了一个网络服务的简单结构，这里线程池中的线程作为传入的请求。它使用了预先配置的 <a href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/util/concurrent/Executors.html#newFixedThreadPool%28int%29"><code>Executors.newFixedThreadPool(int)</code></a> 工厂方法：
<pre> class NetworkService {<br />
private final ServerSocket serverSocket;<br />
private final ExecutorService pool;<br />
<br />
public NetworkService(int port, int poolSize) throws IOException {<br />
serverSocket = new ServerSocket(port);<br />
pool = Executors.newFixedThreadPool(poolSize);<br />
}<br />
<br />
public void serve() {<br />
try {<br />
for (;;) {<br />
pool.execute(new Handler(serverSocket.accept()));<br />
}<br />
} catch (IOException ex) {<br />
pool.shutdown();<br />
}<br />
}<br />
}<br />
<br />
class Handler implements Runnable {<br />
private final Socket socket;<br />
Handler(Socket socket) { this.socket = socket; }<br />
public void run() {<br />
// read and service request<br />
}<br />
}<br />
</pre>
<img src ="http://www.blogjava.net/lqxue/aggbug/238829.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lqxue/" target="_blank">lqx</a> 2008-11-05 15:46 <a href="http://www.blogjava.net/lqxue/archive/2008/11/05/238829.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>js压缩</title><link>http://www.blogjava.net/lqxue/archive/2008/11/04/238669.html</link><dc:creator>lqx</dc:creator><author>lqx</author><pubDate>Tue, 04 Nov 2008 09:53:00 GMT</pubDate><guid>http://www.blogjava.net/lqxue/archive/2008/11/04/238669.html</guid><wfw:comment>http://www.blogjava.net/lqxue/comments/238669.html</wfw:comment><comments>http://www.blogjava.net/lqxue/archive/2008/11/04/238669.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lqxue/comments/commentRss/238669.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lqxue/services/trackbacks/238669.html</trackback:ping><description><![CDATA[<p>压缩不仅仅可以提高用户的下载速度，同时还可以加密代码，下面说下一个常用的js压缩方法：</p>
<p>首先使用dojo的工具shrinksafe(http://shrinksafe.dojotoolkit.org/)压缩一下,dojo的这个
工具会去掉注释，他的压缩不是简单的替换变量，而是利用了mozilla的一个工具,对js解析后才压缩，确保压缩后的代码不会出错。</p>
<p>dojo压缩后，并不会减少太多，下一步可以使用http://javascriptcompressor.com/这个站点进行更高层次的压缩,可惜只能登陆这个站点再压缩，只能将你的js代码复制的他的文本框，然后等他的压缩输出</p>
经过这2步，你的js会变得既安全,文件又小
<img src ="http://www.blogjava.net/lqxue/aggbug/238669.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lqxue/" target="_blank">lqx</a> 2008-11-04 17:53 <a href="http://www.blogjava.net/lqxue/archive/2008/11/04/238669.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为何jsp 在resin下 乱码，但在tomcat下却工作良好？</title><link>http://www.blogjava.net/lqxue/archive/2008/10/31/237824.html</link><dc:creator>lqx</dc:creator><author>lqx</author><pubDate>Fri, 31 Oct 2008 07:21:00 GMT</pubDate><guid>http://www.blogjava.net/lqxue/archive/2008/10/31/237824.html</guid><wfw:comment>http://www.blogjava.net/lqxue/comments/237824.html</wfw:comment><comments>http://www.blogjava.net/lqxue/archive/2008/10/31/237824.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lqxue/comments/commentRss/237824.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lqxue/services/trackbacks/237824.html</trackback:ping><description><![CDATA[关于JSP页面中的pageEncoding和contentType两种属性的区别：
<p>
</p>
<p>pageEncoding是jsp文件本身的编码
</p>
<p>
</p>
<p>contentType的charset是指服务器发送给客户端时的内容编码
</p>
<p>
</p>
<p>JSP要经过两次的&#8220;编码&#8221;，第一阶段会用pageEncoding，第二阶段会用utf-8至utf-8，第三阶段就是由Tomcat出来的网页，
用的是contentType。<span class="jdu317">Phontol.com</span>
</p>
<p>
</p>
<p>第一阶段是jsp编译成.java，它会根据pageEncoding的设定读取jsp，结果是由指定的编码方案翻译成统一的UTF-8
JAVA源码（即.java），如果pageEncoding设定错了，或没有设定，出来的就是中文乱码。<span class="jdu317">Phontol.com</span>
</p>
<p>
</p>
<p>第二阶段是由JAVAC的JAVA源码至java
byteCode的编译，不论JSP编写时候用的是什么编码方案，经过这个阶段的结果全部是UTF-8的encoding的java源码。<span class="jdu317">Phontol.com</span>
</p>
<p>
</p>
<p>JAVAC用UTF-8的encoding读取java源码，编译成UTF-8
encoding的二进制码（即.class），这是JVM对常数字串在二进制码（java encoding）内表达的规范。<span class="jdu317">Phontol.com</span>
</p>
<p>
</p>
<p>第三阶段是Tomcat（或其的application
container）载入和执行阶段二的来的JAVA二进制码，输出的结果，也就是在客户端见到的，这时隐藏在阶段一和阶段二的参数contentType就发挥了功效
</p>
<p>
</p>
<p>contentType的設定.
</p>
<p>
</p>
<p><span style="color: red;">pageEncoding 和contentType的预设都是 ISO8859-1. 而随便设定了其中一个,
另一个就跟着一样了(TOMCAT4.1.27是如此). 但这不是绝对的, 这要看各自JSPC的处理方式</span>.<span style="color: red;">
而pageEncoding不等于contentType, 更有利亚洲区的文字 CJKV系JSP网页的开发和展示, (例pageEncoding=GB2312
不等于 contentType=utf-8)。</span></p>
<p><span style="background-color: yellow;">
<p><br />
</p>
<p><span style="color: #fff120;"><span style="color: #202eff;">在Tomcat中如果在jsp中设定了pageEncoding，则contentType也跟着设定成相同的编码了,但是在resion中就不是，resin中还会用默认的，这点通过查看编译后的类servlet java文件就可以看到这一点，</span></span><span style="color: #4a30ff;">而问题恰恰就出在这里，所以，在jsp中，如果是在resin下最好还是明确的单独设定这2个属性。</span></p>
</span></p>
<p><br />
</p>
<p>
</p>
<p>jsp文件不像.java，.java在被编译器读入的时候默认采用的是操作系统所设定的locale所对应的编码，比如中国大陆就是GBK，台湾就是BIG5或者MS950。<span class="jdu317">Phontol.com</span>而一般我们不管是在记事本还是在ue中写代码，如果没有经过特别转码的话，写出来的都是本地编码格式的内容。<span class="jdu317">Phontol.com</span>所以编译器采用的方法刚好可以让虚拟机得到正确的资料。<span class="jdu317">Phontol.com</span>
</p>
<p>
</p>
<p>但是jsp文件不是这样，它没有这个默认转码过程，但是指定了pageEncoding就可以实现正确转码了。<span class="jdu317">Phontol.com</span>
</p>
<p>
</p>
<p>举个例子:
</p>
<p>
</p>
<center>
<table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" width="400" cellpadding="2" cellspacing="0">
    <tbody>
        <tr>
            <td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
            <pre>&lt;%@ page contentType="text/html;charset=utf-8" %&gt;</pre>
            </td>
        </tr>
    </tbody>
</table>
</center>
<p>
</p>
<p>大都会打印出乱码，因为输入的&#8220;你好&#8221;是gbk的，但是服务器是否正确抓到&#8220;你好&#8221;不得而知。<span class="jdu317">Phontol.com</span>
</p>
<p>
</p>
<p>但是如果更改为
</p>
<p>
</p>
<center>
<table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" width="400" cellpadding="2" cellspacing="0">
    <tbody>
        <tr>
            <td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
            <pre>&lt;%@ page contentType="text/html;charset=utf-8" pageEncoding="GBK"%&gt;</pre>
            </td>
        </tr>
    </tbody>
</table>
</center>
<p>
</p>
<p>这样就服务器一定会是正确抓到&#8220;你好&#8221;了。<span class="jdu317">Phontol.com</span> </p>
<br />
<img src ="http://www.blogjava.net/lqxue/aggbug/237824.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lqxue/" target="_blank">lqx</a> 2008-10-31 15:21 <a href="http://www.blogjava.net/lqxue/archive/2008/10/31/237824.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux 下用 perl 发email</title><link>http://www.blogjava.net/lqxue/archive/2008/10/17/234818.html</link><dc:creator>lqx</dc:creator><author>lqx</author><pubDate>Fri, 17 Oct 2008 01:33:00 GMT</pubDate><guid>http://www.blogjava.net/lqxue/archive/2008/10/17/234818.html</guid><wfw:comment>http://www.blogjava.net/lqxue/comments/234818.html</wfw:comment><comments>http://www.blogjava.net/lqxue/archive/2008/10/17/234818.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lqxue/comments/commentRss/234818.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lqxue/services/trackbacks/234818.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">首先，在linux上安装perl-Mail-Sendmail-0.79-1.0.rh9.rf.noarch.rpm<br />
<br />
perl 代码如下：<br />
<br />
#</span><span style="color: #008000;">!/usr/bin/perl&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">use</span><span style="color: #000000;">&nbsp;Mail</span><span style="color: #000000;">::</span><span style="color: #000000;">Sendmail;&nbsp;<br />
</span><span style="color: #800080;">$delay</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">1</span><span style="color: #000000;">;<br />
</span><span style="color: #800080;">$f_list</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">list.txt</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">;<br />
</span><span style="color: #800080;">$line</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">0</span><span style="color: #000000;">;</span><span style="color: #008000;">#</span><span style="color: #008000;">skip&nbsp;the&nbsp;column&nbsp;title&nbsp;line</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">my</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">$subject</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">xxx</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">;<br />
</span><span style="color: #0000ff;">open</span><span style="color: #000000;">(FILE</span><span style="color: #000000;">,</span><span style="color: #800080;">$f_list</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">die</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">Can&nbsp;not&nbsp;open&nbsp;list&nbsp;file\n</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">;<br />
</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">FILE</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">){<br />
</span><span style="color: #0000ff;">chomp</span><span style="color: #000000;">;<br />
</span><span style="color: #800080;">$line</span><span style="color: #000000;">=</span><span style="color: #800080;">$line</span><span style="color: #000000;">+</span><span style="color: #800000;">1</span><span style="color: #000000;">;<br />
</span><span style="color: #0000ff;">next</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #800080;">$line</span><span style="color: #000000;">==</span><span style="color: #800000;">1</span><span style="color: #000000;">);<br />
<br />
(</span><span style="color: #800080;">$email</span><span style="color: #000000;">,</span><span style="color: #800080;">$passwd</span><span style="color: #000000;">,</span><span style="color: #800080;">$username</span><span style="color: #000000;">,</span><span style="color: #800080;">$yonghuming</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">split</span><span style="color: #000000;">(</span><span style="color: #000000;">/,/</span><span style="color: #000000;">);<br />
<br />
<br />
</span><span style="color: #800080;">%mail</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(<br />
&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000; font-weight: bold;">xxx@xxx.com</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000;">,</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">$email</span><span style="color: #000000;">,</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;subject&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">$subject</span><span style="color: #000000;">,</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000; font-weight: bold;">content-type</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000; font-weight: bold;">text/html;&nbsp;charset="gbk"</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000;">,</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />
</span><span style="color: #800080;">$mail</span><span style="color: #000000;">{body}&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">END_OF_BODY;<br />
</span><span style="color: #000000;">&lt;!</span><span style="color: #000000;">DOCTYPE&nbsp;HTML&nbsp;PUBLIC&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">-//W3C//DTD&nbsp;HTML&nbsp;4.01&nbsp;Transitional//EN</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br />
</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">http://www.w3.org/TR/html4/loose.dtd</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">html</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">head</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">meta&nbsp;http</span><span style="color: #000000;">-</span><span style="color: #000000;">equiv</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">Content-Type</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&nbsp;content</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">text/html;&nbsp;charset=gbk</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">title</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">个人邮箱登陆</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">title</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">style&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">text/css</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;"><br />
body&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;margin</span><span style="color: #000000;">-</span><span style="color: #000000;">left</span><span style="color: #000000;">:</span><span style="color: #000000;">&nbsp;0px;<br />
&nbsp;&nbsp;&nbsp;&nbsp;margin</span><span style="color: #000000;">-</span><span style="color: #000000;">top</span><span style="color: #000000;">:</span><span style="color: #000000;">&nbsp;0px;<br />
&nbsp;&nbsp;&nbsp;&nbsp;margin</span><span style="color: #000000;">-</span><span style="color: #000000;">right</span><span style="color: #000000;">:</span><span style="color: #000000;">&nbsp;0px;<br />
&nbsp;&nbsp;&nbsp;&nbsp;margin</span><span style="color: #000000;">-</span><span style="color: #000000;">bottom</span><span style="color: #000000;">:</span><span style="color: #000000;">&nbsp;0px;<br />
}<br />
</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">style</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">link</span><span style="color: #000000;">&nbsp;href</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">images/css.css</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&nbsp;rel</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">stylesheet</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">text/css</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">style&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">text/css</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">.</span><span style="color: #000000;">style1&nbsp;{font</span><span style="color: #000000;">-</span><span style="color: #000000;">size</span><span style="color: #000000;">:</span><span style="color: #000000;">&nbsp;13px}<br />
</span><span style="color: #000000;">.</span><span style="color: #000000;">style3&nbsp;{color</span><span style="color: #000000;">:</span><span style="color: #000000;">&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">0066CC}</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">.</span><span style="color: #000000;">style4&nbsp;{color</span><span style="color: #000000;">:</span><span style="color: #000000;">&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">FF0000}</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">style</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">head</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">body</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">table&nbsp;width</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">60%</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&nbsp;border</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">0</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&nbsp;align</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">center</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&nbsp;cellpadding</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">0</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&nbsp;cellspacing</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">0</span><span style="color: #000000; font-weight: bold;">"</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;">tr</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">td&nbsp;height</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">10</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&nbsp;valign</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">bottom</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&gt;&lt;</span><span style="color: #000000;">hr&nbsp;width</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">100%</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&nbsp;size</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">10</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&nbsp;color</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">#3399FF</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&gt;test&lt;/</span><span style="color: #000000;">td</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;">tr</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp; </span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">table</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">body</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">html</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
<br />
END_OF_BODY<br />
<br />
sendmail(</span><span style="color: #800080;">%mail</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">Error:&nbsp;$Mail::Sendmail::error\n</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">;<br />
</span><span style="color: #0000ff;">sleep</span><span style="color: #000000;">(</span><span style="color: #800080;">$delay</span><span style="color: #000000;">);&nbsp;<br />
}<br />
</span><span style="color: #0000ff;">close</span><span style="color: #000000;">(FILE);<br />
<br />
<br />
list file 内容格式:<br />
xx@163.com,xdf.com,xxx,xxx<br />
</span></div>
<img src ="http://www.blogjava.net/lqxue/aggbug/234818.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lqxue/" target="_blank">lqx</a> 2008-10-17 09:33 <a href="http://www.blogjava.net/lqxue/archive/2008/10/17/234818.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>firefox 3 call Components.classes</title><link>http://www.blogjava.net/lqxue/archive/2008/09/18/229665.html</link><dc:creator>lqx</dc:creator><author>lqx</author><pubDate>Thu, 18 Sep 2008 05:16:00 GMT</pubDate><guid>http://www.blogjava.net/lqxue/archive/2008/09/18/229665.html</guid><wfw:comment>http://www.blogjava.net/lqxue/comments/229665.html</wfw:comment><comments>http://www.blogjava.net/lqxue/archive/2008/09/18/229665.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lqxue/comments/commentRss/229665.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lqxue/services/trackbacks/229665.html</trackback:ping><description><![CDATA[在firefox3下Components.classes 是不允许直接调用的，需要加上如下那句粗体的语句才可以<br />
&lt;script&gt;<br />
&nbsp;&nbsp;&nbsp; <strong>netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');</strong><br />
&nbsp;&nbsp;&nbsp; var prefs = Components.classes['@mozilla.org/preferences-service;1'].getService(Components.interfaces.nsIPrefBranch); <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; prefs.setBoolPref("dom.allow_scripts_to_close_windows", true);<br />
&lt;/script&gt;<br />
<img src ="http://www.blogjava.net/lqxue/aggbug/229665.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lqxue/" target="_blank">lqx</a> 2008-09-18 13:16 <a href="http://www.blogjava.net/lqxue/archive/2008/09/18/229665.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>firefox extension 中 call click 事件</title><link>http://www.blogjava.net/lqxue/archive/2008/09/17/229407.html</link><dc:creator>lqx</dc:creator><author>lqx</author><pubDate>Wed, 17 Sep 2008 05:44:00 GMT</pubDate><guid>http://www.blogjava.net/lqxue/archive/2008/09/17/229407.html</guid><wfw:comment>http://www.blogjava.net/lqxue/comments/229407.html</wfw:comment><comments>http://www.blogjava.net/lqxue/archive/2008/09/17/229407.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lqxue/comments/commentRss/229407.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lqxue/services/trackbacks/229407.html</trackback:ping><description><![CDATA[<br />
在chomal.manifest里如下设定，注意黄色部分，很关键<br />
content&nbsp;&nbsp;&nbsp;&nbsp; sample&nbsp;&nbsp;&nbsp; chrome/content/&nbsp; <span style="background-color: yellow;">xpcnativewrappers=no </span><br />
overlay chrome://browser/content/browser.xul chrome://sample/content/sample.xul<br />
<br />
调用方式：<br />
window.content.document.getElementById('sssddd').onclick();<br />
<br />
<br />
参考如下连接<br />
<br />
http://developer.mozilla.org/En/Safely_accessing_content_DOM_from_chrome<br />
<br />
xpcnativewrappers<br />
<br />
http://developer.mozilla.org/en/Chrome_Registration<br />
<img src ="http://www.blogjava.net/lqxue/aggbug/229407.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lqxue/" target="_blank">lqx</a> 2008-09-17 13:44 <a href="http://www.blogjava.net/lqxue/archive/2008/09/17/229407.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>div 底端对齐</title><link>http://www.blogjava.net/lqxue/archive/2008/09/01/226057.html</link><dc:creator>lqx</dc:creator><author>lqx</author><pubDate>Mon, 01 Sep 2008 05:13:00 GMT</pubDate><guid>http://www.blogjava.net/lqxue/archive/2008/09/01/226057.html</guid><wfw:comment>http://www.blogjava.net/lqxue/comments/226057.html</wfw:comment><comments>http://www.blogjava.net/lqxue/archive/2008/09/01/226057.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lqxue/comments/commentRss/226057.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lqxue/services/trackbacks/226057.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">style&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="text/css"</span><span style="color: #ff0000;">&nbsp;media</span><span style="color: #0000ff;">="all"</span><span style="color: #0000ff;">&gt;</span><span style="background-color: #f5f5f5; color: #800000;"><br />
div,img</span><span style="background-color: #f5f5f5; color: #000000;">{</span><span style="background-color: #f5f5f5; color: #ff0000;">margin</span><span style="background-color: #f5f5f5; color: #000000;">:</span><span style="background-color: #f5f5f5; color: #0000ff;">&nbsp;0</span><span style="background-color: #f5f5f5; color: #000000;">;</span><span style="background-color: #f5f5f5; color: #ff0000;">padding</span><span style="background-color: #f5f5f5; color: #000000;">:</span><span style="background-color: #f5f5f5; color: #0000ff;">&nbsp;0</span><span style="background-color: #f5f5f5; color: #000000;">;</span><span style="background-color: #f5f5f5; color: #ff0000;">border</span><span style="background-color: #f5f5f5; color: #000000;">:</span><span style="background-color: #f5f5f5; color: #0000ff;">&nbsp;0</span><span style="background-color: #f5f5f5; color: #000000;">;</span><span style="background-color: #f5f5f5; color: #000000;">}</span><span style="background-color: #f5f5f5; color: #800000;"><br />
<br />
<br />
#content</span><span style="background-color: #f5f5f5; color: #000000;">{</span><span style="background-color: #f5f5f5; color: #ff0000;">width</span><span style="background-color: #f5f5f5; color: #000000;">:</span><span style="background-color: #f5f5f5; color: #0000ff;">&nbsp;303px</span><span style="background-color: #f5f5f5; color: #000000;">;</span><span style="background-color: #f5f5f5; color: #ff0000;">height</span><span style="background-color: #f5f5f5; color: #000000;">:</span><span style="background-color: #f5f5f5; color: #0000ff;">&nbsp;404px</span><span style="background-color: #f5f5f5; color: #000000;">;</span><span style="background-color: #f5f5f5; color: #ff0000;">background</span><span style="background-color: #f5f5f5; color: #000000;">:</span><span style="background-color: #f5f5f5; color: #0000ff;">&nbsp;#F63</span><span style="background-color: #f5f5f5; color: #000000;">;</span><span style="background-color: #f5f5f5; color: #ff0000;">color</span><span style="background-color: #f5f5f5; color: #000000;">:</span><span style="background-color: #f5f5f5; color: #0000ff;">&nbsp;#000</span><span style="background-color: #f5f5f5; color: #000000;">;</span><span style="background-color: #f5f5f5; color: #ff0000;">font</span><span style="background-color: #f5f5f5; color: #000000;">:</span><span style="background-color: #f5f5f5; color: #0000ff;">&nbsp;12px&nbsp;Arial,Helvetica,sans-serif</span><span style="background-color: #f5f5f5; color: #000000;">;</span><span style="background-color: #f5f5f5; color: #ff0000;">position</span><span style="background-color: #f5f5f5; color: #000000;">:</span><span style="background-color: #f5f5f5; color: #0000ff;">&nbsp;relative</span><span style="background-color: #f5f5f5; color: #000000;">;</span><span style="background-color: #f5f5f5; color: #000000;">}</span><span style="background-color: #f5f5f5; color: #800000;"><br />
<br />
#content&nbsp;div</span><span style="background-color: #f5f5f5; color: #000000;">{</span><span style="background-color: #f5f5f5; color: #ff0000;">position</span><span style="background-color: #f5f5f5; color: #000000;">:</span><span style="background-color: #f5f5f5; color: #0000ff;">&nbsp;absolute</span><span style="background-color: #f5f5f5; color: #000000;">;</span><span style="background-color: #f5f5f5; color: #ff0000;">left</span><span style="background-color: #f5f5f5; color: #000000;">:</span><span style="background-color: #f5f5f5; color: #0000ff;">&nbsp;0</span><span style="background-color: #f5f5f5; color: #000000;">;</span><span style="background-color: #f5f5f5; color: #ff0000;">bottom</span><span style="background-color: #f5f5f5; color: #000000;">:</span><span style="background-color: #f5f5f5; color: #0000ff;">&nbsp;0</span><span style="background-color: #f5f5f5; color: #000000;">;</span><span style="background-color: #f5f5f5; color: #000000;">}</span><span style="background-color: #f5f5f5; color: #800000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">style</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">head</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">div&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="content"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">div</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">底端对齐&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">div</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">div</span><span style="color: #0000ff;">&gt;</span></div>
<img src ="http://www.blogjava.net/lqxue/aggbug/226057.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lqxue/" target="_blank">lqx</a> 2008-09-01 13:13 <a href="http://www.blogjava.net/lqxue/archive/2008/09/01/226057.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何把表1的数据换成表2的形式</title><link>http://www.blogjava.net/lqxue/archive/2008/07/16/215158.html</link><dc:creator>lqx</dc:creator><author>lqx</author><pubDate>Wed, 16 Jul 2008 03:18:00 GMT</pubDate><guid>http://www.blogjava.net/lqxue/archive/2008/07/16/215158.html</guid><wfw:comment>http://www.blogjava.net/lqxue/comments/215158.html</wfw:comment><comments>http://www.blogjava.net/lqxue/archive/2008/07/16/215158.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lqxue/comments/commentRss/215158.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lqxue/services/trackbacks/215158.html</trackback:ping><description><![CDATA[<br />
<img height="197" alt="" src="http://www.blogjava.net/images/blogjava_net/lqxue/b1.JPG" width="222" border="0" /><br />
<br />
<br />
<img height="81" alt="" src="http://www.blogjava.net/images/blogjava_net/lqxue/b2.JPG" width="288" border="0" /><br />
<br />
select&nbsp; max(a.num) A,max(b.num) B,max(c.num) C,tttt.name from tttt <br />
left join (select * from tttt where abc='C') c on c.abc=tttt.abc and c.name=tttt.name<br />
left join (select * from tttt where abc='B') b on b.abc=tttt.abc and b.name=tttt.name<br />
left join (select * from tttt where abc='A') a on a.abc=tttt.abc and a.name=tttt.name<br />
group by name <br />
<br />
<img src ="http://www.blogjava.net/lqxue/aggbug/215158.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lqxue/" target="_blank">lqx</a> 2008-07-16 11:18 <a href="http://www.blogjava.net/lqxue/archive/2008/07/16/215158.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】JAVA的内省（introspector）与反射（reflection）</title><link>http://www.blogjava.net/lqxue/archive/2008/07/14/214771.html</link><dc:creator>lqx</dc:creator><author>lqx</author><pubDate>Mon, 14 Jul 2008 09:21:00 GMT</pubDate><guid>http://www.blogjava.net/lqxue/archive/2008/07/14/214771.html</guid><wfw:comment>http://www.blogjava.net/lqxue/comments/214771.html</wfw:comment><comments>http://www.blogjava.net/lqxue/archive/2008/07/14/214771.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lqxue/comments/commentRss/214771.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lqxue/services/trackbacks/214771.html</trackback:ping><description><![CDATA[&nbsp;很多朋友在深入的接触 JAVA 语言后就会发现这样两个词：反射 (Reflection) 和内省 (Introspector) ，经常搞不清楚这到底是怎么回事，在什么场合下应用以及如何使用？今天把这二者放在一起介绍，因为它们二者是相辅相成的。 <br />
<br />
<strong>反射 </strong><br />
<br />
相对而言，反射比内省更容易理解一点。用一句比较白的话来概括，反射就是让你可以通过名称来得到对象 ( 类，属性，方法 ) 的技术。例如我们可以通过类名来生成一个类的实例；知道了方法名，就可以调用这个方法；知道了属性名就可以访问这个属性的值。 <br />
<br />
还是写两个例子让大家更直观的了解反射的使用方法： <br />
<div class="quote_title">引用</div>
<div class="quote_div">//通过类名来构造一个类的实例 <br />
Class cls_str = Class.forName( "java.lang.String" ); <br />
// 上面这句很眼熟，因为使用过 JDBC 访问数据库的人都用过 J <br />
Object str = cls_str.newInstance(); <br />
// 相当于 String str = new String(); <br />
//通过方法名来调用一个方法 <br />
String methodName = "length" ; <br />
Method m = cls_str.getMethod(methodName, null ); <br />
System.out.println( "length is " + m.invoke(str, null )); <br />
// 相当于 System.out.println(str.length());</div>
<br />
上面的两个例子是比较常用方法。看到上面的例子就有人要发问了：为什么要这么麻烦呢？本来一条语句就完成的事情干吗要整这么复杂？没错，在上面的例子中确实没有必要这么麻烦。不过你想像这样一个应用程序，它支持动态的功能扩展，也就是说程序不重新启动但是可以自动加载新的功能，这个功能使用一个具体类来表示。首先我们必须为这些功能定义一个接口类，然后我们要求所有扩展的功能类必须实现我指定的接口，这个规定了应用程序和可扩展功能之间的接口规则，但是怎么动态加载呢？我们必须让应用程序知道要扩展的功能类的类名，比如是 test.Func1 ，当我们把这个类名 ( 字符串 ) 告诉应用程序后，它就可以使用我们第一个例子的方法来加载并启用新的功能。这就是类的反射，请问你有别的选择吗？ <br />
<br />
关于方法的反射建议大家看我的另外一篇文章《 利用 Turbine 的事件映射来扩展 Struts 的功能 》，地址是： http://www.javayou.com/article/CSDN/extend_struts.html 。这篇文章详细介绍了如果通过反射来扩展 Struts 框架的功能。 <br />
<br />
<strong>内省</strong> <br />
<br />
内省是 Java 语言对 Bean 类属性、事件的一种缺省处理方法。例如类 A 中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的值。通过 getName/setName 来访问 name 属性，这就是默认的规则。 Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法，通过这些 API 可以使你不需要了解这个规则（但你最好还是要搞清楚），这些 API 存放于包 java.beans 中。 <br />
<br />
<br />
一般的做法是通过类 Introspector 来获取某个对象的 BeanInfo 信息，然后通过 BeanInfo 来获取属性的描述器（ PropertyDescriptor ），通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法，然后我们就可以通过反射机制来调用这些方法。下面我们来看一个例子，这个例子把某个对象的所有属性名称和值都打印出来： <br />
<br />
<br />
<div class="quote_title">引用</div>
<div class="quote_div">/* <br />
* Created on 2004-6-29 <br />
*/ <br />
<br />
package demo; <br />
<br />
<br />
import java.beans.BeanInfo; <br />
import java.beans.Introspector; <br />
import java.beans.PropertyDescriptor; <br />
<br />
<br />
/** <br />
* 内省演示例子 <br />
* @author liudong <br />
*/ <br />
<br />
public class IntrospectorDemo { <br />
String name; <br />
public static void main(String[] args) throws Exception{ <br />
IntrospectorDemo demo = new IntrospectorDemo(); <br />
demo.setName( "Winter Lau" ); <br />
<br />
// 如果不想把父类的属性也列出来的话， <br />
// 那 getBeanInfo 的第二个参数填写父类的信息 <br />
BeanInfo bi = Introspector.getBeanInfo(demo.getClass(), Object. class ); <br />
PropertyDescriptor[] props = bi.getPropertyDescriptors(); <br />
for ( int i=0;i&lt;props.length;i++){ <br />
System.out.println(props[i].getName()+ "=" + <br />
props[i].getReadMethod().invoke(demo, null )); <br />
} <br />
<br />
} <br />
<br />
public String getName() { <br />
return name; <br />
} <br />
<br />
public void setName(String name) { <br />
this .name = name; <br />
} <br />
} </div>
<br />
<br />
Web 开发框架 Struts 中的 FormBean 就是通过内省机制来将表单中的数据映射到类的属性上，因此要求 FormBean 的每个属性要有 getter/setter 方法。但也并不总是这样，什么意思呢？就是说对一个 Bean 类来讲，我可以没有属性，但是只要有 getter/setter 方法中的其中一个，那么 Java 的内省机制就会认为存在一个属性，比如类中有方法 setMobile ，那么就认为存在一个 mobile 的属性，这样可以方便我们把 Bean 类通过一个接口来定义而不用去关心具体实现，不用去关心 Bean 中数据的存储。比如我们可以把所有的 getter/setter 方法放到接口里定义，但是真正数据的存取则是在具体类中去实现，这样可提高系统的扩展性。 <br />
<br />
<strong>总结</strong> <br />
将 Java 的反射以及内省应用到程序设计中去可以大大的提供程序的智能化和可扩展性。有很多项目都是采取这两种技术来实现其核心功能，例如我们前面提到的 Struts ，还有用于处理 XML 文件的 Digester 项目，其实应该说几乎所有的项目都或多或少的采用这两种技术。在实际应用过程中二者要相互结合方能发挥真正的智能化以及高度可扩展性。<br />
<br />
另外，以下是SUN的java doc 对<strong>Introspector</strong>的解释：<br />
<dl>
<dt>public class <strong>Introspector</strong></dt>
<dt>extends <a title="class in java.lang" href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html">Object</a></dt></dl>
<p>The Introspector class provides a standard way for tools to learn about the properties, events, and methods supported by a target Java Bean. </p>
<p>For each of those three kinds of information, the Introspector will separately analyze the bean's class and superclasses looking for either explicit or implicit information and use that information to build a BeanInfo object that comprehensively describes the target bean. </p>
<p>For each class "Foo", explicit information may be available if there exists a corresponding "FooBeanInfo" class that provides a non-null value when queried for the information. We first look for the BeanInfo class by taking the full package-qualified name of the target bean class and appending "BeanInfo" to form a new class name. If this fails, then we take the final classname component of this name, and look for that class in each of the packages specified in the BeanInfo package search path. </p>
<p>Thus for a class such as "sun.xyz.OurButton" we would first look for a BeanInfo class called "sun.xyz.OurButtonBeanInfo" and if that failed we'd look in each package in the BeanInfo search path for an OurButtonBeanInfo class. With the default search path, this would mean looking for "sun.beans.infos.OurButtonBeanInfo". </p>
<p>If a class provides explicit BeanInfo about itself then we add that to the BeanInfo information we obtained from analyzing any derived classes, but we regard the explicit information as being definitive for the current class and its base classes, and do not proceed any further up the superclass chain. </p>
<p>If we don't find explicit BeanInfo on a class, we use low-level reflection to study the methods of the class and apply standard design patterns to identify property accessors, event sources, or public methods. We then proceed to analyze the class's superclass and add in the information from it (and possibly on up the superclass chain). </p>
<p><strong>Because the Introspector caches BeanInfo classes for better performance, take care if you use it in an application that uses multiple class loaders. In general, when you destroy a <code>ClassLoader</code> that has been used to introspect classes, you should use the </strong><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/beans/Introspector.html#flushCaches%28%29"><code><code><strong>Introspector.flushCaches</strong></code></code></a><strong> or </strong><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/beans/Introspector.html#flushFromCaches%28java.lang.Class%29"><code><code><strong>Introspector.flushFromCaches</strong></code></code></a><strong> method to flush all of the introspected classes out of the cache. </strong></p>
<p>For more information about introspection and design patterns, please consult the <a href="http://java.sun.com/products/javabeans/docs/index.html">JavaBeans specification</a>. </p>
<img src ="http://www.blogjava.net/lqxue/aggbug/214771.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lqxue/" target="_blank">lqx</a> 2008-07-14 17:21 <a href="http://www.blogjava.net/lqxue/archive/2008/07/14/214771.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>