﻿<?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-cAng^Er-文章分类-|:数 据 库:|</title><link>http://www.blogjava.net/xiaosao/category/11006.html</link><description>不懂我的人 , 离不了我 , 该了解了解我 !而懂我的人 , 更离不了我 , 因为他们爱我 。</description><language>zh-cn</language><lastBuildDate>Fri, 25 Feb 2011 13:14:21 GMT</lastBuildDate><pubDate>Fri, 25 Feb 2011 13:14:21 GMT</pubDate><ttl>60</ttl><item><title>&lt;转&gt;Oracle内存共享区</title><link>http://www.blogjava.net/xiaosao/articles/344895.html</link><dc:creator>cAng^Er</dc:creator><author>cAng^Er</author><pubDate>Wed, 23 Feb 2011 02:49:00 GMT</pubDate><guid>http://www.blogjava.net/xiaosao/articles/344895.html</guid><wfw:comment>http://www.blogjava.net/xiaosao/comments/344895.html</wfw:comment><comments>http://www.blogjava.net/xiaosao/articles/344895.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaosao/comments/commentRss/344895.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaosao/services/trackbacks/344895.html</trackback:ping><description><![CDATA[<p>原文:http://bbs.dameng.com/viewthread.php?tid=2202&amp;extra=page%3D1<br />
</p>
PGA是一个服务器进程的专用的私有内存区，而SGA则是共享内存区。<br />
<br />
SGA由多个部分组成：<br />
1， 固定SGA（Fixed SGA）<br />
2， 块缓冲区（Db cache）<br />
3， 重做日志缓冲区（Redo log buffer）<br />
4， Java池（<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=Java">Java</span> pool）<br />
5， 大池（Large pool）<br />
6， 共享池（Shared pool）<br />
7， 流池（Stream pool）<br />
<br />
有如下参数控制共享池相关组件大小：<br />
1， JAVA_POOL_SIZE：控制Java池大小。<br />
2， SHARED_POOL_SIZE：9i中控制共享池中占用最大的部分，10g以上控制共享池大小。<br />
3， LARGE_POOL_SIZE：控制大池大小。<br />
4， DB_*K_CACHE_SIZE：控制不同块大小的缓冲区大小。<br />
5， LOG_BUFFER：控制重做日志缓冲区大小。<br />
6， SGA_TARGET：10g以上控制自动SGA内存管理的总内存大小。<br />
7， SGA_MAX_SIZE：控制SGA可以达到的最大大小，改变需重启<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%CA%FD%BE%DD%BF%E2">数据库</span>。<br />
<br />
下面将详细介绍各个部分的作用和推荐设置。<br />
<br />
SGA各组件作用<br />
1， SGA：<br />
<br />
2， 块缓冲区：<br />
&nbsp; &nbsp; 查询时，Oracle会先把从磁盘读取的数据放入内存，以后再查询相关数据时不用再次读取磁盘。insert和update时，Oracle SGA会现在该区中缓存数据，之后批量写到硬盘中。通过块缓冲区，<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=Oracle">Oracle</span>可以通过内存缓存提高磁盘的I/O。<br />
&nbsp; &nbsp; 块缓冲区中有三个区域：<br />
默认池（Default pool）：所有数据默认都在这里缓存。<br />
保持池（Keep pool）：用来缓存需要多次重用的数据。<br />
回收池（Recycle pool）：用来缓存很少重用的数据。<br />
<br />
&nbsp; &nbsp; 原来只有一个默认池，所有数据都在这里缓存。这样会产生一个问题：大量很少重用的数据会把需重用的数据缓冲区，造成磁盘I/O增加，运行速度下降。后来分出了保持池和回收池根据是<br />
<br />
否经常重用来分别缓存数据。<br />
&nbsp; &nbsp; 这三部分内存区需要手动确定大小，并且之间没有共享。例如：保持池中已经满了，而回收池中还有大量空闲内存，这时回收池的内存不会分配给保持池。<br />
&nbsp; &nbsp; 9i开始，还可以设置db_nk_cache。9i之前数据库只能使用相同的块大小。9i开始同一个数据库可以使用多种块大小（2KB,4KB,8KB,16KB,32KB），这些块需要在各自的db_nk_cache中缓存。如果为不<br />
<br />
同的表空间指定了不同的块大小，需要为其设置各自的缓冲区。<br />
<br />
3， 重做日志缓冲区（Redo log buffer）：<br />
&nbsp; &nbsp; 数据写到重做日志文件之前在这里缓存，在以下情况中触发：<br />
每隔3秒<br />
缓存达到1MB或1/3满时<br />
用户提交时<br />
缓冲区的数据写入磁盘前<br />
<br />
4， Java池（Java pool）：<br />
&nbsp; &nbsp; 在数据库中运行Java代码时用到这部分内存。例如：编写Java存储过程在服务器内运行。需要注意的是，该内存与常见的Java编写的B/S系统并没关系。用JAVA语言代替PL/SQL语言在数据库中写存储<br />
<br />
过程才会用到这部分内存。<br />
<br />
5， 大池（Large pool）：<br />
&nbsp; &nbsp; 下面三种情况使用到大池：<br />
并行执行：存放进程间的消息缓冲区<br />
RMAN：某些情况下用于磁盘I/O缓冲区<br />
共享服务器模式：共享服务器模式下UGA在大池中分配（如果设置了大池）<br />
<br />
6， 共享池（Shared pool）<br />
&nbsp; &nbsp; 共享池是SGA中最重要的内存段之一。共享池太大和太小都会严重影响服务器。<br />
SQL和PL/SQL的解释计划、代码，数据字典数据等等都在这里缓存。<br />
SQL和PL/SQL代码在执行前会进行&#8220;解析&#8221;来获得执行计划及权限验证等相关辅助操作。&#8220;解析&#8221;很费时间。对于响应时间很短的查询，&#8220;解析&#8221;可以占到全部时间的2/3。对于响应时间较长的统计等操<br />
<br />
作，&#8220;解析&#8221;所占用的时间比例会下降很多。执行计划及所需的数据字典数据都缓存在共享池中，让后续相同的查询可以减少很多时间。<br />
&nbsp; &nbsp; 不使用&#8220;绑定变量&#8221;导致：<br />
&nbsp; &nbsp; 系统需要花费大量的资源去解析查询。<br />
&nbsp; &nbsp; 共享池中的代码从不重用，系统花费很大代价管理这部分内存。<br />
&nbsp; &nbsp; 关于共享变量的优缺点讨论已经超过了这篇文章的范畴，简单来讲，响应时间短的查询要使用共享变量，响应时间长的统计不使用共享变量。<br />
&nbsp; &nbsp; 需要注意的是，SHARED_POOL_SIZE参数在9i中控制共享池中占用最大的部分，10g以上控制共享池总大小。<br />
<br />
7， 流池（Stream pool）<br />
&nbsp; &nbsp; 9iR2以上增加了&#8220;流&#8221;技术，10g以上在SGA中增加了流池。流是用来共享和复制数据的工具。
<img src ="http://www.blogjava.net/xiaosao/aggbug/344895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaosao/" target="_blank">cAng^Er</a> 2011-02-23 10:49 <a href="http://www.blogjava.net/xiaosao/articles/344895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>&lt;转&gt;oracle性能优化-共享池调整</title><link>http://www.blogjava.net/xiaosao/articles/344893.html</link><dc:creator>cAng^Er</dc:creator><author>cAng^Er</author><pubDate>Wed, 23 Feb 2011 02:33:00 GMT</pubDate><guid>http://www.blogjava.net/xiaosao/articles/344893.html</guid><wfw:comment>http://www.blogjava.net/xiaosao/comments/344893.html</wfw:comment><comments>http://www.blogjava.net/xiaosao/articles/344893.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaosao/comments/commentRss/344893.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaosao/services/trackbacks/344893.html</trackback:ping><description><![CDATA[<a href="http://space.itpub.net/79499/viewspace-341794">原文:http://space.itpub.net/79499/viewspace-341794</a><br />
<br />
<span style="font-size: 9pt">一</span><span style="font-size: 9pt">.</span><span style="font-size: 9pt">简介</span><span style="font-size: 9pt">:</span><span style="font-size: 9pt"><a onclick="javascript:tagshow(event, '%CA%FD%BE%DD%BF%E2');" href="javascript:;" target="_self"><u><strong>数据库</strong></u></a>调整中最为重要的一部分是重写运行效率差的</span><span style="font-size: 9pt"><a onclick="javascript:tagshow(event, 'SQL');" href="javascript:;" target="_self"><u><strong>SQL</strong></u></a></span><span style="font-size: 9pt">代码</span><span style="font-size: 9pt">,</span><span style="font-size: 9pt">重写之后的</span><span style="font-size: 9pt">SQL</span><span style="font-size: 9pt">代码在运行效率方面可能会与之前的产生极大的差别！</span><span style="font-size: 9pt"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 9pt">但是当遇到重写之后性能还是未能突破瓶颈或者你是用户</span><span style="font-size: 9pt">(</span><span style="font-size: 9pt">无法访问</span><span style="font-size: 9pt">SQL</span><span style="font-size: 9pt">代码</span><span style="font-size: 9pt">)</span><span style="font-size: 9pt">的时候</span><span style="font-size: 9pt">,</span><span style="font-size: 9pt">可以通过调整</span><span style="font-size: 9pt"><a onclick="javascript:tagshow(event, 'ORACLE');" href="javascript:;" target="_self"><u><strong>ORACLE</strong></u></a></span><span style="font-size: 9pt">的共享内存结构</span><span style="font-size: 9pt">SGA(System Global Area),</span><span style="font-size: 9pt">最大限度地提高性能！</span><span style="font-size: 9pt"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SGA</span><span style="font-size: 9pt">中比较重要的组件就是</span><span style="font-size: 9pt">Shared Pool(</span><span style="font-size: 9pt">共享池</span><span style="font-size: 9pt">),</span><span style="font-size: 9pt">它的作用就是高速缓存</span><span style="font-size: 9pt">SQL</span><span style="font-size: 9pt">语句</span><span style="font-size: 9pt">!</span><span style="font-size: 9pt">共享池由一个最近最少使用</span><span style="font-size: 9pt">(LRU,Least Recently Used)</span><span style="font-size: 9pt">算法来<a onclick="javascript:tagshow(event, '%B9%DC%C0%ED');" href="javascript:;" target="_self"><u><strong>管理</strong></u></a></span><span style="font-size: 9pt">!<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 9pt">共享池的好处</span><span style="font-size: 9pt">:<br />
1.<span style="color: rgb(51,102,255)">select cust_id,cust_name from col_cust<br />
</span>2.</span><span style="font-size: 9pt">上列语句的算法被转换成</span><span style="font-size: 9pt">ASCII</span><span style="font-size: 9pt">码</span><span style="font-size: 9pt">,</span><span style="font-size: 9pt">然后通过一个散列算法产生一个单独的散列值</span><span style="font-size: 9pt">~~</span><span style="font-size: 9pt">接着</span><span style="font-size: 9pt">Process</span><span style="font-size: 9pt">会查看该散列值在</span><span style="font-size: 9pt">Shared Pool</span><span style="font-size: 9pt">中是否存在</span><span style="font-size: 9pt">,<br />
</span><span style="font-size: 9pt">如果存在</span><span style="font-size: 9pt">,</span><span style="font-size: 9pt">就执行高速缓存中语句</span><span style="font-size: 9pt"><br />
3.</span><span style="font-size: 9pt">如果不存在</span><span style="font-size: 9pt">,</span><span style="font-size: 9pt">就必须对该语句进行语法分析</span><span style="font-size: 9pt">,</span><span style="font-size: 9pt">这些分析步骤会产生额外的系统开销</span><span style="font-size: 9pt">,</span><span style="font-size: 9pt">该操作是高代价的</span><span style="font-size: 9pt">!<br />
4.</span><span style="font-size: 9pt">查找到匹配的</span><span style="font-size: 9pt">SQL</span><span style="font-size: 9pt">叫做一次高速缓冲区命中</span><span style="font-size: 9pt">(Cache Hit)<br />
5.</span><span style="font-size: 9pt">反之叫做高速缓冲区脱靶</span><span style="font-size: 9pt">(Cache Miss)<br />
6.</span><span style="font-size: 9pt">注意是区分大小写的</span><span style="font-size: 9pt"><br />
&nbsp;<span style="color: rgb(51,102,255)">SELECT CUST_ID,CUST_NAME FROM COL_CUST</span>&nbsp;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="font-size: 9pt">二</span><span style="font-size: 9pt">.</span><span style="font-size: 9pt">共享池有三个组件组成</span><span style="font-size: 9pt">,Library Cache(</span><span style="font-size: 9pt">库高速缓存区</span><span style="font-size: 9pt">),Data Dictionary Cache(</span><span style="font-size: 9pt">数据目录高速缓存区</span><span style="font-size: 9pt">),User Global Area(</span><span style="font-size: 9pt">用户全局区</span><span style="font-size: 9pt">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.Library Cache(</span><span style="font-size: 9pt">库高速缓存区</span><span style="font-size: 9pt">)</span><span style="font-size: 9pt">是用来缓存</span><span style="font-size: 9pt">SQL</span><span style="font-size: 9pt">语句的场所</span><span style="font-size: 9pt">.</span><span style="font-size: 9pt">可以通过下面这句话对动态视图进行查询</span><span style="font-size: 9pt">,</span><span style="font-size: 9pt">检查</span><span style="font-size: 9pt">Library Cache</span><span style="font-size: 9pt">的内容</span><span style="font-size: 9pt"><br />
&nbsp;<span style="color: rgb(51,102,255)">select p.username,l.sql_text,<br />
&nbsp;lpad(' ' ,4*(LEVEL-2)) || operation || ' ' || options || ' ' || object_name as "Execution Plan"<br />
&nbsp;from (<br />
&nbsp;select s.username,p.address,p.hash_value,p.operation,p.options,p.object_name,p.id,p.parent_id<br />
&nbsp;from v$sql_plan p,v$session s<br />
&nbsp;where (p.address=s.sql_address and p.hash_value=s.sql_hash_value) and s.username='citictest'<br />
&nbsp;) p,v$sql l<br />
&nbsp;where(l.address=p.address and l.hash_value=p.hash_value)<br />
&nbsp;start with id=0<br />
&nbsp;connect by prior id = parent_id<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.Data Dictionary Cache(</span><span style="font-size: 9pt">数据目录高速缓存区</span><span style="font-size: 9pt">):</span><span style="font-size: 9pt">数据目录是用来检查</span><span style="font-size: 9pt">SQL</span><span style="font-size: 9pt">语句所引用的那些表是否已经存在</span><span style="font-size: 9pt">,</span><span style="font-size: 9pt">列名和数据类型是否也正确</span><span style="font-size: 9pt">! Library Cache</span><span style="font-size: 9pt">和</span><span style="font-size: 9pt">Data Dictionary Cache</span><span style="font-size: 9pt">使用互相独立的</span><span style="font-size: 9pt">LRU</span><span style="font-size: 9pt">机制</span><span style="font-size: 9pt">,</span><span style="font-size: 9pt">好处是后续用户发布的语句与先前用户所发布的语句类似但不一致</span><span style="font-size: 9pt">,</span><span style="font-size: 9pt">虽然在</span><span style="font-size: 9pt">Library Cache</span><span style="font-size: 9pt">中无法找到匹配的</span><span style="font-size: 9pt">,</span><span style="font-size: 9pt">但是在数据目录中会存在</span><span style="font-size: 9pt">,</span><span style="font-size: 9pt">也会有性能上的提高。</span>
<div><span style="font-size: 9pt"><br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="font-size: 9pt">三</span><span style="font-size: 9pt">.(1)</span><span style="font-size: 9pt">测量</span><span style="font-size: 9pt">Library Cache(</span><span style="font-size: 9pt">库高速缓存区</span><span style="font-size: 9pt">)</span><span style="font-size: 9pt">的性能</span><span style="font-size: 9pt"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(51,102,255)">select namespace,gethitratio,pinhitratio,reloads,invalidations<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from v$librarycache<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where namespace in ('SQL_AREA','TABLE/PROCEDURE','BODY','TRIGGER');<br />
</span></span><span style="font-size: 9pt">主要看</span><span style="font-size: 9pt">gethitratio,pinhitratio&gt;90%</span><span style="font-size: 9pt">说明调整充分</span></div>
<div><span style="font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(51,102,255)">select sum(reloads)/sum(pins) "RELOAD</span></span><span style="font-size: 9pt; color: rgb(51,102,255)">　</span><span style="font-size: 9pt; color: rgb(51,102,255)">RATIO"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from v$librarycache<br />
</span><span style="font-size: 9pt">当</span><span style="font-size: 9pt">&lt;1%</span><span style="font-size: 9pt">意味着不是经常重新语法分析以前被装载到</span><span style="font-size: 9pt">Library Cache</span><span style="font-size: 9pt">的语句</span><span style="font-size: 9pt"><br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2)</span><span style="font-size: 9pt">测量</span><span style="font-size: 9pt">Data Dictionary Cache(</span><span style="font-size: 9pt">数据目录高速缓存区</span><span style="font-size: 9pt">)</span><span style="font-size: 9pt">的性能</span><span style="font-size: 9pt"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(51,102,255)">select 1 - (sum(getmisses)/sum(gets)) "DATA DICTIONARY HIT RATIO"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from v$rowcache;<br />
</span></span><span style="font-size: 9pt">当</span><span style="font-size: 9pt">&gt;85%</span><span style="font-size: 9pt">时说明调整充分</span></div>
<div><span style="font-size: 9pt">&nbsp;&nbsp;&nbsp;</span><span style="font-size: 9pt">四</span><span style="font-size: 9pt">.</span><span style="font-size: 9pt">通过改进</span><span style="font-size: 9pt">Library Cache</span><span style="font-size: 9pt">和</span><span style="font-size: 9pt">Data Dictionary Cache</span><span style="font-size: 9pt">来提高</span><span style="font-size: 9pt">shared pool</span><span style="font-size: 9pt">性能</span><span style="font-size: 9pt"><br />
(1).</span><span style="font-size: 9pt">得到当前</span><span style="font-size: 9pt">shared pool</span><span style="font-size: 9pt">的大小</span><span style="font-size: 9pt"><br />
&nbsp;<span style="color: rgb(51,102,255)">select pool,sum(bytes) "SIZE" from v$sgastat where pool='shared pool' group by pool;<br />
</span>(2).</span><span style="font-size: 9pt">得到推荐的</span><span style="font-size: 9pt">shared pool</span><span style="font-size: 9pt">大小</span><span style="font-size: 9pt"><br />
&nbsp;&nbsp;<span style="color: rgb(51,102,255)">set echo off<br />
&nbsp; set feedback off<br />
&nbsp; set serveroutput on<br />
&nbsp; declare<br />
&nbsp; v_total_plsql_mem number := 0;<br />
&nbsp; v_total_sql_mem&nbsp;&nbsp; number := 0;<br />
&nbsp; v_total_sharable_mem number := 0;<br />
&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select sum(sharable_mem) into v_total_plsql_mem from v$db_object_cache;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select sum(sharable_mem) into v_total_sql_mem from v$sqlarea where executions &gt; 10;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v_total_sharable_mem := v_total_plsql_mem + v_total_sql_mem;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dbms_Output.put_line('Estimated required shared pool size is:' || to_char(v_total_sharable_mem,'fm9,999,999,999,999') || ' bytes');<br />
&nbsp; end;<br />
&nbsp; /<br />
</span>(3).</span><span style="font-size: 9pt">动态加大</span><span style="font-size: 9pt">shared pool</span><span style="font-size: 9pt">大小</span><span style="font-size: 9pt"><br />
<span style="color: rgb(51,102,255)">alert system set shared_pool_size = 200M;<br />
</span>*</span><span style="font-size: 9pt">大小不能超过</span><span style="font-size: 9pt">SGA_MAX_SIZE</span><span style="font-size: 9pt">的值</span><span style="font-size: 9pt"><br />
(4).</span><span style="font-size: 9pt">初始</span><span style="font-size: 9pt">SGA</span><span style="font-size: 9pt">大小的计算</span><span style="font-size: 9pt"><br />
(TSGA)SGA</span><span style="font-size: 9pt">总的大小</span><span style="font-size: 9pt">=</span><span style="font-size: 9pt">服务器物理内存</span><span style="font-size: 9pt">*0.55&nbsp;&nbsp; (1G</span><span style="font-size: 9pt">以上物理内存的话可以相应</span><span style="font-size: 9pt">60%-75%)<br />
(TSGAI)</span><span style="font-size: 9pt">每个实例的总</span><span style="font-size: 9pt">SGA</span><span style="font-size: 9pt">大小</span><span style="font-size: 9pt">=TSGA/oracle</span><span style="font-size: 9pt">上实例的个数</span><span style="font-size: 9pt"><br />
shared pool</span><span style="font-size: 9pt">的总内存</span><span style="font-size: 9pt">=TSGAI*0.45<br />
(5).</span><span style="font-size: 9pt">上述四点是其实完成的是同一个做法，就是使</span><span style="font-size: 9pt">Shared Pool</span><span style="font-size: 9pt">更大</span><span style="font-size: 9pt"><br />
(6).</span><span style="font-size: 9pt">可以将</span><span style="font-size: 9pt">PL/SQL</span><span style="font-size: 9pt">程序包装入</span><span style="font-size: 9pt">Shared Pool Reserved Area(</span><span style="font-size: 9pt">共享池保留区</span><span style="font-size: 9pt">)<br />
Shared_Pool_Reserved_Size</span><span style="font-size: 9pt">用来设置这一区域的大小，默认是</span><span style="font-size: 9pt">5%</span><span style="font-size: 9pt">，这是不够的</span><span style="font-size: 9pt"><br />
<span style="color: rgb(51,102,255)">select owner,name,sharable_mem from v$db_object_cache<br />
where type in('PACKAGE','PACKAGE BODY') order by sharable_mem desc;<br />
</span></span><span style="font-size: 9pt">上述这句语句可以查看当前缓存区中的</span><span style="font-size: 9pt">PL/SQL</span><span style="font-size: 9pt">程序包的名称和大小，当发现大小</span><span style="font-size: 9pt">&gt; Shared_Pool_Reserved_Size</span><span style="font-size: 9pt">时说明保留区的大小不够，你需要增加</span><span style="font-size: 9pt">Shared_Pool_Reserved_Size</span><span style="font-size: 9pt">的值</span><span style="font-size: 9pt"><br />
(7).</span><span style="font-size: 9pt">把重要的</span><span style="font-size: 9pt">PL/SQL</span><span style="font-size: 9pt">代码保持在内存中</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">你可以把常用的</span><span style="font-size: 9pt">PROCEDURE</span><span style="font-size: 9pt">销定</span><span style="font-size: 9pt">(Pinning)</span><span style="font-size: 9pt">在</span><span style="font-size: 9pt">Shared_Pool_Reserved_Size</span><span style="font-size: 9pt">中</span><span style="font-size: 9pt"><br />
</span><span style="font-size: 9pt">做法如下</span><span style="font-size: 9pt">:</span></div>
<div><span style="font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a)sys</span><span style="font-size: 9pt">用户登录</span><span style="font-size: 9pt"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b)</span><span style="font-size: 9pt">运行</span><span style="font-size: 9pt">@%ORACLE_HOME%/rdbms\admin\dbmspool.sql<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c)SQL&gt;execute DBMS_SHARED_POOL.KEEP('PROCEDURENAME') (</span><span style="font-size: 9pt">销定</span><span style="font-size: 9pt">,</span><span style="font-size: 9pt">必须用</span><span style="font-size: 9pt">sys</span><span style="font-size: 9pt">完成</span><span style="font-size: 9pt">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d)</span><span style="font-size: 9pt">找到销定的对象</span><span style="font-size: 9pt">select owner,name,type from v$db_object_cache where kept='YES';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e)</span><span style="font-size: 9pt">销定对单独的</span><span style="font-size: 9pt">SQL</span><span style="font-size: 9pt">语句无法操作</span><span style="font-size: 9pt">,</span><span style="font-size: 9pt">尽可能的把大语句做成</span><span style="font-size: 9pt">PROCEDURE</span><span style="font-size: 9pt">，可以用一下语句寻找出比较大的语句</span><span style="font-size: 9pt"><br />
<span style="color: rgb(51,102,255)">select substr(sql_text,1,45),length(sql_text) "STMT_SIZE" from v$sqlarea where command_type=47 order by length(sql_text) desc;<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f)</span><span style="font-size: 9pt">可以编写一个脚本，当实例启动之后运行，把所有需要销定的语句执行一下</span><span style="font-size: 9pt"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; h)</span><span style="font-size: 9pt">只有使用</span><span style="font-size: 9pt">UNKEEP</span><span style="font-size: 9pt">或者实例关闭时才会取消销定</span><span style="font-size: 9pt"><br />
(8).</span><span style="font-size: 9pt">其他的一些调整</span><span style="font-size: 9pt">Library Cache</span><span style="font-size: 9pt">参数</span><span style="font-size: 9pt"><br />
a)open_cursors :</span><span style="font-size: 9pt">默认</span><span style="font-size: 9pt">50<br />
b)cursor_space_for_time</span><span style="font-size: 9pt">默认</span><span style="font-size: 9pt">false<br />
c)session_cached_cursors</span><span style="font-size: 9pt">默认</span><span style="font-size: 9pt">0(</span><span style="font-size: 9pt">无游标高速缓存</span><span style="font-size: 9pt">)<br />
d)cursor_sharing</span><span style="font-size: 9pt">默认</span><span style="font-size: 9pt">EXACT --2</span><span style="font-size: 9pt">条</span><span style="font-size: 9pt">SQL</span><span style="font-size: 9pt">语句必须完全匹配才能共享</span><span style="font-size: 9pt">shared pool</span><span style="font-size: 9pt">中所缓存的已分析代码</span><span style="font-size: 9pt">.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SIMILAR --</span><span style="font-size: 9pt">允许</span><span style="font-size: 9pt">2</span><span style="font-size: 9pt">条仅在字面上不同的</span><span style="font-size: 9pt">SQL</span><span style="font-size: 9pt">语句共享</span><span style="font-size: 9pt">shared pool</span><span style="font-size: 9pt">中所缓存的已分析代码</span><span style="font-size: 9pt">.<br />
</span><span style="font-size: 9pt">例如</span><span style="font-size: 9pt">:<span style="color: rgb(51,102,255)">select cust_id from col_cust where cust_name = 'wang'<br />
&nbsp;&nbsp;&nbsp;&nbsp; select cust_id from col_cust where cust_name = 'huang'<br />
</span></span><span style="font-size: 9pt">上述两句在</span><span style="font-size: 9pt">SIMILAR</span><span style="font-size: 9pt">模式中是相等，可以使用缓存的已分析代码</span><span style="font-size: 9pt">.</span></div>
<img src ="http://www.blogjava.net/xiaosao/aggbug/344893.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaosao/" target="_blank">cAng^Er</a> 2011-02-23 10:33 <a href="http://www.blogjava.net/xiaosao/articles/344893.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>&lt;转&gt;Webwork对checkbox复选框Action的处理</title><link>http://www.blogjava.net/xiaosao/articles/97419.html</link><dc:creator>cAng^Er</dc:creator><author>cAng^Er</author><pubDate>Fri, 02 Feb 2007 01:20:00 GMT</pubDate><guid>http://www.blogjava.net/xiaosao/articles/97419.html</guid><wfw:comment>http://www.blogjava.net/xiaosao/comments/97419.html</wfw:comment><comments>http://www.blogjava.net/xiaosao/articles/97419.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaosao/comments/commentRss/97419.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaosao/services/trackbacks/97419.html</trackback:ping><description><![CDATA[原:<a href="http://blog.csdn.net/chikai/archive/2004/12/06/206371.aspx">http://blog.csdn.net/chikai/archive/2004/12/06/206371.aspx</a><br />webwork对页面诸如像checkbox这种表单元素的处理，我们如果只是简单的用来设置字段的布尔值，就像下面的处理方式，如：<br />&lt;input type="checkbox" name="user.lockedOut" value="true"/&gt;如果用户选中这复选框，浏览器在查询串中将会送出"user.lockedOut=true"，此时OGNL执行了action.getUser().setLockedOut(true)。如果用户不选中复选框，浏览器将不会送出查询串，因此，在开始，应确保已经初始化lockedOut 为false：<br />private boolean m_lockedOut = false;<br />public void setLockedOut(boolean lockedOut) { m_lockedOut = lockedOut; }
<p>        但更多情况下，我们是把它当做复选（多项选择）来用，这有两种情况用checkbox来设置集合：<br /><strong>一.checkbox name相同</strong><br />在一个String 类型的Set 集合里面存放许多权限，用checkbox的HTML如下：<br />&lt;input type="checkbox" name="user.priv" value="boss"/&gt;<br />&lt;input type="checkbox" name="user.priv" value="admin"/&gt;<br />&lt;input type="checkbox" name="user.priv" value="manager"/&gt;<br />比方说，一个用户选中前面的两项，浏览器将会送出这查询串： user.priv=boss&amp;user.priv=admin。<br />OGNL将会处理查询串：action.getUser().setPriv(String[] {"boss", "admin"})。<br />Action里面的方法将会是这样：<br />Set m_privileges = new HashSet();</p><p>    public void setPriv(String[] privs) {<br />        for (int i = 0; i &lt; privs.length; i++) {<br />            m_privileges.add(privs[i]);<br />        }<br />    }<br /><strong>二.checkbox name不同<br /></strong>有三种处理方式：<br /><strong>I.</strong><br /> &lt;input type="checkbox" name="xlist[0].id" value="444"&gt;<br /> &lt;input type="checkbox" name="xlist[1].id" value="443"&gt;<br /> &lt;input type="checkbox" name="xlist[2].id" value="442"&gt;<br /> * Action中用List集合来处理：private List xlist = new XWorkList(User.class)<br />    public List getXlist(){             <br />        return xlist;<br />    }<br /><strong>II.</strong> <br /> &lt;input type="checkbox" name="xmap['0'].id" value="444"&gt;<br /> &lt;input type="checkbox" name="xmap['1'].id" value="443"&gt;<br /> &lt;input type="checkbox" name="xmap['2'].id" value="442"&gt;<br />  * Action中用Map集合来处理：private Map xmap = new XWorkMap(User.class)<br />    public List getXmap(){             <br />        return xmap;<br />    }<br /><strong> III.</strong><br /> &lt;input type="checkbox" name="xarray[0]." value="444"&gt;<br /> &lt;input type="checkbox" name="xarray[1]" value="443"&gt;<br /> &lt;input type="checkbox" name="xarray[2]" value="442"&gt;<br />  *Action中用Object[]数组来处理（注意数组的长度必须事先确定，不可以动态改动数组的大小）：<br />     private Object[] xarray = new Object[3]<br />     public Object[] getXarray(){ <br />                return xarray; <br />        } </p><p>        下面用一个稍为复杂一点的例子来加深对List集合处理方式的理解，其它处理方式都是异曲同工。<br /><font color="#ff0000">multiSelect.jsp文件</font><br />&lt;<a href="mailto:%@page">%@page</a> pageEncoding="gb2312" contentType="text/html;charset=gb2312"%&gt;<br />&lt;<a href="mailto:%@taglib">%@taglib</a> prefix="ww" uri="webwork" %&gt;<br />&lt;html&gt;<br />   &lt;body&gt;<br />   &lt;form name="multi" method="post" action="multiSelect.action"&gt;<br />      &lt;%int i = 0; %&gt;<br />      &lt;ww:iterator value="ulist"&gt; <br />      &lt;% <br />        String cName = "xlist["+i+"].id";<br />        i++;<br />       %&gt;<br />       &lt;input type="checkbox" name="&lt;%=cName%&gt;" value="&lt;ww:property value="id"/&gt;"&gt;<br />       &lt;ww:property value="username"/&gt;<br />       &lt;br&gt;<br />      &lt;/ww:iterator&gt;<br />      &lt;input type="hidden" name="actionEvent" value="viewSelect"&gt; <br />      &lt;input type="submit" value="选择"&gt; <br />   &lt;/form&gt;<br />   &lt;/body&gt;<br />&lt;/html&gt;</p><p><font color="#ff0000">multiSelect_result.jsp</font>文件<br />&lt;<a href="mailto:%@page">%@page</a> pageEncoding="gb2312" contentType="text/html;charset=gb2312"%&gt;<br />&lt;<a href="mailto:%@taglib">%@taglib</a> prefix="ww" uri="webwork" %&gt;<br />&lt;html&gt;<br />   &lt;body&gt;你的选择是：&lt;br&gt;<br />       &lt;ww:iterator value="xlist"&gt; <br />       &lt;ww:property value="id"/&gt;<br />       &lt;br&gt;<br />      &lt;/ww:iterator&gt;<br />   &lt;/body&gt;<br />&lt;/html&gt;</p><p><font color="#ff0000">MultiSelectAction.java</font>文件</p><p>package com.wzj.rbac.webwork.action;<br />import java.util.List;<br />import com.opensymphony.xwork.Action;<br />import com.opensymphony.xwork.util.XWorkList;<br />import com.wzj.framework.spring.resource.BeanLocator;<br />import com.wzj.rbac.ServiceFacade.UserService;<br />import com.wzj.rbac.domain.object.User;<br />/**<br /> * @desc 复选框 选择提交Action类<br /> * @author chikai&lt;br&gt;<br /> * @link &lt;a href="<a href="mailto:wzj616@etang.com&quot;&gt;chikai&lt;/a">mailto:wzj616@etang.com"&gt;chikai&lt;/a</a>&gt;<br /> * @version $ MultiSelectAction.java  2004-12-5 19:11:54 $ <br /> * @version $ Project xwork<br /> */<br />public class MultiSelectAction implements Action {</p><p>    private final static String PRE_SUCCESS = "pre_success";<br />    //用户列表<br />    private List ulist;<br />    //选择的用户<br />    private List xlist = new XWorkList(User.class);<br />    private UserService uService;<br />    //页面执行动作判断<br />    private String actionEvent;<br />    <br />    public String execute() throws Exception {<br />       if(actionEvent!=null&amp;&amp;actionEvent.equals("viewSelect"))<br />       {   <br />           for(int s=0;s&lt;xlist.size();s++){<br />               if(((User)xlist.get(s)).getId()==null){<br />                   xlist.remove(s);<br />                   s--;<br />                   }<br />           }  <br />           return SUCCESS;<br />       }<br />       //获取用户业务服务<br />       uService = BeanLocator.getGlobalServiceLocator().getUserService();<br />       ulist = uService.getAllUser();<br />       return PRE_SUCCESS;<br />    }<br />    public List getUlist(){<br />        return ulist;<br />    }<br />    public List getXlist(){             <br />        return xlist;<br />    }<br />    public void setActionEvent(String ae){<br />        actionEvent = ae;<br />    }<br />}</p><p><br /><font color="#ff0000">xwork.xml</font>文件：</p><p>&lt;!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "<a href="http://www.opensymphony.com/xwork/xwork-1.0.dtd">http://www.opensymphony.com/xwork/xwork-1.0.dtd</a>"&gt;</p><p>&lt;xwork&gt;<br /> <br /> &lt;include file="webwork-default.xml" /&gt;<br />    &lt;include file="config-browser.xml" /&gt;<br />    &lt;package name="pklogin" extends="webwork-default"&gt;<br /> <br />    &lt;interceptors&gt;<br />        &lt;interceptor-stack name="modelParamsStack"&gt;<br />     &lt;interceptor-ref name="model-driven" /&gt;<br />        &lt;interceptor-ref name="params" /&gt;<br />        &lt;/interceptor-stack&gt; <br /> &lt;/interceptors&gt;  <br /> <br /> &lt;action name="multiSelect" class="com.wzj.rbac.webwork.action.MultiSelectAction"&gt;<br />  &lt;result name="success" type="dispatcher"&gt;<br />            &lt;param name="location"&gt;/multiSelect_result.jsp&lt;/param&gt;<br />        &lt;/result&gt;<br />  &lt;result name="pre_success" type="dispatcher"&gt;<br />   &lt;param name="location"&gt;/multiSelect.jsp&lt;/param&gt;<br />  &lt;/result&gt;<br />  &lt;interceptor-ref name="modelParamsStack" /&gt;<br /> &lt;/action&gt;<br />  <br /> &lt;/package&gt;</p><p>&lt;/xwork&gt;</p><img src ="http://www.blogjava.net/xiaosao/aggbug/97419.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaosao/" target="_blank">cAng^Er</a> 2007-02-02 09:20 <a href="http://www.blogjava.net/xiaosao/articles/97419.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>&lt;转&gt;log4j/log4e的使用 http://stieglitzcc.spaces.live.com/Blog/cns!6A816552E3F0D074!122.entry</title><link>http://www.blogjava.net/xiaosao/articles/93899.html</link><dc:creator>cAng^Er</dc:creator><author>cAng^Er</author><pubDate>Mon, 15 Jan 2007 03:36:00 GMT</pubDate><guid>http://www.blogjava.net/xiaosao/articles/93899.html</guid><wfw:comment>http://www.blogjava.net/xiaosao/comments/93899.html</wfw:comment><comments>http://www.blogjava.net/xiaosao/articles/93899.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaosao/comments/commentRss/93899.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaosao/services/trackbacks/93899.html</trackback:ping><description><![CDATA[
		<h4 class="TextColor1" id="subjcns!6A816552E3F0D074!122" style="MARGIN-BOTTOM: 0px">log4j/log4e的使用</h4>
		<div id="msgcns!6A816552E3F0D074!122">
				<p>
						<span style="FONT-FAMILY: 宋体">
								<font color="blue">
										<font size="2">简单的说<span lang="EN-US">log4j就是帮助开发人员进行日志输出管理的API类库。它最重要的特点就</span></font>
								</font>
						</span>
				</p>
				<p>
						<font color="blue">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">可以</span>
										<span style="FONT-FAMILY: 宋体">配置文件灵活的设置</span>
										<span style="FONT-FAMILY: 宋体">日志信息的优先级、日志信息的输出目的地以及日志信息的输出格式。<span lang="EN-US"></span></span>
								</font>
						</font>
				</p>
				<p style="TEXT-INDENT: 21.75pt">
						<font color="blue">
								<font size="2">
										<span lang="EN-US" style="FONT-FAMILY: 宋体">Log4j除了可以记录程序运行日志信息外还有一重要的功能就是用来</span>
										<span style="FONT-FAMILY: 宋体">显示调试信息。程序员经常会遇到脱离<span lang="EN-US">java ide环境调试程序的情况，这时大多数人会选择使用System.out.println语句输出某个变量值的方法进行调试。这样会带来一个非常麻烦的问题：一旦哪天程序员决定不要显示这些System.out.println的东西了就只能一行行的把这些垃圾语句注释掉。若哪天又需调试变量值，则只能再一行行去掉这些注释恢复System.out.println语句。使用log4j可以很好的处理类似情况。</span></span>
								</font>
						</font>
				</p>
				<p style="TEXT-INDENT: -21pt">
						<span lang="EN-US" style="FONT-FAMILY: 宋体">
								<font color="blue">
										<font size="2">log4j使用方法</font>
								</font>
						</span>
				</p>
				<p style="TEXT-INDENT: 22.05pt">
						<span style="FONT-FAMILY: 宋体">
								<font color="blue">
										<font size="2">下面介绍的是<span lang="EN-US">log4j一些理论方面的知识，读者觉得枯燥的话可以跳过本节直接阅读第三节实例部分。</span></font>
								</font>
						</span>
				</p>
				<p>
						<span style="FONT-SIZE: 10.5pt">
								<font color="blue">
										<font size="2">　　<span>1、定义配置文件</span></font>
								</font>
						</span>
				</p>
				<p>
						<span style="FONT-SIZE: 10.5pt">
								<font color="blue">
										<font size="2">　<span lang="EN-US"><span>  </span>首先使用配置文件将使我们的应用程序更加灵活配置log日志输出方式包括输出优先级、输出目的地、输出格式。Log4j支持两种配置文件格式，一种是XML 格式的文件，一种是Java特性文件log4j.properties（键=值）。下面将介绍使用log4j.properties文件作为配置文件的方法：</span></font>
								</font>
						</span>
				</p>
				<p>
						<font color="blue">
								<font size="2">
										<span style="FONT-SIZE: 10.5pt">　　</span>
										<span lang="EN-US" style="FONT-SIZE: 10.5pt">
												<span>①</span>
										</span>
										<span lang="EN-US" style="FONT-SIZE: 10.5pt">配置根Logger，其语法为：0</span>
								</font>
						</font>
				</p>
				<p>
						<span style="FONT-SIZE: 10.5pt">
								<font color="blue">
										<font size="2">　　<span lang="EN-US">log4j.rootLogger = [ level ] , appenderName, appenderName, … </span></font>
								</font>
						</span>
				</p>
				<p>
						<span style="FONT-SIZE: 10.5pt">
								<font color="blue">
										<font size="2">　　其中，<span lang="EN-US">level 是日志记录的优先级，分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别。Log4j建议只使用四个级别，优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别，您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别，则应用程序中所有DEBUG级别的日志信息将不被打印出来。 appenderName就是指定日志信息输出到哪个地方。可同时指定多个输出目的地。 </span></font>
								</font>
						</span>
				</p>
				<p>
						<font color="blue">
								<font size="2">
										<span style="FONT-SIZE: 10.5pt">　　</span>
										<span lang="EN-US" style="FONT-SIZE: 10.5pt">
												<span>②</span>
										</span>
										<span lang="EN-US" style="FONT-SIZE: 10.5pt">配置日志信息输出目的地Appender，其语法为：</span>
								</font>
						</font>
				</p>
				<p>
						<span style="FONT-SIZE: 10.5pt">
								<font color="blue">
										<font size="2">　　</font>
										<span lang="EN-US">
												<font size="2">log4j.appender.appenderName = fully.qualified.name.of.appender.class <br />　　log4j.appender.appenderName.option1 = value1 <br />　　… <br />　　log4j.appender.appenderName.option = valueN </font>
										</span>
								</font>
						</span>
				</p>
				<p>
						<span style="FONT-SIZE: 10.5pt">
								<font color="blue">
										<font size="2">　　其中，</font>
										<span lang="EN-US">
												<font size="2">Log4j提供的appender有以下几种： <br />　　org.apache.log4j.ConsoleAppender（控制台）， <br />　　org.apache.log4j.FileAppender（文件）， <br />　　org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件），<br />　　org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件）， <br />　　org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方） </font>
										</span>
								</font>
						</span>
				</p>
				<p>
						<font color="blue">
								<font size="2">
										<span style="FONT-SIZE: 10.5pt">　 </span>
										<span lang="EN-US" style="FONT-SIZE: 10.5pt">
												<span>③</span>
										</span>
										<span lang="EN-US" style="FONT-SIZE: 10.5pt">配置日志信息的格式（布局），其语法为：</span>
								</font>
						</font>
				</p>
				<p>
						<span style="FONT-SIZE: 10.5pt">
								<font color="blue">
										<font size="2">　　</font>
										<span lang="EN-US">
												<font size="2">log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class <br />　　log4j.appender.appenderName.layout.option1 = value1 <br />　　… <br />　　log4j.appender.appenderName.layout.option = valueN </font>
										</span>
								</font>
						</span>
				</p>
				<p>
						<span style="FONT-SIZE: 10.5pt">
								<font color="blue">
										<font size="2">　　其中，</font>
										<span lang="EN-US">
												<font size="2">Log4j提供的layout有以下几种： <br />　　org.apache.log4j.HTMLLayout（以HTML表格形式布局）， <br />　　org.apache.log4j.PatternLayout（可以灵活地指定布局模式）， <br />　　org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串）， <br />　　org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息） </font>
										</span>
								</font>
						</span>
				</p>
				<p>
						<span style="FONT-SIZE: 10.5pt">
								<font color="blue">
										<font size="2">　　<span lang="EN-US">Log4J采用类似C语言中的printf函数的打印格式格式化日志信息，打印参数如下： %m 输出代码中指定的消息</span></font>
								</font>
						</span>
				</p>
				<p>
						<span style="FONT-SIZE: 10.5pt">
								<font color="blue">
										<font size="2">　　</font>
										<span lang="EN-US">
												<font size="2">%p 输出优先级，即DEBUG，INFO，WARN，ERROR，FATAL <br />　　%r 输出自应用启动到输出该log信息耗费的毫秒数 <br />　　%c 输出所属的类目，通常就是所在类的全名 <br />　　%t 输出产生该日志事件的线程名 <br />　　%n 输出一个回车换行符，Windows平台为“\r\n”，Unix平台为“\n” <br />　　%d 输出日志时间点的日期或时间，默认格式为ISO8601，也可以在其后指定格式，比如：%d{yyy MMM dd HH:mm:ss,SSS}，输出类似：</font>
										</span>
								</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10.5pt">
								<font color="blue">
										<font size="2">2002年10月18日</font>
								</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10.5pt">
								<font color="blue">
										<font size="2"> 22：10：28，921 <br />　　%l 输出日志事件的发生位置，包括类目名、发生的线程，以及在代码中的行数。举例：Testlog4.main(TestLog4.java:10) </font>
								</font>
						</span>
				</p>
				<p>
						<span style="FONT-SIZE: 10.5pt">
								<font color="blue">
										<font size="2">　　<span>2、在代码中使用Log4j </span></font>
								</font>
						</span>
				</p>
				<p>
						<font color="blue">
								<font size="2">
										<span style="FONT-SIZE: 10.5pt">　　</span>
										<span lang="EN-US" style="FONT-SIZE: 10.5pt">
												<span>①</span>
										</span>
										<span lang="EN-US" style="FONT-SIZE: 10.5pt">得到记录器</span>
								</font>
						</font>
				</p>
				<p>
						<span style="FONT-SIZE: 10.5pt">
								<font color="blue">
										<font size="2">　　使用<span lang="EN-US">Log4j，第一步就是获取日志记录器，这个记录器将负责控制日志信息。其语法为： </span></font>
								</font>
						</span>
				</p>
				<p>
						<span style="FONT-SIZE: 10.5pt">
								<font color="blue">
										<font size="2">　　<span lang="EN-US">public static Logger getLogger( String name) </span></font>
								</font>
						</span>
				</p>
				<p>
						<span style="FONT-SIZE: 10.5pt">
								<font color="blue">
										<font size="2">　　通过指定的名字获得记录器，如果必要的话，则为这个名字创建一个新的记录器。<span lang="EN-US">Name一般取本类的名字，比如： </span></font>
								</font>
						</span>
				</p>
				<p>
						<span style="FONT-SIZE: 10.5pt">
								<font color="blue">
										<font size="2">　　<span lang="EN-US">static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )</span></font>
								</font>
						</span>
				</p>
				<p>
						<font color="blue">
								<font size="2">
										<span style="FONT-SIZE: 10.5pt">　　</span>
										<span lang="EN-US" style="FONT-SIZE: 10.5pt">
												<span>②</span>
										</span>
										<span lang="EN-US" style="FONT-SIZE: 10.5pt">读取配置文件 </span>
								</font>
						</font>
				</p>
				<p>
						<span style="FONT-SIZE: 10.5pt">
								<font color="blue">
										<font size="2">　　当获得了日志记录器之后，第二步将配置<span lang="EN-US">Log4j环境，其语法为：</span></font>
								</font>
						</span>
				</p>
				<p style="TEXT-INDENT: 21pt">
						<span lang="EN-US" style="FONT-SIZE: 10.5pt">
								<font color="blue">
										<font size="2">BasicConfigurator.configure ()： 自动快速地使用缺省Log4j环境。<br />　　PropertyConfigurator.configure ( String configFilename) ：读取使用Java的特性文件编写的配置文件。</font>
								</font>
						</span>
				</p>
				<p style="TEXT-INDENT: 21pt">
						<font color="blue">
								<font size="2">
										<span style="FONT-SIZE: 10.5pt">例：<span lang="EN-US">PropertyConfigurator.configure</span></span>
										<span lang="EN-US" style="FONT-SIZE: 10.5pt">(".\\src\\log4j.properties")</span>
								</font>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt">
										<br />
										<font size="2">　　DOMConfigurator.configure ( String filename ) ：读取XML形式的配置文件。</font>
								</span>
						</font>
				</p>
				<p>
						<font color="blue">
								<font size="2">
										<span style="FONT-SIZE: 10.5pt">　　</span>
										<span lang="EN-US" style="FONT-SIZE: 10.5pt">
												<span>③</span>
										</span>
										<span lang="EN-US" style="FONT-SIZE: 10.5pt">插入记录信息（格式化日志信息）</span>
								</font>
						</font>
				</p>
				<p>
						<span style="FONT-SIZE: 10.5pt">
								<font color="blue">
										<font size="2">　　当上两个必要步骤执行完毕，就可轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方，其语法如下：<span lang="EN-US"></span></font>
								</font>
						</span>
				</p>
				<p>
						<span style="FONT-SIZE: 10.5pt">
								<font color="blue">
										<font size="2">　　</font>
										<span lang="EN-US">
												<font size="2">Logger.debug ( Object message ) ;<br />　　Logger.info ( Object message ) ;<br />　　Logger.warn ( Object message ) ;<br />　　Logger.error ( Object message ) ;</font>
										</span>
								</font>
						</span>
				</p>
				<p style="TEXT-INDENT: -21pt">
						<span lang="EN-US" style="FONT-FAMILY: 宋体">
								<font color="blue">
										<font size="2">log4j范例程序</font>
								</font>
						</span>
				</p>
				<p>
						<span style="FONT-FAMILY: 宋体">
								<font color="blue">
										<font size="2">下面将使用一个最简单的范例程序来进一步说明<span lang="EN-US">log4j的使用方法。程序代码如下：</span></font>
								</font>
						</span>
				</p>
				<p style="LINE-HEIGHT: 6pt">
						<span lang="EN-US" style="COLOR: navy">
								<font color="blue">
										<font size="2">
										</font>
								</font>
						</span> </p>
				<p style="LINE-HEIGHT: 8pt">
						<span>
								<font color="blue">
										<font size="2">import org.apache.log4j.*;</font>
								</font>
						</span>
				</p>
				<p style="LINE-HEIGHT: 8pt">
						<span lang="EN-US" style="COLOR: black">
								<font color="blue">
										<font size="2">
										</font>
								</font>
						</span> </p>
				<p style="LINE-HEIGHT: 8pt">
						<font color="blue">
								<font size="2">
										<span>public class</span>
										<span lang="EN-US" style="COLOR: black"> LogTest </span>
										<span lang="EN-US" style="COLOR: navy">{</span>
										<span lang="EN-US" style="COLOR: black">
										</span>
								</font>
						</font>
				</p>
				<p style="LINE-HEIGHT: 8pt">
						<span lang="EN-US" style="COLOR: black">
								<font color="blue">
										<font size="2">
										</font>
								</font>
						</span> </p>
				<p style="LINE-HEIGHT: 8pt">
						<span lang="EN-US" style="COLOR: black">
								<font color="blue">
										<font size="2">
										</font>
								</font>
						</span> </p>
				<p style="LINE-HEIGHT: 8pt">
						<font color="blue">
								<font size="2">
										<span>
												<span>    </span>static</span>
										<span lang="EN-US" style="COLOR: black"> Logger logger = Logger.getLogger(LogTest.class.getName());</span>
								</font>
						</font>
				</p>
				<p style="LINE-HEIGHT: 8pt">
						<span lang="EN-US" style="COLOR: black">
								<font color="blue">
										<font size="2">
										</font>
								</font>
						</span> </p>
				<p style="LINE-HEIGHT: 8pt">
						<font color="blue">
								<font size="2">
										<span>
												<span>    </span>public</span>
										<span> static</span>
										<span> void</span>
										<span lang="EN-US" style="COLOR: black"> main(String[] args) </span>
										<span lang="EN-US" style="COLOR: navy">{</span>
										<span lang="EN-US" style="COLOR: black">
										</span>
								</font>
						</font>
				</p>
				<p style="LINE-HEIGHT: 8pt">
						<span lang="EN-US" style="COLOR: black">
								<font color="blue">
										<font size="2">
										</font>
								</font>
						</span> </p>
				<p style="LINE-HEIGHT: 8pt">
						<font color="blue">
								<font size="2">
										<span lang="EN-US" style="COLOR: black">
												<span>        </span>
										</span>
										<span lang="EN-US" style="FONT-SIZE: 10.5pt">PropertyConfigurator.configure ( “.\\src\</span>
										<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Arial">log4j.properties</span>
										<span lang="EN-US" style="FONT-SIZE: 10.5pt">”)</span>
										<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">；</span>
										<span lang="EN-US" style="COLOR: black">
										</span>
								</font>
						</font>
				</p>
				<p style="TEXT-INDENT: 40pt; LINE-HEIGHT: 8pt">
						<font color="blue">
								<font size="2">
										<span lang="EN-US" style="COLOR: black">logger.debug(</span>
										<span lang="EN-US" style="COLOR: red">"Debug ..."</span>
										<span lang="EN-US" style="COLOR: black">);</span>
								</font>
						</font>
				</p>
				<p style="LINE-HEIGHT: 8pt">
						<span lang="EN-US" style="COLOR: black">
								<font color="blue">
										<font size="2">
										</font>
								</font>
						</span> </p>
				<p style="LINE-HEIGHT: 8pt">
						<font color="blue">
								<font size="2">
										<span lang="EN-US" style="COLOR: black">
												<span>        </span>logger.info(</span>
										<span lang="EN-US" style="COLOR: red">"Info ..."</span>
										<span lang="EN-US" style="COLOR: black">);</span>
								</font>
						</font>
				</p>
				<p style="LINE-HEIGHT: 8pt">
						<span lang="EN-US" style="COLOR: black">
								<font color="blue">
										<font size="2">
										</font>
								</font>
						</span> </p>
				<p style="LINE-HEIGHT: 8pt">
						<font color="blue">
								<font size="2">
										<span lang="EN-US" style="COLOR: black">
												<span>        </span>logger.warn(</span>
										<span lang="EN-US" style="COLOR: red">"Warn ..."</span>
										<span lang="EN-US" style="COLOR: black">);</span>
								</font>
						</font>
				</p>
				<p style="LINE-HEIGHT: 8pt">
						<span lang="EN-US" style="COLOR: black">
								<font color="blue">
										<font size="2">
										</font>
								</font>
						</span> </p>
				<p style="LINE-HEIGHT: 8pt">
						<font color="blue">
								<font size="2">
										<span lang="EN-US" style="COLOR: black">
												<span>        </span>logger.error(</span>
										<span lang="EN-US" style="COLOR: red">"Error ..."</span>
										<span lang="EN-US" style="COLOR: black">);</span>
								</font>
						</font>
				</p>
				<p style="LINE-HEIGHT: 8pt">
						<span lang="EN-US" style="COLOR: black">
								<font color="blue">
										<font size="2">
										</font>
								</font>
						</span> </p>
				<p style="LINE-HEIGHT: 6pt">
						<font color="blue">
								<font size="2">
										<span lang="EN-US" style="COLOR: black">
												<span>    </span>
										</span>
										<span lang="EN-US" style="COLOR: navy">}</span>
										<span lang="EN-US" style="COLOR: black">
										</span>
								</font>
						</font>
				</p>
				<p style="LINE-HEIGHT: 6pt">
						<font color="blue">
								<font size="2">
										<span lang="EN-US" style="COLOR: navy">}</span>
										<span lang="EN-US" style="COLOR: black">
										</span>
								</font>
						</font>
				</p>
				<p>
						<span style="FONT-FAMILY: 宋体">
								<font color="blue">
										<font size="2">程序说明：<span lang="EN-US"></span></font>
								</font>
						</span>
				</p>
				<p style="TEXT-INDENT: 10.5pt">
						<font color="blue">
								<font size="2">
										<span lang="EN-US" style="FONT-FAMILY: 宋体">
												<span>①</span>
										</span>
										<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial"> static Logger logger = Logger.getLogger(LogTest.class.getName());</span>
										<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">就是创建一个属于</span>
										<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">LogTest</span>
										<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">类的</span>
										<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">Logger</span>
										<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">对象，创建时要告知</span>
										<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">Logger</span>
										<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">你当前的</span>
										<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">Class</span>
										<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">是什么。</span>
										<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
										</span>
								</font>
						</font>
				</p>
				<p style="TEXT-INDENT: 10pt">
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">②</font>
						</span>
						<font color="blue">
								<font size="2">
										<span lang="EN-US"> PropertyConfigurator.configure ( “</span>
										<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">log4j.properties</span>
										<span lang="EN-US">”)</span>
										<span style="FONT-FAMILY: 宋体">就是说使用当前工程目录下的</span>
										<span lang="EN-US">src</span>
										<span style="FONT-FAMILY: 宋体">文件夹中的</span>
										<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">log4j.properties</span>
										<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">文件作为配置文件。若将</span>
										<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">log4j.properties</span>
										<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">放在工程根目录下也可不写此句，程序会自动找到配置文件。</span>
										<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
										</span>
								</font>
						</font>
				</p>
				<p style="TEXT-INDENT: 10pt">
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">③</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue"> logger.debug</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">就是输出</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">debug</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">的信息，</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">logger.info</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">就是输出提示信息，</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">logger.warn</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">就是显示警告信息，</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">logger.error</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">就是显示错误信息。</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
						</span>
				</p>
				<p>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">
								</font>
						</span> </p>
				<p>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">下面是配置文件</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">log4j.properties</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">的内容：</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
						</span>
				</p>
				<p>
						<font color="blue">
								<font size="2">
										<span lang="EN-US" style="COLOR: black">log4j.rootCategory=DEBUG, stdout</span>
										<span style="COLOR: black; FONT-FAMILY: 宋体">，</span>
										<span lang="EN-US" style="COLOR: black">R</span>
								</font>
						</font>
				</p>
				<p>
						<span lang="EN-US" style="COLOR: black">
								<font color="blue">
										<font size="2">log4j.appender.stdout=org.apache.log4j.ConsoleAppender</font>
								</font>
						</span>
				</p>
				<p>
						<span lang="EN-US" style="COLOR: black">
								<font color="blue">
										<font size="2">log4j.appender.stdout.layout=org.apache.log4j.PatternLayout</font>
								</font>
						</span>
				</p>
				<p>
						<span lang="EN-US" style="COLOR: black">
								<font color="blue">
										<font size="2">log4j.appender.stdout.layout.ConversionPattern=%5p (%F:%L) - %m%n</font>
								</font>
						</span>
				</p>
				<p>
						<span lang="EN-US" style="COLOR: black">
								<font color="blue">
										<font size="2">log4j.appender.R=org.apache.log4j.RollingFileAppender</font>
								</font>
						</span>
				</p>
				<p>
						<span lang="EN-US" style="COLOR: black">
								<font color="blue">
										<font size="2">log4j.appender.R.File=log.txt</font>
								</font>
						</span>
				</p>
				<p>
						<span lang="EN-US" style="COLOR: black">
								<font color="blue">
										<font size="2">log4j.appender.R.MaxFileSize=100KB</font>
								</font>
						</span>
				</p>
				<p>
						<span lang="EN-US" style="COLOR: black">
								<font color="blue">
										<font size="2">log4j.appender.R.MaxBackupIndex=1</font>
								</font>
						</span>
				</p>
				<p>
						<span lang="EN-US" style="COLOR: black">
								<font color="blue">
										<font size="2">log4j.appender.R.layout=org.apache.log4j.PatternLayout</font>
								</font>
						</span>
				</p>
				<p>
						<font color="blue">
								<font size="2">
										<span lang="EN-US" style="COLOR: black">log4j.appender.R.layout.ConversionPattern=%d</span>
										<span lang="EN-US" style="COLOR: navy">{</span>
										<span lang="EN-US" style="COLOR: black">yyyy MMM dd HH:mm:ss</span>
										<span lang="EN-US" style="COLOR: navy">}</span>
										<span lang="EN-US" style="COLOR: black"> %-5p %c - %m%n</span>
								</font>
						</font>
				</p>
				<p>
						<span style="FONT-FAMILY: 宋体">
								<font color="blue">
										<font size="2">程序说明：<span lang="EN-US"></span></font>
								</font>
						</span>
				</p>
				<p>
						<font color="blue">
								<font size="2">
										<span lang="EN-US" style="FONT-FAMILY: 宋体">
												<span>①</span>
										</span>
										<span lang="EN-US" style="COLOR: black"> log4j.rootCategory=DEBUG, stdout</span>
										<span style="COLOR: black; FONT-FAMILY: 宋体">，</span>
										<span lang="EN-US" style="COLOR: black">R</span>
								</font>
						</font>
				</p>
				<p>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">就是说我要显示所有优先权等於和高于</font>
						</span>
						<span>
								<font color="blue">Debug的信息。<br />"stdout"，</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">”R”</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">表示我定义了两个输出端</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">(</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">随便什么名字都好</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">)</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">。</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
						</span>
				</p>
				<p>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">②</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">下面的三行说</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">stdout</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">输出端其实是标准输出</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">Console</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">，也就是屏幕。输出的格式是</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">Pattern</font>
						</span>
						<font color="blue">
								<font size="2">
										<span lang="EN-US" style="COLOR: black">Layout</span>
										<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">。转换方式是</span>
										<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">%5p (%F:%L) - %m%n</span>
										<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">，即前五格用来显示优先权，再显示当前的文件名，加当前的行数。最后是</span>
										<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">logger.debug()</span>
										<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">或</span>
										<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">logger.info()</span>
										<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">或</span>
										<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">logger.warn()</span>
										<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">或</span>
										<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">logger.error()</span>
										<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">里的信息。</span>
										<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">%n</span>
										<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">表示回车空行。</span>
										<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
										</span>
								</font>
						</font>
				</p>
				<p>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">③</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">再加上下面六行则</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">log</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">信息不光显示在屏幕上，而且将被保存在一个叫</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">"log.txt"</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">的文件里，文件最大为</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">100KB</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">。如果文件大小超过</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">100KB</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">，文件会被备份成</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">"log.txt.1"</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">，新的</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">"log.txt"</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">继续记录</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">log</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">信息。</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
						</span>
				</p>
				<p>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">接下来我们可以改变</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">log4j.properties</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">，而不需重新编译就可以控制</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">log</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">信息是否显示、</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">log</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">信息的输出端类型、输出方式、输出格式，等等。举例如下：</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
						</span>
				</p>
				<p>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">①</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">在</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">log4j.properties</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">文件里把</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">"log4j.rootCategory=DEBUG,stdout,R"</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">改写成</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">"log4j.rootCategory=OFF, stdout,R"</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">，这样所有的</font>
						</span>
						<span>
								<font color="blue">log信息都不会显示了；解决了本文开始提出的问题。<br />②</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">在</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">log4j.properties</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">文件里把</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">"log4j.rootCategory=DEBUG,stdout,R"</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">改写成</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">"log4j.rootCategory=INFO, stdout,R"</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">，这样只显示</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">INFO, WARN, ERROR</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">的</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">log</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">信息，而</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">DEBUG</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">信息不会被显示；</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
						</span>
				</p>
				<p>
						<span lang="EN-US" style="FONT-FAMILY: 宋体">
								<font color="blue">
										<font size="2">
										</font>
								</font>
						</span> </p>
				<p style="TEXT-INDENT: -21pt">
						<span style="FONT-FAMILY: 宋体">
								<font color="blue">
										<font size="2">在<span lang="EN-US">web程序中使用log4j注意问题</span></font>
								</font>
						</span>
				</p>
				<p style="TEXT-INDENT: 0cm">
						<font color="blue">
								<font size="2">
										<span lang="EN-US" style="FONT-FAMILY: 宋体">
												<span>1、<span style="FONT: 7pt 'Times New Roman'">    </span></span>
										</span>
										<span style="FONT-FAMILY: 宋体">由于<span lang="EN-US">jsp或servlet在执行状态时没有当前路径概念，所有使用</span></span>
										<span lang="EN-US">PropertyConfigurator.configure</span>
										<span style="FONT-FAMILY: 宋体">（</span>
										<span lang="EN-US">String</span>
										<span style="FONT-FAMILY: 宋体">）语句找</span>
										<span lang="EN-US">log4j.properties</span>
										<span style="FONT-FAMILY: 宋体">文件时要给出相对于当前</span>
										<span lang="EN-US">jsp</span>
										<span style="FONT-FAMILY: 宋体">或</span>
										<span lang="EN-US">servlet</span>
										<span style="FONT-FAMILY: 宋体">的路径转化成为一个绝对的文件系统路径。方法是使用</span>
										<span lang="EN-US">servletcontext.getrealpath(string)</span>
										<span style="FONT-FAMILY: 宋体">语句。例：</span>
										<span lang="EN-US">
										</span>
								</font>
						</font>
				</p>
				<p>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">//得到当前jsp路径</font>
						</span>
						<span lang="EN-US" style="FONT-FAMILY: 宋体">
						</span>
				</p>
				<p>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">String prefix =<span>  </span>getServletContext().getRealPath(</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">
								<font color="blue">"/"<span style="COLOR: black">);</span></font>
						</span>
				</p>
				<p>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">//读取</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">
								<font color="blue">log4j.properties</font>
						</span>
						<span lang="EN-US" style="FONT-FAMILY: 宋体">
						</span>
				</p>
				<p>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">PropertyConfigurator.configure(prefix+</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">
								<font color="blue">"\\WEB-INF\\log4j.properties"<span style="COLOR: black">);</span></font>
						</span>
				</p>
				<p>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">2、相应的log4j.properties设置某个属性时也要在程序中设置绝对路径。例：</font>
						</span>
				</p>
				<p>
						<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">
								<font color="blue">log4j.appender.R.File属性设置日志文件存放位置。我们可以用读写.properties配置文件的方法进行灵活设置。<span style="COLOR: black"></span></font>
						</span>
				</p>
				<p>
						<span style="FONT-FAMILY: 宋体">
								<span lang="EN-US">
										<font color="blue">
												<br />
												<font size="2">log4e使用说明</font>
										</font>
								</span>
						</span>
				</p>
				<p style="TEXT-INDENT: 21pt">
						<font color="blue">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">在了解了<span lang="EN-US">log4j的功能后，我们肯定会我们的程序中</span></span>
										<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">编写一些</span>
										<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">Log4j</span>
										<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">日志记录。对于使用</span>
										<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">Eclipse</span>
										<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">的程序员</span>
										<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">Log4e</span>
										<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">将是我们最得力的</span>
										<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">log4j</span>
										<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">日志编写助手，现在开始</span>
										<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">Log4e</span>
										<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">之旅。</span>
										<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
										</span>
								</font>
						</font>
				</p>
				<p style="TEXT-INDENT: 20pt">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">Log4e</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">是一个免费的</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">Eclipse Plugin</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">，它可帮助你在你的</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">Java</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">工程中快速加入</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">Log</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">；</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">
								</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">我们可以在</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<a href="http://log4e.jayefem.de/index.php/Download">
										<font color="#0066a7">http://log4e.jayefem.de/index.php/Download</font>
								</a>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">网站上下载</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">Log4e</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">最新版本。下载后将相应文件夹拷贝到</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">Eclipse</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">的插件目录下，重新</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">Eclipse</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">，在首选项中会多出一个</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">Log4e</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">选项。</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
						</span>
				</p>
				<p style="TEXT-INDENT: 20pt">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">Log4e</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">可以有多个插入</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">Log</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">为一个方法、类，当然也可以在当前位置插入</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">Log</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">，同时其也可以把</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">Sysout.out.println()</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">的转换为</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">log</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">；所有的这一切只需要你点点鼠标或者按一次快捷键，下面我们只以为一个方法插入</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">Log</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">为例来讲解</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
						</span>
				</p>
				<p style="TEXT-INDENT: 20pt">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">
										<img height="427" alt="1.JPG" src="http://www.blogjava.net/images/blogjava_net/cinderella/log4j/1.JPG" width="558" border="0" />
										<br />
								</font>
						</span>
				</p>
				<p>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">在</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">Java</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">编辑上下文中点击右键，选择</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">Log4E</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">，你将看到如下界面：</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
						</span>
				</p>
				<p>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
						</span>
				</p>
				<p>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">
										<img height="440" alt="2.JPG" src="http://www.blogjava.net/images/blogjava_net/cinderella/log4j/2.JPG" width="690" border="0" />点击</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
								<font color="blue">Insert Log Statement For This Method</font>
						</span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
								<font color="blue">，你将看到验证页面：</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
						</span>
				</p>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">
						<font color="blue">
								<img height="420" alt="3.JPG" src="http://www.blogjava.net/images/blogjava_net/cinderella/log4j/3.JPG" width="658" border="0" />
								<br />Finish</font>
				</span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">
						<font color="blue">后这时你将看到插入</font>
				</span>
				<span>
						<font color="blue">Log后的函数如下：<br /><img height="534" alt="4.JPG" src="http://www.blogjava.net/images/blogjava_net/cinderella/log4j/4.JPG" width="690" border="0" /></font>
				</span>
		</div>
