﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-爪哇一角-文章分类-其他资源</title><link>http://www.blogjava.net/ocean07000814/category/15457.html</link><description>共同探讨STRUTS#HIBERNATE#SPRING#EJB等技术</description><language>zh-cn</language><lastBuildDate>Thu, 03 Mar 2011 11:38:44 GMT</lastBuildDate><pubDate>Thu, 03 Mar 2011 11:38:44 GMT</pubDate><ttl>60</ttl><item><title>Log4J的配置文件详解</title><link>http://www.blogjava.net/ocean07000814/articles/345458.html</link><dc:creator>非洲小白脸</dc:creator><author>非洲小白脸</author><pubDate>Wed, 02 Mar 2011 01:49:00 GMT</pubDate><guid>http://www.blogjava.net/ocean07000814/articles/345458.html</guid><wfw:comment>http://www.blogjava.net/ocean07000814/comments/345458.html</wfw:comment><comments>http://www.blogjava.net/ocean07000814/articles/345458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ocean07000814/comments/commentRss/345458.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ocean07000814/services/trackbacks/345458.html</trackback:ping><description><![CDATA[<p>Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的，它可接key=value格式的设置或xml格式的设置信息。通过配置，可以创建出Log4J的运行环境。</p>
<p>1. 配置文件<br />
Log4J配置文件的基本格式如下： </p>
<p>#配置根Logger<br />
log4j.rootLogger&nbsp; =&nbsp;&nbsp; [ level ]&nbsp;&nbsp; ,&nbsp; appenderName1 ,&nbsp; appenderName2 ,&nbsp; &#8230;</p>
<p>#配置日志信息输出目的地Appender<br />
log4j.appender.appenderName&nbsp; =&nbsp; fully.qualified.name.of.appender.class <br />
　　log4j.appender.appenderName.option1&nbsp; =&nbsp; value1 <br />
　　&#8230; <br />
　　log4j.appender.appenderName.optionN&nbsp; =&nbsp; valueN </p>
<p>#配置日志信息的格式（布局）<br />
log4j.appender.appenderName.layout&nbsp; =&nbsp; fully.qualified.name.of.layout.class <br />
　　log4j.appender.appenderName.layout.option1&nbsp; =&nbsp; value1 <br />
　　&#8230; <br />
　　log4j.appender.appenderName.layout.optionN&nbsp; =&nbsp; valueN&nbsp; <br />
其中 [level] 是日志输出级别，共有5级：</p>
<p>FATAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; <br />
ERROR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp; <br />
WARN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp; <br />
INFO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6&nbsp; <br />
DEBUG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7 <br />
&nbsp;<br />
Appender 为日志输出目的地，Log4j提供的appender有以下几种：</p>
<p>org.apache.log4j.ConsoleAppender（控制台），<br />
org.apache.log4j.FileAppender（文件），<br />
org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件），<br />
org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件），<br />
org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方） <br />
Layout：日志输出格式，Log4j提供的layout有以下几种：</p>
<p><br />
org.apache.log4j.HTMLLayout（以HTML表格形式布局），<br />
org.apache.log4j.PatternLayout（可以灵活地指定布局模式），<br />
org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），<br />
org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息） <br />
打印参数: Log4J采用类似C语言中的printf函数的打印格式格式化日志信息，如下:</p>
<p><br />
&nbsp;　&nbsp; %m&nbsp;&nbsp; 输出代码中指定的消息<br />
　　%p&nbsp;&nbsp; 输出优先级，即DEBUG，INFO，WARN，ERROR，FATAL <br />
　　%r&nbsp;&nbsp; 输出自应用启动到输出该log信息耗费的毫秒数 <br />
　　%c&nbsp;&nbsp; 输出所属的类目，通常就是所在类的全名 <br />
　　%t&nbsp;&nbsp; 输出产生该日志事件的线程名 <br />
　　%n&nbsp;&nbsp; 输出一个回车换行符，Windows平台为&#8220;\r\n&#8221;，Unix平台为&#8220;\n&#8221; <br />
　　%d&nbsp;&nbsp; 输出日志时间点的日期或时间，默认格式为ISO8601，也可以在其后指定格式，比如：%d{yyy MMM dd HH:mm:ss , SSS}，输出类似：2002年10月18日&nbsp; 22 ： 10 ： 28 ， 921&nbsp; <br />
　　%l&nbsp;&nbsp; 输出日志事件的发生位置，包括类目名、发生的线程，以及在代码中的行数。举例：Testlog4.main(TestLog4.java: 10 )&nbsp; <br />
2. 在代码中初始化Logger: <br />
1）在程序中调用BasicConfigurator.configure()方法：给根记录器增加一个ConsoleAppender，输出格式通过PatternLayout设为"%-4r [%t] %-5p %c %x - %m%n"，还有根记录器的默认级别是Level.DEBUG. <br />
2）配置放在文件里，通过命令行参数传递文件名字，通过PropertyConfigurator.configure(args[x])解析并配置；<br />
3）配置放在文件里，通过环境变量传递文件名等信息，利用log4j默认的初始化过程解析并配置；<br />
4）配置放在文件里，通过应用服务器配置传递文件名等信息，利用一个特殊的servlet来完成配置。</p>
<p>3. 为不同的 Appender 设置日志输出级别：<br />
当调试系统时，我们往往注意的只是异常级别的日志输出，但是通常所有级别的输出都是放在一个文件里的，如果日志输出的级别是BUG！？那就慢慢去找吧。<br />
这时我们也许会想要是能把异常信息单独输出到一个文件里该多好啊。当然可以，Log4j已经提供了这样的功能，我们只需要在配置中修改Appender的Threshold 就能实现,比如下面的例子：</p>
<p>[配置文件]</p>
<p><br />
<span style="background-color: #ccffff">&nbsp;### set log levels ###<br />
log4j.rootLogger = debug ,&nbsp; stdout ,&nbsp; D ,&nbsp; E</span></p>
<p><span style="background-color: #ccffff">### 输出到控制台 ###<br />
log4j.appender.stdout = org.apache.log4j.ConsoleAppender<br />
log4j.appender.stdout.Target = System.out<br />
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout<br />
log4j.appender.stdout.layout.ConversionPattern =&nbsp; %d{ABSOLUTE} %5p %c{ 1 }:%L - %m%n</span></p>
<p><span style="background-color: #ccffff">### 输出到日志文件 ###<br />
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender<br />
log4j.appender.D.File = logs/log.log<br />
log4j.appender.D.Append = true<br />
log4j.appender.D.Threshold = DEBUG ## 输出DEBUG级别以上的日志<br />
log4j.appender.D.layout = org.apache.log4j.PatternLayout<br />
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}&nbsp; [ %t:%r ] - [ %p ]&nbsp; %m%n</span></p>
<p><span style="background-color: #ccffff">### 保存异常信息到单独文件 ###<br />
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender<br />
log4j.appender.D.File = logs/error.log ## 异常日志文件名<br />
log4j.appender.D.Append = true<br />
log4j.appender.D.Threshold = ERROR ## 只输出ERROR级别以上的日志!!!<br />
log4j.appender.D.layout = org.apache.log4j.PatternLayout<br />
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}&nbsp; [ %t:%r ] - [ %p ]&nbsp; %m%n <br />
[代码中使用] </span></p>
<p><br />
<span style="background-color: #ccffff">&nbsp; public&nbsp;&nbsp; class&nbsp; TestLog4j&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp;&nbsp; static&nbsp;&nbsp; void&nbsp; main(String[] args)&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PropertyConfigurator.configure( " D:/Code/conf/log4j.properties " );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Logger logger&nbsp; =&nbsp; Logger.getLogger(TestLog4j. class );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.debug( " debug " );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.error( " error " );<br />
&nbsp;&nbsp;&nbsp; } <br />
} <br />
运行一下，看看异常信息是不是保存在了一个单独的文件error.log中</span></p>
<p><span style="background-color: #ccffff">log4j.properties 使用<br />
一.参数意义说明<br />
输出级别的种类<br />
ERROR、WARN、INFO、DEBUG<br />
ERROR 为严重错误 主要是程序的错误<br />
WARN 为一般警告，比如session丢失<br />
INFO 为一般要显示的信息，比如登录登出<br />
DEBUG 为程序的调试信息<br />
配置日志信息输出目的地<br />
log4j.appender.appenderName = fully.qualified.name.of.appender.class<br />
1.org.apache.log4j.ConsoleAppender（控制台）<br />
2.org.apache.log4j.FileAppender（文件）<br />
3.org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件）<br />
4.org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件）<br />
5.org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方）<br />
配置日志信息的格式<br />
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class<br />
1.org.apache.log4j.HTMLLayout（以HTML表格形式布局），<br />
2.org.apache.log4j.PatternLayout（可以灵活地指定布局模式），<br />
3.org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），<br />
4.org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息）<br />
控制台选项<br />
Threshold=DEBUG:指定日志消息的输出最低层次。<br />
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。<br />
Target=System.err：默认情况下是：System.out,指定输出控制台<br />
FileAppender 选项<br />
Threshold=DEBUF:指定日志消息的输出最低层次。<br />
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。<br />
File=mylog.txt:指定消息输出到mylog.txt文件。<br />
Append=false:默认值是true,即将消息增加到指定文件中，false指将消息覆盖指定的文件内容。<br />
RollingFileAppender 选项<br />
Threshold=DEBUG:指定日志消息的输出最低层次。<br />
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。<br />
File=mylog.txt:指定消息输出到mylog.txt文件。<br />
Append=false:默认值是true,即将消息增加到指定文件中，false指将消息覆盖指定的文件内容。<br />
MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时，将会自动滚动，即将原来的内容移到mylog.log.1文件。<br />
MaxBackupIndex=2:指定可以产生的滚动文件的最大数。<br />
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n<br />
日志信息格式中几个符号所代表的含义：<br />
&nbsp;-X号: X信息输出时左对齐；<br />
&nbsp;%p: 输出日志信息优先级，即DEBUG，INFO，WARN，ERROR，FATAL,<br />
&nbsp;%d: 输出日志时间点的日期或时间，默认格式为ISO8601，也可以在其后指定格式，比如：%d{yyy MMM dd HH:mm:ss,SSS}，输出类似：2002年10月18日 22：10：28，921<br />
&nbsp;%r: 输出自应用启动到输出该log信息耗费的毫秒数<br />
&nbsp;%c: 输出日志信息所属的类目，通常就是所在类的全名<br />
&nbsp;%t: 输出产生该日志事件的线程名<br />
&nbsp;%l: 输出日志事件的发生位置，相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程，以及在代码中的行数。举例：Testlog4.main (TestLog4.java:10)<br />
&nbsp;%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。<br />
&nbsp;%%: 输出一个"%"字符<br />
&nbsp;%F: 输出日志消息产生时所在的文件名称<br />
&nbsp;%L: 输出代码中的行号<br />
&nbsp;%m: 输出代码中指定的消息,产生的日志具体信息<br />
&nbsp;%n: 输出一个回车换行符，Windows平台为"\r\n"，Unix平台为"\n"输出日志信息换行<br />
&nbsp;可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如：<br />
&nbsp;1)%20c：指定输出category的名称，最小的宽度是20，如果category的名称小于20的话，默认的情况下右对齐。<br />
&nbsp;2)%-20c:指定输出category的名称，最小的宽度是20，如果category的名称小于20的话，"-"号指定左对齐。<br />
&nbsp;3)%.30c:指定输出category的名称，最大的宽度是30，如果category的名称大于30的话，就会将左边多出的字符截掉，但小于30的话也不会有空格。<br />
&nbsp;4)%20.30c:如果category的名称小于20就补空格，并且右对齐，如果其名称长于30字符，就从左边较远输出的字符截掉。<br />
二.文件配置Sample1<br />
log4j.rootLogger=DEBUG,A1,R<br />
#log4j.rootLogger=INFO,A1,R<br />
# ConsoleAppender 输出<br />
log4j.appender.A1=org.apache.log4j.ConsoleAppender<br />
log4j.appender.A1.layout=org.apache.log4j.PatternLayout<br />
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n<br />
# File 输出 一天一个文件,输出路径可以定制,一般在根路径下<br />
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender<br />
log4j.appender.R.File=blog_log.txt<br />
log4j.appender.R.MaxFileSize=500KB<br />
log4j.appender.R.MaxBackupIndex=10<br />
log4j.appender.R.layout=org.apache.log4j.PatternLayout<br />
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n<br />
文件配置Sample2<br />
下面给出的Log4J配置文件实现了输出到控制台，文件，回滚文件，发送日志邮件，输出到数据库日志表，自定义标签等全套功能。<br />
log4j.rootLogger=DEBUG,CONSOLE,A1,im <br />
#DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE<br />
log4j.addivity.org.apache=true<br />
################### <br />
# Console Appender <br />
################### <br />
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender <br />
log4j.appender.Threshold=DEBUG <br />
log4j.appender.CONSOLE.Target=System.out <br />
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout <br />
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n <br />
#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n<br />
##################### <br />
# File Appender <br />
##################### <br />
log4j.appender.FILE=org.apache.log4j.FileAppender <br />
log4j.appender.FILE.File=file.log <br />
log4j.appender.FILE.Append=false <br />
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout <br />
log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n <br />
# Use this layout for LogFactor 5 analysis<br />
######################## <br />
# Rolling File <br />
######################## <br />
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender <br />
log4j.appender.ROLLING_FILE.Threshold=ERROR <br />
log4j.appender.ROLLING_FILE.File=rolling.log <br />
log4j.appender.ROLLING_FILE.Append=true <br />
log4j.appender.ROLLING_FILE.MaxFileSize=10KB <br />
log4j.appender.ROLLING_FILE.MaxBackupIndex=1 <br />
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout <br />
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n<br />
#################### <br />
# Socket Appender <br />
#################### <br />
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender <br />
log4j.appender.SOCKET.RemoteHost=localhost <br />
log4j.appender.SOCKET.Port=5001 <br />
log4j.appender.SOCKET.LocationInfo=true <br />
# Set up for Log Facter 5 <br />
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout <br />
log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n<br />
######################## <br />
# Log Factor 5 Appender <br />
######################## <br />
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender <br />
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000<br />
######################## <br />
# SMTP Appender <br />
####################### <br />
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender <br />
log4j.appender.MAIL.Threshold=FATAL <br />
log4j.appender.MAIL.BufferSize=10 <br />
log4j.appender.MAIL.From=chenyl@yeqiangwei.com<br />
log4j.appender.MAIL.SMTPHost=mail.hollycrm.com <br />
log4j.appender.MAIL.Subject=Log4J Message <br />
log4j.appender.MAIL.To=chenyl@yeqiangwei.com<br />
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout <br />
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n<br />
######################## <br />
# JDBC Appender <br />
####################### <br />
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender <br />
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test <br />
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver <br />
log4j.appender.DATABASE.user=root <br />
log4j.appender.DATABASE.password= <br />
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n') <br />
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout <br />
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n<br />
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender <br />
log4j.appender.A1.File=SampleMessages.log4j <br />
log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j' <br />
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout<br />
################### <br />
#自定义Appender <br />
################### <br />
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender<br />
log4j.appender.im.host = mail.cybercorlin.net <br />
log4j.appender.im.username = username <br />
log4j.appender.im.password = password <br />
log4j.appender.im.recipient = corlin@yeqiangwei.com<br />
log4j.appender.im.layout=org.apache.log4j.PatternLayout <br />
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n<br />
三.高级使用<br />
实验目的：<br />
&nbsp;1.把FATAL级错误写入2000NT日志<br />
&nbsp;2. WARN，ERROR，FATAL级错误发送email通知管理员<br />
&nbsp;3.其他级别的错误直接在后台输出<br />
实验步骤：<br />
&nbsp;输出到2000NT日志<br />
&nbsp;1.把Log4j压缩包里的NTEventLogAppender.dll拷到WINNT\SYSTEM32目录下<br />
&nbsp;2.写配置文件log4j.properties<br />
# 在2000系统日志输出<br />
&nbsp;log4j.logger.NTlog=FATAL, A8<br />
&nbsp;# APPENDER A8<br />
&nbsp;log4j.appender.A8=org.apache.log4j.nt.NTEventLogAppender<br />
&nbsp;log4j.appender.A8.Source=JavaTest<br />
&nbsp;log4j.appender.A8.layout=org.apache.log4j.PatternLayout<br />
&nbsp;log4j.appender.A8.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n<br />
3.调用代码：<br />
&nbsp;Logger logger2 = Logger.getLogger("NTlog"); //要和配置文件中设置的名字相同<br />
&nbsp;logger2.debug("debug!!!");<br />
&nbsp;logger2.info("info!!!");<br />
&nbsp;logger2.warn("warn!!!");<br />
&nbsp;logger2.error("error!!!");<br />
&nbsp;//只有这个错误才会写入2000日志<br />
&nbsp;logger2.fatal("fatal!!!");<br />
发送email通知管理员：<br />
&nbsp;1. 首先下载JavaMail和JAF, <br />
&nbsp; http://java.sun.com/j2ee/ja/javamail/index.html<br />
&nbsp; http://java.sun.com/beans/glasgow/jaf.html<br />
&nbsp;在项目中引用mail.jar和activation.jar。<br />
&nbsp;2. 写配置文件<br />
&nbsp;# 将日志发送到email<br />
&nbsp;log4j.logger.MailLog=WARN,A5<br />
&nbsp;#&nbsp; APPENDER A5<br />
&nbsp;log4j.appender.A5=org.apache.log4j.net.SMTPAppender<br />
&nbsp;log4j.appender.A5.BufferSize=5<br />
&nbsp;log4j.appender.A5.To=chunjie@yeqiangwei.com<br />
&nbsp;log4j.appender.A5.From=error@yeqiangwei.com<br />
&nbsp;log4j.appender.A5.Subject=ErrorLog<br />
&nbsp;log4j.appender.A5.SMTPHost=smtp.263.net<br />
&nbsp;log4j.appender.A5.layout=org.apache.log4j.PatternLayout<br />
&nbsp;log4j.appender.A5.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n<br />
&nbsp;3.调用代码：<br />
&nbsp;//把日志发送到mail<br />
&nbsp;Logger logger3 = Logger.getLogger("MailLog");<br />
&nbsp;logger3.warn("warn!!!");<br />
&nbsp;logger3.error("error!!!");<br />
&nbsp;logger3.fatal("fatal!!!");<br />
在后台输出所有类别的错误：<br />
&nbsp;1. 写配置文件<br />
&nbsp;# 在后台输出<br />
&nbsp;log4j.logger.console=DEBUG, A1<br />
&nbsp;# APPENDER A1<br />
&nbsp;log4j.appender.A1=org.apache.log4j.ConsoleAppender<br />
&nbsp;log4j.appender.A1.layout=org.apache.log4j.PatternLayout<br />
&nbsp;log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n<br />
&nbsp;2．调用代码<br />
&nbsp;Logger logger1 = Logger.getLogger("console");<br />
&nbsp;logger1.debug("debug!!!");<br />
&nbsp;logger1.info("info!!!");<br />
&nbsp;logger1.warn("warn!!!");<br />
&nbsp;logger1.error("error!!!");<br />
&nbsp;logger1.fatal("fatal!!!");<br />
--------------------------------------------------------------------<br />
&nbsp;全部配置文件：log4j.properties<br />
&nbsp;# 在后台输出<br />
&nbsp;log4j.logger.console=DEBUG, A1<br />
&nbsp;# APPENDER A1<br />
&nbsp;log4j.appender.A1=org.apache.log4j.ConsoleAppender<br />
&nbsp;log4j.appender.A1.layout=org.apache.log4j.PatternLayout<br />
&nbsp;log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n<br />
# 在2000系统日志输出<br />
&nbsp;log4j.logger.NTlog=FATAL, A8<br />
&nbsp;# APPENDER A8<br />
&nbsp;log4j.appender.A8=org.apache.log4j.nt.NTEventLogAppender<br />
&nbsp;log4j.appender.A8.Source=JavaTest<br />
&nbsp;log4j.appender.A8.layout=org.apache.log4j.PatternLayout<br />
&nbsp;log4j.appender.A8.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n<br />
# 将日志发送到email<br />
&nbsp;log4j.logger.MailLog=WARN,A5<br />
&nbsp;#&nbsp; APPENDER A5<br />
&nbsp;log4j.appender.A5=org.apache.log4j.net.SMTPAppender<br />
&nbsp;log4j.appender.A5.BufferSize=5<br />
&nbsp;log4j.appender.A5.To=chunjie@yeqiangwei.com<br />
&nbsp;log4j.appender.A5.From=error@yeqiangwei.com<br />
&nbsp;log4j.appender.A5.Subject=ErrorLog<br />
&nbsp;log4j.appender.A5.SMTPHost=smtp.263.net<br />
&nbsp;log4j.appender.A5.layout=org.apache.log4j.PatternLayout<br />
&nbsp;log4j.appender.A5.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n<br />
全部代码：Log4jTest.java<br />
&nbsp; <br />
/* <br />
&nbsp; * 创建日期 2003-11-13 <br />
&nbsp; */ <br />
&nbsp;package edu.bcu.Bean; <br />
&nbsp;import org.apache.log4j.*; <br />
&nbsp;//import org.apache.log4j.nt.*; <br />
&nbsp;//import org.apache.log4j.net.*; <br />
&nbsp;/** <br />
&nbsp; * @author yanxu <br />
&nbsp; */ <br />
&nbsp;public class Log4jTest <br />
&nbsp;{ <br />
&nbsp; public static void main(String args[]) <br />
&nbsp; { <br />
&nbsp;&nbsp; PropertyConfigurator.configure("log4j.properties"); <br />
&nbsp;&nbsp; //在后台输出 <br />
&nbsp;&nbsp; Logger logger1 = Logger.getLogger("console"); <br />
&nbsp;&nbsp; logger1.debug("debug!!!"); <br />
&nbsp;&nbsp; logger1.info("info!!!"); <br />
&nbsp;&nbsp; logger1.warn("warn!!!"); <br />
&nbsp;&nbsp; logger1.error("error!!!"); <br />
&nbsp;&nbsp; logger1.fatal("fatal!!!");<br />
//在NT系统日志输出 <br />
&nbsp;&nbsp; Logger logger2 = Logger.getLogger("NTlog"); <br />
&nbsp;&nbsp; //NTEventLogAppender nla = new NTEventLogAppender(); <br />
&nbsp;&nbsp; logger2.debug("debug!!!"); <br />
&nbsp;&nbsp; logger2.info("info!!!"); <br />
&nbsp;&nbsp; logger2.warn("warn!!!"); <br />
&nbsp;&nbsp; logger2.error("error!!!"); <br />
&nbsp;&nbsp; //只有这个错误才会写入2000日志 <br />
&nbsp;&nbsp; logger2.fatal("fatal!!!");<br />
//把日志发送到mail <br />
&nbsp;&nbsp; Logger logger3 = Logger.getLogger("MailLog"); <br />
&nbsp;&nbsp; //SMTPAppender sa = new SMTPAppender(); <br />
&nbsp;&nbsp; logger3.warn("warn!!!"); <br />
&nbsp;&nbsp; logger3.error("error!!!"); <br />
&nbsp;&nbsp; logger3.fatal("fatal!!!"); <br />
&nbsp; } <br />
&nbsp;} </span></p>
<p>&nbsp;</p>
<p>本文出处：http://blog.csdn.net/azheng270/archive/2008/03/12/2173430.aspx</p>
<img src ="http://www.blogjava.net/ocean07000814/aggbug/345458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ocean07000814/" target="_blank">非洲小白脸</a> 2011-03-02 09:49 <a href="http://www.blogjava.net/ocean07000814/articles/345458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POI通过读取Excel模板生成Excel文件</title><link>http://www.blogjava.net/ocean07000814/articles/344865.html</link><dc:creator>非洲小白脸</dc:creator><author>非洲小白脸</author><pubDate>Tue, 22 Feb 2011 09:48:00 GMT</pubDate><guid>http://www.blogjava.net/ocean07000814/articles/344865.html</guid><wfw:comment>http://www.blogjava.net/ocean07000814/comments/344865.html</wfw:comment><comments>http://www.blogjava.net/ocean07000814/articles/344865.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ocean07000814/comments/commentRss/344865.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ocean07000814/services/trackbacks/344865.html</trackback:ping><description><![CDATA[<li><span><span class="comment">/** </span>&nbsp;</span>
<li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;导出 </span>&nbsp;</span>
<li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;mapping </span>&nbsp;</span>
<li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;form </span>&nbsp;</span>
<li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;request </span>&nbsp;</span>
<li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;response </span>&nbsp;</span>
<li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return </span>&nbsp;</span>
<li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;ActionForward&nbsp;export(ActionMapping&nbsp;mapping,&nbsp;ActionForm&nbsp;form, &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)&nbsp;{ &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;checkBoxValueList&nbsp;=&nbsp;request.getParameter(</span><span class="string">"ckv"</span><span>); &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(!CommonUtil.isNotNullorEmtry(checkBoxValueList))&nbsp;{ &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.saveMessages(request,&nbsp;</span><span class="string">"export.fail"</span><span>); &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;mapping.findForward(</span><span class="string">"export.fail"</span><span>); &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;Order&gt;&nbsp;listOrder&nbsp;=&nbsp;orderService.exportOrderList(checkBoxValueList); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span>
<li><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SimpleDateFormat&nbsp;sf&nbsp;=&nbsp;new&nbsp;SimpleDateFormat("yyyyMMddhhmm"); </span><span>&nbsp;&nbsp;</span></span>
<li><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Calendar&nbsp;calendar&nbsp;=&nbsp;Calendar.getInstance(); </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServletOutputStream&nbsp;os&nbsp;=&nbsp;response.getOutputStream();&nbsp;</span><span class="comment">//获得输出流 </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.reset();&nbsp;&nbsp;&nbsp;</span><span class="comment">//清空输出流 </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;fileName&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;String(</span><span class="string">"订单列表"</span><span>.getBytes(</span><span class="string">"gb2312"</span><span>),&nbsp;</span><span class="string">"ISO8859-1"</span><span>)&nbsp;+</span><span class="string">".xls"</span><span>; &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setHeader(</span><span class="string">"Content-disposition"</span><span>,&nbsp;</span><span class="string">"attachment;&nbsp;filename="</span><span>+&nbsp;fileName);&nbsp;</span><span class="comment">//设定输出文件头 </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setContentType(</span><span class="string">"application/msexcel"</span><span>);&nbsp;</span><span class="comment">//定义输出类型 </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;filePath&nbsp;=&nbsp;request.getSession().getServletContext().getRealPath(</span><span class="string">"/excel/model/order.xls"</span><span>); &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HSSFWorkbook&nbsp;workbook&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;HSSFWorkbook(</span><span class="keyword">new</span><span>&nbsp;FileInputStream(filePath));&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//读取excel模板 </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HSSFSheet&nbsp;sheet&nbsp;=&nbsp;workbook.getSheetAt(</span><span class="number">0</span><span>);&nbsp;&nbsp;&nbsp;</span><span class="comment">//读取第一个工作簿 </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HSSFRow&nbsp;row; &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HSSFCell&nbsp;cell&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;rownum&nbsp;=&nbsp;</span><span class="number">3</span><span>;&nbsp;</span><span class="comment">//添加的起始行 </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HSSFCellStyle&nbsp;style&nbsp;=&nbsp;</span><span class="keyword">this</span><span>.getStyle(workbook); &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator&lt;Order&gt;&nbsp;it&nbsp;=&nbsp;listOrder.iterator(); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Order&nbsp;order&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>(it.hasNext())&nbsp;{ &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;order&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Order(); &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;order&nbsp;=&nbsp;it.next(); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row&nbsp;=&nbsp;sheet.createRow(rownum); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myCreateCell(</span><span class="number">1</span><span>,&nbsp;String.valueOf(rownum-</span><span class="number">2</span><span>),&nbsp;row,&nbsp;cell,&nbsp;style);&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//列1 </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myCreateCell(</span><span class="number">2</span><span>,&nbsp;order.getAdName(),&nbsp;row,&nbsp;cell,&nbsp;style);&nbsp;&nbsp;&nbsp;</span><span class="comment">//列2 </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myCreateCell(</span><span class="number">3</span><span>,&nbsp;order.getSmallAreaName(),&nbsp;row,&nbsp;cell,&nbsp;style);&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//列1&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rownum++; &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;workbook.write(os); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.flush(); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.close(); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;myCreateCell(</span><span class="keyword">int</span><span>&nbsp;cellnum,&nbsp;String&nbsp;value,&nbsp;HSSFRow&nbsp;row,&nbsp;HSSFCell&nbsp;cell,&nbsp;HSSFCellStyle&nbsp;style)&nbsp;{ &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cell&nbsp;=&nbsp;row.createCell((</span><span class="keyword">short</span><span>)&nbsp;cellnum); &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cell.setCellValue(</span><span class="keyword">new</span><span>&nbsp;HSSFRichTextString(value)); &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cell.setCellStyle(style); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;HSSFCellStyle&nbsp;getStyle(HSSFWorkbook&nbsp;workbook)&nbsp;{ &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//设置字体; </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HSSFFont&nbsp;font&nbsp;=&nbsp;workbook.createFont(); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//设置字体大小; </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font.setFontHeightInPoints((</span><span class="keyword">short</span><span>)&nbsp;</span><span class="number">10</span><span>); &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//设置字体名字; </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font.setFontName(</span><span class="string">"宋体"</span><span>); &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//font.setItalic(true); </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//font.setStrikeout(true); </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//设置样式; </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HSSFCellStyle&nbsp;style&nbsp;=&nbsp;workbook.createCellStyle(); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//设置底边框; </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style.setBorderBottom(HSSFCellStyle.BORDER_THIN); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//设置底边框颜色; </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style.setBottomBorderColor(HSSFColor.BLACK.index); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//设置左边框; </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style.setBorderLeft(HSSFCellStyle.BORDER_THIN); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//设置左边框颜色; </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style.setLeftBorderColor(HSSFColor.BLACK.index); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//设置右边框; </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style.setBorderRight(HSSFCellStyle.BORDER_THIN); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//设置右边框颜色; </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style.setRightBorderColor(HSSFColor.BLACK.index); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//设置顶边框; </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style.setBorderTop(HSSFCellStyle.BORDER_THIN); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//设置顶边框颜色; </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style.setTopBorderColor(HSSFColor.BLACK.index); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//在样式用应用设置的字体; </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style.setFont(font); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//设置自动换行; </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style.setWrapText(</span><span class="keyword">false</span><span>); &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//设置水平对齐的样式为居中对齐; </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style.setAlignment(HSSFCellStyle.ALIGN_CENTER); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//设置垂直对齐的样式为居中对齐; </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;style; &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span> </li>
<p><br />
EXCEL模板加载出错的问题：<br />
可能是因为模板中某些格式存在问题，或者模板中存在EXCEL的某些高级功能，【POI】无法加载导致出错。<br />
解决办法：自己一步步从最简单的excel文件开始，绘制模板。</p>
<img src ="http://www.blogjava.net/ocean07000814/aggbug/344865.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ocean07000814/" target="_blank">非洲小白脸</a> 2011-02-22 17:48 <a href="http://www.blogjava.net/ocean07000814/articles/344865.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>物化视图</title><link>http://www.blogjava.net/ocean07000814/articles/342428.html</link><dc:creator>非洲小白脸</dc:creator><author>非洲小白脸</author><pubDate>Thu, 06 Jan 2011 07:08:00 GMT</pubDate><guid>http://www.blogjava.net/ocean07000814/articles/342428.html</guid><wfw:comment>http://www.blogjava.net/ocean07000814/comments/342428.html</wfw:comment><comments>http://www.blogjava.net/ocean07000814/articles/342428.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ocean07000814/comments/commentRss/342428.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ocean07000814/services/trackbacks/342428.html</trackback:ping><description><![CDATA[创建物化视图<br />
CREATE MATERIALIZED VIEW mv_test_pk<br />
&nbsp;<wbr> --如果可以快速刷新则进行快速刷新，否则完全刷新refresh force on demand&nbsp;<wbr><br />
&nbsp;<wbr>REFRESH FAST on demand<br />
&nbsp;<wbr> start with to_date('24-11-2008 18:00:10', 'dd-mm-yyyy hh24:mi:ss') --第一次刷新时间<br />
&nbsp;<wbr> next TRUNC(SYSDATE+1)+18/24 --刷新时间间隔<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> AS select * from t_test;<br />
<br />
也可以手动刷新物化视图：dbms_mview('mv_emp_pk');<br />
<br />
 <img src ="http://www.blogjava.net/ocean07000814/aggbug/342428.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ocean07000814/" target="_blank">非洲小白脸</a> 2011-01-06 15:08 <a href="http://www.blogjava.net/ocean07000814/articles/342428.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>String中特殊字符的替换</title><link>http://www.blogjava.net/ocean07000814/articles/342394.html</link><dc:creator>非洲小白脸</dc:creator><author>非洲小白脸</author><pubDate>Thu, 06 Jan 2011 01:00:00 GMT</pubDate><guid>http://www.blogjava.net/ocean07000814/articles/342394.html</guid><wfw:comment>http://www.blogjava.net/ocean07000814/comments/342394.html</wfw:comment><comments>http://www.blogjava.net/ocean07000814/articles/342394.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ocean07000814/comments/commentRss/342394.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ocean07000814/services/trackbacks/342394.html</trackback:ping><description><![CDATA[String str = "abc'\"\\&amp;/$#&lt;&gt;";<br />
&nbsp;&nbsp;System.out.println(str);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;str = str.replaceAll("[']", "B");<br />
&nbsp;&nbsp;str = str.replaceAll("[\"]", "B");<br />
&nbsp;&nbsp;str = str.replaceAll("[\\\\]", "B");<br />
&nbsp;&nbsp;str = str.replaceAll("[/]", "B");<br />
&nbsp;&nbsp;str = str.replaceAll("[&amp;]", "B");<br />
&nbsp;&nbsp;str = str.replaceAll("[$]", "B");<br />
&nbsp;&nbsp;str = str.replaceAll("[#]", "B");<br />
&nbsp;&nbsp;str = str.replaceAll("[&lt;]", "B");<br />
&nbsp;&nbsp;str = str.replaceAll("[&gt;]", "B");<br />
<br />
两处输出内容：<br />
abc'"\&amp;/$#&lt;&gt;<br />
abcBBBBBBBBB
<img src ="http://www.blogjava.net/ocean07000814/aggbug/342394.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ocean07000814/" target="_blank">非洲小白脸</a> 2011-01-06 09:00 <a href="http://www.blogjava.net/ocean07000814/articles/342394.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Velocity学习</title><link>http://www.blogjava.net/ocean07000814/articles/335784.html</link><dc:creator>非洲小白脸</dc:creator><author>非洲小白脸</author><pubDate>Thu, 21 Oct 2010 06:46:00 GMT</pubDate><guid>http://www.blogjava.net/ocean07000814/articles/335784.html</guid><wfw:comment>http://www.blogjava.net/ocean07000814/comments/335784.html</wfw:comment><comments>http://www.blogjava.net/ocean07000814/articles/335784.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ocean07000814/comments/commentRss/335784.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ocean07000814/services/trackbacks/335784.html</trackback:ping><description><![CDATA[<h3>Velocity用户手册---中文版(学习修改版)</h3>
Velocity的能力远不止web站点开发这个领域，例如，它可以从模板（template）产生SQL和PostScript、XML，它也可以被当
作一个独立工具来产生源代码和报告，或者作为其他系统的集成组件使用。Velocity也可以为Turbine
web开发架构提供模板服务（template
service）。Velocity+Turbine提供一个模板服务的方式允许一个web应用以一个真正的MVC模型进行开发。
<br />
<br />
Velocity能为我们作什么？
<br />
The Mud Store Example
<br />
假设你是一家专门出售Mud的在线商店的页面设计人员，让我们暂且称它为&#8220;在线MUD商店&#8221;。你们的业务很旺，客户下了各种类型和数量的mud订
单。他们都是通过输入用户名和密码后才登陆到你的网站，登陆后就允许他们查看订单并购买更多的mud。现在，一种非常流行的mud正在打折销售。另外有一
些客户规律性的购买另外一种也在打折但是不是很流行的Bright Red
Mud，由于购买的人并不多所以它被安置在页面的边缘。所有用户的信息都是被跟踪并存放于数据库中的，所以某天有一个问题可能会冒出来：为什么不使用
velocity来使用户更好的浏览他们感兴趣的商品呢？
<br />
Velocity使得web页面的客户化工作非常容易。作为一个web site的设计人员，你希望每个用户登陆时都拥有自己的页面。
<br />
你会见了一些公司内的软件工程师，你发现他们每个人都同意客户应该拥有具有个性化的信息。那让我们把软件工程师应该作的事情发在一边，看一看你应该作些什么吧。
<br />
你可能在页面内嵌套如下的VTL声明：
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 </div>
</div>
<ol class="dp-j" start="1">
    <li><span><span>&lt;html&gt;&nbsp;&nbsp;</span></span></li>
    <li><span>&lt;body&gt;&nbsp;&nbsp;</span></li>
    <li><span>Hello&nbsp;$customer.Name!&nbsp;&nbsp;</span></li>
    <li><span>&lt;table&gt;&nbsp;&nbsp;</span></li>
    <li><span>#foreach(&nbsp;$mud&nbsp;in&nbsp;$nudsOnSpecial&nbsp;);&nbsp;&nbsp;&nbsp;</span></li>
    <li><span>#<span class="keyword">if</span><span>&nbsp;(&nbsp;$customer.hasPurchased(&nbsp;$mud&nbsp;);&nbsp;);&nbsp;&nbsp;&nbsp;</span></span></li>
    <li><span>&lt;tr&gt;&lt;td&gt;$flogger.getPromo(&nbsp;$mud&nbsp;);&lt;/td&gt;&lt;/tr&gt;&nbsp;&nbsp;</span></li>
    <li><span>#end&nbsp;&nbsp;</span></li>
    <li><span>#end&nbsp;&nbsp;</span></li>
    <li><span>&lt;/table&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre style="display: none;" name="code" class="java">&lt;html&gt;
&lt;body&gt;
Hello $customer.Name!
&lt;table&gt;
#foreach( $mud in $nudsOnSpecial );
#if ( $customer.hasPurchased( $mud ); );
&lt;tr&gt;&lt;td&gt;$flogger.getPromo( $mud );&lt;/td&gt;&lt;/tr&gt;
#end
#end
&lt;/table&gt;</pre>
<br />
Velocity Template Language(VTL):AN introduction
<br />
VTL意味着提供最简单、最容易并且最整洁的方式合并页面动态内容。
<br />
VTL使用references来在web
site内嵌套动态内容，一个变量就是一种类型的reference。变量是某种类型的refreence，它可以指向java代码中的定义，或者从当前
页面内定义的VTL statement得到值。下面是一个VTL statement的例子，它可以被嵌套到HTML代码中：
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 </div>
</div>
<ol class="dp-j" start="1">
    <li><span><span>#set&nbsp;(&nbsp;$a&nbsp;=&nbsp;&#8220;Velocity&#8221;&nbsp;);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre style="display: none;" name="code" class="java"> #set ( $a = &#8220;Velocity&#8221; );</pre>
<br />
和所有的VTL
statement一样，这个statement以＃字符开始并且包含一个directive：set。当一个在线用户请求你的页面时，Velocity
Templating Engine将查询整个页面以便发现所有＃字符，然后确定哪些是VTL statement，哪些不需要VTL作任何事情。
<br />
＃字符后紧跟一个directive：set时，这个set directive使用一个表达式（使用括号封闭）――一个方程式分配一个值给变量。变量被列在左边，而它的值被列在右边，最后他们之间使用＝号分割。
<br />
在上面的例子中，变量是$a，而它的值是Velocity。和其他的references一样以$字符开始，而值总是以双引号封闭。Velocity中仅有String可以被赋值给变量。
<br />
记住以下的规则：
<br />
使用$字符开始的references用于得到什么；使用#字符开始的directives用于作些什么。
<br />
Hello Velocity World!
<br />
一旦某个变量被分配了一个值，那么你就可以在HTML文件的任何地方引用它。在下面的例子中，一个值被分配给$foo变量，并在其后被引用。
<br />
&lt;html&gt;
<br />
&lt;body&gt;
<br />
#set ( $foo = &#8220;Velocity&#8221; )
<br />
Hello $foo World!
<br />
&lt;/body&gt;
<br />
&lt;/html&gt;
<br />
上面的实现结果是在页面上打印&#8220;Hello Velocity World！&#8221;
<br />
为了使包含VTL directives的statement更具有可读性，我们鼓励你在新行开始每个VTL statement，尽管你不是必须这么作。Set directive将在后面详细描述。
<br />
注释
<br />
单行注释：
<br />
&nbsp; ## This is a single line comment.
<br />
多行注释：
<br />
&nbsp; #*
<br />
&nbsp;&nbsp; Thus begins a multi-line comment. Online visitors won&#8217;t
<br />
&nbsp;&nbsp; see this text because the Velocity Templating Engine will
<br />
ignore it.
<br />
&nbsp; *#
<br />
文档格式：
<br />
&nbsp; #**
<br />
&nbsp;&nbsp; This is a VTL comment block and
<br />
&nbsp;&nbsp; may be used to store such information
<br />
as the document author and versioning
<br />
&nbsp;&nbsp; information:
<br />
&nbsp;&nbsp; @version 5
<br />
&nbsp;&nbsp; @author
<br />
&nbsp; *#
<br />
<br />
References
<br />
在VTL中有三种类型的references：变量(variables)、属性(properties)、方法(methods)。作为一个使
用VTL的页面设计者，你和你的工程师必须就references的名称达成共识，以便你可以在你的template中使用它们。
<br />
Everything coming to and from a reference被作为一个String对象处理。如果有一个对象$foo是一个Integer对象，那么Velocity将调用它的toString()方法将这个对象转型为String类型。
<br />
&nbsp; 变量
<br />
&nbsp; 格式要求同java。
<br />
&nbsp; 属性
<br />
&nbsp; 例子：
<br />
&nbsp;&nbsp;&nbsp; $customer.Address
<br />
&nbsp;&nbsp;&nbsp; $purchase.Total
<br />
$customer.Address有两种含义。它可以表示：查找hashtable对象customer中以Address为关键字的值；也可
以表示调用customer对象的getAddress()方法。当你的页面被请求时，Velocity将确定以上两种方式选用那种，然后返回适当的值。
<br />
方法
<br />
一个方法就是被定义在java中的一段代码，并且它有完成某些有用工作的能力，例如一个执行计算和判断条件是否成立、满足等。方法是一个由$开始并跟随VTL标识符组成的References，一般还包括一个VTL方法体。例如：
<br />
&nbsp; $customer.getAddress()
<br />
&nbsp; $purchase.getTotal()
<br />
&nbsp; $page.setTitle( &#8220;My Home Page&#8221; )
<br />
&nbsp; $person.setAttributes( [&#8220;Strange&#8221;, &#8220;Weird&#8221;, &#8220;Excited&#8221;] )
<br />
前两个例子$customer.getAddress()和$purchase.getTotal()看起来挺想上面的属性$customer.Address 和 $purchase.Total。如果你觉得他们之间有某种联系的话，那你是正确的。
<br />
VTL属性可以作为VTL方法的缩写。$customer.Address属性和使用$customer.getAddress()方法具有相同的效果。如果可能的话使用属性的方式是比较合理的。属性和方法的不同点在于你能够给一个方法指定一个参数列表。
<br />
正式reference标记
<br />
reference的正是格式如下：
<br />
&nbsp; ${mudSlinger}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 变量
<br />
&nbsp; ${customer.Address}&nbsp;&nbsp;&nbsp; 属性
<br />
&nbsp; ${purchase.getTotal()}&nbsp;&nbsp;&nbsp; 方法
<br />
非正是格式更见常用，但是有时还是使用正是格式比较适合。例如：你希望通过一个变量$vice来动态的组织一个字符串。
<br />
&nbsp; Jack is a $vicemaniac.
<br />
本来变量是$vice现在却变成了$vicemaniac，这样Veloctiy就不知道您到底要什么了。所以，应该使用正是格式书写
<br />
&nbsp; Jack is a ${vice}maniac
<br />
现在Velocity知道变量是$vice而不是$vicemaniac。
<br />
Quiet reference notation
<br />
例如：
<br />
&nbsp; &lt;input type=&#8221;text&#8221; name=&#8221;email&#8221; value=&#8221;$email&#8221; /&gt;
<br />
当页面的form被初始加载时，变量$email还没有值，这时你肯定是希望它能够显示一个blank text来代替输出&#8221;$email&#8221;这样的字段。那么使用quiet reference notation就比较合适。
<br />
&nbsp; &lt;input type=&#8221;text&#8221; name=&#8221;email&#8221; value=&#8221;$!email&#8221;/&gt;
<br />
这样文本框的初始值就不会是email而是空值了。
<br />
正式和quiet格式的reference notation也可一同使用，像下面这样：
<br />
&nbsp; &lt;input type=&#8221;text&#8221; name=&#8221;email&#8221; value=&#8221;$!{email}&#8221;/&gt;
<br />
Getting literal
<br />
Velocity使用特殊字符$和#来帮助它工作，所以如果要在template里使用这些特殊字符要格外小心。本节将讨论$字符。
<br />
&nbsp; 货币字符
<br />
在VTL中使用$2.5这样的货币标识是没有问题得的，VTL不会将它错认为是一个reference，因为VTL中的reference总是以一个大写或者小写的字母开始。
<br />
Escaping valid VTL reference
<br />
VTL中使用&#8220;\&#8221;作为逃逸符。
<br />
例如：
<br />
&nbsp; #set( $email = &#8220;foo&#8221; )
<br />
&nbsp; $email
<br />
&nbsp; \$email
<br />
&nbsp; \\$email
<br />
&nbsp; \\\$email
<br />
将render为：
<br />
&nbsp; foo
<br />
&nbsp; $email
<br />
&nbsp; \foo
<br />
&nbsp; \\$email
<br />
如果email变量没有被定义则
<br />
&nbsp; $email
<br />
&nbsp; \$email
<br />
&nbsp; \\$email
<br />
&nbsp; \\\$email
<br />
将被render为：
<br />
&nbsp; $email
<br />
&nbsp; \$email
<br />
&nbsp; \\$email
<br />
&nbsp; \\\$email
<br />
注意：VTL中未被定义的变量将被认为是一个字符串，所以以下例子：
<br />
&nbsp; #set( $foo = &#8220;gibbous&#8221; )
<br />
&nbsp; $moon = $foo
<br />
的输出结果是：
<br />
$moon = gibbous
<br />
Case substitution
<br />
现在你已经对reference比较熟悉了，你可以将他们高效的应用于你的template了。Velocity利用了很多java规范以方便了设计人员的使用。例如：
<br />
&nbsp; $foo
<br />
&nbsp; $foo.getBar()
<br />
&nbsp; ## is the same as
<br />
&nbsp; $foo.Bar
<br />
<br />
&nbsp; $data.getUser(&#8220;jon&#8221;)
<br />
&nbsp; ## is the same as
<br />
&nbsp; $data.User(&#8220;jon&#8221;)
<br />
<br />
&nbsp; $data.getRequest().getServerName()
<br />
&nbsp; # is the same as
<br />
&nbsp; $data.Request.ServerName
<br />
&nbsp; ## is the same as
<br />
&nbsp; ${data.Request.ServerName}
<br />
但是，注意VTL中不会将reference解释为对象的实例变量。例如：$foo.Name将被解释为Foo对象的getName（）方法，而不是Foo对象的Name实例变量。
<br />
Directives
<br />
Reference允许设计者使用动态的内容，而directive使得你可以应用java代码来控制你的显示逻辑，从而达到你所期望的显示效果。
<br />
&nbsp; #set
<br />
&nbsp; #set directive被用于设置一个reference的值。例如：
<br />
&nbsp;&nbsp;&nbsp; #set ( $primate = &#8220;monkey&#8221; )
<br />
&nbsp;&nbsp;&nbsp; #set ( $customer.Behavior = $primate )
<br />
赋值左侧的（LHS）必须是一个变量或者属性reference。右侧（RHS）可以是以下类型中一种：
<br />
l&nbsp; 变量reference
<br />
l&nbsp; String literal
<br />
l&nbsp; 属性reference
<br />
l&nbsp; 方法reference
<br />
l&nbsp; number literal
<br />
l&nbsp; ArrayList
<br />
下面是应用各种类型的RHS的例子：
<br />
&nbsp; ＃set ( $monkey = $bill ) ##变量reference
<br />
&nbsp; ＃set ( $monkey.Friend = &#8220;monica&#8221; ) ##String literal
<br />
&nbsp; ＃set ( $monkey.Blame = $whitehouse.Leak )##属性reference
<br />
&nbsp; ＃set ( $monkey.Plan = $spindoctor.weave($web) )##方法reference
<br />
&nbsp; ＃set ( $monkey.Number = 123 )##Number literal
<br />
&nbsp; ＃set ( $monkey.Say = [&#8220;Not&#8221;, $my, &#8220;fault&#8221;] )##ArrayList
<br />
注意：最后一个例子的取值方法为：$monkey.Say.get(0)
<br />
RHS也可以是一个简单的算术表达式：
<br />
&nbsp; #set ( $value = $foo + 1 )
<br />
&nbsp; #set ( $value = $bar -1 )
<br />
#set ( $value = $foo * $bar )
<br />
#set ( $value = $foo / $bar )
<br />
如果你的RHS是一个null，VTL的处理将比较特殊：它将指向一个已经存在的reference，这对初学者来讲可能是比较费解的。例如：
<br />
&nbsp; #set ( $resut = $query.criteria(&#8220;name&#8221;) )
<br />
&nbsp; The result of the first query is $result
<br />
<br />
&nbsp; #set ( $resut = $query.criteria(&#8220;address&#8221;) )
<br />
&nbsp; The result of the second query is $result
<br />
如果$query.criteria(&#8220;name&#8221;)返回一个&#8220;bill&#8221;，而$query.criteria(&#8220;address&#8221;)返回的是null，则显示的结果如下：
<br />
&nbsp; The result of the first query is bill
<br />
&nbsp; The result of the first query is bill
<br />
看看下面的例子：
<br />
&nbsp; #set( $criteria = ["name", "address"] )
<br />
#foreach( $criterion in $criteria )
<br />
#set( $result = $query.criteria($criterion) )
<br />
&nbsp; #if( $result )
<br />
&nbsp; Query was successful
<br />
&nbsp;&nbsp;&nbsp;&nbsp; #end
<br />
#end
<br />
在上面的例子中，程序将不能智能的根据$result的值决定查询是否成功。在$result被#set后（added to the
context），它不能被设置回null（removed from the
context）。打印的结果将显示两次查询结果都成功了，但是实际上有一个查询是失败的。
<br />
为了解决以上问题我们可以通过预先定义的方式：
<br />
&nbsp; #set( $criteria = [&#8220;name&#8221;, &#8220;address&#8221;] )
<br />
&nbsp; #foreach( $criterion in $criteria )
<br />
&nbsp;&nbsp;&nbsp; #set( $result = false )
<br />
&nbsp;&nbsp;&nbsp; #set( $result = $query.criteria( $criterion ) )
<br />
&nbsp;&nbsp;&nbsp; #if( $result )
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Query was successful
<br />
&nbsp;&nbsp;&nbsp; #end
<br />
&nbsp; #end
<br />
&nbsp; String Literals
<br />
&nbsp; 当你使用#set directive，String literal封闭在一对双引号内。
<br />
&nbsp;&nbsp;&nbsp; #set ( $directoryRoot = &#8220;www&#8221; )
<br />
&nbsp;&nbsp;&nbsp; #set ( $templateName = &#8220;index.vm&#8221; )
<br />
&nbsp;&nbsp;&nbsp; #set ( $template = &#8220;$directoryRoot/$tempateName&#8221; )
<br />
&nbsp;&nbsp;&nbsp; $template
<br />
&nbsp; 上面这段代码的输出结果为：www/index.vm
<br />
&nbsp; 但是，当string literal被封装在单引号内时，它将不被解析：
<br />
&nbsp;&nbsp;&nbsp; #set ( $foo = &#8220;bar&#8221; )
<br />
&nbsp;&nbsp;&nbsp; $foo
<br />
&nbsp;&nbsp;&nbsp; #set ( $blargh = &#8216;$foo&#8217; )
<br />
&nbsp; 结果：
<br />
&nbsp;&nbsp;&nbsp; bar
<br />
&nbsp;&nbsp;&nbsp; $foo
<br />
&nbsp; 上面这个特性可以通过修改velocity.properties文件的stringliterals.interpolate = false的值来改变上面的特性是否有效。
<br />
条件语句
<br />
&nbsp; if/elseif/else
<br />
当一个web页面被生成时使用Velocity的#if directrive，如果条件成立的话可以在页面内嵌入文字。例如：
<br />
&nbsp; #if ( $foo )
<br />
&nbsp;&nbsp;&nbsp; &lt;strong&gt;Velocity!&lt;/strong&gt;
<br />
&nbsp; #end
<br />
上例中的条件语句将在以下两种条件下成立：
<br />
l&nbsp; $foo是一个boolean型的变量，且它的值为true
<br />
l&nbsp; $foo变量的值不为null
<br />
这里需要注意一点：Velocity context仅仅能够包含对象，所以当我们说&#8220;boolean&#8221;时实际上代表的时一个Boolean对象。即便某个方法返回的是一个boolean值，Velocity也会利用内省机制将它转换为一个Boolean的相同值。
<br />
如果条件成立，那么#if和#end之间的内容将被显示。
<br />
#elseif和#else元素可以同#if一同使用。例如：
<br />
&nbsp; #if( $foo &lt; 10 )
<br />
&nbsp;&nbsp;&nbsp; &lt;strong&gt; Go North &lt;/strong&gt;
<br />
&nbsp; #elseif( $foo == 10 )
<br />
&nbsp;&nbsp;&nbsp; &lt;strong&gt; Go East &lt;/strong&gt;
<br />
&nbsp; #elseif( $foo == 6 )
<br />
&nbsp;&nbsp;&nbsp; &lt;strong&gt; Go South &lt;/strong&gt;
<br />
&nbsp; #else
<br />
&nbsp;&nbsp;&nbsp; &lt;strong&gt; Go West &lt;/strong&gt;
<br />
&nbsp; #end
<br />
注意这里的Velocity的数字是作为Integer来比较的――其他类型的对象将使得条件为false，但是与java不同它使用&#8220;＝＝&#8221;来比较两个值，而且velocity要求等号两边的值类型相同。
<br />
关系、逻辑运算符
<br />
Velocity中使用等号操作符判断两个变量的关系。例如：
<br />
#set ( $foo = &#8220;deoxyribonucleic acid&#8221; )
<br />
#set ( $bar = &#8220;ribonucleic acid&#8221; )
<br />
#if ( $foo == $foo )
<br />
&nbsp; In this case it&#8217;s clear they aren&#8217;t equivalent.So&#8230;
<br />
#else
<br />
&nbsp; They are not equivalent and this will be the output.
<br />
#end
<br />
<br />
Velocity有AND、OR和NOT逻辑运算符。下面是一些例子：
<br />
&nbsp; ## logical AND
<br />
&nbsp; #if( $foo &amp;&amp; $bar )
<br />
&nbsp;&nbsp;&nbsp; &lt;strong&gt; This AND that &lt;/strong&gt;
<br />
&nbsp; #end
<br />
<br />
&nbsp; ## logical OR
<br />
&nbsp; #if ( $foo || $bar )
<br />
&nbsp;&nbsp;&nbsp; &lt;strong&gt;This OR That &lt;/strong&gt;
<br />
&nbsp; #end
<br />
<br />
&nbsp; ##logical NOT
<br />
&nbsp; #if ( !$foo )
<br />
&nbsp;&nbsp;&nbsp; &lt;strong&gt; NOT that &lt;/strong&gt;
<br />
&nbsp; #end
<br />
循环
<br />
&nbsp; Foreach循环
<br />
&nbsp; 例子：
<br />
&nbsp;&nbsp;&nbsp; &lt;ul&gt;
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #foreach ( $product in $allProducts )
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li&gt; $product &lt;/li&gt;
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #end
<br />
&nbsp;&nbsp;&nbsp; &lt;/ul&gt;
<br />
&nbsp; 每次循环$allProducts中的一个值都会赋给$product变量。
<br />
$allProducts可以是一个Vector、Hashtable或者Array。分配给$product的值是一个java对象，并且可以
通过变量被引用。例如：如果$product是一个java的Product类，并且这个产品的名字可以通过调用他的getName（）方法得到。
<br />
现在我们假设$allProducts是一个Hashtable，如果你希望得到它的key应该像下面这样：
<br />
&lt;ul&gt;
<br />
#foreach ( $key in $allProducts.keySet() )
<br />
&lt;li&gt;Key: $key -&gt; Value: $allProducts.get($key) &lt;/li&gt;
<br />
#end
<br />
&lt;/ul&gt;
<br />
<br />
Velocity还特别提供了得到循环次数的方法，以便你可以像下面这样作：
<br />
&lt;table&gt;
<br />
#foreach ( $customer in $customerList )
<br />
&lt;tr&gt;&lt;td&gt;$velocityCount&lt;/td&gt;&lt;td&gt;$customer.Name&lt;/td&gt;&lt;/tr&gt;
<br />
#end
<br />
&lt;/table&gt;
<br />
$velocityCount变量的名字是Velocity默认的名字，你也可以通过修改velocity.properties文件来改变它。
默认情况下，计数从&#8220;1&#8221;开始，但是你可以在velocity.properties设置它是从&#8220;1&#8221;还是从&#8220;0&#8221;开始。下面就是文件中的配置：
<br />
&nbsp; # Default name of loop counter
<br />
&nbsp; # variable reference
<br />
&nbsp; directive.foreach.counter.name = velocityCount
<br />
<br />
&nbsp; # Default starting value of the loop
<br />
&nbsp; # counter variable reference
<br />
&nbsp; directive.foreach.counter.initial.value = 1
<br />
<br />
include
<br />
#include script element允许模板设计者引入本地文件。被引入文件的内容将不会通过模板引擎被render。为了安全的原因，被引入的本地文件只能在TEMPLATE_ROOT目录下。
<br />
&nbsp; #inclued ( &#8220;one.txt&#8221; )
<br />
如果您需要引入多个文件，可以用逗号分隔就行：
<br />
&nbsp; #include ( &#8220;one.gif&#8221;, &#8220;two.txt&#8221;, &#8220;three.htm&#8221; )
<br />
在括号内可以是文件名，但是更多的时候是使用变量的：
<br />
&nbsp; #inclue ( &#8220;greetings.txt&#8221;, $seasonalstock )
<br />
<br />
parse
<br />
#parse script element允许模板设计者一个包含VTL的本地文件。Velocity将解析其中的VTL并render模板。
<br />
&nbsp; #parse( &#8220;me.vm&#8221; )
<br />
就像#include，#parse接受一个变量而不是一个模板。任何由#parse指向的模板都必须包含在TEMPLATE_ROOT目录下。与#include不同的是，#parse只能指定单个对象。
<br />
你可以通过修改velocity.properties文件的parse_direcive.maxdepth的值来控制一个template可以包含的最多#parse的个数――默认值是10。#parse是可以递归调用的，例如：如果dofoo.vm包含如下行：
<br />
&nbsp; Count down.
<br />
&nbsp; #set ( $count = 8 )
<br />
&nbsp; #parse ( &#8220;parsefoo.vm&#8221; )
<br />
&nbsp; All done with dofoo.vm!
<br />
那么在parsefoo.vm模板中，你可以包含如下VTL：
<br />
&nbsp; $count
<br />
&nbsp; #set ( $count = $count &#8211; 1 )
<br />
&nbsp; #if ( $count &gt; 0 )
<br />
&nbsp;&nbsp;&nbsp; #parse( &#8220;parsefoo.vm&#8221; )
<br />
&nbsp; #else
<br />
&nbsp;&nbsp;&nbsp; All done with parsefoo.vm!
<br />
&nbsp; #end
<br />
的显示结果为：
<br />
&nbsp; Count down.
<br />
&nbsp; 8
<br />
&nbsp; 7
<br />
&nbsp; 6
<br />
&nbsp; 5
<br />
&nbsp; 4
<br />
&nbsp; 3
<br />
&nbsp; 2
<br />
&nbsp; 1
<br />
&nbsp; 0
<br />
&nbsp; All done with parsefoo.vm!
<br />
All done with dofoo.vm!
<br />
<br />
Stop
<br />
#stop script element允许模板设计者停止执行模板引擎并返回。把它应用于debug是很有帮助的。
<br />
&nbsp; #stop
<br />
<br />
Velocimacros
<br />
#macro script element允许模板设计者定义一段可重用的VTL template。例如：
<br />
&nbsp; #macro ( d )
<br />
&nbsp; &lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
<br />
&nbsp; #end
<br />
在上面的例子中Velocimacro被定义为d，然后你就可以在任何VTL directive中以如下方式调用它：
<br />
&nbsp; #d()
<br />
当你的template被调用时，Velocity将用&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;替换为#d()。
<br />
每个Velocimacro可以拥有任意数量的参数――甚至0个参数，虽然定义时可以随意设置参数数量，但是调用这个Velocimacro时必须指定正确的参数。下面是一个拥有两个参数的Velocimacro，一个参数是color另一个参数是array：
<br />
&nbsp; #macro ( tablerows $color $somelist )
<br />
&nbsp; #foreach ( $something in $somelist )
<br />
&nbsp;&nbsp;&nbsp; &lt;tr&gt;&lt;td bgcolor=$color&gt;$something&lt;/td&lt;/tr&gt;
<br />
&nbsp; #end
<br />
&nbsp; #end
<br />
调用#tablerows Velocimacro：
<br />
&nbsp; #set ( $greatlakes = [ &#8220;Superior&#8221;, &#8220;Michigan&#8221;, &#8220;Huron&#8221;, &#8220;Erie&#8221;, &#8220;Ontario&#8221; ] )
<br />
&nbsp; #set ( $color = &#8220;blue&#8221; )
<br />
&nbsp; &lt;table&gt;
<br />
&nbsp;&nbsp;&nbsp; #tablerows( $color $greatlakes )
<br />
&nbsp; &lt;/table&gt;
<br />
经过以上的调用将产生如下的显示结果：
<br />
&nbsp; &lt;table&gt;
<br />
&nbsp;&nbsp;&nbsp; &lt;tr&gt;&lt;td bgcolor=&#8221; blue&#8221;&gt; Superior &lt;/td&gt;&lt;/tr&gt;
<br />
&nbsp;&nbsp;&nbsp; &lt;tr&gt;&lt;td bgcolor=&#8221; blue&#8221;&gt; Michigan &lt;/td&gt;&lt;/tr&gt;
<br />
&nbsp;&nbsp;&nbsp; &lt;tr&gt;&lt;td bgcolor=&#8221; blue&#8221;&gt; Huron &lt;/td&gt;&lt;/tr&gt;
<br />
&nbsp;&nbsp;&nbsp; &lt;tr&gt;&lt;td bgcolor=&#8221; blue&#8221;&gt; Erie &lt;/td&gt;&lt;/tr&gt;
<br />
&nbsp;&nbsp;&nbsp; &lt;tr&gt;&lt;td bgcolor=&#8221; blue&#8221;&gt; Ontario &lt;/td&gt;&lt;/tr&gt;
<br />
&nbsp; &lt;/table&gt;
<br />
Velocimacros可以在Velocity模板内实现行内定义（inline），也就意味着同一个web
site内的其他Velocity模板不可以获得Velocimacros的定义。定义一个可以被所有模板共享的Velocimacro显然是有很多好处
的：它减少了在一大堆模板中重复定义的数量、节省了工作时间、减少了出错的几率、保证了单点修改。
<br />
上面定义的#tablerows( $color $list
)Velocimacro被定义在一个Velocimacros模板库(在velocity.properties中定义)里，所以这个macro可以在
任何规范的模板中被调用。它可以被多次应用并且可以应用于不同的目的。例如下面的调用：
<br />
&nbsp; #set ( $parts = [ &#8220;volva&#8221;, &#8220;stipe&#8221;, &#8220;annulus&#8221;, &#8220;gills&#8221;, &#8220;pileus&#8221; ] )
<br />
&nbsp; #set ( $cellbgcol = &#8220;#CC00FF&#8221; )
<br />
&nbsp; &lt;table&gt;
<br />
&nbsp;&nbsp;&nbsp; #tablerows( $cellbgcol $parts )
<br />
&nbsp; &lt;/table&gt;
<br />
上面VTL将产生如下的输出：
<br />
&nbsp; &lt;table&gt;
<br />
&nbsp;&nbsp;&nbsp; &lt;tr&gt;&lt;td bgcolor=&#8221;#CC00FF&#8221;&gt; volva &lt;/td&lt;/tr&gt;
<br />
&nbsp;&nbsp;&nbsp; &lt;tr&gt;&lt;td bgcolor=&#8221;#CC00FF&#8221;&gt; stipe &lt;/td&lt;/tr&gt;
<br />
&nbsp;&nbsp;&nbsp; &lt;tr&gt;&lt;td bgcolor=&#8221;#CC00FF&#8221;&gt; annulus &lt;/td&lt;/tr&gt;
<br />
&nbsp;&nbsp;&nbsp; &lt;tr&gt;&lt;td bgcolor=&#8221;#CC00FF&#8221;&gt; gills &lt;/td&lt;/tr&gt;
<br />
&nbsp;&nbsp;&nbsp; &lt;tr&gt;&lt;td bgcolor=&#8221;#CC00FF&#8221;&gt; pileus &lt;/td&lt;/tr&gt;
<br />
&nbsp; &lt;/table&gt;
<br />
&nbsp; Velocimacro arguments
<br />
&nbsp; Velocimacro可以使用以下任何元素作为参数：
<br />
l&nbsp; Reference：任何以$开头的reference
<br />
l&nbsp; String literal：
<br />
l&nbsp; Number literal：
<br />
l&nbsp; IntegerRange：[1&#8230;.3]或者[$foo&#8230;.$bar]
<br />
l&nbsp; 对象数组：[&#8220;a&#8221;,&#8221;b&#8221;,&#8221;c&#8221;]
<br />
l&nbsp; boolean值：true、false
<br />
当将一个reference作为参数传递给Velocimacro时，请注意reference作为参数时是以名字的形式传递的。这就意味着参数
的值在每次Velocimacro内执行时才会被产生。这个特性使得你可以将一个方法调用作为参数传递给Velocimacro，而每次
Velocimacro执行时都是通过这个方法调用产生不同的值来执行的。例如：
<br />
&nbsp; #macro ( callme $a )
<br />
&nbsp;&nbsp;&nbsp; $a $a $a
<br />
&nbsp; #end
<br />
&nbsp; #callme( $foo.bar() )
<br />
执行的结果是：reference $foo的bar（）方法被执行了三次。
<br />
如果你不需要这样的特性可以通过以下方法：
<br />
&nbsp; #set ( $myval = $foo.bar() )
<br />
&nbsp; #callme ( $myval )
<br />
<br />
Velocimacro properties
<br />
Velocity.properties文件中的某几行能够使Velocimacros的实现更加灵活。注意更多的内容可以看Developer Guide。
<br />
Velocity.properties文件中的velocimacro.libraary：一个以逗号分隔的模板库列表。默认情况下，velocity查找唯一的一个库：VM_global_library.vm。你可以通过配置这个属性来指定自己的模板库。
<br />
Velocity.properties文件中的velocimacro.permissions.allow.inline属性：有两个可选的
值true或者false，通过它可以确定Velocimacros是否可以被定义在regular
template内。默认值是ture――允许设计者在他们自己的模板中定义Velocimacros。
<br />
Velocity.properties文件中的
<br />
velocimacro.permissions.allow.inline.replace.global属性有两个可选值true和
false，这个属性允许使用者确定inline的Velocimacro定义是否可以替代全局Velocimacro定义（比如在
velocimacro.library属性中指定的文件内定义的Velocimacro）。默认情况下，此值为false。这样就阻止本地
Velocimacro定义覆盖全局定义。
<br />
Velocity.properties文件中的
<br />
velocimacro.permissions.allow.inline.local.scale属性也是有true和false两个可选
值，默认是false。它的作用是用于确定你inline定义的Velocimacros是否仅仅在被定义的template内可见。换句话说，如果这个
属性设置为true，一个inline定义的Velocimacros只能在定义它的template内使用。你可以使用此设置实现一个奇妙的VM敲
门：a template can define a private implementation of the second VM that
will be called by the first VM when invoked by that template. All other
templates are unaffected。
<br />
Velocity.properties文件中的velocimacro.context.localscope属性有true和false两
个可选值，默认值为false。当设置为true时，任何在Velocimacro内通过#set()对context的修改被认为是针对此
velocimacro的本地设置，而不会永久的影响内容。
<br />
Velocity.properties文件中的velocimacro.library.autoreload属性控制
Velocimacro库的自动加载。默认是false。当设置为ture时，对于一个Velocimacro的调用将自动检查原始库是否发生了变化，如
果变化将重新加载它。这个属性使得你可以不用重新启动servlet容器而达到重新加载的效果，就像你使用regular模板一样。这个属性可以使用的前
提就是resource loader缓存是off状态（file.resource.loader.cache =
false）。注意这个属性实际上是针对开发而非产品的。
<br />
Velocimacro Trivia
<br />
Velocimacro必须被定义在他们被使用之前。也就是说，你的#macro()声明应该出现在使用Velocimacros之前。
<br />
特别要注意的是，如果你试图#parse()一个包含#macro()的模板。因为#parse()发生在运行期，但是解析器在
parsetiem决定一个看似VM元素的元素是否是一个VM元素，这样#parse()-ing一组VM声明将不按照预期的样子工作。为了得到预期的结
果，只需要你简单的使用velocimacro.library使得Velocity在启动时加载你的VMs。
<br />
Escaping VTL directives
<br />
VTL directives can be escaped with &#8220;\&#8221;号，使用方式跟VTL的reference使用逃逸符的格式差不多。
<br />
&nbsp; ## #include( &#8220;a.txt&#8221; ) renders as &lt;ontents of a.txt&gt;(注释行)
<br />
&nbsp; #include( &#8220;a.txt&#8221; )
<br />
<br />
&nbsp; ## \#include( &#8220;a.txt&#8221; ) renders as \#include( &#8220;a.txt&#8221; )
<br />
&nbsp; \#include( &#8220;a.txt&#8221; )
<br />
<br />
&nbsp; ## \\#include ( &#8220;a.txt&#8221; ) renders as \&lt;contents of a.txt&gt;
<br />
&nbsp; \\#include( &#8220;a.txt&#8221; )
<br />
在对在一个directive内包含多个script元素的VTL directives使用逃逸符时要特别小心（比如在一个if-else-end statement内）。下面是VTL的if-statement的典型应用：
<br />
&nbsp; #if ( $jazz )
<br />
&nbsp;&nbsp;&nbsp; Vyacheslav Ganelin
<br />
&nbsp; #end
<br />
如果$jazz是ture，输出将是：
<br />
&nbsp; Vyacheslav Ganelin
<br />
如果$jazz是false，将没有输出。使用逃逸符将改变输出。考虑一下下面的情况：
<br />
&nbsp; \#if ( $jazz )
<br />
&nbsp;&nbsp;&nbsp; Vyacheslav Ganelin
<br />
&nbsp; \#end
<br />
现在无论$jazz是true还是false，输出结果都是：
<br />
&nbsp; #if ( $jazz )
<br />
&nbsp;&nbsp;&nbsp; Vyacheslav Ganelin
<br />
&nbsp; #end
<br />
事实上，由于你使用了逃逸符，$jazz根本就没有被解析为boolean型值。在逃逸符前使用逃逸符是合法的，例如：
<br />
&nbsp; \\#if ( $jazz )
<br />
&nbsp;&nbsp;&nbsp; Vyacheslav Ganelin
<br />
&nbsp; \\#end
<br />
以上程序的显示结果为：
<br />
&nbsp; \ Vyacheslav Ganelin
<br />
&nbsp; \
<br />
但是如果$jazz为false，那么将没有输出。（书上说会没有输出，但是我觉得应该还有有&#8220;\&#8221;字符被输出。）
<br />
VTL：Formatting issues
<br />
尽管在此用户手册中VTL通常都开始一个新行，如下所示：
<br />
&nbsp; #set ( $imperial = [ &#8220;Munetaka&#8221;, &#8220;Koreyasu&#8221;, &#8220;Hisakira&#8221;, &#8220;Morikune&#8221; ] )
<br />
&nbsp; #foreach ( $shogun in $imperial )
<br />
&nbsp;&nbsp;&nbsp; $shogun
<br />
&nbsp; #end
<br />
但是像下面这种写法也是可以的：
<br />
&nbsp; Send me #set($foo = [&#8220;$10 and&#8221;,&#8221;a cake&#8221;])#foreach($a in $foo)$a #end please.
<br />
上面的代码可以被改写为：
<br />
&nbsp; Send me
<br />
&nbsp; #set ( $foo = [&#8220;$10 and &#8220;,&#8221;a cake&#8221;] )
<br />
&nbsp; #foreach ( $a in $foo )
<br />
&nbsp;&nbsp;&nbsp; $a
<br />
&nbsp; #end
<br />
&nbsp; please.
<br />
或者
<br />
&nbsp; Send me
<br />
&nbsp; #set($foo = [&#8220;$10 and &#8220;,&#8221;a cake&#8221;])
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #foreach （$a in $foo ）$a
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #end please.
<br />
这两种的输出结构将一样。
<br />
其他特性和杂项
<br />
&nbsp; math&nbsp;&nbsp; 在模板中可以使用Velocity内建的算术函数，如：加、减、乘、除
<br />
&nbsp;&nbsp;&nbsp; #set ( $foo = $bar + 3 )
<br />
&nbsp;&nbsp;&nbsp; #set ( $foo = $bar - 4 )
<br />
&nbsp;&nbsp;&nbsp; #set ( $foo = $bar * 6 )
<br />
&nbsp;&nbsp;&nbsp; #set ( $foo = $bar / 2 )
<br />
&nbsp; 当执行除法时将返回一个Integer类型的结果。而余数你可以使用%来得到：
<br />
&nbsp;&nbsp;&nbsp; #set ( $foo = $bar % 5 )
<br />
在Velocity内使用数学计算公式时，只能使用像-n,-2,-1,0,1,2,n这样的整数，而不能使用其它类型数据。当一个非整型的对象被使用时它将被logged并且将以null作为输出结果。
<br />
Range Operator
<br />
Range operator可以被用于与#set和#foreach statement联合使用。对于处理一个整型数组它是很有用的，Range operator具有以下构造形式：
<br />
&nbsp; [n..m]
<br />
m和n都必须是整型，而m是否大于n则无关紧要。例子：
<br />
&nbsp; First example:
<br />
&nbsp; #foreach ( $foo in [1..5] )
<br />
&nbsp;&nbsp;&nbsp; $foo
<br />
&nbsp; #end
<br />
<br />
&nbsp; Second example:
<br />
&nbsp; #foreach ( $bar in [2..-2] )
<br />
&nbsp;&nbsp;&nbsp; $bar
<br />
&nbsp; #end
<br />
<br />
&nbsp; Third example:
<br />
&nbsp; #set ( $arr = [0..1] )
<br />
&nbsp; #foreach ( $i in $arr )
<br />
&nbsp;&nbsp;&nbsp; $i
<br />
&nbsp; #end
<br />
<br />
&nbsp; Fourth example:
<br />
&nbsp; [1..3]
<br />
上面四个例子的输出结果为：
<br />
&nbsp; First example：
<br />
&nbsp; 1 2 3 4 5
<br />
<br />
&nbsp; Second example：
<br />
&nbsp; 2 1 0 -1 -2
<br />
<br />
&nbsp; Third example：
<br />
&nbsp; 0 1
<br />
<br />
&nbsp; Fourth example：
<br />
&nbsp; [1..3]
<br />
注意：range operator只在#set和#foreach中有效。
<br />
Advanced Issue：Escaping and！
<br />
当一个reference被&#8220;！&#8221;分隔时，并且在它之前有逃逸符时，reference将以特殊的方式处理。注意这种方式与标准的逃逸方式时不同的。对照如下：
<br />
#set ( $foo = &#8220;bar&#8221; )
<br />
特殊形式&nbsp; 标准格式
<br />
Render前&nbsp; Render后&nbsp; Render前&nbsp; Render后
<br />
$\!foo&nbsp; $!foo&nbsp; \$foo&nbsp; \$foo
<br />
$\!{foo}&nbsp; $!{foo}&nbsp; \$!foo&nbsp; \$!foo
<br />
$\\!foo&nbsp; $\!foo&nbsp; \$!{foo}&nbsp; \$!{foo}
<br />
$\\\!foo&nbsp; $\\!foo&nbsp; \\$!{foo}&nbsp; \bar
<br />
Velocimacro杂记
<br />
&nbsp; Can I user a directive or another VM as an argument to a VM?
<br />
&nbsp; 例如：#center ( #bold( &#8220;hello&#8221; ) )
<br />
&nbsp; 不可以。一个directive的参数使用另外一个directive是不合法的。
<br />
&nbsp; 但是，还是有些事情你可以作的。最简单的方式就是使用双引号：
<br />
&nbsp;&nbsp;&nbsp; #set ( $stuff = &#8220;#bold( &#8216;hello&#8217; )&#8221; )
<br />
&nbsp;&nbsp;&nbsp; #center ( $stuff )
<br />
&nbsp; 上面的格式也可以缩写为一行：
<br />
&nbsp;&nbsp;&nbsp; #center ( &#8220;#bold( &#8216;hello&#8217; ) )
<br />
请注意在下面的例子中参数被evaluated在Velocimacro内部，而不是在calling level。例子：
<br />
&nbsp; #macro ( inner $foo )
<br />
&nbsp;&nbsp;&nbsp; inner : $foo
<br />
&nbsp; #end
<br />
<br />
&nbsp; #macro ( outer $foo )
<br />
&nbsp;&nbsp;&nbsp; #set ( $bar = &#8220;outerlala&#8221; )
<br />
&nbsp;&nbsp;&nbsp; outer : $foo
<br />
&nbsp; #end
<br />
&nbsp;
<br />
&nbsp; #set ( $bar = &#8216;calltimelala&#8217; )
<br />
&nbsp; #outer( &#8220;#inner($bar)&#8221; )
<br />
输出结果为：
<br />
&nbsp; outer : inner : outerlala
<br />
记住Veloctiy的特性：参数的传递是By Name的。例如：
<br />
&nbsp; #macro ( foo $color )
<br />
&nbsp;&nbsp;&nbsp; &lt;tr bgcolor = $color &gt;&lt;td&gt;Hi&lt;/td&gt;&lt;/tr&gt;
<br />
&nbsp;&nbsp;&nbsp; &lt;tr bgcolor = $color &gt;&lt;td&gt;There&lt;/td&gt;&lt;/tr&gt;
<br />
&nbsp; #end
<br />
<br />
&nbsp; #foo ( $bar.rowColor() )
<br />
以上代码将导致rowColor()方法两次调用，而不是一次。为了避免这种现象的出现，我们可以按照下面的方式执行：
<br />
&nbsp; #set ( $color = $bar.rowColor() )
<br />
&nbsp; #foo ( $color )
<br />
can I register velocimacros via #parse()?
<br />
目前，Velocimacros必须在第一次被模板调用前被定义。这就意味着你的#macro()声明应该出现在使用Velocimacros之前。
<br />
如果你试图#parse()一个包含#macro()
directive的模板，这一点是需要牢记的。因为#parse()发生在运行期，但是解析器在parsetiem决定一个看似VM元素的元素是否是一
个VM元素，这样#parse()-ing一组VM声明将不按照预期的样子工作。为了得到预期的结果，只需要你简单的使用
velocimacro.library使得Velocity在启动时加载你的VMs。
<br />
What is velocimacro autoreloading？
<br />
velocimacro.library.autoreload是专门为开发而非产品使用的一个属性。此属性的默认值是false。
<br />
String concatenation
<br />
开发人员最常问的问题是我如何作字符拼接？在java中是使用&#8220;＋&#8221;号来完成的。
<br />
在VTL里要想实现同样的功能你只需要将需要联合的reference放到一起就行了。例如：
<br />
#set ( $size = &#8220;Big&#8221; )
<br />
#set ( $name = &#8220;Ben&#8221; )
<br />
The clock is $size$name.
<br />
输出结果将是：The clock is BigBen.。更有趣的情况是：
<br />
&nbsp; #set ( $size = &#8220;Big&#8221; )
<br />
&nbsp; #set ( $name = &#8220;Ben&#8221; )
<br />
&nbsp; #set ( $clokc = &#8220;$size$name&#8221; )
<br />
&nbsp; The clock is $clock.
<br />
上例也会得到同样的结果。最后一个例子，当你希望混合固定字段到你的reference时，你需要使用标准格式：
<br />
&nbsp; #set ( $size = &#8220;Big&#8221; )
<br />
&nbsp; #set ( $name = &#8220;Ben&#8221; )
<br />
&nbsp; #set ( $clock = &#8220;${size}Tall$name&#8221; )
<br />
&nbsp; The clock is $clock.
<br />
输出结果是：The clock is BigTallBen.。使用这种格式主要是为了使得$size不被解释为$sizeTall。
<br />
<br />
几个写法汇总：
<br />
Java代码 <br />
<ol class="dp-j" start="1">
    <li><span><span>--关于链接的写法--&nbsp;&nbsp;</span></span></li>
    <li><span>&lt;a&nbsp;href=<span class="string">"abc.jsp?num=$var"</span><span>&gt;url&lt;/a&gt; <br />
    </span></span></li>
</ol>
<img src ="http://www.blogjava.net/ocean07000814/aggbug/335784.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ocean07000814/" target="_blank">非洲小白脸</a> 2010-10-21 14:46 <a href="http://www.blogjava.net/ocean07000814/articles/335784.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Tomcat中部署Java Web应用程序(jar命令打war包)</title><link>http://www.blogjava.net/ocean07000814/articles/331694.html</link><dc:creator>非洲小白脸</dc:creator><author>非洲小白脸</author><pubDate>Fri, 10 Sep 2010 09:47:00 GMT</pubDate><guid>http://www.blogjava.net/ocean07000814/articles/331694.html</guid><wfw:comment>http://www.blogjava.net/ocean07000814/comments/331694.html</wfw:comment><comments>http://www.blogjava.net/ocean07000814/articles/331694.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ocean07000814/comments/commentRss/331694.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ocean07000814/services/trackbacks/331694.html</trackback:ping><description><![CDATA[<p><font size="4">让大家久等了。今天给大家介绍怎样在Tomcat5.5.9中部署Java Web应用程序。本文的重点是如何<font color="#ff0000">部署</font>，所以暂且先不介绍怎样开发Web应用程序和怎样启动Tomcat服务器，也不考虑使用的什么开发工具，总之在练习本文所说的例子之前，你应该有一个Java Web应用程序。本文假定Web应用程序的根目录为<font color="#ff0000">PetWeb</font>。而且存放在<font color="#ff0000">F:\</font>下。下文中<code><font>$CATALINA_HOME指的是Tomcat<font color="#ff0000">根</font>目录。</font></code><br />
<br />
&nbsp;&nbsp;&nbsp; 在Tomcat中部署Java Web应用程序有两种方式：静态部署和动态部署。<br />
一、静态部署<br />
&nbsp;&nbsp;&nbsp;&nbsp; 静态部署指的是我们在服务器启动之前部署我们的程序，只有当服务器启动之后，我们的Web应用程序才能访问。以下3中方式都可以部署：<br />
&nbsp;&nbsp;&nbsp; 1、将PetWeb目录拷贝到</font><code><font size="4">$CATALINA_HOME\webapps下，然后启动服务器就可以了。这种方式比较简单，访问地址如下：</font><a href="http://localhost:8080/PetWeb/"><font size="4">http://localhost:8080/<font color="#ff0000">PetWeb/</font></font></a><br />
<font size="4">&nbsp;&nbsp; 2、这种方式可以不必将PetWeb目录拷贝到webapps下，直接在F:\部署。方法如下，更改</font><code><font size="4">$CATALINA_HOME\conf\server.xml文件，在&lt;host&gt;标签内添加&lt;Context&gt;标签，内容如下：<br />
&lt;Context docBase="F:/PetWeb" reloadable="false" path="/Pet"/&gt;<br />
其
中reloadable="false"表示当应用程序中的内容发生更改之后服务器不会自动加载，这个属性在开发阶段通常都设为true，方便开发，在发
布阶段应该设置为false，提高应用程序的访问速度。docBase为路径，可以使用绝对路径，也可以使用相对路径，相对路径相对于webapps。
path属性的值是访问时的根地址。访问地址如下：</font><a href="http://localhost:8080/Pet/"><font size="4">http://localhost:8080/<font color="#ff0000">Pet/</font></font></a><br />
<font size="4">&nbsp;&nbsp;&nbsp;3、这种方式和第二种方式差不多，但是不是在Server.xml文件中添加Context标签，而是在<code>$CATALINA_HOME</code>\conf\Catalina\localhost中添加一个xml文件，如Pet.xml，内容如下：<br />
</font></code></code><font size="4">&lt;Context docBase="F:/PetWeb" reloadable="false" /&gt;大家可能发现和第二种方式差不多，但是缺少了path属性，这种方式服务器会使用.xml的名字作为path属性的值。访问地址如下：</font><a href="http://localhost:8080/Pet/"><font size="4">http://localhost:8080/<font color="#ff0000">Pet/</font></font></a><br />
<font size="4">&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 我们刚才是将PetWeb文件夹部署在了服务器中，我们知道可以将Web应用程序的<font color="#ff0000">内容</font>打成<font color="#ff0000">.war</font></font><font size="4"><font color="#000000">包，然后在部署在服务器上。打包请参考如下步骤：<br />
&nbsp;&nbsp;&nbsp; 1、打开命令提示符（Start--&gt;Run--&gt;cmd）<br />
&nbsp;&nbsp;&nbsp; 2、设置jdk环境变量（如果我教过的学生不会配置，以后别说孙老师教过你）<br />
&nbsp;&nbsp;&nbsp; 3、在命令提示符中进入F:\PetWeb文件后，键入如下命令：<br />
</font></font><font size="4"><font color="#ff0000">jar cvf Pet.war */.</font></font><font size="4"><font color="#ff0000">&nbsp; </font></font><font size="4"><font color="#000000">应</font></font><font size="4"><font color="#000000">这样在当前目录下</font></font><font size="4"><font color="#000000">该有Pet.war文件。其中..表示当前目录的父目录。<br />
&nbsp;&nbsp;&nbsp;&nbsp;部
署Pet.war文件非常简单，将刚才有docBase="F:\PetWeb"更改为docBase="F:\Pet.war"或者直接将其拷贝到
webapps下也可以。重新启动服务器就可以将Pet.war部署为一个Web应用程序了。如果你够细心的话你会发现，服务器将Pet.war文件解
开，并且在webapps下面又生成了一个Pet文件夹，然后把Pet.war的内容拷贝到里面去了。我们可以通过以下方式取消自动解包，配置方式如下：<br />
</font>&lt;Context docBase="F:/PetWeb" reloadable="false" <font color="#ff0000"><code>unpackWAR</code>="false"</font>/&gt;&nbsp;&nbsp;&nbsp; 让大家久等了。今天给大家介绍怎样在Tomcat5.5.9中部署Java Web应用程序。本文的重点是如何<font color="#ff0000">部署</font>，所以暂且先不介绍怎样开发Web应用程序和怎样启动Tomcat服务器。我们现在不考虑使用的什么开发工具，总之在练习本文所说的例子之前，你应该有一个Java Web应用程序。本文假定Web应用程序的根目录为<font color="#ff0000">PetWeb</font>。<br />
&nbsp;&nbsp;&nbsp; 在Tomcat中部署Java Web应用程序有两种方式：静态部署和动态部署。<br />
一、静态部署<br />
&nbsp;&nbsp;&nbsp;&nbsp; 静态部署指的是我们在服务器启动之前部署我们的程序，只有当服务器启动之后，我们的Web应用程序才能访问。以下3中方式都可以部署：<br />
&nbsp;&nbsp;&nbsp; 1、将PetWeb目录拷贝到&nbsp;&nbsp;&nbsp; 让大家久等了。今天给大家介绍怎样在Tomcat5.5.9中部署Java Web应用程序。本文的重点是如何<font color="#ff0000">部署</font>，所以暂且先不介绍怎样开发Web应用程序和怎样启动Tomcat服务器。我们现在不考虑使用的什么开发工具，总之在练习本文所说的例子之前，你应该有一个Java Web应用程序。本文假定Web应用程序的根目录为<font color="#ff0000">PetWeb</font>。而且存放在<font color="#ff0000">F:\</font>下。<br />
&nbsp;&nbsp;&nbsp; 在Tomcat中部署Java Web应用程序有两种方式：静态部署和动态部署。在下文中<code>$CATALINA_HOME指的是Tomcat<font color="#ff0000">根</font>目录。</code><br />
一、静态部署<br />
&nbsp;&nbsp;&nbsp;&nbsp; 静态部署指的是我们在服务器启动之前部署我们的程序，只有当服务器启动之后，我们的Web应用程序才能访问。以下3中方式都可以部署：<br />
&nbsp;&nbsp;&nbsp; 1、将PetWeb目录拷贝到</font><code><font size="4">$CATALINA_HOME\webapps下，然后启动服务器就可以了。这种方式比较简单，但是web应用程序必须在webapps目录下。访问地址如下：<br />
</font><a href="http://localhost:8080/PetWeb/"><font size="4">http://localhost:8080/<font color="#ff0000">PetWeb/</font></font></a><br />
<font size="4">&nbsp;&nbsp; 2、这种方式可以不必将PetWeb目录拷贝到webapps下，直接在F:\部署。方法如下，更改</font><code><font size="4">$CATALINA_HOME\conf\server.xml文件，在&lt;host&gt;标签内添加&lt;Context&gt;标签，内容如下：<br />
&lt;Context docBase="F:/PetWeb" reloadable="false" path="/Pet"/&gt;<br />
其
中reloadable="false"表示当应用程序中的内容发生更改之后服务器不会自动加载，这个属性在开发阶段通常都设为true，方便开发，在发
布阶段应该设置为false，提高应用程序的访问速度。docBase为路径，可以使用绝对路径，也可以使用相对路径，相对路径相对于webapps。
path属性的值是访问时的根地址。访问地址如下：</font><a href="http://localhost:8080/Pet/"><font size="4">http://localhost:8080/<font color="#ff0000">Pet/</font></font></a><br />
<font size="4">&nbsp;&nbsp;&nbsp;3、这种方式和第二种方式差不多，但是不是在Server.xml文件中添加Context标签，而是在<code>$CATALINA_HOME</code>\conf\Catalina\localhost中添加一个xml文件，如Pet.xml，内容如下：<br />
</font></code></code><font size="4">&lt;Context docBase="F:/PetWeb" reloadable="false" /&gt;大家可能发现和第二种方式差不多，但是缺少了path属性，这种方式服务器会使用.xml的名字作为path属性的值。访问地址如下：</font><a href="http://localhost:8080/Pet/"><font size="4">http://localhost:8080/<font color="#ff0000">Pet/</font></font></a><br />
<font size="4">&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 我们刚才是将PetWeb文件夹部署在了服务器中，我们知道可以将Web应用程序的<font color="#ff0000">内容</font>打成<font color="#ff0000">.war</font></font><font size="4"><font color="#000000">包，然后在部署在服务器上。打包请参考如下步骤：<br />
&nbsp;&nbsp;&nbsp; 1、打开命令提示符（Start--&gt;Run--&gt;cmd）<br />
&nbsp;&nbsp;&nbsp; 2、设置jdk环境变量（如果我教过的学生不会配置，以后别说孙老师教过你）<br />
&nbsp;&nbsp;&nbsp; 3、在命令提示符中进入F:\PetWeb文件后，键入如下命令：<br />
</font></font><font size="4"><font color="#ff0000">jar cvf Pet.war */.</font></font><font size="4"><font color="#ff0000">&nbsp; </font></font><font size="4"><font color="#000000">这样在当前目录下应该有Pet.war文件。其中..表示当前目录的父目录。<br />
&nbsp;&nbsp;&nbsp;&nbsp;部
署Pet.war文件非常简单，将刚才有docBase="F:\PetWeb"更改为docBase="F:\Pet.war"或者直接将其拷贝到
webapps下也可以。重新启动服务器就可以将Pet.war部署为一个Web应用程序了。如果你够细心的话你会发现，服务器将Pet.war文件解
开，并且在webapps下面又生成了一个Pet文件夹，然后把Pet.war的内容拷贝到里面去了。我们可以通过以下方式取消自动解压缩，配置方式如
下：<br />
</font>&lt;Context docBase="F:/PetWeb" reloadable="false" <font color="#ff0000"><code>unpackWAR</code>="false"</font>/&gt;<br />
二、动态部署<br />
&nbsp;&nbsp;&nbsp; 动态部署是指可以在服务器启动之后部署web应用程序，而不用重新启动服务器。动态部署要用到服务器提供的manager.war文件，如果在</font><code><font size="4">$CATALINA_HOME\webapps\下没有该文件，你必须去重新下载tomcat，否则不能完成以下的功能。要想使用该管理程序必须首先编辑</font><code><font size="4">$CATALINA_HOME\conf\tomcat-users.xml文件，内容如下：关于这个文件的更多内容，请参考</font><a href="http://coresun.blog.sohu.com/70550348.html" target="_blank"><font size="4">Java Web应用程序的安全模型二</font></a><br />
</code></code><font size="4">&lt;tomcat-users&gt;<br />
&nbsp; &lt;role rolename="tomcat"/&gt;<br />
&nbsp; &lt;role rolename="role1"/&gt;<br />
</font><font size="4"><font color="#ff0000">&nbsp; &lt;role rolename="manager"/&gt;<br />
&nbsp; &lt;user username="coresun" password="coresun" roles="manager"/&gt;</font><br />
&nbsp; &lt;user username="tomcat" password="tomcat" roles="tomcat"/&gt;<br />
&nbsp; &lt;user username="both" password="tomcat" roles="tomcat,role1"/&gt;<br />
&nbsp; &lt;user username="role1" password="tomcat" roles="role1"/&gt;<br />
&lt;/tomcat-users&gt;<br />
然后在浏览器中键入如下地址：<br />
</font><a href="http://localhost:8080/"><font size="4">http://localhost:8080/</font></a><font size="4">应该看到一个漂亮的加菲猫了吧。点击左边的Tomcat Manager链接，提示输入用户名和密码，本文都是coresun，然后可以看到以下页面：<br />
<img style="margin: 0px auto 10px; display: block; text-align: center;" alt="" src="http://120.img.pp.sohu.com/images/blog/2007/11/21/20/7/116fdde175d.jpg" border="0" />在Context&nbsp;Path(option):中输入/Pet<br />
XML Configration file&nbsp;URL中要指定一个.xml文件，比如我们在F:\下建立一个Pet.xml文件，内容如下：<br />
&lt;Context reloadable="false" /&gt;docBase不用写了，因为在下一个文本框中填入。或者更简单点，这个文本框什么都不填。<br />
在WAR&nbsp;or Directory URL:中键入F:\PetWet或者F:\Pet.war都可以，然后点击Deploy按钮，看看上面是不是已经看到了你web应用程序，名字就是你Context&nbsp;Path(option):中的名字。<br />
<br />
如果你部署.war文件还有更加简单的方式，下面还有个Select WAR file uploae点击浏览选择.war文件，然后点击Deploy也可以。</font><br />
<font size="4">&nbsp;&nbsp;&nbsp; </font></p>
<img src ="http://www.blogjava.net/ocean07000814/aggbug/331694.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ocean07000814/" target="_blank">非洲小白脸</a> 2010-09-10 17:47 <a href="http://www.blogjava.net/ocean07000814/articles/331694.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Eclipse调试时不能用查看器查看iter.next()</title><link>http://www.blogjava.net/ocean07000814/articles/327507.html</link><dc:creator>非洲小白脸</dc:creator><author>非洲小白脸</author><pubDate>Thu, 29 Jul 2010 12:50:00 GMT</pubDate><guid>http://www.blogjava.net/ocean07000814/articles/327507.html</guid><wfw:comment>http://www.blogjava.net/ocean07000814/comments/327507.html</wfw:comment><comments>http://www.blogjava.net/ocean07000814/articles/327507.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ocean07000814/comments/commentRss/327507.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ocean07000814/services/trackbacks/327507.html</trackback:ping><description><![CDATA[用Eclipse调一个Iterator，有一个for循环：<br />
for(Iterator iter = coolection.iterator(); iter.hasNext(); ) {<br />
&nbsp;&nbsp;&nbsp;  Object o = iter.next();  // 在这里添加了一个断点<br />
&nbsp;&nbsp;&nbsp;  o.doSomething();<br />
}<br />
<br />
&nbsp;&nbsp;&nbsp;
在程序跑到断点那里的时候，我用Expression查看了一下iter.next()，结果这个值和预期的值并不一样，而是向后偏移了一个位置，也就是
说Expression查看器在查看iter.next()的时候实际上是对原来的iter又进行了一次.next()方法的调用，调试过程干扰了程序的
正常运行。所以在调试情况下程序总是不能正常运行，而实际上程序并没有任何问题。
<img src ="http://www.blogjava.net/ocean07000814/aggbug/327507.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ocean07000814/" target="_blank">非洲小白脸</a> 2010-07-29 20:50 <a href="http://www.blogjava.net/ocean07000814/articles/327507.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JProbe 下载</title><link>http://www.blogjava.net/ocean07000814/articles/310879.html</link><dc:creator>非洲小白脸</dc:creator><author>非洲小白脸</author><pubDate>Tue, 26 Jan 2010 08:01:00 GMT</pubDate><guid>http://www.blogjava.net/ocean07000814/articles/310879.html</guid><wfw:comment>http://www.blogjava.net/ocean07000814/comments/310879.html</wfw:comment><comments>http://www.blogjava.net/ocean07000814/articles/310879.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ocean07000814/comments/commentRss/310879.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ocean07000814/services/trackbacks/310879.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CSUNLIN%7E1.SJN%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:PunctuationKerning/>
<w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
<w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:Compatibility>
<w:SpaceForUL/>
<w:BalanceSingleByteDoubleByteWidth/>
<w:DoNotLeaveBackslashAlone/>
<w:ULTrailSpace/>
<w:DoNotExpandShiftReturn/>
<w:AdjustLineHeightInTable/>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:UseFELayout/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
</w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles deflockedstate="false" latentstylecount="156">
</w:LatentStyles>
</xml><![endif]--><style>
<!-- /* Font Definitions */
@font-face
{font-family:"MS Mincho";
panose-1:2 2 6 9 4 2 5 8 3 4;
mso-font-alt:"ＭＳ 明朝";
mso-font-charset:128;
mso-generic-font-family:modern;
mso-font-pitch:fixed;
mso-font-signature:-1610612033 1757936891 16 0 131231 0;}
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
@font-face
{font-family:Century;
panose-1:2 4 6 4 5 5 5 2 3 4;
mso-font-charset:0;
mso-generic-font-family:roman;
mso-font-pitch:variable;
mso-font-signature:647 0 0 0 159 0;}
@font-face
{font-family:"MS PGothic";
panose-1:2 11 6 0 7 2 5 8 2 4;
mso-font-charset:128;
mso-generic-font-family:swiss;
mso-font-pitch:variable;
mso-font-signature:-1610612033 1757936891 16 0 131231 0;}
@font-face
{font-family:"\@MS Mincho";
panose-1:2 2 6 9 4 2 5 8 3 4;
mso-font-charset:128;
mso-generic-font-family:modern;
mso-font-pitch:fixed;
mso-font-signature:-1610612033 1757936891 16 0 131231 0;}
@font-face
{font-family:"\@MS PGothic";
panose-1:2 11 6 0 7 2 5 8 2 4;
mso-font-charset:128;
mso-generic-font-family:swiss;
mso-font-pitch:variable;
mso-font-signature:-1610612033 1757936891 16 0 131231 0;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0mm;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"MS PGothic";
mso-bidi-font-family:"MS PGothic";}
a:link, span.MsoHyperlink
{color:#AAAAAA;
mso-text-animation:none;
text-decoration:none;
text-underline:none;
text-decoration:none;
text-line-through:none;}
a:visited, span.MsoHyperlinkFollowed
{color:purple;
text-decoration:underline;
text-underline:single;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:36.0pt;
mso-footer-margin:36.0pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:標準の表;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0mm 5.4pt 0mm 5.4pt;
mso-para-margin:0mm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:Century;
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]-->
<script>
if (top.location != self.location) {top.location=self.location;}
</script>
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-333696-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script');
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
ga.setAttribute('async', 'true');
document.documentElement.firstChild.appendChild(ga);
})();
</script>
<script async="true" src="7276395_files/ga.js"></script>
<script type="text/javascript" src="7276395_files/resize.js"></script>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 12pt; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US"><a href="http://www.quest.com/jprobe/"><span style="color: blue;">JProbe</span></a>
Version: 8.1.0<o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 12pt; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: 宋体; color: #666666; letter-spacing: 0.6pt;">软件简介：一款</span><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US">Java</span><span style="font-family: 宋体; color: #666666; letter-spacing: 0.6pt;">代码、内存和覆盖率分析工具。</span><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 12pt; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: 宋体; color: #666666; letter-spacing: 0.6pt;">主要特性：覆盖浏览器和源代码视图－快速分离未检测代码和死代码；</span><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 12pt; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: 宋体; color: #666666; letter-spacing: 0.6pt;">批处理模式－能以批处理模式运行，方便的集成建立</span><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US">/</span><span style="font-family: 宋体; color: #666666; letter-spacing: 0.6pt;">测试系统；</span><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 12pt; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: 宋体; color: #666666; letter-spacing: 0.6pt;">报表－以</span><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US">XML</span><span style="font-family: 宋体; color: #666666; letter-spacing: 0.6pt;">、纯文本、</span><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US">CSV</span><span style="font-family: 宋体; color: #666666; letter-spacing: 0.6pt;">或者</span><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US">HTML</span><span style="font-family: 宋体; color: #666666; letter-spacing: 0.6pt;">格式输出覆盖范围报告，用以定制分析；</span><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 12pt; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: 宋体; color: #666666; letter-spacing: 0.6pt;">快照合并－合并多个平台运行的整个覆盖数据；</span><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 12pt; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US">Eclipse IDE</span><span style="font-family: 宋体; color: #666666; letter-spacing: 0.6pt;">集成，提供了</span><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US">Eclipse</span><span style="font-family: 宋体; color: #666666; letter-spacing: 0.6pt;">插件，可在</span><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US">Eclipse</span><span style="font-family: 宋体; color: #666666; letter-spacing: 0.6pt;">中直接进行内存分析和代码覆盖率测试。</span><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 165%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 165%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><strong><span style="font-family: 宋体; color: #666666; letter-spacing: 0.6pt;">下载：</span></strong><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 165%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US"><a href="http://worlddownloads.quest.com.edgesuite.net/Repository/www.quest.com/latest_versions/JProbeforAIXBINFormat_810.zip"><span style="color: blue;">JProbe for AIX - BIN Format</span></a><o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 165%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US"><a href="http://worlddownloads.quest.com.edgesuite.net/Repository/www.quest.com/latest_versions/JProbeforLinuxforx86andx64BINFormat_810.zip"><span style="color: blue;">JProbe for Linux for x86 and x64 - BIN Format</span></a><o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 165%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US"><a href="http://worlddownloads.quest.com.edgesuite.net/Repository/www.quest.com/latest_versions/JProbeforSolarisBINFormat_810.zip"><span style="color: blue;">JProbe for Solaris - BIN Format</span></a><o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 165%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US"><a href="http://worlddownloads.quest.com.edgesuite.net/Repository/www.quest.com/latest_versions/JProbeforSolarisx86BINFormat_810.zip"><span style="color: blue;">JProbe for Solaris x86 - BIN Format</span></a><o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 165%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US"><a href="http://worlddownloads.quest.com.edgesuite.net/Repository/www.quest.com/latest_versions/JProbeforWindowsEXEFormat_810.zip"><span style="color: blue;">JProbe for Windows - EXE Format</span></a><o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 165%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US"><a href="http://worlddownloads.quest.com.edgesuite.net/Repository/www.quest.com/individual_components/JProbePluginsforEclipse_810.zip"><span style="color: blue;">JProbe Plugins for Eclipse</span></a><o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 165%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 165%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US"><a href="http://www.quest.com/Quest_Site_Assets/Documents/JProbeInstallationGuide810.pdf"><span style="color: blue;">JProbe Installation Guide</span></a><o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 165%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US"><a href="http://www.quest.com/Quest_Site_Assets/PDF/JProbe_v8_1_Release_Notes.htm"><span style="color: blue;">JProbe Release Notes</span></a><o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 165%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US"><a href="http://www.quest.com/Quest_Site_Assets/Documents/JProbeUserGuide810.pdf"><span style="color: blue;">JProbe User Guide</span></a><o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 165%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US"><a href="http://www.quest.com/Quest_Site_Assets/Documents/JProbeReferenceGuide810.pdf"><span style="color: blue;">JProbe Reference Guide</span></a><o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 165%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US"><a href="http://www.quest.com/Quest_Site_Assets/Documents/JProbePluginsForEclipse810.pdf"><span style="color: blue;">JProbe Plugins for Eclipse Guide</span></a><o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 165%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US"><a href="http://www.quest.com/Quest_Site_Assets/Documents/JProbeDemosAndTutorials810.pdf"><span style="color: blue;">JProbe Demos and Tutorials</span></a><o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 165%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 165%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: 宋体; color: #666666; letter-spacing: 0.6pt;">破解方法</span><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US">(</span><strong><u><span style="font-family: 宋体; color: red; letter-spacing: 0.6pt;">请使用正版软件</span></u></strong><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US">)</span><span style="font-family: 宋体; color: #666666; letter-spacing: 0.6pt;">：</span><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 165%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: 宋体; color: #666666; letter-spacing: 0.6pt;">安装</span><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US">Jprobe</span><span style="font-family: 宋体; color: #666666; letter-spacing: 0.6pt;">后，</span><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 165%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: 宋体; color: #666666; letter-spacing: 0.6pt;">方法</span><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US">1</span><span style="font-family: 宋体; color: #666666; letter-spacing: 0.6pt;">：替换</span><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US">client-support.jar</span><span style="font-family: 宋体; color: #666666; letter-spacing: 0.6pt;">目录中的</span><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US">\com\sitraka\licensing\ValidateSignature.class</span><span style="font-family: 宋体; color: #666666; letter-spacing: 0.6pt;">文件。</span><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 165%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: 宋体; color: #666666; letter-spacing: 0.6pt;">方法</span><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US">2</span><span style="font-family: 宋体; color: #666666; letter-spacing: 0.6pt;">：替换</span><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US">client-support.jar</span><span style="font-family: 宋体; color: #666666; letter-spacing: 0.6pt;">目录中的</span><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US">\com\sitraka\licensing\
LicenseProperties.class</span><span style="font-family: 宋体; color: #666666; letter-spacing: 0.6pt;">文件。</span><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 165%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 165%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: 宋体; color: #666666; letter-spacing: 0.6pt;">破解文件：</span><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 165%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US"><a href="http://vdng8g.tuk.livefilestore.com/y1pOa_lcClMPLHRp0yOIUiCdYXPToGKteR7iYqhDcfwbq9Aabg_eGHF63q5l-a_fOePyM0c-R5A-M4/Jprobe_v8.0.0_Crack.zip"><span style="color: blue;">Jprobe_v8.0.0_Crack</span></a><o:p></o:p></span></p>
<p class="MsoNormal" style="background: white none repeat scroll 0% 0%; margin-left: 36pt; line-height: 165%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="color: #666666; letter-spacing: 0.6pt;" lang="EN-US"><a href="http://vdng8g.bay.livefilestore.com/y1p5icQlf4oFVFYIDGpYHQni4LMp-ekKTKRUgAXGIk7qNd7-Tr8UV0BXJ0SnWijeSZMUGzIZZDSWQWfvECcvUmIxA/JProbe.Suite.v8.1.0.Cracked-FALLEN.zip"><span style="color: blue;">JProbe.Suite.v8.1.0.Cracked-FALLEN</span></a><o:p></o:p></span></p>
<img src ="http://www.blogjava.net/ocean07000814/aggbug/310879.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ocean07000814/" target="_blank">非洲小白脸</a> 2010-01-26 16:01 <a href="http://www.blogjava.net/ocean07000814/articles/310879.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java内存监控--JConsole 监控应用</title><link>http://www.blogjava.net/ocean07000814/articles/305567.html</link><dc:creator>非洲小白脸</dc:creator><author>非洲小白脸</author><pubDate>Fri, 11 Dec 2009 06:55:00 GMT</pubDate><guid>http://www.blogjava.net/ocean07000814/articles/305567.html</guid><wfw:comment>http://www.blogjava.net/ocean07000814/comments/305567.html</wfw:comment><comments>http://www.blogjava.net/ocean07000814/articles/305567.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ocean07000814/comments/commentRss/305567.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ocean07000814/services/trackbacks/305567.html</trackback:ping><description><![CDATA[<div class="postTitle">
<a id="viewpost1_TitleUrl" class="postTitle2" href="../../beansoft/archive/2006/12/13/87494.html">使用 JDK 6 中的 JConsole 监控应用(转载)</a>
</div>
<p>其实在 JDK 5 中已经新加入了这个功能了. 现在的 JDK 已经内置了对 VM 的监控功能. JDK 6 中这个工具变的更加好用了. 关于 JDK 5 中如何使用这个工具可以参考这里: <a title="http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html" href="http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html">http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html</a></p>
<p><a title="http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html" href="http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html">http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html</a></p>
<p>jconsole 可以很方便的监控本机的所有 Java 应用和远程的应用.</p>
<p><strong>监控本地应用</strong></p>
<p>&nbsp;首先就是启动您要监控的应用, 例如我用 JDK 1.6 来启动了 Tomcat, 或者 Eclipse 也可以, 可以在任务管理器(Ctrl+Alt+Del可以调出来, 或者在任务栏点击右键)里看到进程ID, 例如我这里是 6132.</p>
<p>接着在 JDK 安装目录中(&lt;JDK_HOME&gt;/bin/jconsole.exe)启动 jconsole.exe (双击或者在 cmd 里面敲入 jconsole), 主界面会提示您建立一个新连接:</p>
<p><a href="../../images/blogjava_net/beansoft/WindowsLiveWriter/201371a3d235_CCDC/image06.png" atomicselection="true"><img style="border-width: 0px;" src="../../images/blogjava_net/beansoft/WindowsLiveWriter/201371a3d235_CCDC/image0_thumb2.png" width="473" border="0" height="507"  alt="" /></a> </p>
<p>可以看到进程ID, 选择它, 然后点击"连接". 这些 ID 必须都是用 JDK 1.6 的 java.exe 启动的, 否则在列表里看不到.</p>
<p><a href="../../images/blogjava_net/beansoft/WindowsLiveWriter/201371a3d235_CCDC/image09.png" atomicselection="true"><img style="border-width: 0px;" src="../../images/blogjava_net/beansoft/WindowsLiveWriter/201371a3d235_CCDC/image0_thumb3.png" width="746" border="0" height="543"  alt="" /></a> </p>
<p>JConsle 能监控内存,线程,类的数目和CPU然后点击各个 Tab 可以看到详细的输出, 详细的输出包括:<br />
内存: 堆/非堆, 峰值, 内存的各个部分, 例如 Perm, Eden 等的大小曲线图.<br />
线程: 峰值, 所有线程的列表, 堆栈跟踪(哪个对象中的线程)等. 还可以强制执行GC.<br />
类: 峰值, 类总数曲线图.<br />
MBean: 一些 JVM 参数的详细 MBean 信息.</p>
<p><strong>监控远程进程</strong></p>
<p>首先需要在运行的应用上启用远程管理, 参数如下(简单期间就不加用户验证了):<br />
java
-Dcom.sun.management.jmxremote.port=1090
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false -jar
../demo/jfc/Java2D/Java2Demo.jar</p>
<p>然后连接的时候选择远程进程, 地址输入:</p>
<p>localhost:1090</p>
<p>即可.当然在别的电脑上(一般是局域网)可以输入那个电脑的IP.</p>
<p>综
述: 使用 JConsole 可以简单的监控 Server 状态, 但是本身要占一定的资源, 不过 JVM 自带的监控,
理论上讲应该是占资源很小很小的, 可以用它来方便的了解 Web 服务器应用进程的状态. 如果要调优应用, 还是使用 JProfiler
等工具更好一些, 当然它们占的资源也更大.</p>
<p>后记:</p>
<p>jdk1.6.0\demo\management\MemoryMonitor</p>
<p>这里带了个很好的画内存曲线图的例子... 大家改改就可以实现同时监控多台 Server 的内存曲线了....</p>
<p><a href="../../images/blogjava_net/beansoft/WindowsLiveWriter/201371a3d235_CCDC/image%7B0%7D%5B2%5D.png" atomicselection="true"><img style="border: 0px none ;" src="../../images/blogjava_net/beansoft/WindowsLiveWriter/201371a3d235_CCDC/image%7B0%7D_thumb.png" width="413" border="0" height="376"  alt="" /></a> </p>
<img src ="http://www.blogjava.net/ocean07000814/aggbug/305567.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ocean07000814/" target="_blank">非洲小白脸</a> 2009-12-11 14:55 <a href="http://www.blogjava.net/ocean07000814/articles/305567.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FireBug 调试JS入门 —如何调试JS(转载保存)</title><link>http://www.blogjava.net/ocean07000814/articles/303900.html</link><dc:creator>非洲小白脸</dc:creator><author>非洲小白脸</author><pubDate>Fri, 27 Nov 2009 07:19:00 GMT</pubDate><guid>http://www.blogjava.net/ocean07000814/articles/303900.html</guid><wfw:comment>http://www.blogjava.net/ocean07000814/comments/303900.html</wfw:comment><comments>http://www.blogjava.net/ocean07000814/articles/303900.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ocean07000814/comments/commentRss/303900.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ocean07000814/services/trackbacks/303900.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt;">&nbsp; 安装就不用说了，很简单，在FireFox上插件库里找到FireBug就Ok了。下图是FireBug Debug 窗口。<br />
<div align="center"><img style="width: 733px; height: 333px;" alt="" src="../../images/blogjava_net/vincent/js.gif" width="733" height="333" border="0" /><br />
</div>
&nbsp;&nbsp;&nbsp;&nbsp; FireBug美工用的非常普遍，公司美工妹妹用的非常熟练 呵呵，而对于我们开发人员，主要用它来Debug JS。看看官方对Debug功能的介绍。<br />
&nbsp;Firebug includes a powerful JavaScript debugger that lets you pause
execution at any time and see what each variable looked like at that
moment. If your code is a little sluggish, use the JavaScript profiler
to measure performance and find bottlenecks fast.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 简而言之，FireBug 可以让我们在任何时候debugJS 并查看变量，同时可以通过它找出JS中性能瓶颈。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下图是如何找到Web应用的JS，激活Firebug，点Script，然后在All 旁边选择你要Debug的JS。<br />
<div align="center"><img alt="" src="../../images/blogjava_net/vincent/screenScript-listing.gif" border="0" /></div>
<br />
下图是如何打断点 基本跟Eclipse一样，点击行号就Ok了。<br />
<div align="center"><img alt="" src="../../images/blogjava_net/vincent/screenScript-breakpoint.gif" width="214" height="164" border="0" /></div>
下图是如何在断点上设定条件，如果条件符合，就进入断点，这个功能很不错，特别是Debug很复杂的Function时候。<br />
<div align="center"><img alt="" src="../../images/blogjava_net/vincent/screenScript-cond.gif" width="214" height="164" border="0" /></div>
&nbsp;下图是如何单步调试，跟Eclipse一样 F11单步 <br />
<div align="center"><img alt="" src="../../images/blogjava_net/vincent/screenScript-step.gif" width="214" height="164" border="0" /></div>
下图是查看调用的Stack，对以复杂的JS Debug很有帮助。<br />
<div align="center"><img alt="" src="../../images/blogjava_net/vincent/screenScript-stack.gif" width="214" height="164" border="0" /><br />
</div>
下图是查看变量 基本跟EclipseDebug 一样。<br />
<br />
<div align="center"><img alt="" src="../../images/blogjava_net/vincent/screenScript-watch.gif" border="0" /></div>
<br />
下图是在断点处查看变量。<br />
<br />
<div align="center"><img alt="" src="../../images/blogjava_net/vincent/screenScript-tooltip.gif" width="214" height="164" border="0" /></div>
<br />
有个很好用的功能，代码行之间快速调转，使得对上千行的JS调试很轻松。<br />
<div align="center"><img alt="" src="../../images/blogjava_net/vincent/screenScript-linejump.gif" width="214" height="164" border="0" /></div>
下图就是Performance 测试结果，使用很简单 点Profile<br />
<div align="center"><img alt="" src="../../images/blogjava_net/vincent/screenScript-profile.gif" width="214" height="164" border="0" /></div>
<br />
还有一个Log功能比较实用，看下图 如果你不想每次都进入断点，用这个就再好不过了。<br />
<div align="center"><img alt="" src="../../images/blogjava_net/vincent/screenScript-logcalls.gif" width="214" height="164" border="0" /></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基本用法就这些了，希望对大家有帮助。<br />
</span>
<img src ="http://www.blogjava.net/ocean07000814/aggbug/303900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ocean07000814/" target="_blank">非洲小白脸</a> 2009-11-27 15:19 <a href="http://www.blogjava.net/ocean07000814/articles/303900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中Collections.sort()函数的用法(多字段)</title><link>http://www.blogjava.net/ocean07000814/articles/297940.html</link><dc:creator>非洲小白脸</dc:creator><author>非洲小白脸</author><pubDate>Mon, 12 Oct 2009 09:44:00 GMT</pubDate><guid>http://www.blogjava.net/ocean07000814/articles/297940.html</guid><wfw:comment>http://www.blogjava.net/ocean07000814/comments/297940.html</wfw:comment><comments>http://www.blogjava.net/ocean07000814/articles/297940.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ocean07000814/comments/commentRss/297940.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ocean07000814/services/trackbacks/297940.html</trackback:ping><description><![CDATA[<strong>用Collections.sort方法对list排序有两种方法<br />
第一种是list中的对象实现Comparable接口，如下：</strong><br />
/**<br />
* 根据order对User排序<br />
*/<br />
public class User <strong>implements Comparable&lt;User&gt;{</strong><br />
&nbsp;&nbsp;&nbsp;    private String name;<br />
&nbsp;&nbsp;&nbsp;    private Integer order;<br />
&nbsp;&nbsp;&nbsp;    public String getName() {<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    return name;<br />
&nbsp;&nbsp;&nbsp;    }<br />
&nbsp;&nbsp;&nbsp;    public void setName(String name) {<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    this.name = name;<br />
&nbsp;&nbsp;&nbsp;    }<br />
&nbsp;&nbsp;&nbsp;    public Integer getOrder() {<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    return order;<br />
&nbsp;&nbsp;&nbsp;    }<br />
&nbsp;&nbsp;&nbsp;    public void setOrder(Integer order) {<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    this.order = order;<br />
&nbsp;&nbsp;&nbsp;    }<br />
&nbsp;&nbsp;&nbsp;    <strong>public int compareTo(User arg0) {<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    return this.getOrder().compareTo(arg0.getOrder());<br />
&nbsp;&nbsp;&nbsp;    }</strong><br />
}<br />
测试一下：<br />
public class Test{<br />
<br />
&nbsp;&nbsp;&nbsp;    public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    User user1 = new User();<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    user1.setName("a");<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    user1.setOrder(1);<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    User user2 = new User();<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    user2.setName("b");<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    user2.setOrder(2);<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    List&lt;User&gt; list = new ArrayList&lt;User&gt;();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   //此处add user2再add user1<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    list.add(user2);<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    list.add(user1);<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    <strong>Collections.sort(list);</strong><br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    <strong>for(User u : list){<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    System.out.println(u.getName());<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    }</strong><br />
&nbsp;&nbsp;&nbsp;    }<br />
}<br />
输出结果如下<br />
<strong>a<br />
b</strong><br />
<strong>第二种方法是根据Collections.sort重载方法来实现，例如：</strong><br />
/**<br />
* 根据order对User排序<br />
*/<br />
public class User { //此处无需实现Comparable接口<br />
&nbsp;&nbsp;&nbsp;    private String name;<br />
&nbsp;&nbsp;&nbsp;    private Integer order;<br />
&nbsp;&nbsp;&nbsp;    public String getName() {<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    return name;<br />
&nbsp;&nbsp;&nbsp;    }<br />
&nbsp;&nbsp;&nbsp;    public void setName(String name) {<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    this.name = name;<br />
&nbsp;&nbsp;&nbsp;    }<br />
&nbsp;&nbsp;&nbsp;    public Integer getOrder() {<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    return order;<br />
&nbsp;&nbsp;&nbsp;    }<br />
&nbsp;&nbsp;&nbsp;    public void setOrder(Integer order) {<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    this.order = order;<br />
&nbsp;&nbsp;&nbsp;    }<br />
}<br />
主类中这样写即可：<br />
public class Test{<br />
&nbsp;&nbsp;&nbsp;    public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    User user1 = new User();<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    user1.setName("a");<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    user1.setOrder(1);<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    User user2 = new User();<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    user2.setName("b");<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    user2.setOrder(2);<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    List&lt;User&gt; list = new ArrayList&lt;User&gt;();<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    list.add(user2);<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    list.add(user1);<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    <br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    <strong>Collections.sort(list,new Comparator&lt;User&gt;(){<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    public int compare(User arg0, User arg1) {<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    return arg0.getOrder().compareTo(arg1.getOrder());<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    }<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    });<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    for(User u : list){<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    System.out.println(u.getName());<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    }</strong><br />
&nbsp;&nbsp;&nbsp;    }<br />
}<br />
输出结果如下<br />
<strong>a<br />
b</strong><br />
前者代码结构简单，但是只能根据固定的属性排序，后者灵活，可以临时指定排序项，但是代码不够简洁<br />
<br />
多字段的场合：<br />
<strong>Collections.sort(list,new Comparator&lt;User&gt;(){<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    public int compare(User arg0, User arg1) {<br />
</strong><strong>&nbsp;</strong>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一次比较专业<br />
<strong>
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp; int i = arg0.getOrder().compareTo(arg1.getOrder());<br />
</strong><br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果专业相同则进行第二次比较<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i==0){<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二次比较<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j=<strong>arg0.getXXX().compareTo(arg1.get</strong><strong>XXX</strong><strong>());</strong><br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果学制相同则返回按年龄排序<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(j==0){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return <strong>arg0.getCCC().compareTo(arg1.get</strong><strong>CCC</strong><strong>());</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return j;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return i;<br />
<strong>
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    }<br />
&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;    });</strong><br />
<img src ="http://www.blogjava.net/ocean07000814/aggbug/297940.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ocean07000814/" target="_blank">非洲小白脸</a> 2009-10-12 17:44 <a href="http://www.blogjava.net/ocean07000814/articles/297940.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse中RMI plugin的实现(调试配置)</title><link>http://www.blogjava.net/ocean07000814/articles/296926.html</link><dc:creator>非洲小白脸</dc:creator><author>非洲小白脸</author><pubDate>Tue, 29 Sep 2009 09:09:00 GMT</pubDate><guid>http://www.blogjava.net/ocean07000814/articles/296926.html</guid><wfw:comment>http://www.blogjava.net/ocean07000814/comments/296926.html</wfw:comment><comments>http://www.blogjava.net/ocean07000814/articles/296926.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ocean07000814/comments/commentRss/296926.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ocean07000814/services/trackbacks/296926.html</trackback:ping><description><![CDATA[<ol>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在Eclipse使用的比较多，而其功能的可扩展性也是超级强大，可以将多种工具和开发技术通过插件包的形式融合进来。这里说一下怎么通过RMI&nbsp;Plugin在Eclipse里面调试RMI程序。</span> </li>
    <li><br />
    </li>
    <li class="alt"><span>一、准备安装包</span></li>
    <li class="alt"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Eclipse的下载地址这里就不说了，可以参考我的blog中《Eclipse开发struts指南》一文。这里提供RMI&nbsp;Plugin&nbsp;</span><span class="keyword">for</span><span>&nbsp;Eclipse&nbsp;的下载地址：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http:</span><span class="comment">//www.genady.net/rmi/v16/index.html?/rmi/v16/main.html&amp;MAIN16</span> </li>
    <li><br />
    </li>
    <li class="alt"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>破解版下载地址：<a href="http://www.inspiresky.com/bbs/dispbbs.asp?boardID=13&amp;ID=2160&amp;page=1">http:</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我
    们下载适合eclipse3.1的1.6.5版本，得到net.genady.rmi_1.6.5.zip安装包。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里使用的是
    Eclipse3.1版本，如果是2.x版本的请下载1.6.0版本的安装包。同时需要JDK1.4.2以上版本的支持，这里不讲了，请自行下载安装。</span><span class="comment">//www.inspiresky.com/bbs/dispbbs.asp?boardID=13&amp;ID=2160&amp;page=1</span> </li>
    <li><span>二、安装插件包</span> </li>
    <li><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>解压缩安装包net.genady.rmi_1.</span><span class="number">6.5</span><span>.zip，将解压后得到的features和plugins文件夹拷贝至Eclipse安装根目录下，覆盖原有文件夹。</span> </li>
    <li class="alt"><br />
    </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;启动Eclipse（如果已经启动，请重新启动Eclipse），这时在工具栏上会发现多了一个工具图标，里面有Registry的管理选项，这个就是RMI&nbsp;Registry的管理器。说明已经安装成功了。</span> </li>
    <li class="alt"><br />
    </li>
    <li><span>三、设置开发环境</span></li>
    <li><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>在安装好插件包后，我们来设置RMI开发环境。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;启动Eclipse，在菜单window-&gt;preferences对话框中，选中左边树菜单java-&gt;rmi，右边窗口会出现RMI&nbsp;Plugin的默认设置信息。</span> </li>
    <li class="alt"><br />
    </li>
    <li><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>最上面的Path&nbsp;to&nbsp;RMI&nbsp;registry设置java的RMI&nbsp;Registry的路径，如这里设置的是C:\Program&nbsp;Files\Java\jdk1.</span><span class="number">5</span><span>.0_05\bin\rmiregistry.exe，一般不用管它。下面的一个框是RMI的服务端口，默认是&nbsp;</span><span class="number">1099</span><span>，这个类似tomcat的服务端口</span><span class="number">8080</span><span>一样，链接的时候需要找到对应的端口才能链接上。其实RMI的最低层是socket。</span> </li>
    <li class="alt"><br />
    </li>
    <li><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>这里需要特别指出的是RMI&nbsp;Plugin是个收费的Eclipse插件，有</span><span class="number">15</span><span>天的免费试用期。而RMI属性中最大的窗口就是填使用授权信息的。我的网站论坛提供破解版本的下载供个人研究之用。</span> </li>
    <li class="alt"><br />
    </li>
    <li><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>开发环境到这里也只是基本的设计完成，其他的还要在具体的项目中进行设置，下面我们就开发一个简单的演示项目。</span> </li>
    <li class="alt"><br />
    </li>
    <li><span>四、开发演示项目</span></li>
    <li><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>这里偷一下懒，引用别人的一篇文章的实例，大家可以比照在eclipse中创建该项目；也可以顺便了解一下RMI的基本机制，和不用工具的开发方法。</span> </li>
    <li class="alt"><br />
    </li>
    <li><span>&nbsp;文章地址：</span> <span><a href="http://www.inspiresky.com/bbs/dispbbs.asp?boardID=22&amp;ID=1687&amp;page=1">http:</a></span><span class="comment">//www.inspiresky.com/bbs/dispbbs.asp?boardID=22&amp;ID=1687&amp;page=1</span></li>
    <li><span class="comment"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>这里采用第五楼文章中的例子。如果你对RMI没有什么太多了解请一定先看此文章。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里我们一步一步来在eclipse中创建我们的演示项目：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li><span class="comment"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>1、启动eclipse，新建项目</span></li>
    <li><span class="comment"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>菜单file-&gt;new-&gt;projects-&gt;java&nbsp;projects，点击next，projects&nbsp;name&nbsp;为RMITest。其他默认，点击next，点击finish。OK，新项目建成。</span> </li>
    <li class="alt"><br />
    </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="number">2</span><span>、新建服务器包</span></li>
    <li><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>左边树中右键项目RMITest，</span><span class="keyword">new</span><span>-&gt;</span><span class="keyword">package</span><span>，新建包com.inspiresky.rmi.server。</span> </li>
    <li class="alt"><br />
    </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="number">3</span><span>、创建远程对象接口类</span></li>
    <li><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>右键点击刚才创建的包，</span><span class="keyword">new</span><span>-&gt;Interface，新建接口I_Hello。然后编辑我们新建的接口，代码如下所示：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> </li>
    <li class="alt"><br />
    </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">package</span><span>&nbsp;com.inspiresky.rmi.server;</span> </li>
    <li class="alt"><br />
    </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">import</span><span>&nbsp;java.rmi.Remote;&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">import</span><span>&nbsp;java.rmi.RemoteException;</span> </li>
    <li><br />
    </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/*</span> </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Junsan&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ </li>
    <li><br />
    </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">interface</span><span>&nbsp;I_Hello&nbsp;</span><span class="keyword">extends</span><span>&nbsp;Remote{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;SayHello()&nbsp;</span><span class="keyword">throws</span><span>&nbsp;RemoteException;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </li>
    <li><br />
    </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="number">4</span><span>、定义一个实现该接口的类</span></li>
    <li class="alt"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>右键点击刚才创建的包，</span><span class="keyword">new</span><span>-&gt;</span><span class="keyword">class</span><span>，新建类文件Hello。然后编辑我们新建的接口，代码如下所示：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> </li>
    <li><br />
    </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">package</span><span>&nbsp;com.inspiresky.rmi.server;</span> </li>
    <li><br />
    </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">import</span><span>&nbsp;java.rmi.RemoteException;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">import</span><span>&nbsp;java.rmi.server.UnicastRemoteObject;</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/*</span> </li>
    <li class="alt"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Junsan</span> </li>
    <li><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span> </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Hello&nbsp;</span><span class="keyword">extends</span><span>&nbsp;UnicastRemoteObject&nbsp;</span><span class="keyword">implements</span><span>&nbsp;I_Hello{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;</span><span class="keyword">long</span><span>&nbsp;serialVersionUID&nbsp;=&nbsp;-8868676826752697887L;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Hello()&nbsp;</span><span class="keyword">throws</span><span>&nbsp;RemoteException</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;SayHello()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//这个是实现I_Hello接口的方法</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="string">"Hello&nbsp;world&nbsp;!!"</span><span>;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;好了到此，已经完成了主要服务对象的编写工作。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="number">5</span><span>、生成程序的存根文件</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;右键点击工程名称
    RMITest，RMI-&gt;Enable&nbsp;Stubs&nbsp;Generations。选中后，在我们工程文件夹RMITest/bin下的相应的包中
    com\inspiresky\rmi\server下就自动生成了Hello_Stub.</span><span class="keyword">class</span><span>类。</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="number">6</span><span>、创建RMI服务器类</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;同</span><span class="number">4</span><span>中的过程，新建类RMI_Server，并编辑器代码为：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">package</span><span>&nbsp;com.inspiresky.rmi.server;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">import</span><span>&nbsp;java.rmi.Naming;</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/*</span> </li>
    <li class="alt"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Junsan</span> </li>
    <li><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span> </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;RMI_Server&nbsp;{</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;RMI_Server()&nbsp;{</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;{</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hello&nbsp;hello&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Hello();</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Naming.rebind(</span><span class="string">"RMI_Hello"</span><span>,&nbsp;hello);</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"===&nbsp;Hello&nbsp;server&nbsp;Ready&nbsp;===&nbsp;"</span><span>);</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;exception)&nbsp;{</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exception.printStackTrace();</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="number">7</span><span>、新建客户端包</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;方法同</span><span class="number">2</span><span>，包名com.inspiresky.rmi.client。</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="number">8</span><span>、创建客户端</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在新建的包中同</span><span class="number">4</span><span>过程，创建类RMI_Client。并编辑代码如下：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">package</span><span>&nbsp;com.inspiresky.rmi.client;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">import</span><span>&nbsp;java.rmi.Naming;</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">import</span><span>&nbsp;com.inspiresky.rmi.server.I_Hello;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/*</span> </li>
    <li><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Junsan</span> </li>
    <li class="alt"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span> </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;RMI_Client&nbsp;{</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;RMI_Client()&nbsp;{</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">super</span><span>();</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;{</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I_Hello&nbsp;hello&nbsp;=&nbsp;(I_Hello)&nbsp;Naming.lookup(</span><span class="string">"RMI_Hello"</span><span>);</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(hello.SayHello());</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;{</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OK，到这里我们就可以准备调试运行我们的程序了。</span> </li>
    <li><span>五、运行调试项目</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在运行之前需要进行一下设置，否则，会提示错误信息，说找不到stub类。</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="number">1</span><span>、启动RMIRegistry</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Eclipse菜单window-&gt;show&nbsp;view-&gt;others，在弹出菜单中选择RMI&nbsp;Views-&gt;RMI&nbsp;Registry&nbsp;Inspector，这是会多出来一个窗口，这里可以显示已经注册的RMI应用。</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;点击工具条上的RMI&nbsp;Plugin图标，在菜单中选择Start&nbsp;Local&nbsp;Registry。</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注意这个只需要启动一次，除非你把它关掉。</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="number">2</span><span>、配置运行RMI服务</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;右键点击左边树中的RMI_Server.java文件，菜单Debug&nbsp;As&nbsp;-&gt;RMI&nbsp;Application。在弹出对话框中找到RMI&nbsp;Properties标签页。</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这时这里前两项显示红色。</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;选中java.security.police项的value框，点击选择按钮会出现文件选择对话框，我们这里设置成C:\Program&nbsp;Files\Java\jre1.</span><span class="number">5</span><span>.0_05\lib\security\java.security。就是jre的安全策略配置文件，要选择成泥当前用的jdk的侧略文件。</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;选中第二项java.rmi.server.codebase的value项，这里选择编译后类包所在的文件夹。点击
    选择按钮-&gt;add按钮-&gt;pick&nbsp;from&nbsp;workspace，选择当前工程RMITest的bin文件夹。这里是file:/E:
    /workspace/RMITest/bin/。</span> </li>
    <li><span>（这里有点要补充一下，还可以 </span><span>点击选择按钮-&gt;add按钮-&gt;compute</span><span> from classpath）<br />
    </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;点击apply按钮。</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;点击debug按钮。</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这时Eclipse的console窗口中出现</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;===&nbsp;Hello&nbsp;server&nbsp;Ready&nbsp;===</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;表示RMI服务已经运行。&nbsp;&nbsp;&nbsp;</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="number">3</span><span>、设置调试信息</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;打开Hello.java文件，在&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="string">"Hello&nbsp;world&nbsp;!!"</span><span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;处设置断点。</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="number">4</span><span>、运行客户端，调试程序</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;工程树中，右键点击RMI_Client.java文件，Run&nbsp;As&nbsp;-&gt;&nbsp;Java&nbsp;Application。</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们点击后，窗口一闪而过，停止后，会发现光标已经停止在我们设定断点的地方。这里程序没有错误，我们按F6键继续，会进入程序下一步的运行文件，调试的时候就是这样子一步一步调试下去。这里我们按F8直接运行完代码，在console窗口中会显示</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hello&nbsp;world&nbsp;!!</span> </li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;表示程序已经运行成功。</span></li>
</ol>
<img src ="http://www.blogjava.net/ocean07000814/aggbug/296926.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ocean07000814/" target="_blank">非洲小白脸</a> 2009-09-29 17:09 <a href="http://www.blogjava.net/ocean07000814/articles/296926.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CentOS 下 ftp 的配置介绍</title><link>http://www.blogjava.net/ocean07000814/articles/292150.html</link><dc:creator>非洲小白脸</dc:creator><author>非洲小白脸</author><pubDate>Fri, 21 Aug 2009 10:37:00 GMT</pubDate><guid>http://www.blogjava.net/ocean07000814/articles/292150.html</guid><wfw:comment>http://www.blogjava.net/ocean07000814/comments/292150.html</wfw:comment><comments>http://www.blogjava.net/ocean07000814/articles/292150.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ocean07000814/comments/commentRss/292150.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ocean07000814/services/trackbacks/292150.html</trackback:ping><description><![CDATA[<h1 class="title_txt">
CentOS 下 ftp 的配置介绍<cite class="fav_csdnstylebykimi">
</cite>
</h1>
<script type="text/javascript">
document.body.oncopy = function() {
if (window.clipboardData) {
setTimeout(function() {
var text = clipboardData.getData("text");
if (text && text.length>300) {
text = text + "\r\n\n本文来自CSDN博客，转载请标明出处：" + location.href;
clipboardData.setData("text", text);
}
}, 100);
}
}
</script>
<script class="blogstory">function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>
<p>首先，安装的时候要勾选ftp服务，centos会帮你装上vsftpd这个ftp服务器并把它标为系统服务。<br />
启动命令：/etc/rc.d/init.d/vsftpd start<br />
这时候可以使用ftp客户端连接。<br />
vsftpd的权限貌似和系统权限有挂钩。</p>
<p>下面是抄来的配置解释vsftpd的配置<br />
vsftpd.ftpusers：位于/etc目录下。它指定了哪些用户账户不能访问FTP服务器，例如root等。<br />
vsftpd.user_list：位于/etc目录下。该文件里的用户账户在默认情况下也不能访问FTP服务器，仅当vsftpd .conf配置文件里启用userlist_enable=NO选项时才允许访问。<br />
vsftpd.conf：位于/etc/vsftpd目录下。来自定义用户登录控制、用户权限控制、超时设置、服务器功能选项、服务器性能选项、服务器响应消息等FTP服务器的配置。</p>
<p><span style="color: #222222;"><strong>(1)用户登录控制</strong><br />
</span>anonymous_enable=YES，允许匿名用户登录。<br />
no_anon_password=YES，匿名用户登录时不需要输入密码。<br />
local_enable=YES，允许本地用户登录。<br />
deny_email_enable=YES，可以创建一个文件保存某些匿名电子邮件的黑名单，以防止这些人使用Dos攻击。<br />
banned_email_file=/etc/vsftpd.banned_emails，当启用deny_email_enable功能时，所需的电子邮件黑名单保存路径(默认为/etc/vsftpd.banned_emails)。</p>
<p><span style="color: #222222;"><strong>(2)用户权限控制</strong><br />
</span>write_enable=YES，开启全局上传权限。<br />
local_umask=022，本地用户的上传文件的umask设为022(系统默认是077，一般都可以改为022)。<br />
anon_upload_enable=YES，允许匿名用户具有上传权限，很明显，必须启用write_enable=YES，才可以使用此项。同时我们还必须建立一个允许ftp用户可以读写的目录(前面说过，ftp是匿名用户的映射用户账号)。<br />
anon_mkdir_write_enable=YES，允许匿名用户有创建目录的权利。<br />
chown_uploads=YES，启用此项，匿名上传文件的属主用户将改为别的用户账户，注意，这里建议不要指定root账号为匿名上传文件的属主用户！<br />
chown_username=whoever，当启用chown_uploads=YES时，所指定的属主用户账号，此处的whoever自然要用合适的用户账号来代替。<br />
chroot_list_enable=YES，可以用一个列表限定哪些本地用户只能在自己目录下活动，如果chroot_local_user=YES，那么这个列表里指定的用户是不受限制的。<br />
chroot_list_file=/etc/vsftpd.chroot_list，如果chroot_local_user=YES，则指定该列表(chroot_local_user)的保存路径(默认是/etc/vsftpd.chroot_list)。<br />
nopriv_user=ftpsecure，指定一个安全用户账号，让FTP服务器用作完全隔离和没有特权的独立用户。这是vsftpd系统推荐选项。<br />
async_abor_enable=YES，强烈建议不要启用该选项，否则将可能导致出错！<br />
ascii_upload_enable=YES；ascii_download_enable=YES，默认情况下服务器会假装接受ASCⅡ模式请求但实际上是忽略这样的请求，启用上述的两个选项可以让服务器真正实现ASCⅡ模式的传输。<br />
注意：启用ascii_download_enable选项会让恶意远程用户们在ASCⅡ模式下用&#8220;SIZE/big/file&#8221;这样的指令大量消耗FTP服务器的I/O资源。<br />
这些ASCⅡ模式的设置选项分成上传和下载两个，这样我们就可以允许ASCⅡ模式的上传(可以防止上传脚本等恶意文件而导致崩溃)，而不会遭受拒绝服务攻击的危险。</p>
<p><span style="color: #222222;"><strong>(3)用户连接和超时选项</strong><br />
</span>idle_session_timeout=600，可以设定默认的空闲超时时间，用户超过这段时间不动作将被服务器踢出。<br />
data_connection_timeout=120，设定默认的数据连接超时时间。</p>
<p><span style="color: #222222;"><strong>(4)服务器日志和欢迎信息</strong><br />
</span>dirmessage_enable=YES，允许为目录配置显示信息，显示每个目录下面的message_file文件的内容。<br />
ftpd_banner=Welcome to blah FTP service，可以自定义FTP用户登录到服务器所看到的欢迎信息。<br />
xferlog_enable=YES，启用记录上传/下载活动日志功能。<br />
xferlog_file=/var/log/vsftpd.log，可以自定义日志文件的保存路径和文件名，默认是/var/log/vsftpd.log。</p>
<img src ="http://www.blogjava.net/ocean07000814/aggbug/292150.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ocean07000814/" target="_blank">非洲小白脸</a> 2009-08-21 18:37 <a href="http://www.blogjava.net/ocean07000814/articles/292150.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>centos下postgresql的安装与配置</title><link>http://www.blogjava.net/ocean07000814/articles/292065.html</link><dc:creator>非洲小白脸</dc:creator><author>非洲小白脸</author><pubDate>Fri, 21 Aug 2009 03:45:00 GMT</pubDate><guid>http://www.blogjava.net/ocean07000814/articles/292065.html</guid><wfw:comment>http://www.blogjava.net/ocean07000814/comments/292065.html</wfw:comment><comments>http://www.blogjava.net/ocean07000814/articles/292065.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ocean07000814/comments/commentRss/292065.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ocean07000814/services/trackbacks/292065.html</trackback:ping><description><![CDATA[<h1 class="title_txt">centos下postgresql的安装与配置<cite class="fav_csdnstylebykimi">
</cite>
</h1>
<div class="blogstory">
<script type="text/javascript">
document.body.oncopy = function() {
if (window.clipboardData) {
setTimeout(function() {
var text = clipboardData.getData("text");
if (text && text.length>300) {
text = text + "\r\n\n本文来自CSDN博客，转载请标明出处：" + location.href;
clipboardData.setData("text", text);
}
}, 100);
}
}
</script>
<script class="blogstory">function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>
<p>一、安装(以root身份进行)</p>
<p>1、检出最新的postgresql的yum配置从http://yum.pgsqlrpms.org/reporpms/repoview/pgdg-centos.html</p>
<p>然后根据版本选择需要的rpm后执行下列命令</p>
<p>rpm -Uvh http://yum.pgsqlrpms.org/reporpms/8.3/pgdg-centos-8.3-6.noarch.rpm</p>
<p>2、安装或者升级postgresql-libs</p>
<p>yum upgrade postgresql-libs</p>
<p>3、安装postgresql</p>
<p>yum install postgresql postgresql-server</p>
<p>4、初始化数据库以及启动服务</p>
<p>service postgresql initdb</p>
<p>service postgresql start</p>
<p>二、配置</p>
<p>在配置之前需将postgresql的端口号5432在iptables下开放。</p>
<p>yum安装postgresql后的安装路径为：/var/lib/pgsql下，主要配置文件在其data文件夹下，进入data文件夹</p>
<p>1、修改postgresql.conf文件</p>
<p>如果想让PostgreSQL监听整个网络的话，将listen_addresses前的#去掉，并将listen_addresses = 'localhost'改成listen_addresses = '*'</p>
<p>2、修改pg_hba.conf</p>
<p>这个文件最后有一个列表，它决定了分派了每一个用户的权限，以及认证方式。格式是&#8220;Type Database User Address Method&#8221;，要注意的是method最好写md5。</p>
<p>在列表后追加一行：host&nbsp;&nbsp;&nbsp; all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 192.168.1.0/24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; password</p>
<p>3、修改postgres用户密码：passwd postgres</p>
<p>4、暂时将pg_hba.conf中，本机的认证方式改为trust，切换当前用户为postgres：su postgres</p>
<p>5、用psql登录PostgreSQL系统，&#8220;SELECT * FROM pg_shadow;&#8221;，发现这个表里的postgres这个用户根本还没有存储密码；于是，再&#8220;ALTER USER postgres PASSWORD '它的密码';</p>
<p>6、重启服务/etc/init.d/postgresql restart，连接成功。</p>
</div>
<img src ="http://www.blogjava.net/ocean07000814/aggbug/292065.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ocean07000814/" target="_blank">非洲小白脸</a> 2009-08-21 11:45 <a href="http://www.blogjava.net/ocean07000814/articles/292065.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CentOS Samba 服务器的构建</title><link>http://www.blogjava.net/ocean07000814/articles/292056.html</link><dc:creator>非洲小白脸</dc:creator><author>非洲小白脸</author><pubDate>Fri, 21 Aug 2009 01:48:00 GMT</pubDate><guid>http://www.blogjava.net/ocean07000814/articles/292056.html</guid><wfw:comment>http://www.blogjava.net/ocean07000814/comments/292056.html</wfw:comment><comments>http://www.blogjava.net/ocean07000814/articles/292056.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ocean07000814/comments/commentRss/292056.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ocean07000814/services/trackbacks/292056.html</trackback:ping><description><![CDATA[<div class="tit">[转]CentOS Samba 服务器的构建</div>
<div id="blog_text" class="cnt">
<h2> </h2>
<div class="t_msgfont">
<table class="t_table" cellspacing="0">
    <tbody>
        <tr>
            <td>前　　言</td>
        </tr>
    </tbody>
</table>
<br />
在我们使用 Windows 作为客户机的时候，通常有文件、打印共享的需求。作为Windows 网络功能之一，通常可以在 Windows 客户机之间通过 Windows Network 固有的功能实现这些要求。然而，通过 Samba 我们也可以让一台 <span class="t_tag" href="http://www.stksky.com/tag.php?name=CentOS">CentOS</span> 主机来兼容 Windows 网络，实现同样的功能，进而充分发挥 CentOS 主机的可用性。<br />
<br />
本篇文档主要介绍怎样通过 Samba 服务器的构建实现 Windows 网络中的文件共享。<br />
<br />
<table style="width: 98%;" class="t_table" cellspacing="0">
    <tbody>
        <tr>
            <td>
            <table class="t_table" cellspacing="0">
                <tbody>
                    <tr>
                        <td>安装 Samba</td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
首先，通过 yum 来在线安装 Samba 。<br />
<br />
<table style="width: 98%;" class="t_table" cellspacing="0">
    <tbody>
        <tr>
            <td>[root@sample ~]# yum -y install samba　 &#8592; 安装 Samba <br />
            <br />
            Setting up Install Process<br />
            Setting up repositories<br />
            update 100% |=========================| 951 B 00:00<br />
            base 100% |=========================| 1.1 kB 00:00<br />
            addons 100% |=========================| 951 B 00:00<br />
            extras 100% |=========================| 1.1 kB 00:00<br />
            Reading repository metadata in from local files<br />
            primary.xml.gz 100% |=========================| 73 kB 00:00<br />
            update : ################################################## 212/212<br />
            Added 212 new packages, deleted 0 old in 4.94 seconds<br />
            primary.xml.gz 100% |=========================| 569 kB 00:00<br />
            base : ################################################## 1500/1500<br />
            Added 1500 new packages, deleted 0 old in 28.97 seconds<br />
            primary.xml.gz 100% |=========================| 157 B 00:00<br />
            Added 0 new packages, deleted 0 old in 0.03 seconds<br />
            primary.xml.gz 100% |=========================| 32 kB 00:00<br />
            extras : ################################################## 124/124<br />
            Added 124 new packages, deleted 0 old in 1.93 seconds<br />
            Parsing package install arguments<br />
            Resolving Dependencies<br />
            --&gt; Populating transaction set with selected packages. Please wait.<br />
            ---&gt; Downloading header for samba to pack into transaction set.<br />
            samba-3.0.10-1.4E.9.i386. 100% |=========================| 101 kB 00:00<br />
            ---&gt; Package samba.i386 0:3.0.10-1.4E.9 set to be updated<br />
            --&gt; Running transaction check<br />
            --&gt; Processing Dependency: samba-common = 0:3.0.10 for package: samba<br />
            --&gt; Restarting Dependency Resolution with new changes.<br />
            --&gt; Populating transaction set with selected packages. Please wait.<br />
            ---&gt; Downloading header for samba-common to pack into transaction set.<br />
            samba-common-3.0.10-1.4E. 100% |=========================| 37 kB 00:00<br />
            ---&gt; Package samba-common.i386 0:3.0.10-1.4E.9 set to be updated<br />
            --&gt; Running transaction check Dependencies Resolved<br />
            =============================================================================<br />
            Package Arch Version Repository Size<br />
            =============================================================================<br />
            Installing:<br />
            samba i386 3.0.10-1.4E.9 base 13 M<br />
            Installing for dependencies:<br />
            samba-common i386 3.0.10-1.4E.9 base 5.0 M<br />
            Transaction Summary<br />
            =============================================================================<br />
            Install 2 Package(s)<br />
            Update 0 Package(s)<br />
            Remove 0 Package(s)<br />
            Total download size: 18 M<br />
            Downloading Packages:<br />
            (1/2): samba-common-3.0.1 100% |=========================| 5.0 MB 00:04<br />
            (2/2): samba-3.0.10-1.4E. 100% |=========================| 13 MB 00:11<br />
            warning: rpmts_HdrFromFdno: V3 DSA signature: NOKEY, key ID 443e1821<br />
            Public key for samba-common-3.0.10-1.4E.9.i386.rpm is not installed<br />
            Retrieving GPG key from <a target="_blank" href="http://mirror.centos.org/centos/RPM-GPG-KEY-centos4">http://mirror.centos.org/centos/RPM-GPG-KEY-centos4</a><br />
            Importing GPG key 0x443E1821 "CentOS-4 key &lt;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#99;&#101;&#110;&#116;&#111;&#115;&#45;&#52;&#107;&#101;&#121;&#64;&#99;&#101;&#110;&#116;&#111;&#115;&#46;&#111;&#114;&#103;">centos-4key@centos.org</a>&gt;"<br />
            Key imported successfully<br />
            Running Transaction Test<br />
            Finished Transaction Test<br />
            Transaction Test Succeeded<br />
            Running Transaction<br />
            Installing: samba-common ######################### [1/2]<br />
            Installing: samba ######################### [2/2]<br />
            Installed: samba.i386 0:3.0.10-1.4E.9<br />
            Dependency Installed: samba-common.i386 0:3.0.10-1.4E.9<br />
            Complete!</td>
        </tr>
    </tbody>
</table>
<br />
<table style="width: 98%;" class="t_table" cellspacing="0">
    <tbody>
        <tr>
            <td>
            <table class="t_table" cellspacing="0">
                <tbody>
                    <tr>
                        <td>配置 Samba</td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
然后，通过编辑 /etc/samba/smb.conf ，根据需求配置 Samba。在这里，本文的原则是只将文件共享应用于内网，并让将要被共享的目录拥有充分的读写权限属性。<br />
<table style="width: 98%;" class="t_table" cellspacing="0">
    <tbody>
        <tr>
            <td>[root@sample ~]# vi /etc/samba/smb.conf　 &#8592; 编辑 Samba 的配置文件<br />
            <br />
            #======================= Global Settings =====================================<br />
            [global] 　 &#8592; 找到这一行（全局设置标签），在此行下面添加如下行：<br />
            <br />
            dos charset = GB2312　 &#8592; 将 Windows 客户端的文字编码设置为简体中文 GB2312<br />
            unix charset = GB2312　 &#8592; 指定 Samba 所在的 CentOS 服务端新建文件或目录时的编码为 GB2312 <br />
            display charset = GB2312　 &#8592; 指定使用 SWAT（一种通过浏览器控制Samba的工具）时页面的默认文字编码 <br />
            directory mask = 0777　 &#8592; 指定新建目录的属性（以下4行）<br />
            force directory mode = 0777<br />
            directory security mask = 0777<br />
            force directory security mode = 0777<br />
            create mask = 0777　 &#8592; 指定新建文件的属性（以下4行）<br />
            force create mode = 0777<br />
            security mask = 0777<br />
            force security mode = 0777<br />
            <br />
            workgroup = MYGROUP　 &#8592; 找到此行，将工作组名称改为 Windows 网络所定义的工作组名<br />
            &#8595;<br />
            workgroup = WORKGROUP　 &#8592; 变为此状态，这里以 Windows XP 默认的&#8220;WORKGROUP&#8221;为例<br />
            <br />
            ; hosts allow = 192.168.1. 192.168.2. 127.　 &#8592; 找到此行，去掉行首的&#8220;;&#8221;，并制定访问限制<br />
            &#8595;<br />
            hosts allow = 192.168.0. 127.　 &#8592; 变为此状态，指定内网IP地址及本地，只允许这两种情况的访问<br />
            <br />
            然后在配置文件的末尾填如下几行，定义公众共享目录：<br />
            <br />
            [public]<br />
            comment = Public Stuff<br />
            path = /home/samba　 &#8592; 指定共享目录位置<br />
            public = yes<br />
            writable = yes　 &#8592; 赋予共享目录写入权限的属性</td>
        </tr>
    </tbody>
</table>
接下来，创建将要通过 Samba 共享给 Windows 网络的专用目录。<br />
<table style="width: 98%;" class="t_table" cellspacing="0">
    <tbody>
        <tr>
            <td>[root@sample ~]# mkdir /home/samba　 &#8592; 建立共享文件专用目录<br />
            <br />
            [root@sample ~]# chown -R nobody. /home/samba　 &#8592; 设置专用目录归属为 nobody <br />
            <br />
            [root@sample ~]# chmod 777 /home/samba　 &#8592; 将专用目录属性设置为 777</td>
        </tr>
    </tbody>
</table>
<br />
在进行到服务端的连接之前，需要预先对用于登录 Samba 的用户进行设置。这里我们以 CentOS 中 Samba 标准的 Samba
用户数据库管理工具&#8220;smbpasswd&#8221;为例，创建用于登录 Samba 的用户数据。这里需要注意的一点：用 smbpasswd
创建用户的前提是，系统用户中存在该用户 -- 在基于系统用户之上，才可以创建该用户在 Samba 用户数据库中的信息。<br />
<br />
<table style="width: 98%;" class="t_table" cellspacing="0">
    <tbody>
        <tr>
            <td>[root@sample ~]# smbpasswd -a centospub　 &#8592; 将系统用户 centospub（例）加入到 Samba 用户数据库<br />
            <br />
            New SMB password:　 &#8592; 输入该用户用于登录 Samba 的密码<br />
            Retype new SMB password:　 &#8592; 再次确认输入该密码<br />
            Added user centospub.</td>
        </tr>
    </tbody>
</table>
<br />
<table style="width: 98%;" class="t_table" cellspacing="0">
    <tbody>
        <tr>
            <td>
            <table class="t_table" cellspacing="0">
                <tbody>
                    <tr>
                        <td>启动 Samba 服务</td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
在启动 Samba 服务之前，首先将防火墙设置中 Samba 所用到的端口进行开放。<br />
<table style="width: 98%;" class="t_table" cellspacing="0">
    <tbody>
        <tr>
            <td>[root@sample ~]# vi /etc/sysconfig/iptables　 &#8592; 编辑 iptables 配置文件<br />
            <br />
            -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT　 &#8592; 找到此行，在下面添加如下行：<br />
            -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 139 -j ACCEPT<br />
            -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 445 -j ACCEPT<br />
            -A RH-Firewall-1-INPUT -p udp -m udp --dport 137 -j ACCEPT<br />
            -A RH-Firewall-1-INPUT -p udp -m udp --dport 138 -j ACCEPT<br />
            <br />
            [root@sample ~]# /etc/rc.d/init.d/iptables restart　 &#8592; 重新启动 iptables ，使新的规则生效 <br />
            Flushing firewall rules: 　　　　　　　　　[ OK ]<br />
            Setting chains to policy ACCEPT: filter 　　[ OK ]<br />
            Unloading iptables modules: 　　　　　　[ OK ]<br />
            Applying iptables firewall rules: 　　　　　[ OK ]</td>
        </tr>
    </tbody>
</table>
最后，启动 Samba 服务。<br />
<table style="width: 98%;" class="t_table" cellspacing="0">
    <tbody>
        <tr>
            <td>[root@sample ~]# chkconfig smb on　 &#8592; 设置 Samba 自启动<br />
            <br />
            [root@sample ~]# chkconfig --list smb　 &#8592; 确认 Samba 启动标签，确认 2-5 为 on 的状态<br />
            smb 0:off 1:off 2:on 3:on 4:on 5:on 6:off<br />
            <br />
            [root@sample ~]# <span style="color: red;">/etc/rc.d/init.d/smb start</span>　 &#8592; <span style="color: red;">启动 Samba 服务</span><br />
            Starting SMB services:　　　　　　 [ <span style="color: red;">OK </span>]<br />
            Starting NMB services:　　　　　　 [ <span style="color: red;">OK </span>]</td>
        </tr>
    </tbody>
</table>
<br />
<table style="width: 98%;" class="t_table" cellspacing="0">
    <tbody>
        <tr>
            <td>
            <table class="t_table" cellspacing="0">
                <tbody>
                    <tr>
                        <td>从 Windows 客户端连接到 Samba 服务器</td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
在服务端启动 Samba 服务后，我们就可以从 Windows 客户端通过 Windows 网络连接到 Samba。这里以 Windows XP 为例，说明如下连接过程：<br />
<br />
1、从桌面打开&#8220;网上邻居&#8221;，并点击&#8220;查看工作组计算机&#8221;选项；<br />
<br />
<img src="http://www.centospub.com/make/samba/samba01.gif" width="597" border="0" height="413"  alt="" /> <br />
<br />
2、确认出现 Samba 服务端的连接，并双击该连接；（本站文档的主机名以 Sample 为例）<br />
<br />
<img src="http://www.centospub.com/make/samba/samba02.gif" width="597" border="0" height="413"  alt="" /> <br />
<br />
3、输入在服务端预先设置好的 Samba 用户的用户名及密码；（用户名同系统用户名，密码需要输入在通过 smbpasswd 为该系统用户设置的 Samba 专用的密码。）<br />
<br />
<img src="http://www.centospub.com/make/samba/samba03.gif" width="597" border="0" height="413"  alt="" /> <br />
<br />
4、然后确认能够连接到 Samba 服务器，并出现根目录及 Samba 专用共享目录。<br />
<br />
<img src="http://www.centospub.com/make/samba/samba04.gif" width="597" border="0" height="413"  alt="" /><br />
<br />
最后，在相应目录进行新建、修改以及删除文件的操作，测试相应权限的可操作性。</div>
</div>
<img src ="http://www.blogjava.net/ocean07000814/aggbug/292056.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ocean07000814/" target="_blank">非洲小白脸</a> 2009-08-21 09:48 <a href="http://www.blogjava.net/ocean07000814/articles/292056.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>native2ascii.exe -reverse file1.properties file2.properties</title><link>http://www.blogjava.net/ocean07000814/articles/283061.html</link><dc:creator>非洲小白脸</dc:creator><author>非洲小白脸</author><pubDate>Thu, 18 Jun 2009 07:37:00 GMT</pubDate><guid>http://www.blogjava.net/ocean07000814/articles/283061.html</guid><wfw:comment>http://www.blogjava.net/ocean07000814/comments/283061.html</wfw:comment><comments>http://www.blogjava.net/ocean07000814/articles/283061.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ocean07000814/comments/commentRss/283061.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ocean07000814/services/trackbacks/283061.html</trackback:ping><description><![CDATA[ <img src ="http://www.blogjava.net/ocean07000814/aggbug/283061.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ocean07000814/" target="_blank">非洲小白脸</a> 2009-06-18 15:37 <a href="http://www.blogjava.net/ocean07000814/articles/283061.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>properties文件读入</title><link>http://www.blogjava.net/ocean07000814/articles/281776.html</link><dc:creator>非洲小白脸</dc:creator><author>非洲小白脸</author><pubDate>Fri, 12 Jun 2009 03:20:00 GMT</pubDate><guid>http://www.blogjava.net/ocean07000814/articles/281776.html</guid><wfw:comment>http://www.blogjava.net/ocean07000814/comments/281776.html</wfw:comment><comments>http://www.blogjava.net/ocean07000814/articles/281776.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ocean07000814/comments/commentRss/281776.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ocean07000814/services/trackbacks/281776.html</trackback:ping><description><![CDATA[<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;test;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_73_532_Open_Image" onclick="this.style.display='none'; Codehighlighter1_73_532_Open_Text.style.display='none'; Codehighlighter1_73_532_Closed_Image.style.display='inline'; Codehighlighter1_73_532_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_73_532_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_73_532_Closed_Text.style.display='none'; Codehighlighter1_73_532_Open_Image.style.display='inline'; Codehighlighter1_73_532_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;test&nbsp;</span><span id="Codehighlighter1_73_532_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_73_532_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_116_405_Open_Image" onclick="this.style.display='none'; Codehighlighter1_116_405_Open_Text.style.display='none'; Codehighlighter1_116_405_Closed_Image.style.display='inline'; Codehighlighter1_116_405_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_116_405_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_116_405_Closed_Text.style.display='none'; Codehighlighter1_116_405_Open_Image.style.display='inline'; Codehighlighter1_116_405_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getPara(String&nbsp;fileName)&nbsp;</span><span id="Codehighlighter1_116_405_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_116_405_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;Properties&nbsp;prop&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Properties();<br />
<img id="Codehighlighter1_162_281_Open_Image" onclick="this.style.display='none'; Codehighlighter1_162_281_Open_Text.style.display='none'; Codehighlighter1_162_281_Closed_Image.style.display='inline'; Codehighlighter1_162_281_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_162_281_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_162_281_Closed_Text.style.display='none'; Codehighlighter1_162_281_Open_Image.style.display='inline'; Codehighlighter1_162_281_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_162_281_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_162_281_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;InputStream&nbsp;is&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getClass().getResourceAsStream(fileName);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;prop.load(is);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(is&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;is.close();<br />
<img id="Codehighlighter1_303_369_Open_Image" onclick="this.style.display='none'; Codehighlighter1_303_369_Open_Text.style.display='none'; Codehighlighter1_303_369_Closed_Image.style.display='inline'; Codehighlighter1_303_369_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_303_369_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_303_369_Closed_Text.style.display='none'; Codehighlighter1_303_369_Open_Image.style.display='inline'; Codehighlighter1_303_369_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;e)&nbsp;</span><span id="Codehighlighter1_303_369_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_303_369_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;System.out.println(e&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">file&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;fileName&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;not&nbsp;found</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;prop.getProperty(</span><span style="color: #000000">"</span><span style="color: #000000">db</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_448_530_Open_Image" onclick="this.style.display='none'; Codehighlighter1_448_530_Open_Text.style.display='none'; Codehighlighter1_448_530_Closed_Image.style.display='inline'; Codehighlighter1_448_530_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_448_530_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_448_530_Closed_Text.style.display='none'; Codehighlighter1_448_530_Open_Image.style.display='inline'; Codehighlighter1_448_530_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_448_530_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_448_530_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;test&nbsp;test&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;test();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;System.out.println(test.getPara(</span><span style="color: #000000">"</span><span style="color: #000000">db.properties</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
<br />
java文件同级目录下建立db.properties，<br />
内容&nbsp; db=123445<br />
<br />
 <img src ="http://www.blogjava.net/ocean07000814/aggbug/281776.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ocean07000814/" target="_blank">非洲小白脸</a> 2009-06-12 11:20 <a href="http://www.blogjava.net/ocean07000814/articles/281776.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse的远程调试</title><link>http://www.blogjava.net/ocean07000814/articles/256208.html</link><dc:creator>非洲小白脸</dc:creator><author>非洲小白脸</author><pubDate>Mon, 23 Feb 2009 05:52:00 GMT</pubDate><guid>http://www.blogjava.net/ocean07000814/articles/256208.html</guid><wfw:comment>http://www.blogjava.net/ocean07000814/comments/256208.html</wfw:comment><comments>http://www.blogjava.net/ocean07000814/articles/256208.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ocean07000814/comments/commentRss/256208.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ocean07000814/services/trackbacks/256208.html</trackback:ping><description><![CDATA[<span class="a14c" id="zoom">
<blockquote>在本地计算机上调试 Java&#8482; 应用程序并不是惟一的选择。学习如何使用构成远程调试的不同连接类型进行远程调试。本文概述了设置远程应用程序调试的特性和示例。</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
<p>远程调试对应用程序开发十分有用。例如，为不能托管开发平台的低端机器开发程序，或在专用的机器上（比如服务不能中断的 Web 服务器）调试程序。其他情况包括：运行在内存小或 CUP 性能低的设备上的 Java 应用程序（比如移动设备），或者开发人员想要将应用程序和开发环境分开，等等。</p>
<p><span class="atitle">先决条件</span></p>
<table cellspacing="0" cellpadding="0" width="40%" align="right" border="0">
    <tbody>
        <tr>
            <td width="10"><img height="1" alt="" src="http://www.linuxeden.com/upimg/allimg/090113/0909080.gif" width="10" /></td>
            <td>
            <table cellspacing="0" cellpadding="5" width="100%" border="1">
                <tbody>
                    <tr>
                        <td bgcolor="#eeeeee">启动配置类型<br />
                        启动配置 保存一组用于启动程序的属性。启动配置类型是一种可以在 Eclipse 平台上启动的独特程序。</td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<p>如果您还没安装该程序，请下载 Eclipse V3.4（Ganymede）。在 Ganymede 中，套接字（socket）监听连接器被添加到 Remote Java Application 启动配置类型。Eclipse 最新的套接字监听连接器允许您打开 Java 调试器，它能够监听特定套接字上的连接。可以从命令行选项打开被调试的程序，并将其连接到调试器。在 Ganymede 发布之前，仅有一个连接套接字的连接器，被调试的程序所在的机器必须是一个与调试器相连的调试主机。由于受到内存和 CPU 不足的限制，要想让移动设备充当主机是不现实的。</p>
<p>为了进行远程调试，必须使用 Java Virtual Machine (JVM) V5.0 或更新版本，比如 IBM&#174; J9 或 Sun Microsystem 的 Java SE Development Kit（JDK）。本文主要讨论远程调试，而不是每个 Eclipse 调试特性的细节。查看 参考资料 获得更多关于使用 Eclipse 进行调试的信息，并且可以找到上面提到的软件。</p>
<p><span class="atitle">JPDA 简介</span></p>
<table cellspacing="0" cellpadding="0" width="40%" align="right" border="0">
    <tbody>
        <tr>
            <td width="10"><img height="1" alt="" src="http://www.linuxeden.com/upimg/allimg/090113/0909080.gif" width="10" /></td>
            <td>
            <table cellspacing="0" cellpadding="5" width="100%" border="1">
                <tbody>
                    <tr>
                        <td bgcolor="#eeeeee">常用缩写词<br />
                        <ul>
                            <li>JDI — Java 调试接口（Java Debug Interface）
                            <li>JDT — Java 开发工具（Java Development Tools）
                            <li>JDWP — Java 调试网络协议（Java Debug Wire Protocol）
                            <li>JPDA — Java 平台调试器架构（Java Platform Debugger Architecture）
                            <li>JVM — Java 虚拟机（Java Virtual Machine）
                            <li>JVMDI — JVM 调试接口（JVM Debug Interface）
                            <li>JVMTI — JVM 工具接口（JVM Tool Interface）
                            <li>VM — 虚拟机（Virtual Machine） </li>
                        </ul>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<p>Sun Microsystem 的 Java Platform Debugger Architecture (JPDA) 技术是一个多层架构，使您能够在各种环境中轻松调试 Java 应用程序。JPDA 由两个接口（分别是 JVM Tool Interface 和 JDI）、一个协议（Java Debug Wire Protocol）和两个用于合并它们的软件组件（后端和前端）组成。它的设计目的是让调试人员在任何环境中都可以进行调试。JPDA 不仅能够用于桌面系统，而且能够在嵌入式系统上很好地工作。</p>
<p>JVM Tool Interface (JVMTI) 规定必须为调试提供 VM（编辑注：从 Java V5 开始，将用 JVMTI 代替 Java V1.4 中的 JVMDI）。Java Debug Wire Protocol (JDWP) 描述调试信息的格式，以及在被调试的进程和调试器前端之间传输的请求，调试器前端实现 JDI，比如 Eclipse、Borland JBuilder 等。根据 Sun 的 JPDA 规范，被调试的程序常常称为 debuggee。JDI 是一个高级的接口，它定义用于远程调试的信息和请求。下面给出了调试器的架构。</p>
<br />
清单 1. Java 平台调试器架构<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">            Components                      Debugger Interfaces
            /    |--------------|
            /     |     VM       |
            debuggee -----(      |--------------|  &lt;---- JVMTI - Java VM Tool Interface
            \     |   back-end   |
            \    |--------------|
            /           |
            comm channel --(            |  &lt;------------ JDWP - Java Debug Wire Protocol
            \           |
            /    |--------------|
            /     |  front-end   |
            debugger -----(      |--------------|  &lt;---- JDI - Java Debug Interface
            \     |      UI      |
            \    |--------------|
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>因此，任何第三方工具和基于 JPDA 的 VM 应该都能协调工作。通过这个客户机-服务器架构，您可以从运行该平台的本地工作站调试 Java 程序，甚至还可以通过网络进行远程调试。</p>
<p>在讨论调试场景之前，我们先了解 JPDA 规范中的两个术语：连接器和传输。连接器是一个 JDI 抽象，用来在调试器应用程序和目标 VM 之间建立连接。传输定义应用程序如何进行访问，以及数据如何在前端和后端之间传输。连接器 &#8220;映射&#8221; 到可用的传输类型和连接模式。在 Sun 的 JPDA 参考实现中，为 Microsoft&#174; Windows&#174; 提供了两个传输机制：套接字传输和共享内存传输。可用的连接器：</p>
<ul>
    <li>连接套接字连接器
    <li>连接共享内存连接器
    <li>监听套接字连接器
    <li>监听共享内存连接器
    <li>启动命令行连接器 </li>
</ul>
<p>在调试器应用程序和目标 VM 之间建立连接时，有一端将用作服务器并监听连接。随后，另一端将连接到监听器并建立一个连接。通过连接，调试器应用程序或目标 VM 都可以充当服务器。进程之间的通信可以在同一个机器或不同的机器上运行。</p>
<p>要远程调试 Java 程序，难点不是在调试器的前端，而是远程 Java 后端。不幸的是，Eclipse 帮助系统中为这方面提供的信息并不多。事实上，JDI 和 JVMTI 是分别由 Eclipse 和 Java 运行时环境实现的。我们仅需要考虑 JDMP，因为它包含与 JVMTI 和 JDI 进行通信所需的信息。JDWP 包含许多参数，用于为远程 Java 应用程序调用所需的程序。以下是本文用到的一些参数。</p>
<dl>
<dt>-Xdebug
<dd>启用调试特性。</dd></dl>
<dl>
<dt>-Xrunjdwp:&lt;sub-options&gt;
<dd>在目标 VM 中加载 JDWP 实现。它通过传输和 JDWP 协议与独立的调试器应用程序通信。下面介绍一些特定的子选项。</dd></dl>
<p>从 Java V5 开始，您可以使用 -agentlib:jdwp 选项，而不是 -Xdebug 和 -Xrunjdwp。但如果连接到 V5 以前的 VM，只能选择 -Xdebug 和 -Xrunjdwp。下面简单描述 -Xrunjdwp 子选项。</p>
<dl>
<dt>transport
<dd>这里通常使用套接字传输。但是在 Windows 平台上也可以使用共享内存传输。</dd></dl>
<dl>
<dt>server
<dd>如果值为 y，目标应用程序监听将要连接的调试器应用程序。否则，它将连接到特定地址上的调试器应用程序。</dd></dl>
<dl>
<dt>address
<dd>这是连接的传输地址。如果服务器为 n，将尝试连接到该地址上的调试器应用程序。否则，将在这个端口监听连接。</dd></dl>
<dl>
<dt>suspend
<dd>如果值为 y，目标 VM 将暂停，直到调试器应用程序进行连接。</dd></dl>
<p>要获得每个调试设置的详细解释，请参考 JPDA 文档（参见 参考资料）。</p>
<p>清单 2 是一个示例，显示如何在调试模式下启动 VM 并监听端口 8765 的套接字连接。</p>
<br />
清单 2. 作为调试服务器的目标 VM<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">            -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8765
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>清单 3 显示如何使用位于 8000 端口的主机 127.0.0.1 上的套接字连接运行中的调试器应用程序。</p>
<br />
清单 3. 作为调试客户机的目标 VM<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">            -Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:8000
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.linuxeden.com/upimg/allimg/090113/0909082.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.linuxeden.com/upimg/allimg/090113/0909080.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><span class="atitle">Eclipse 中的远程调试特性</span></p>
<p>Eclipse 是一个图形化 Java 调试器前端。JDI 在 org.eclipse.jdt.debug 包中实现。本文不详细讨论 JDI 实现。参见 参考资料 获得关于 Eclipse JDT 和 Java JDI 技术的信息。</p>
<p>我们首先应该知道要使用哪个 Eclipse 连接器。要了解 Eclipse 提供的远程连接类型，您可以转到 Eclipse 菜单并选择 Run &gt; Debug Configurations...，在 Remote Java Application 中添加一个启动配置，然后从下拉列表中选择连接器。在 Ganymede 中共有两个连接器：</p>
<ul>
    <li>Socket Attach
    <li>Socket Listen </li>
</ul>
<p>对于监听套接字的连接器，Eclipse VM 将是与远程 Java 应用程序连接的主机。对于连接套接字的连接器，目标 VM 将作为主机。这两种连接器对应用程序调试没有影响，用户可以任意选择。但根据经验，需要使用速度更快、更强大的计算机作为 VM 调试主机，因为需要计算的资源很多。</p>
<p>在调试 Java 应用程序之前，需要确保已经为远程应用程序启用所有调试选项。如果选项信息不可用，您将收到一个错误信息，比如 &#8220;Debug information is not available&#8221; 或 &#8220;Unable to install breakpoint due to missing line number&#8221;。您可以通过更改 Eclipse 菜单上的 Window &gt; Preferences &gt; Java &gt; Compiler 来修改设置。</p>
<br />
图 1. Eclipse 中的调试选项 <br />
<img alt="Eclipse 中的调试选项" src="http://www.linuxeden.com/upimg/allimg/090113/0909084.jpg" /> <br />
<br />
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.linuxeden.com/upimg/allimg/090113/0909082.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.linuxeden.com/upimg/allimg/090113/0909080.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><span class="atitle">远程调试应用程序</span></p>
<p>现在，我们已经准备好远程调试应用程序。我们分步执行：</p>
<dl>
<dt>1. 使用简单类创建一个 Java 项目
<dd>我们为调试创建一个简单类。清单 4 给出了示例代码。</dd></dl><br />
清单 4. 调试示例代码<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">            package com.ibm.developerWorks.debugtest;
            public class test {
            public static void main(String[] args) {
            System.out.println("This is a test.");
            }
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<dl>
<dt>2. 设置一个断点
<dd>在代码中设置一个断点。在这个例子中，我们在 System.out.println("This is a test."); 这行中设置断点。</dd></dl><br />
图 2. 在 Eclipse 中设置断点<br />
<img alt="在 Eclipse 中设置断点" src="http://www.linuxeden.com/upimg/allimg/090113/0909087.jpg" /> <br />
<dl>
<dt>3. 从本地调试应用程序
<dd>在调试应用程序之前，确保已经为项目启用图 1 中描述的调试选项。从本地调试应用程序是没有必要的，但是这可以确保是否所有调试信息都可用。右键单击 Java 项目，并选择 Debug As，然后选择 Java Application（参见图 3）。如果应用程序在断点处停止执行，则表明调试信息正确显示。这时，可以继续使用这些调试特性，比如显示调试堆栈、变量或断点管理等等。</dd></dl><br />
图 3. 从本地调试应用程序<br />
<img alt="从本地调试应用程序" src="http://www.linuxeden.com/upimg/allimg/090113/0909088.jpg" /> <br />
<dl>
<dt>4. 导出 Java 项目
<dd>我们将使用这个应用程序作为调试目标。右键单击 Java 项目，选择 Export，然后选择 Java，最后选择 JAR file 或 Runnable JAR file 导出项目。将在指定的位置生成 JAR 文件。注意，如果 Java 源代码与目标应用程序不匹配，调试特性将不能正常工作。</dd></dl>
<dl>
<dt>5. 手动运行 Java 应用程序
<dd>打开控制台手动启动应用程序，确保正确配置了 Java 运行时环境。</dd></dl><br />
清单 5. 调用 Java 应用程序的示例<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">            java -jar test.jar
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<dl>
<dt>6. 远程调试应用程序
<dd>将 JAR 文件复制到远程计算机或同一台计算机上的适当位置，调用调试服务器，然后为它添加一个客户机。简单的 Java 应用程序就可以充当调试服务器或客户机。您可以在 Eclipse 中选择 Socket Attach 或 Socket Listen 连接类型，这取决于特定的配置。接下来的两个小节将学习如何将应用程序作为服务器或客户机运行。</dd></dl>
<p><span class="smalltitle">作为调试服务器的目标 VM</span></p>
<p>下面这个示例远程调用 Java 应用程序作为调试服务器，并在端口 8000 监听套接字连接。目标 VM 将暂停，直到调试器连接。</p>
<br />
清单 6. Eclipse 连接套接字模式下的 VM 调用示例<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">            java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address="8000" -jar
            test.jar
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>使用远程启动配置启动 Eclipse，并指定远程应用程序的目标 VM 地址。为此，单击 Run &gt; Debug Configurations，然后在 Eclipse 菜单中双击 Remote Java Application。从最新创建的启动配置中为目标应用程序指定 IP 和端口。为了在同一台机器上运行远程应用程序，仅需将主机 IP 指定为 localhost 或 127.0.0.1。</p>
<br />
图 4. 连接套接字连接的配置<br />
<img alt="连接套接字连接的配置" src="http://www.linuxeden.com/upimg/allimg/090113/0909089.jpg" /> <br />
<br />
<p>选择 Allow termination of remote VM 选项终止在应用程序调试期间连接的 VM。</p>
<br />
图 5. Eclipse 中的 Terminate 按钮<br />
<img alt="Eclipse 中的 Terminate 按钮" src="http://www.linuxeden.com/upimg/allimg/090113/09090810.jpg" /> <br />
<br />
<p><span class="smalltitle">作为调试客户机的目标 VM</span></p>
<p>第二个示例使用一个简单的 Java 应用程序作为调试客户机，并且调试器前端作为调试服务器。Eclipse 使用套接字监听模式连接类型进行监听。必须先启动调试前端来监听特定的端口。图 6 给出一个用于设置监听的示例配置。</p>
<br />
图 6. 监听套接字连接的配置<br />
<img alt="监听套接字连接的配置" src="http://www.linuxeden.com/upimg/allimg/090113/09090811.jpg" /> <br />
<br />
<p>单击 Eclipse Debug 按钮，状态栏将显示消息 &#8220;waiting for vm to connect at port 8000...&#8221;。看到这个消息后，启动远程应用程序。清单 7 显示了如何将 Java 应用程序作为调试客户机并调用它，然后使用端口 8000 上的主机 127.0.0.1 的套接字将其连接到一个正在运行的调试器应用程序。</p>
<br />
清单 7. Eclipse 监听套接字连接模式中的 VM 调用示例<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">            java -Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:8000,suspend=y
            -jar test.jar
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>如果一切进行顺利，将会显示一个调试透视图帮助调试应用程序，并且远程 Java 应用程序将正常停止。这类似于步骤 3 中的本地调试（参见图 3）。在这里，您可以使用标准的调试特性，比如设置断点和值、单步执行等。</p>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.linuxeden.com/upimg/allimg/090113/0909082.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.linuxeden.com/upimg/allimg/090113/0909080.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<br />
<span style="color: red">注意：一定是自己编译的src才可。即：src要与调试的程序一致。</span><br />
<p><span class="atitle">结束语</span></p>
<p>本文演示如何使用 Eclipse 内置的远程 Java 应用程序配置类型对应用程序执行远程调试。介绍了如何设置 Java 应用程序以调用远程调试，并帮助您理解 Eclipse 提供的连接器。最后，您还学习了如何将这些技术应用到项目中。</p>
</span>
<img src ="http://www.blogjava.net/ocean07000814/aggbug/256208.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ocean07000814/" target="_blank">非洲小白脸</a> 2009-02-23 13:52 <a href="http://www.blogjava.net/ocean07000814/articles/256208.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SP写法实例——日期CHECK</title><link>http://www.blogjava.net/ocean07000814/articles/254885.html</link><dc:creator>非洲小白脸</dc:creator><author>非洲小白脸</author><pubDate>Mon, 16 Feb 2009 06:13:00 GMT</pubDate><guid>http://www.blogjava.net/ocean07000814/articles/254885.html</guid><wfw:comment>http://www.blogjava.net/ocean07000814/comments/254885.html</wfw:comment><comments>http://www.blogjava.net/ocean07000814/articles/254885.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ocean07000814/comments/commentRss/254885.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ocean07000814/services/trackbacks/254885.html</trackback:ping><description><![CDATA[<p>SET QUOTED_IDENTIFIER ON <br />
GO<br />
SET ANSI_NULLS ON <br />
GO</p>
<p>ALTER&nbsp; PROCEDURE sp****(<br />
&nbsp;@a&nbsp;&nbsp;AS VARCHAR(3),<br />
&nbsp;@b&nbsp;&nbsp;&nbsp;AS VARCHAR(7),<br />
&nbsp;@c&nbsp;&nbsp;&nbsp;AS CHAR(2),<br />
&nbsp;@d&nbsp;&nbsp;AS VARCHAR(7)<br />
) AS<br />
BEGIN<br />
&nbsp;DECLARE @NDTime varchar(50)<br />
&nbsp;DECLARE @aOD VARCHAR(8)<br />
&nbsp;DECLARE @dateDif&nbsp; INT<br />
&nbsp;DECLARE @JRC VARCHAR(1)</p>
<p>&nbsp;/* 現在日時取得SP(sp****NowDate)を使用して、日時を取得する。 */<br />
&nbsp;EXEC sp****NowDate @NDTime OUTPUT<br />
<br />
&nbsp;SELECT&nbsp;@aOD&nbsp;=&nbsp;字段<br />
&nbsp;FROM&nbsp;&nbsp;****&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;WHERE&nbsp;字段&nbsp;&nbsp;=&nbsp;@a<br />
&nbsp;AND&nbsp;&nbsp;字段&nbsp;&nbsp;=&nbsp;@b<br />
&nbsp;AND&nbsp;&nbsp;字段&nbsp;&nbsp;&nbsp;= &nbsp;@c<br />
AND&nbsp;&nbsp;字段&nbsp;&nbsp;=&nbsp;d<br />
&nbsp;<br />
&nbsp;SET @JRC= '1'<br />
&nbsp;if datediff(d,Convert(datetime,@aOD),Convert(datetime,@NDT)) &gt;= 180 begin<br />
&nbsp;&nbsp;SET @JRC = '0'<br />
&nbsp;end<br />
&nbsp;SELECT @JRC ****<br />
END</p>
<p><br />
GO<br />
SET QUOTED_IDENTIFIER OFF <br />
GO<br />
SET ANSI_NULLS ON <br />
GO</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/ocean07000814/aggbug/254885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ocean07000814/" target="_blank">非洲小白脸</a> 2009-02-16 14:13 <a href="http://www.blogjava.net/ocean07000814/articles/254885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何在Eclipse 3.1.1上安装jadclipse[java的反编译工具] </title><link>http://www.blogjava.net/ocean07000814/articles/241283.html</link><dc:creator>非洲小白脸</dc:creator><author>非洲小白脸</author><pubDate>Wed, 19 Nov 2008 01:30:00 GMT</pubDate><guid>http://www.blogjava.net/ocean07000814/articles/241283.html</guid><wfw:comment>http://www.blogjava.net/ocean07000814/comments/241283.html</wfw:comment><comments>http://www.blogjava.net/ocean07000814/articles/241283.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ocean07000814/comments/commentRss/241283.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ocean07000814/services/trackbacks/241283.html</trackback:ping><description><![CDATA[<p>jad是java的反编译工具，是命令行执行，反编译出来的源文件可读性较高。可惜用起来不太方便。还好</p>
<p>找到eclipse下的插件，叫jadclipse，安装好之后，只要双击.class文件，就能直接看源文件，包括jar</p>
<p>包中的class文件，也可以直接反编译。</p>
<p>1.下载jad1.5.8<br />
<a href="http://www.kpdus.com/jad.html#download">http://www.kpdus.com/jad.html#download</a><br />
下载后解压。解压缩后将jad.exe拷贝到JRE的bin目录下，如\Java\jre1.5.0_06\bin</p>
<p>2.下载 jadclipse_3.1.0.jar<br />
<a href="http://jaist.dl.sourceforge.net/sourceforge/jadclipse/jadclipse_3.1.0.jar">http://jaist.dl.sourceforge.net/sourceforge/jadclipse/jadclipse_3.1.0.jar</a><br />
将jadclipse_3.1.0.jar复制到D:\Program Files\eclipse\myplugin\eclipse\plugins目录下(用的是</p>
<p>link方式安装插件的)。<br />
<br />
这需要看你的Eclipse版本了<br />
最新版3.2.2（适用于Eclipse 3.2M5以上，包括3.4.x）在 <a href="http://prdownloads.sourceforge.net/jadclipse/jadclipse_3.2.2.jar?download" target="_blank">http://prdownloads.sourceforge.net/jadclipse/jadclipse_3.2.2.jar?download</a><br />
<br />
3.启动Eclipse后，在Windows--&gt;Perference--&gt;Java下面应该会多出一个JadClipse目录，相关的设置可</p>
<p>以在此修改 <br />
配置jadclipse：设置path to decompiler为jad.exe的全路径，如：F:\Java\jre1.5.0_06\bin\jad.exe</p>
<p>，在Directory for temporary files中指定临时文件的路径,如：G:\Java\eclipse-SDK-3.0-win32\temp<br />
4、在Eclipse的Windows--&gt;Perference--&gt;General-&gt;Editors-&gt;File Associations中修改&#8220;*.class&#8221;默</p>
<p>认关联的编辑器为&#8220;JadClipse Class File Viewer&#8221;<br />
5、安装完成，双击class文件，Eclipse将自动反编译了。</p>
<p><br />
</p>
<p>自从<span class="hilite1">eclipse</span>升级到<span class="hilite3">3</span>.<span class="hilite3">3</span>以后<span class="hilite4">jad</span>插件就一直没有成功的安装上去，网上看了好多文章也是以前版本的安装方法，<span class="hilite3">3</span>.<span class="hilite3">3</span>目前通过<span class="hilite1">eclipse</span>的software update的插件安装方式已经不行了。 <br />
<br />
目前安装方式如下： <br />
1.从<a href="http://www.kpdus.com/jad.html#download" target="_blank">http://www.kpdus.com/<span class="hilite4">jad</span>.html#download</a>地址下载最新的<span class="hilite4">jad</span>，我目前下载的是jadnt158.zip <br />
<br />
2.从<a href="http://nchc.dl.sourceforge.net/sourceforge/jadclipse/net.sf.jadclipse_3.3.0.jar" target="_blank">http://nchc.dl.sourceforge.net/sourceforge/jadclipse/net.sf.jadclipse_3.<span class="hilite3">3</span>.0.jar</a>地址下载jadclipse_3.<span class="hilite3">3</span>.0.jar，拷贝到<span class="hilite1">eclipse</span>的plugins目录下。 <br />
<br />
<span class="hilite3">3</span>.启动或重起<span class="hilite1">eclipse</span>，修改window -&gt; Preferences -&gt; Java -&gt; JadClipse 下的 <br />
Path to decompiler 如：D:\eric\jadnt158\<span class="hilite4">jad</span>.exe（jadnt158.zip解压后的目录） <br />
<br />
4.Windows -&gt; Perference -&gt; General -&gt; Editors -&gt; File Associations中修改&#8220;*.class&#8221;默认关联的编辑器为&#8220;JadClipse Class File Viewer&#8221; </p>
<img src ="http://www.blogjava.net/ocean07000814/aggbug/241283.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ocean07000814/" target="_blank">非洲小白脸</a> 2008-11-19 09:30 <a href="http://www.blogjava.net/ocean07000814/articles/241283.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache 2.x与WEBLOGIC 9集成-Windows篇</title><link>http://www.blogjava.net/ocean07000814/articles/198856.html</link><dc:creator>非洲小白脸</dc:creator><author>非洲小白脸</author><pubDate>Wed, 07 May 2008 01:30:00 GMT</pubDate><guid>http://www.blogjava.net/ocean07000814/articles/198856.html</guid><wfw:comment>http://www.blogjava.net/ocean07000814/comments/198856.html</wfw:comment><comments>http://www.blogjava.net/ocean07000814/articles/198856.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ocean07000814/comments/commentRss/198856.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ocean07000814/services/trackbacks/198856.html</trackback:ping><description><![CDATA[<strong>本文简要介绍Apache2.x如何与WLS7.0如何集成，主要包括一下内容：</strong><br />
软件环境描述<br />
安装Apache2.x <br />
安装WLS9.0，配置WLS Domain<br />
Apache2.x与WLS集成
<p><strong>软件环境描述</strong><br />
Windows&nbsp;XP Professional SP4<br />
Apache 2.0.47<br />
WebLogic Server 9.0 SP1</p>
<p><strong>安装Apache2.x</strong><br />
从Apache站点下载2.0.47版本的Apache HTTP Server，参考下载地址为：<br />
http://apache.linuxforum.net/dist/httpd/binaries/win32/apache_2.0.47-win32-x86-no_ssl.msi<br />
下载完毕后，开始安装apache。双击apache_2.0.47-win32-x86-no_ssl.msi，安装Apache，出现欢迎画面，点击"Next"，然后出现协议页面，选择同意协议选择，点击"Next"，出现说明页面，点击"Next"，然后出现下面所示画面：<br />
<img height="276" alt="" src="http://dev2dev.bea.com.cn/images/school/server031119/image002.jpg" width="427" /> <br />
图1 配置Apache<br />
填写完毕后，点击"Next"，选择典型安装，点击"Next"，然后出现选择安装路径，这里取默认值，点击"Next"，然后点击"Install"按钮。安装完毕后，点击"Finish"按钮，退出安装程序。这时候，你会发现在桌面的右下角出现apache的运行监视图标。</p>
<p><strong>安装WLS9.0，配置WLS Domain</strong><br />
安装WLS9.0，WLS7.0安装参数概要如下：<br />
</p>
<table cellspacing="1" cellpadding="2" width="80%" border="1">
    <tbody>
        <tr>
            <td>名称</td>
            <td>值</td>
        </tr>
        <tr>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td>BEA Home</td>
            <td>C:\bea</td>
        </tr>
        <tr>
            <td>Domain Name</td>
            <td>base_domain</td>
        </tr>
        <tr>
            <td>Domain类型</td>
            <td>WLS Domain</td>
        </tr>
        <tr>
            <td>Domain Location</td>
            <td>C:\bea\user_projects\</td>
        </tr>
        <tr>
            <td>Server类型</td>
            <td>Single Server(Standalone Server)</td>
        </tr>
        <tr>
            <td>Server Name</td>
            <td>myserver</td>
        </tr>
        <tr>
            <td>myserver的用户名</td>
            <td>weblogic</td>
        </tr>
        <tr>
            <td>myserver的口令</td>
            <td>weblogic</td>
        </tr>
    </tbody>
</table>
<p><img height="369" alt="" src="http://dev2dev.bea.com.cn/images/school/server031119/image004.jpg" width="491" /> <br />
图2 配置WebLogic</p>
<p><strong>Apache2.x与WLS集成</strong><br />
1、 修改C:\WINDOWS\system32\drivers\etc目录下面的hosts文件。在用记事本把文件打开，在文件的最后加上：127.0.0.1 www.synnex-china.com ，如下图所示：<br />
<img height="114" alt="" src="http://dev2dev.bea.com.cn/images/school/server031119/image005.jpg" width="468" /> <br />
图3 配置 DNS文件<br />
2、登陆weblogic的控制台，发布。然后启动刚刚创建好的WebLogic Server，如果出现下图所示的画面，说明WebLogic Server启动正常：<br />
<img height="160" alt="" src="http://dev2dev.bea.com.cn/images/school/server031119/image007.jpg" width="553" /> <br />
图4 WebLogic启动欢迎画面<br />
3、进入DOS界面，首先到C:\Program Files\Apache Group\Apache2\bin目录下面，然后执行Apache -l命令，出现如下画面：<br />
<img height="153" alt="" src="http://dev2dev.bea.com.cn/images/school/server031119/image008.jpg" width="432" /> <br />
图5 Apache -l命令<br />
mod_so.c表明当前的Apache HTTP Server是动态加载的模式，可以和WebLogic进行整合（因为Windows平台下面的WebLogic Server7.0只支持Apache 2.x）。<br />
然后将附件中的mod_wl_20.so拷贝到C:\Program Files\Apache Group\Apache2\modules目录下面。然后执行 Apache -t命令，出现如下画面：<br />
<img height="82" alt="" src="http://dev2dev.bea.com.cn/images/school/server031119/image009.jpg" width="414" /> <br />
图6 Apache -t命令</p>
<p>这表明Apache 的WebLogic Server plug-in安装成功。</p>
<p>4、修改C:\Program Files\Apache Group\Apache2\conf目录下面的httpd.conf文件。<br />
首先添加新的和WebLogic相关的应用模块，在httpd.conf文件的174行加入如下语句：<br />
#WebLogic Server Proxy Settings<br />
LoadModule weblogic_module modules/mod_wl_20.so<br />
&lt;IfModule mod_weblogic.c&gt;<br />
WebLogicHost www.synnex-china.com<br />
WebLogicPort 7001<br />
MatchExpression *.jsp<br />
&nbsp;MatchExpression *.js<br />
&nbsp;MatchExpression *.css<br />
&nbsp;MatchExpression *.do<br />
&nbsp;MatchExpression *.gif<br />
&nbsp;MatchExpression *.html<br />
&lt;/IfModule&gt;<br />
<br />
图7 为Apache 添加WebLogic相关的应用模块<br />
然后把httpd.conf文件中的<br />
DocumentRoot "C:/Program Files/Apache Group/Apache2/htdocs"<br />
改为<br />
DocumentRoot "D:/desk/desk_project/src/jsp/desk"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;（web项目所在的webapp目录）<br />
，把<br />
&lt;Directory "C:/Program Files/Apache Group/Apache2/htdocs"&gt;<br />
改为<br />
&lt;Directory "D:/desk/desk_project/src/jsp/desk"&gt;（web项目所在的webapp目录）<br />
<br />
修改完毕后，重新启动apache服务，如下图所示：<br />
<img height="331" alt="" src="http://dev2dev.bea.com.cn/images/school/server031119/image011.jpg" width="531" /><br />
<br />
原来访问地址：<a href="http://localhost:7001/desk/Menu.html">http://localhost:7001/desk/Menu.html</a><br />
这个时候，你就可以用<a href="http://localhost/desk/Menu.html来访问页面了">http://localhost/desk/Menu.html来访问页面了</a>&nbsp; ：-）</p>
<img src ="http://www.blogjava.net/ocean07000814/aggbug/198856.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ocean07000814/" target="_blank">非洲小白脸</a> 2008-05-07 09:30 <a href="http://www.blogjava.net/ocean07000814/articles/198856.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4j使用说明 [转] </title><link>http://www.blogjava.net/ocean07000814/articles/86928.html</link><dc:creator>非洲小白脸</dc:creator><author>非洲小白脸</author><pubDate>Mon, 11 Dec 2006 08:04:00 GMT</pubDate><guid>http://www.blogjava.net/ocean07000814/articles/86928.html</guid><wfw:comment>http://www.blogjava.net/ocean07000814/comments/86928.html</wfw:comment><comments>http://www.blogjava.net/ocean07000814/articles/86928.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ocean07000814/comments/commentRss/86928.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ocean07000814/services/trackbacks/86928.html</trackback:ping><description><![CDATA[log4j使用说明 [转]
<script><![CDATA[ar stattitle='log4j使用说明&nbsp;[转]';]]&gt;</script><!--头像开始--><span id="oImg" style="FLOAT: left; WIDTH: 57px; HEIGHT: 49px" vspace="10" hspace="10"><table cellspacing="2" cellpadding="6" width="96"><tbody><tr><td><font style="FONT-WEIGHT: normal; FONT-SIZE: 8pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal" color="#006699"><center> </center></font></td></tr></tbody></table></span><script language="JavaScript"><![CDATA[nChangeFloat('left','oImg')]]&gt;</script><!--头像结束--><br /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">1. 下载</span><span lang="EN-US">log4j</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">解压后在目录</span><span lang="EN-US">jakarta-log4j-<chsdate w:st="on" islunardate="False" isrocdate="False" day="30" month="12" year="1899" />1.2.8dist\lib</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">找到</span><span lang="EN-US">log4j-1.2.8.jar</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件拷到</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt"><span lang="EN-US">&lt;Catalina-home&gt;/webapps/test/WEB-INF/lib</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">目录下</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">2.<span style="FONT: 7pt 'Times New Roman'">       </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">创建</span><span lang="EN-US">log4j</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的配置文件</span><span lang="EN-US">log4j.properties,</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">存于目录：</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt"><span lang="EN-US">&lt;Catalina-home&gt;/webapps/test/WEB-INF</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1">       </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件内容：</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US"><span style="mso-tab-count: 1">       </span></span><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">log4j.rootLogger=DEBUG, <span style="COLOR: red">consoleLogger</span>, <span style="COLOR: red">fileLogger</span></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt"></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">log4j.appender.<span style="COLOR: red">consoleLogger</span>=org.apache.log4j.ConsoleAppender </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">log4j.appender.<span style="COLOR: red">consoleLogger</span>.layout=org.apache.log4j.PatternLayout </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">log4j.appender.<span style="COLOR: red">consoleLogger</span>.Threshold=</span><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: ??; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">DEBUG</span><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: ??; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt"></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: ??; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">log4j.appender.<span style="COLOR: red">consoleLogger.</span>layout.ConversionPattern=%c{2} - %m%n </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: ??; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt"></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: ??; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">log4j.appender.<span style="COLOR: red">fileLogger</span>=org.apache.log4j.RollingFileAppender </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: ??; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">log4j.appender.<span style="COLOR: red">fileLogger</span>.File=c:/tomcat/webapps/test/WEB-INF/blog.txt </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: ??; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">log4j.appender.<span style="COLOR: red">fileLogger</span>.MaxFileSize=1000KB </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: ??; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN"># 保留5个旧的日志文件 </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: ??; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">log4j.appender.<span style="COLOR: red">fileLogger</span>.MaxBackupIndex=5 </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: ??; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">log4j.appender.<span style="COLOR: red">fileLogger</span>.layout=org.apache.log4j.PatternLayout </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: ??; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt"># </span><span style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: ??; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">日志格式</span><span style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: ??; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">：</span><span style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: ??; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">按照</span><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: ??; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">WebSphere</span><span style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: ??; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN">通用日志格式相似的方式记录</span><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: ??; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt"></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 18pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: ??; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">log4j.appender.<span style="COLOR: red">fileLogger</span>.layout.ConversionPattern=[%d] %t %c %-5p - %m%n </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt"></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">3.<span style="FONT: 7pt 'Times New Roman'">       </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">创建</span><span lang="EN-US">Blog4jServlet.java</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; COLOR: red; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">import org.apache.log4j.Logger; </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US">import org.apache.log4j.PropertyConfigurator;</span><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; COLOR: red; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt"></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">public class BLog4jServlet extends HttpServlet { </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">public void init(ServletConfig config) throws ServletException {<span style="mso-tab-count: 2">        </span></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt"><span style="mso-tab-count: 2">        </span>try{ </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt"><span style="mso-tab-count: 3">            </span>String path = <span style="COLOR: red">config.getServletContext().getRealPath("/")</span>; </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt"><span style="mso-tab-count: 2">        </span><span style="mso-tab-count: 1">    </span>String propfile = path + <span style="COLOR: red">config.getInitParameter("propfile")</span>; </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt"><span style="mso-tab-count: 3">            </span><span style="COLOR: red">PropertyConfigurator.configure(propfile); </span></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt"><span style="mso-tab-count: 2">        </span>}catch(Exception e){ </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt"><span style="mso-tab-count: 3">            </span>System.out.println(e.getMessage()); </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt"><span style="mso-tab-count: 2">        </span>} </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt"><span style="mso-tab-count: 2">        </span>} </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">} </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore">4.<span style="FONT: 7pt 'Times New Roman'">     </span></span></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">修改<span lang="EN-US">web.xml</span>，加入如下代码：<span lang="EN-US" style="BACKGROUND: #d9d9d9; mso-shading: white; mso-pattern: gray-15 auto"></span></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">&lt;servlet&gt; </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">  </span><span style="mso-tab-count: 1">   </span>&lt;servlet-name&gt;log4j&lt;/servlet-name&gt; </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 38pt; TEXT-ALIGN: left; mso-layout-grid-align: none; mso-char-indent-count: 3.8" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt"><span style="mso-tab-count: 1"></span>&lt;servlet-class&gt;binclude.BLog4jServlet&lt;/servlet-class&gt; </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 17pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">&lt;init-param&gt; </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 35pt; TEXT-INDENT: 7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">&lt;param-name&gt;<span style="COLOR: red">propfile</span>&lt;/param-name&gt; </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">&lt;param-value&gt;/WEB-INF/log4j.properties&lt;/param-value&gt; </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 35pt; TEXT-INDENT: 3pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">&lt;/init-param&gt; </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt"><span style="mso-tab-count: 1"></span>&lt;load-on-startup&gt;1&lt;/load-on-startup&gt; </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">&lt;/servlet&gt; </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore">5.<span style="FONT: 7pt 'Times New Roman'">     </span></span></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">在需要调用<span lang="EN-US">log</span>的时候：<span lang="EN-US"></span></span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">import org.apache.log4j.*; </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; COLOR: red; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">static Logger logger = Logger.getLogger(DispatchServlet.class.getName()); </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">logger.debug("this is a log message from" + logger.getName()); </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">logger.info("info from" + logger.getName()); </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">logger.warn("warn " + logger.getName()); </span></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto; mso-font-kerning: 0pt">logger.error("error" + logger.getName()); </span></p><br /><br /><img src ="http://www.blogjava.net/ocean07000814/aggbug/86928.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ocean07000814/" target="_blank">非洲小白脸</a> 2006-12-11 16:04 <a href="http://www.blogjava.net/ocean07000814/articles/86928.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>eclipse插件下载地址大全</title><link>http://www.blogjava.net/ocean07000814/articles/70579.html</link><dc:creator>非洲小白脸</dc:creator><author>非洲小白脸</author><pubDate>Tue, 19 Sep 2006 09:21:00 GMT</pubDate><guid>http://www.blogjava.net/ocean07000814/articles/70579.html</guid><wfw:comment>http://www.blogjava.net/ocean07000814/comments/70579.html</wfw:comment><comments>http://www.blogjava.net/ocean07000814/articles/70579.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ocean07000814/comments/commentRss/70579.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ocean07000814/services/trackbacks/70579.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<a class="postTitle2" id="viewpost1_TitleUrl" href="/ocean07000814/archive/2006/09/19/70558.html">
						<font color="#56b6e9">
						</font>
				</a> </div>
		<div class="diary_datetitle">
				<font color="#56b6e9">
				</font> </div>
		<table class="diary_bg2" cellspacing="3" cellpadding="3" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<a class="diary_title" href="http://www.blogcn.com/u/40/61/zzxanadu/blog/40403974.html">
												<font color="#56b6e9">
														<font class="diary_title">eclipse的插件下载地址大全</font>
												</font>
										</a>
										<a name="40403974">
										</a>
										<span id="oImg5" style="FLOAT: left; WIDTH: 52px; HEIGHT: 21px" vspace="10" hspace="10">
												<font color="#56b6e9">
												</font>
										</span>
										<script language="JavaScript"><![CDATA[nChangeFloat('left','oImg5');]]&gt;</script>
										<br />Eclipse及其插件介绍和下载- -Tag： Eclipse    插件                                           <br />0.Eclipse下载<br />EMF,GEF - Graphical Editor Framework,UML2,VE - Visual Editor都在这里下载<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://www.eclipse.org/downloads/index.php" target="_blank"><font color="#56b6e9">http://www.eclipse.org/downloads/index.php</font></a><br /> <br />0.5.lomboz J2EE插件,开发JSP,EJB<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://forge.objectweb.org/projects/lomboz" target="_blank"><font color="#56b6e9">http://forge.objectweb.org/projects/lomboz</font></a><br />1.MyEclipse J2EE开发插件，支持SERVLET/JSP/EJB/数据库操纵等 <br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://www.myeclipseide.com/" target="_blank"><font color="#56b6e9">http://www.myeclipseide.com</font></a><br /> <br />2.Properties Editor  编辑java的属性文件，并可以自动存盘为Unicode格式 <br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://propedit.sourceforge.jp/index_en.html" target="_blank"><font color="#56b6e9">http://propedit.sourceforge.jp/index_en.html</font></a>  <br />  <br />3.Colorer Take  为上百种类型的文件按语法着色 <br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://colorer.sourceforge.net/" target="_blank"><font color="#56b6e9">http://colorer.sourceforge.net/</font></a>  <br />  <br />4.XMLBuddy 编辑xml文件<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://www.xmlbuddy.com/" target="_blank"><font color="#56b6e9">http://www.xmlbuddy.com</font></a>  <br />  <br />5.Code Folding  加入多种代码折叠功能（比eclipse自带的更多） <br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://www.coffee-bytes.com/servlet/PlatformSupport" target="_blank"><font color="#56b6e9">http://www.coffee-bytes.com/servlet/PlatformSupport</font></a>  <br />  <br />6.Easy Explorer  从eclipse中访问选定文件、目录所在的文件夹 <br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://easystruts.sourceforge.net/" target="_blank"><font color="#56b6e9">http://easystruts.sourceforge.net/</font></a>  <br />  <br />7.Fat Jar 打包插件，可以方便的完成各种打包任务，可以包含外部的包等 <br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://fjep.sourceforge.net/" target="_blank"><font color="#56b6e9">http://fjep.sourceforge.net/</font></a>  <br />  <br />8.RegEx Test 测试正则表达式 <br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://brosinski.com/stephan/archives/000028.php" target="_blank"><font color="#56b6e9">http://brosinski.com/stephan/archives/000028.php</font></a>  <br />  <br />9.JasperAssistant 报表插件（强，要钱的） <br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://www.jasperassistant.com/" target="_blank"><font color="#56b6e9">http://www.jasperassistant.com/</font></a>  <br />  <br />10.Jigloo GUI Builder ＪＡＶＡ的ＧＵＩ编辑插件 <br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://cloudgarden.com/jigloo/" target="_blank"><font color="#56b6e9">http://cloudgarden.com/jigloo/</font></a>  <br />  <br />11.Profiler 性能跟踪、测量工具，能跟踪、测量ＢＳ程序 <br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://sourceforge.net/projects/eclipsecolorer/" target="_blank"><font color="#56b6e9">http://sourceforge.net/projects/eclipsecolorer/</font></a>  <br />  <br />12.AdvanQas 提供对if/else等条件语句的提示和快捷帮助（自动更改结构等） <br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://eclipsecolorer.sourceforge.net/advanqas/index.html" target="_blank"><font color="#56b6e9">http://eclipsecolorer.sourceforge.net/advanqas/index.html</font></a>  <br />  <br />13.Log4E Log4j插件，提供各种和Log4j相关的任务，如为方法、类添加一个logger等 <br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://log4e.jayefem.de/index.php/Main_Page" target="_blank"><font color="#56b6e9">http://log4e.jayefem.de/index.php/Main_Page</font></a>  <br />  <br />14.VSSPlugin VSS插件 <br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://sourceforge.net/projects/vssplugin" target="_blank"><font color="#56b6e9">http://sourceforge.net/projects/vssplugin</font></a>  <br />  <br />15.Implementors 提供跳转到一个方法的实现类，而不是接中的功能（实用!） <br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://eclipse-tools.sourceforge.net/implementors/" target="_blank"><font color="#56b6e9">http://eclipse-tools.sourceforge.net/implementors/</font></a>  <br />  <br />16.Call Hierarchy 显示一个方法的调用层次（被哪些方法调，调了哪些方法） <br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://eclipse-tools.sourceforge.net/call-hierarchy/index.html" target="_blank"><font color="#56b6e9">http://eclipse-tools.sourceforge.net/call-hierarchy/index.html</font></a>  <br />  <br />17.EclipseTidy 检查和格式化HTML/XML文件 <br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://eclipsetidy.sourceforge.net/" target="_blank"><font color="#56b6e9">http://eclipsetidy.sourceforge.net/</font></a>  <br />  <br />18.Checkclipse 检查代码的风格、写法是否符合规范 <br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://www.mvmsoft.de/content/plugins/checkclipse/checkclipse.htm" target="_blank"><font color="#56b6e9">http://www.mvmsoft.de/content/plugins/checkclipse/checkclipse.htm</font></a>  <br />  <br />19.Hibernate Synchronizer Hibernate插件，自动映射等 <br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://www.binamics.com/hibernatesync/" target="_blank"><font color="#56b6e9">http://www.binamics.com/hibernatesync/</font></a>  <br />  <br />20.VeloEclipse  Velocity插件 <br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://propsorter.sourceforge.net/" target="_blank"><font color="#56b6e9">http://propsorter.sourceforge.net/</font></a>  <br />  <br />21.EditorList 方便的列出所有打开的Editor <br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://editorlist.sourceforge.net/" target="_blank"><font color="#56b6e9">http://editorlist.sourceforge.net/</font></a>  <br />  <br />22.MemoryManager 内存占用率的监视 <br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://cloudgarden.com/memorymanager/" target="_blank"><font color="#56b6e9">http://cloudgarden.com/memorymanager/</font></a>  <br /> <br />23.swt-designer java的GUI插件<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://www.swt-designer.com/" target="_blank"><font color="#56b6e9">http://www.swt-designer.com/</font></a><br /> <br />24.TomcatPlugin 支持Tomcat插件 <br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://www.sysdeo.com/eclipse/tomcatPlugin.html" target="_blank"><font color="#56b6e9">http://www.sysdeo.com/eclipse/tomcatPlugin.html</font></a><br /> <br />25.XML Viewer <br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://tabaquismo.freehosting.net/ignacio/eclipse/xmlview/index.html" target="_blank"><font color="#56b6e9">http://tabaquismo.freehosting.net/ignacio/eclipse/xmlview/index.html</font></a><br /> <br />26.quantum 数据库插件<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://quantum.sourceforge.net/" target="_blank"><font color="#56b6e9">http://quantum.sourceforge.net/</font></a><br /> <br />27.Dbedit 数据库插件<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://sourceforge.net/projects/dbedit" target="_blank"><font color="#56b6e9">http://sourceforge.net/projects/dbedit</font></a><br /> <br />28.clay.core 可视化的数据库插件 <br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://www.azzurri.jp/en/software/index.jsp" target="_blank"><font color="#56b6e9">http://www.azzurri.jp/en/software/index.jsp</font></a>  <br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://www.azzurri.jp/eclipse/plugins" target="_blank"><font color="#56b6e9">http://www.azzurri.jp/eclipse/plugins</font></a><br /> <br />29.hiberclipse hibernate插件 <br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://hiberclipse.sourceforge.net/" target="_blank"><font color="#56b6e9">http://hiberclipse.sourceforge.net</font></a><br /><font color="#56b6e9"><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /></font><a href="http://www.binamics.com/hibernatesync" target="_blank"><font color="#56b6e9">http://www.binamics.com/hibernatesync</font></a><br /> <br />30.struts-console Struts插件<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://www.jamesholmes.com/struts/console/" target="_blank"><font color="#56b6e9">http://www.jamesholmes.com/struts/console/</font></a><br /> <br />31.easystruts Struts插件<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://easystruts.sourceforge.net/" target="_blank"><font color="#56b6e9">http://easystruts.sourceforge.net</font></a>  <br /> <br />32.veloedit Velocity插件<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://veloedit.sourceforge.net/" target="_blank"><font color="#56b6e9">http://veloedit.sourceforge.net/</font></a><br /> <br />33.jalopy 代码整理插件<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://jalopy.sourceforge.net/" target="_blank"><font color="#56b6e9">http://jalopy.sourceforge.net/</font></a><br /> <br />34.JDepend 包关系分析<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://andrei.gmxhome.de/jdepend4eclipse/links.html" target="_blank"><font color="#56b6e9">http://andrei.gmxhome.de/jdepend4eclipse/links.html</font></a><br /> <br />35.Spring IDE Spring插件<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://springide-eclip.sourceforge.net/updatesite/" target="_blank"><font color="#56b6e9">http://springide-eclip.sourceforge.net/updatesite/</font></a><br /> <br />36.doclipse 可以产生xdoclet 的代码提示<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://beust.com/doclipse/" target="_blank"><font color="#56b6e9">http://beust.com/doclipse/</font></a><br /></td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/ocean07000814/aggbug/70579.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ocean07000814/" target="_blank">非洲小白脸</a> 2006-09-19 17:21 <a href="http://www.blogjava.net/ocean07000814/articles/70579.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>