<img src ="http://www.blogjava.net/xiaosao/aggbug/93899.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaosao/" target="_blank">cAng^Er</a> 2007-01-15 11:36 <a href="http://www.blogjava.net/xiaosao/articles/93899.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用JSF和MyFaces实现文件上载</title><link>http://www.blogjava.net/xiaosao/articles/87628.html</link><dc:creator>cAng^Er</dc:creator><author>cAng^Er</author><pubDate>Thu, 14 Dec 2006 02:02:00 GMT</pubDate><guid>http://www.blogjava.net/xiaosao/articles/87628.html</guid><wfw:comment>http://www.blogjava.net/xiaosao/comments/87628.html</wfw:comment><comments>http://www.blogjava.net/xiaosao/articles/87628.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaosao/comments/commentRss/87628.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaosao/services/trackbacks/87628.html</trackback:ping><description><![CDATA[
		<table width="676" border="0">
				<tbody>
						<tr>
								<td width="384">
										<font color="#000066">最近要做上传，但是MultiPartRequestWrapper中的很多的方法都是过时的了，在晚上看看到这篇文章挺好的，放在这里，学习一下！<br />原文连接地址：<br /></font>
										<a href="http://www.java3z.com/cwbwebhome/article/article2a/2136.jsp?id=463">
												<font color="#000066">http://www.java3z.com/cwbwebhome/article/article2a/2136.jsp?id=463</font>
										</a>
										<br />Web浏览器为我们利用Web应用程序发送文件提供了一条简单的途径，但是当前版本的Java Web标准（servlets、JSP和JSF）却无法为我们提供任何帮助。幸运的是，有一些第三方框架组件（例如Apache Commons File Upload、 Apache MyFaces和Oracle ADF Faces）实现了这种特性，它们都暴露了简单的API和定制的标记（tag）。<br /><br />　　 本文的前面一部分介绍文件上载操作是如何实现的，解释了MyFaces和通用文件上载（前者在内部使用了后者）。我们了解这些开放源代码框架组件的内部工作方式是非常重要的，因为只有这样我们才能高效率地使用它们，才能根据自己的需要对它们进行修改。本文的第二部分将介绍一个简单的应用程序，它让用户使用web浏览器上载文件。 </td>
								<td width="282">
										<script type="text/javascript">
												<!--
google_ad_client = "pub-1832179689702023";
google_ad_width = 250;
google_ad_height = 250;
google_ad_format = "250x250_as";
google_ad_type = "text_image";
google_ad_channel ="";
google_color_border = "FFFFFF";
google_color_bg = "FFFFFF";
google_color_link = "3366FF";
google_color_text = "000000";
google_color_url = "3D81EE";
//-->
										</script>
										<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
										</script>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<br />　　 <b>基于Web的文件上载</b><br /><br />　　 我们把"上载"这个专业术语用得有点过滥了。Web管理员在自己的站点上发布文件的时候，它会说自己"上载"了一个文件。Web开发者在建立HTML窗体和脚本，让普通用户通过web浏览器发送一个文件的时候，他也会说自己实现了文件"上载"功能。<br /><br />　　 这两种含义在某些方面是重叠的，因为web管理员可能使用基于web的界面来发布文件（页面、图像、脚本等等）。免费提供个人web站点的公司（例如Yahoo），实现基于web的文件上载功能的目的是为了让人们上载自己的页面。它允许任何一个拥有web浏览器和互联网访问能力的个人发布一个小型的web站点。但是，目前有一些更好的、可用于发布web内容的方式，例如FTP或安全FTP。在这种情况下，你可以利用专用的应用程序（例如FTP客户端）代替web浏览器把自己的内容上载到web服务器上。<br /><br />　　 本文从web开发者的角度来讨论文件上载的问题。例如，一个基于web的邮件应用程序（例如Yahoo邮件），就实现了文件上载，因为只有这样，用户才能够发送那些带有附件的消息。另一个比较好的例子是找工作的web站点，它允许用户把自己的简历发送给招聘人员。本文的示例应用程序计算上载文件的散列值。你可以在自己的应用程序中对上载的文件进行任意的处理，例如把它们的内容存储在数据库中或把它们作为邮件附件发送。现在，让我们看看如何在web应用程序中实现文件上载吧。<br /><br />　　 一个HTML窗体中可以包含一个或多个＜input type="file"＞元素，浏览器把它们作为输入字段来显示（呈现），在这些字段中允许用户输入文件路径。在每个文件输入字段的后面，web浏览器会添加一个按钮，它会打开一个文件对话框，让用户选择一个文件（代替输入路径）：<br /><br /><div align="center"><img height="304" src="http://www.java3z.com/cwbwebhome/article/article2a/images/20050819063349_01.gif" width="426" /><br />图1：包含文件输入字段的web窗体</div><br />　　 当用户点击窗体的"提交（Submit）"按钮的时候，web浏览器对窗体的数据进行编码，其中包括被选中的文件、文件名（或路径）和窗体的其它一些参数。接着，浏览器把编码后的数据发送给web服务器，web服务器把这些数据传递给＜form＞标记的action属性所指定的脚本来处理。如果你开发一个Java web应用程序，那么操作脚本可能是一个servlet（小服务程序）或JSP页面。<br /><br />　　 由于窗体数据默认的编码方式和默认的GET方法都不适合文件上载，所以包含文件输入字段的窗体必须在＜form＞标记中指定multipart/form-data编码方式和POST方法：<br /><br /><p class="code">＜form enctype="multipart/form-data" method="POST" action="..."＞<br />...<br />＜input type="file" name="..."＞<br />...<br />＜/form＞</p><p><br />　　 但是事情并非这么简单，因为实现servlet和JSP规范的应用程序服务器不一定能够处理multipart/form-data编码方式。因此，你必须分析请求的输入流，例如Apache通用文件上载就是一个小型的Java程序包，它让你能够从编码的数据中获取被上载文件的内容。这个程序包的API是很灵活的，它允许你把小文件存储在内存中，把大文件存储在磁盘的临时目录中。你可以指定一个文件大小的阀值，大于这个值的文件都会被写到磁盘上，而不会保留在内存中，而且你还可以规定允许的被上载文件的最大大小。<br /><br />　　 前面提到的org.apache.commons.fileupload程序包包含一个叫作DiskFileUpload的类，它的parseRequest()方法获取HttpServletRequest参数，并返回org.apache.commons.fileupload.FileItem实例列表。编码后的窗体数据从servlet请求的getInputStream()方法所返回的数据流流中读取。FileItem这个名字容易使人误解，因为这个接口的实例同时表现了被上载的文件和正常的请求参数。<br /><br />　　 通用文件上载程序包所提供的API赋予了你访问分解后的窗体数据的权利，但是servlet请求的getParameter()和getParameterValues()方法却无法工作。这是一个难题，因为在输入字段、检查框、单选框和列表框后台运行的JSF组件需要调用这两个方法。我们可以利用Servlets API提供的两个特性（过滤器和请求包装器）来解决这个问题。下一部分描述了Apache MyFaces如何实现过滤器，添加了大量必要的对文件上载的支持，而不会中断已有的JSF组件。此外，MyFaces为JavaBeans提供了API，同时还提供了一个定制的JSF组件，它表现为＜input type="file"＞元素。</p><p>　　<b>配置JSF和MyFaces扩展</b><br /><br />　　 目前，JSF规范的主要实现是JSF参考实现（RI），与此同时，Apache提供了另外一个实现，就是MyFaces。当然可能存在其它一些JSF实现，但是JSF RI和MyFaces是其中最流行的两个。很多开发者更喜欢前者，因为Sun把它称为"官方的"实现，但是，MyFaces拥有一些有趣的扩展（例如对上载文件操作的支持）。如果你愿意，可以把MyFaces扩展与Sun的JSF RI一起使用。你只需要把myfaces-extensions.jar文件、JSF RI的JAR文件和commons-fileupload-1.0.jar文件一起放到自己的web应用程序的WEB-INF/lib目录中就可以了。下面是需要的JAR文件：<br /><br /></p><p class="code">JSF 1.1 RI jsf-api.jarjsf-impl.jar<br />JSTL 1.1 RI jstl.jarstandard.jar<br />MyFaces扩展 myfaces-extensions.jar<br />Apache Commons（供JSF和MyFaces 扩展使用） commons-collections.jarcommons-digester.jarcommons-beanutils.jarcommons-logging.jarcommons-fileupload-1.0.jar</p><br />　　 org.apache.myfaces.component.html.util程序包中的MultipartRequestWrapper类充当MyFaces和通用文件上载之间的桥梁。这个类扩展了HttpServletRequestWrapper，重载了getParameterMap()、getParameterNames()、getParameter()和getParameterValues()方法，这样它们才能适应multipart/form-data编码方式。此外，MultipartRequestWrapper提供了两个新的方法，分别是getFileItem()和getFileItems()，它允许你通过org.apache.commons.fileupload.FileItem接口来访问被上载的文件。<br /><br />　　 当MyFaces检测到编码方式的时候，org.apache.myfaces.component.html.util程序包中的ExtensionsFilter就建立MultipartRequestWrapper实例。因此，你不需要关心窗体数据的分解，但是如果你希望改变被上载文件的处理方式，那么了解它是如何实现的就很有用处了。在典型的应用程序中，你必须在自己的web应用程序的web.xml描述信息中配置ExtensionsFilter，这样它才能在JSF的FacesServlet前面截取HTTP请求：<br /><br /><p class="code">＜?xml version="1.0" encoding="UTF-8"?＞<br /><br />＜!DOCTYPE web-app PUBLIC<br />"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />"http://java.sun.com/dtd/web-app_2_3.dtd"＞<br /><br />＜web-app＞<br /><br />＜context-param＞<br />＜param-name＞javax.faces.STATE_SAVING_METHOD＜/param-name＞<br />＜param-value＞client＜/param-value＞<br />＜/context-param＞<br /><br />＜servlet＞<br />＜servlet-name＞FacesServlet＜/servlet-name＞<br />＜servlet-class＞<br />javax.faces.webapp.FacesServlet<br />＜/servlet-class＞<br />＜load-on-startup＞1＜/load-on-startup＞<br />＜/servlet＞<br /><br />＜servlet-mapping＞<br />＜servlet-name＞FacesServlet＜/servlet-name＞<br />＜url-pattern＞/faces/*＜/url-pattern＞<br />＜/servlet-mapping＞<br /><br />＜servlet-mapping＞<br />＜servlet-name＞FacesServlet＜/servlet-name＞<br />＜url-pattern＞*.faces＜/url-pattern＞<br />＜/servlet-mapping＞<br /><br />＜filter＞<br />＜filter-name＞ExtensionsFilter＜/filter-name＞<br />＜filter-class＞<br />org.apache.myfaces.component.html.util.ExtensionsFilter<br />＜/filter-class＞<br />＜init-param＞<br />＜param-name＞uploadMaxFileSize＜/param-name＞<br />＜param-value＞10m＜/param-value＞<br />＜/init-param＞<br />＜init-param＞<br />＜param-name＞uploadThresholdSize＜/param-name＞<br />＜param-value＞100k＜/param-value＞<br />＜/init-param＞<br />＜/filter＞<br /><br />＜filter-mapping＞<br />＜filter-name＞ExtensionsFilter＜/filter-name＞<br />＜servlet-name＞FacesServlet＜/servlet-name＞<br />＜/filter-mapping＞<br /><br />＜welcome-file-list＞<br />＜welcome-file＞index.jsp＜/welcome-file＞<br />＜/welcome-file-list＞<br /><br />＜/web-app＞</p><br />　　 前面示例中的两个过滤器（filter）参数告诉MyFaces把小于100K的文件放入内存中，并且忽略（即不处理）占用10MB以上磁盘空间的文件。大小介于uploadThresholdSize和uploadMaxFileSize之间的文件将作为临时文件存储在磁盘上。如果你试图载入一个太大的文件，MyFaces当前版本将忽略所有的窗体数据，就像用户提交了一个空表单一样。如果你希望给上载文件失败的用户一些提示信息，就需要更改MyFaces的MultipartRequestWrapper类，找到捕捉SizeLimitExceededException异常的位置，并使用FacesContext.getCurrentInstance().addMessage()来警告用户。<br /><br />　　 前面提到，MyFaces扩展包含了文件上载组件，我们可以在JSF页面中使用它。下一部分将介绍如何实现这样的操作。 使用MyFaces的文件上载组件。<br /><br />　　 为了在web页面中使用JSF和MyFaces，你必须在＜%@taglib%＞指令中声明它们的标记库：<br /><br /><p class="code">＜%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%＞<br />＜%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%＞<br />＜%@ taglib uri="http://myfaces.apache.org/extensions" prefix="x"%＞</p><br />　　 JSF的＜h:form＞标记没有method属性，这是因为它只支持POST方法，但它拥有enctype属性，如果你希望上载文件，就必须使用该属性，把窗体数据设置为多部分（multipart）编码类型：<br /><br /><p class="code">＜f:view＞<br />＜h:form id="MyForm" enctype="multipart/form-data" ＞<br />...<br />＜x:inputFileUpload id="myFileId"<br />value="#{myBean.myFile}"<br />storage="file"<br />required="true"/＞<br />...<br />＜/h:form＞<br />＜/f:view＞</p><br />　　 MyFaces的＜x:inputFileUpload＞标记使你能够定义UI组件的属性，它的呈现部件（renderer）生成＜input type="file"＞元素。org.apache.myfaces.custom.fileupload程序包包含了UI组件类（HtmlInputFileUpload）、呈现部件（HtmlFileUploadRenderer）、定制的标记处理程序（HtmlInputFileUploadTag）、UploadedFile接口和其它一些辅助类。HtmlInputFileUpload类扩展了JSF标准的HtmlInputText组件，重载了它的一些方法。HtmlFileUploadRenderer负责生成HTML标记，从MultipartRequestWrapper中获取FileItem。<br /><br />　　 MyFaces并没有让你直接访问通用文件上载所建立的FileItem实例，它提供了自己的UploadedFile接口来获取被上载的文件的内容、内容类型、文件名和文件大小。JSF窗体的后台bean必须拥有一个UploadedFile类型的属性。前面的例子用JSF表达式（#{myBean.myFile}）把UI组件的值绑定到了这样一个bean上。JSF框架组件将获取HtmlInputFileUpload组件的值，它是一个UploadedFile实例，并且会设置后台bean的myFile属性：<br /><br /><p class="code">import org.apache.myfaces.custom.fileupload.UploadedFile;<br />...<br />public class MyBean {<br />private UploadedFile myFile;<br /><br />public UploadedFile getMyFile() {<br />return myFile;<br />}<br /><br />public void setMyFile(UploadedFile myFile) {<br />this.myFile = myFile;<br />}<br />...<br />}</p><br />　　 MyFaces拥有UploadedFile接口的两种实现方式：UploadedFileDefaultMemoryImpl和UploadedFileDefaultFileImpl。当＜x:inputFileUpload＞标记没有带storage属性，或者这个属性的值是memory的时候，就使用前者。当storage属性的值是file的时候使用后者。<br /><br />　　 UploadedFileDefaultMemoryImpl类从FileItem实例中获取被上载文件的内容、文件名、文件大小和内容类型，并把所有这些信息存储在私有字段中。因此，即使通用文件上载把这个文件保存在磁盘上，UploadedFile的这种实现也会把被上载文件的内容保存在内存中，浪费了资源。<br /><br />　　 UploadedFileDefaultFileImpl类使用一个过渡字段来保存FileItem实例的指针，仅仅在调用getInputStream()方法的时候，才使用它来获取被上载文件的内容。这种实现节约了内存空间，但是，如果它是序列化的（serialize），那么在还原序列化（deserialization）之后，你就无法获取文件内容了。因此，文件上载窗体的后台bean不能保存在session作用域（scope）中，因为当应用程序重新启动或服务器关闭的时候，应用程序服务器会序列化对话（session）bean。<br /><br />　　 如果你希望得到了一个工作正常的、效率很高的解决方案，那么就把后台bean保存在request作用域中，并在＜x:inputFileUpload＞中指定storage="file"以节约内存资源。你也可以通过添加writeObject()方法（它用于序列化被上载文件的内容）来解决UploadedFileDefaultFileImpl类的序列化问题。为了保证UploadedFile的这种实现的高效性，相应的readObject()方法应该重新建立一个临时文件，而不是从内存中读取内容。<br /><br />　　 使用MyFaces的时候还需要注意一个问题：UploadedFile接口并没有定义一个用于删除通用文件上载在磁盘上所建立的临时文件的方法。当FileItem实例作为垃圾被清理的时候，就应该删掉这些文件。通用文件上载的DefaultFileItem类拥有一个finalize()方法，当管理临时文件的对象被从内存中删除的时候，它可以删除它们所管理的临时文件。如果你的应用程序正在上载大型文件的时候，你可能希望在它们被处理后立即删除，而不用等待垃圾清除过程。为了实现这样的功能，你必须添加一个getFileItem()方法（在UploadedFileDefaultFileImpl中），它应该返回FileItem实例，而该实例拥有delete()方法。 
<p></p><p>　　<b>示例应用程序</b><br /><br />　　 前面的部分介绍了是MyFaces如何在通用文件上载的帮助下支持文件上载的。现在我们来看一个实际的利用了这种特性的应用程序。JSF窗体（MyForm.jsp）让用户选择一个文件和一个报文摘要算法，后台bean（ MyBean.java）使用这个算法计算出一个散列值，显示在另外一个web页面（MyResult.jsp）中。这些页面和后台bean通过一个JSF配置文件（faces-config.xml）结合在一起。<br /><br />　　 MyForm.jsp页面<br /><br />　　 这个JSF窗体使用了MyFaces的＜x:inputFileUpload＞标记，同时还使用了其它一些标准的JSF标记来呈现标签、消息、包含报文摘要算法的下拉列表、使用JSF表达式（#{myBean.processMyFile}）指定了处理被上载文件的操作方法的命令按钮：<br /><br /></p><p class="code">＜%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%＞<br />＜%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%＞<br />＜%@ taglib uri="http://myfaces.apache.org/extensions" prefix="x"%＞<br /><br />＜f:view＞<br />＜h:form id="MyForm" enctype="multipart/form-data" ＞<br />　 ＜h:messages globalOnly="true" styleClass="message"/＞<br />　 ＜h:panelGrid columns="3" border="0" cellspacing="5"＞<br />　 ＜h:outputLabel for="myFileId" value="File: "/＞<br />　 ＜x:inputFileUpload id="myFileId" value="#{myBean.myFile}" storage="file" required="true"/＞<br />　 ＜h:message for="myFileId"/＞<br />　 ＜h:outputLabel for="myParamId" value="Param: "/＞<br />　 ＜h:selectOneMenu id="myParamId" value="#{myBean.myParam}" required="true"＞<br />　 ＜f:selectItem itemLabel="" itemValue=""/＞<br />　 ＜f:selectItem itemLabel="MD5" itemValue="MD5"/＞<br />　 ＜f:selectItem itemLabel="SHA-1" itemValue="SHA-1"/＞<br />　 ＜f:selectItem itemLabel="SHA-256" itemValue="SHA-256"/＞<br />　 ＜f:selectItem itemLabel="SHA-384" itemValue="SHA-384"/＞<br />　 ＜f:selectItem itemLabel="SHA-512" itemValue="SHA-512"/＞<br />＜/h:selectOneMenu＞<br />＜h:message for="myParamId"/＞<br /><br />＜h:outputText value=" "/＞<br />＜h:commandButton value="Submit"<br />action="#{myBean.processMyFile}"/＞<br />＜h:outputText value=" "/＞<br /><br />＜/h:panelGrid＞<br />＜/h:form＞<br />＜/f:view＞</p><br />　　 MyBean类<br /><br />　　 后台bean拥有三个属性：myFile、myParam和myResult。前面已经解释了myFile属性的角色。它让你获取被上载文件的内容和文件名、文件大小、内容类型。myParam属性的值是报文摘要算法。myResult属性将保存processMyFile()方法执行之后的散列值。MyBean类为自己的所有属性提供了get和set方法：<br /><br /><p class="code">package com.devsphere.articles.jsfupload;<br /><br />import org.apache.myfaces.custom.fileupload.UploadedFile;<br />...<br />public class MyBean {<br />　 private UploadedFile myFile;<br />　 private String myParam;<br />　 private String myResult;<br /><br />　 public UploadedFile getMyFile() {<br />　　 return myFile;<br />　 }<br /><br />　 public void setMyFile(UploadedFile myFile) {<br />　　 this.myFile = myFile;<br />　 }<br /><br />　 public String getMyParam() {<br />　　 return myParam;<br />　 }<br /><br />　 public void setMyParam(String myParam) {<br />　　 this.myParam = myParam;<br />　 }<br /><br />　 public String getMyResult() {<br />　　 return myResult;<br />　 }<br /><br />　 public void setMyResult(String myResult) {<br />　　 this.myResult = myResult;<br />　 }<br />　 ...<br />}</p><br />　　 processMyFile()通过一个输入流获取被上载文件的内容，这个输入流是通过myFile.getInputStream()获得的。散列值是在java.security.MessageDigest的帮助下计算出来的，然后把它转换为字符串，这样就可以被myResult属性访问了：<br /><br /><p class="code">package com.devsphere.articles.jsfupload;<br />...<br />import javax.faces.application.FacesMessage;<br />import javax.faces.context.FacesContext;<br /><br />import java.security.MessageDigest;<br />import java.security.NoSuchAlgorithmException;<br /><br />import java.io.*;<br /><br />public class MyBean {<br />　 ...<br />　 public String processMyFile() {<br />　　 try {<br />　　　 MessageDigest md= MessageDigest.getInstance(myParam);<br />　　　 InputStream in = new BufferedInputStream(<br />　　　 myFile.getInputStream());<br />　　　 try {<br />　　　　 byte[] buffer = new byte[64 * 1024];<br />　　　　 int count;<br />　　　　 while ((count = in.read(buffer)) ＞ 0)<br />　　　　　 md.update(buffer, 0, count);<br />　　 } finally {<br />　　　 in.close();<br />　　 }<br />　　 byte hash[] = md.digest();<br />　　 StringBuffer buf = new StringBuffer();<br />　　 for (int i = 0; i ＜ hash.length; i++) {<br />　　　 int b = hash[i] &amp; 0xFF;<br />　　　 int c = (b ＞＞ 4) &amp; 0xF;<br />　　　 c = c ＜ 10 ? '0' + c : 'A' + c - 10;<br />　　　 buf.append((char) c);<br />　　　 c = b &amp; 0xF;<br />　　　 c = c ＜ 10 ? '0' + c : 'A' + c - 10;<br />　　　 buf.append((char) c);<br />　　 }<br />　　 myResult = buf.toString();<br />　　 return "OK";<br />　 } catch (Exception x) {<br />　　 FacesMessage message = new FacesMessage(<br />　　 FacesMessage.SEVERITY_FATAL,<br />　　 x.getClass().getName(), x.getMessage());<br />　　 FacesContext.getCurrentInstance().addMessage(null, message);<br />　　 return null;<br />　 }<br />}<br /><br />}</p><br />　　 faces-config.xml文件<br /><br />　　 JSF配置文件把后台bean定义在request作用域中，并且指定了一个导航规则：<br /><br /><p class="code">＜?xml version="1.0" encoding="UTF-8"?＞<br /><br />＜!DOCTYPE faces-config PUBLIC<br />"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"<br />"http://java.sun.com/dtd/web-facesconfig_1_1.dtd"＞<br /><br />＜faces-config＞<br /><br />＜managed-bean＞<br />＜managed-bean-name＞myBean＜/managed-bean-name＞<br />＜managed-bean-class＞<br />com.devsphere.articles.jsfupload.MyBean<br />＜/managed-bean-class＞<br />＜managed-bean-scope＞request＜/managed-bean-scope＞<br />＜/managed-bean＞<br /><br />＜navigation-rule＞<br />＜from-view-id＞/MyForm.jsp＜/from-view-id＞<br />＜navigation-case＞<br />＜from-outcome＞OK＜/from-outcome＞<br />＜to-view-id＞/MyResult.jsp＜/to-view-id＞<br />＜/navigation-case＞<br />＜/navigation-rule＞<br /><br />＜/faces-config＞</p><br />　　 MyResult.jsp页面<br /><br />　　 这个web页面显示了被上载文件的一些信息：<br /><br /><p class="code">＜%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%＞<br />＜%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%＞<br /><br />＜f:view＞<br /><br />＜h:panelGrid columns="2" border="0" cellspacing="5"＞<br /><br />＜h:outputText value="FileName:"/＞<br />＜h:outputText value="#{myBean.myFile.name}"/＞<br /><br />＜h:outputText value="FileSize:"/＞<br />＜h:outputText value="#{myBean.myFile.size}"/＞<br /><br />＜h:outputText value="Param:"/＞<br />＜h:outputText value="#{myBean.myParam}"/＞<br /><br />＜h:outputText value="Result:"/＞<br />＜h:outputText value="#{myBean.myResult}"/＞<br /><br />＜/h:panelGrid＞<br /><br />＜/f:view＞</p><br />　　 被显示的文件名可能带有客户端文件系统的完整路径，如下所示：<br /><br /><div align="center"><img height="311" src="http://www.java3z.com/cwbwebhome/article/article2a/images/20050819063333_2.gif" width="426" /><br />图2：结果页面产生的输出信息</div><br />　　 <b>总结</b><br /><br />　　 在很多情况下，用户需要通过浏览器上载文件，但是在服务器端却没有处理这些文件的理想方法。把文件的内容保存在内存中对于小型文件来说是可以接受的，但是把被上载的文件存储在临时文件中使这种情况变复杂了。MyFaces让你能够选择一个适合应用程序需求的解决方案，但是这个框架组件也有一些小问题。当你不再需要临时文件的时候，它无法让你删除它们；文件名有时候带有文件路径；当用户上载过大的文件的时候也没有警告信息。这些缺陷是可以修补的，因为我们可以使用源代码，而且本文就介绍了MyFaces代码可以改进的一些的地方。无论如何，对于多数应用程序来说，MyFaces不做修改就合乎需求。本文的例子是使用JSF 1.1.01、MyFaces 1.0.9和通用文件上载1.0环境测试的。 <img src ="http://www.blogjava.net/xiaosao/aggbug/87628.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaosao/" target="_blank">cAng^Er</a> 2006-12-14 10:02 <a href="http://www.blogjava.net/xiaosao/articles/87628.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>