﻿<?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-黎素智-文章分类-JAVA</title><link>http://www.blogjava.net/lisuzhi008/category/19776.html</link><description>博客摘录</description><language>zh-cn</language><lastBuildDate>Sat, 29 Sep 2007 22:03:52 GMT</lastBuildDate><pubDate>Sat, 29 Sep 2007 22:03:52 GMT</pubDate><ttl>60</ttl><item><title>log4j的介绍及使用介绍</title><link>http://www.blogjava.net/lisuzhi008/articles/148763.html</link><dc:creator>黎素智</dc:creator><author>黎素智</author><pubDate>Thu, 27 Sep 2007 08:31:00 GMT</pubDate><guid>http://www.blogjava.net/lisuzhi008/articles/148763.html</guid><wfw:comment>http://www.blogjava.net/lisuzhi008/comments/148763.html</wfw:comment><comments>http://www.blogjava.net/lisuzhi008/articles/148763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lisuzhi008/comments/commentRss/148763.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lisuzhi008/services/trackbacks/148763.html</trackback:ping><description><![CDATA[<p>一、前言：<br />
&nbsp;&nbsp;&nbsp;&nbsp; log4j 是一个开放源码项目，是广泛使用的以Java编写的日志记录包。由于log4j出色的表现，&nbsp;&nbsp;&nbsp;&nbsp; 当时在log4j完成时，log4j开发组织曾建议sun在jdk1.4中用log4j取代jdk1.4 的日志工具类，但当时jdk1.4已接近完成，所以sun拒绝使用log4j，当在java开发中实际使用最多的还是log4j，&nbsp;&nbsp;&nbsp;&nbsp; 人们遗忘了sun的日志工具类。&nbsp;&nbsp;&nbsp;&nbsp; 它的一个独有特性包括在类别中继承的概念。通过使用类别层次结构，这样就减少了日志记录输出量，并将日志记录的开销降到最低。<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; 它允许开发者控制以任意间隔输出哪些日志语句。通过使用外部配置文件，完全可以在运行时进行配置。几乎每个大的应用程序都包括其自己的日志记录或跟踪 API。经验表明日志记录是开发周期中的重要组成部分。同样，日志记录提供一些优点。首先，它可以提供运行应用程序的确切 上下文。一旦插入到代码中，生成日志记录输出就不需要人为干涉。其次，日志输出可以保存到永久媒体中以便以后研究。最后，除了在开发阶段中使用，十分丰富的日志记录包还可以用作审计工具。 </p>
<p>&nbsp;&nbsp;&nbsp; 依照该规则，在 1996 年初，EU SEMPER（欧洲安全电子市场）项目就决定编写自己的跟踪 API。 在无数次改进、几次具体化和许多工作之后，该 API 已经演变成 log4j，一种流行的 Java 日志记录包。&nbsp; 这个包按 IBM 公共许可证分发，由开放源码权威机构认证。</p>
<p>&nbsp;&nbsp;&nbsp; 日志记录有其自己的缺点。它会降低应用程序的速度。如果太详细，它可能会使屏幕滚动变得看不见。&nbsp; 为了减低这些影响，log4j 被设计成快速且灵活的。由于应用程序很少将日志记录当作是主要功能，&nbsp; log4j API 力争易于了解和使用。<br />
&nbsp;&nbsp;&nbsp;&nbsp; log4j，它可以控制以任意间隔输出哪些日志语句。</p>
<p>二、主要组件</p>
<p>1、根类别（在类别层次结构的顶部，即全局性的日志级别）<br />
&nbsp;<br />
配置根Logger，其语法为：</p>
<p>log4j.rootLogger = [ level ] , appenderName, appenderName, ...</p>
<p>level 是日志记录的类别<br />
appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。 </p>
<p>类别level 为 OFF、FATAL、ERROR、WARN、INFO、DEBUG、log、ALL或自定义的优先级。<br />
og4j常用的优先级FATAL&gt;ERROR&gt;WARN&gt;INFO&gt;DEBUG<br />
配置根Logger，其语法为：<br />
log4j.rootLogger = [ level ] , appenderName, appenderName, &#8230;<br />
如果为log4j.rootLogger=WARN，则意味着只有WARN,ERROR,FATAL被输出，DEBUG,INFO将被屏蔽掉。</p>
<p>举例：log4j.rootCategory=INFO,stdout,Runlog,Errorlog<br />
根日志类别为INFO，DEBUG将被屏蔽，其他的将被输出。 stdout,Runlog,Errorlog分别为3个输出目的地。</p>
<p>&nbsp;2、常用输出格式</p>
<p>&nbsp;-X号:X信息输出时左对齐；<br />
&nbsp;%p:日志信息级别<br />
&nbsp;%d{}:日志信息产生时间<br />
&nbsp;%c:日志信息所在地（类名）<br />
&nbsp;%m:产生的日志具体信息<br />
&nbsp;%n:输出日志信息换行<br />
&nbsp;举例：<br />
log4j.appender.stdout.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n<br />
log4j.appender.Runlog.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n<br />
log4j.appender.Errorlog.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n</p>
<p>3、布局<br />
使用的输出布局，其中log4j提供4种布局：<br />
org.apache.log4j.HTMLLayout（以HTML表格形式布局）<br />
org.apache.log4j.PatternLayout（可以灵活地指定布局模式），<br />
org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），<br />
org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息） </p>
<p>举例：<br />
输出格式为HTML表格<br />
log4j.appender.stdout.layout=org.apache.log4j.HTMLLayout</p>
<p>输出格式为可以灵活地指定布局模式<br />
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout</p>
<p>输出格式为包含日志信息的级别和信息字符串<br />
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout</p>
<p>输出格式为包含日志产生的时间、线程、类别等等信息<br />
log4j.appender.stdout.layout=org.apache.log4j.TTCCLayout</p>
<p><br />
4、目的地</p>
<p>配置日志信息输出目的地Appender，其语法为</p>
<p><br />
log4j.appender.appenderName = fully.qualified.name.of.appender.class<br />
log4j.appender.appenderName.option1 = value1<br />
...<br />
log4j.appender.appenderName.option = valueN<br />
appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。 </p>
<p>log4j支持的输出目的地：<br />
org.apache.log4j.ConsoleAppender 控制台<br />
org.apache.log4j.FileAppender 文件<br />
org.apache.log4j.DailyRollingFileAppender 每天产生一个日志文件<br />
org.apache.log4j.RollingFileAppender （文件大小到达指定尺寸的时候产生一个新的文件），<br />
org.apache.log4j.WriterAppender （将日志信息以流格式发送到任意指定的地方） <br />
org.apache.log4j.net.SMTPAppender 邮件<br />
org.apache.log4j.jdbc.JDBCAppender 数据库<br />
其他如：GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等</p>
<p>举例：</p>
<p><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（指定输出格式）</p>
<p>输出到文件</p>
<p>&nbsp;&nbsp; log4j.appender.FILE=org.apache.log4j.FileAppender（指定输出到文件）<br />
&nbsp;&nbsp; log4j.appender.FILE.File=file.log（指定输出的路径及文件名）<br />
&nbsp;&nbsp; log4j.appender.FILE.Append=false<br />
&nbsp;&nbsp; log4j.appender.FILE.layout=org.apache.log4j.PatternLayout（指定输出的布局）<br />
&nbsp;&nbsp; log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n（指定输出的格式）</p>
<p>输出到文件（轮换"日志文件",当日志文件达到指定大小时，该文件就被关闭并备份，然后创建一个新的日志文件）</p>
<p>&nbsp; log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender（指定输出到文件）<br />
&nbsp; log4j.appender.ROLLING_FILE.Threshold=ERROR（指定输出类别）<br />
&nbsp; log4j.appender.ROLLING_FILE.File=rolling.log（指定输出的路径及文件名）<br />
&nbsp; log4j.appender.ROLLING_FILE.Append=true<br />
&nbsp; log4j.appender.ROLLING_FILE.MaxFileSize=10KB（指定输出到文件的大小）<br />
&nbsp; log4j.appender.ROLLING_FILE.MaxBackupIndex=1<br />
&nbsp; log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout（指定采用输出布局）<br />
&nbsp; log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n（指定采用输出格式）</p>
<p>输出到Socket<br />
&nbsp;log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender（指定输出到Socket）<br />
&nbsp;log4j.appender.SOCKET.RemoteHost=localhost（远程主机）<br />
&nbsp;log4j.appender.SOCKET.Port=5001（远程主机端口）<br />
&nbsp;log4j.appender.SOCKET.LocationInfo=true<br />
&nbsp;log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout（布局）<br />
&nbsp;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（输出格式）</p>
<p>输出到邮件<br />
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender（指定输出到邮件）<br />
&nbsp;log4j.appender.MAIL.Threshold=FATAL<br />
&nbsp;log4j.appender.MAIL.BufferSize=10<br />
&nbsp;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#108;&#111;&#103;&#52;&#106;&#46;&#97;&#112;&#112;&#101;&#110;&#100;&#101;&#114;&#46;&#77;&#65;&#73;&#76;&#46;&#70;&#114;&#111;&#109;&#61;&#99;&#104;&#101;&#110;&#121;&#108;&#64;&#104;&#111;&#108;&#108;&#121;&#99;&#114;&#109;&#46;&#99;&#111;&#109;">log4j.appender.MAIL.From=chenyl@hollycrm.com</a>（发件人）<br />
&nbsp;log4j.appender.MAIL.SMTPHost=mail.hollycrm.com（SMTP服务器）<br />
&nbsp;log4j.appender.MAIL.Subject=Log4J Message<br />
&nbsp;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#108;&#111;&#103;&#52;&#106;&#46;&#97;&#112;&#112;&#101;&#110;&#100;&#101;&#114;&#46;&#77;&#65;&#73;&#76;&#46;&#84;&#111;&#61;&#99;&#104;&#101;&#110;&#121;&#108;&#64;&#104;&#111;&#108;&#108;&#121;&#99;&#114;&#109;&#46;&#99;&#111;&#109;">log4j.appender.MAIL.To=chenyl@hollycrm.com</a>（收件人）<br />
&nbsp;log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout（布局）<br />
&nbsp;log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n（格式）</p>
<p>&nbsp;</p>
<p>输出到数据库<br />
&nbsp;log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender（指定输出到数据库）<br />
&nbsp;log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test（指定数据库URL）<br />
&nbsp;log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver（指定数据库driver）<br />
&nbsp;log4j.appender.DATABASE.user=root（指定数据库用户）<br />
&nbsp;log4j.appender.DATABASE.password=root（指定数据库用户密码）<br />
&nbsp;log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')（组织SQL语句）<br />
&nbsp;log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout（布局）<br />
&nbsp;log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n（格式）</p>
<p>5、日志类别补充<br />
有时我们需要对某个特定的部分指定有别于根类别的日志类别，可以指定某个包的优先级<br />
如：<br />
&nbsp; log4j.category.com.neusoft.mbip.dm.util=ERROR ，其中com.neusoft.mbip.dm.util为我们需要特别指定日志类别的部分。<br />
&nbsp; <br />
&nbsp; 或者可以指定输出文件的优先级<br />
&nbsp; log4j.appender.Errorlog.Threshold=ERROR<br />
&nbsp; <br />
&nbsp;<br />
&nbsp;三、 常用log4j配置&nbsp; </p>
<p>常用log4j配置，一般可以采用两种方式，.properties和.xml,下面举两个简单的例子：</p>
<p>1、log4j.properties</p>
<p>### 设置org.zblog域对应的级别INFO,DEBUG,WARN,ERROR和输出地A1，A2 ##<br />
log4j.category.org.zblog=ERROR,A1 <br />
log4j.category.org.zblog=INFO,A2 </p>
<p>log4j.appender.A1=org.apache.log4j.ConsoleAppender <br />
### 设置输出地A1，为ConsoleAppender(控制台) ##<br />
log4j.appender.A1.layout=org.apache.log4j.PatternLayout <br />
### 设置A1的输出布局格式PatterLayout,(可以灵活地指定布局模式）##<br />
log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n <br />
### 配置日志输出的格式##</p>
<p>log4j.appender.A2=org.apache.log4j.RollingFileAppender <br />
### 设置输出地A2到文件（文件大小到达指定尺寸的时候产生一个新的文件）##<br />
log4j.appender.A2.File=E:/study/log4j/zhuwei.html <br />
### 文件位置##<br />
log4j.appender.A2.MaxFileSize=500KB <br />
### 文件大小##<br />
log4j.appender.A2.MaxBackupIndex=1 <br />
log4j.appender.A2.layout=org.apache.log4j.HTMLLayout <br />
##指定采用html方式输出</p>
<p>2、log4j.xml</p>
<p>&lt;?xml version="1.0" encoding="GB2312" ?&gt;<br />
&lt;!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"&gt;</p>
<p>&lt;log4j:configuration xmlns:log4j="<a href="http://jakarta.apache.org/log4j/">http://jakarta.apache.org/log4j/</a>"&gt;</p>
<p>&lt;appender name="org.zblog.all" class="org.apache.log4j.RollingFileAppender"&gt;<br />
&lt;!-- 设置通道ID:org.zblog.all和输出方式：org.apache.log4j.RollingFileAppender --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param name="File" value="E:/study/log4j/all.output.log" /&gt;&lt;!-- 设置File参数：日志输出文件名 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param name="Append" value="false" /&gt;&lt;!-- 设置是否在重新启动服务时，在原有日志的基础添加新日志 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;layout class="org.apache.log4j.PatternLayout"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="ConversionPattern" value="%p (%c:%L)- %m%n" /&gt;&lt;!-- 设置输出文件项目和格式 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/layout&gt;<br />
&lt;/appender&gt;</p>
<p>&lt;appender name="org.zblog.zcw" class="org.apache.log4j.RollingFileAppender"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param name="File" value="E:/study/log4j/zhuwei.output.log" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param name="Append" value="true" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param name="MaxFileSize" value="10240" /&gt; &lt;!-- 设置文件大小 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;layout class="org.apache.log4j.PatternLayout"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="ConversionPattern" value="%p (%c:%L)- %m%n" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/layout&gt;<br />
&lt;/appender&gt;</p>
<p>&lt;logger name="zcw.log"&gt; &lt;!-- 设置域名限制，即zcw.log域及以下的日志均输出到下面对应的通道中 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;level value="debug" /&gt;&lt;!-- 设置级别 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;appender-ref ref="org.zblog.zcw" /&gt;&lt;!-- 与前面的通道id相对应 --&gt;<br />
&lt;/logger&gt;</p>
<p>&lt;root&gt; &lt;!-- 设置接收所有输出的通道 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;appender-ref ref="org.zblog.all" /&gt;&lt;!-- 与前面的通道id相对应 --&gt;<br />
&lt;/root&gt;</p>
<p>&lt;/log4j:configuration&gt;</p>
<p><br />
3、配置文件加载方法：</p>
<p>import org.apache.log4j.Logger;<br />
import org.apache.log4j.PropertyConfigurator;<br />
import org.apache.log4j.xml.DOMConfigurator;</p>
<p>public class Log4jApp {<br />
&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DOMConfigurator.configure("E:/study/log4j/log4j.xml");//加载.xml文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //PropertyConfigurator.configure("E:/study/log4j/log4j.properties");//加载.properties文件</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Logger log=Logger.getLogger("org.zblog.test");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.info("测试");<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>4、项目使用log4j<br />
在web应用中，可以将配置文件的加载放在一个单独的servlet中，并在web.xml中配置该servlet在应用启动时候加载。<br />
对于在多人项目中，可以给每一个人设置一个输出通道，这样在每个人在构建Logger时，用自己的域名称，让调试信<br />
息输出到自己的log文件中。</p>
<p>四、log4j配置举例（properties）</p>
<p>#log4j.rootLogger = [ level ] , appenderName, appenderName, <br />
#类别level 为 OFF、FATAL、ERROR、WARN、INFO、DEBUG、log、ALL或自定义的优先级<br />
#Log4j常用的优先级FATAL&gt;ERROR&gt;WARN&gt;INFO&gt;DEBUG</p>
<p>#stdout为控制台 ，Errorlog为错误记录日志 ，<br />
log4j.rootCategory=INFO,stdout,Runlog,Errorlog</p>
<p><br />
#输出的appender的格式为<br />
#log4j.appender.appenderName = fully.qualified.name.of.appender.class <br />
#log4j.appender.appenderName.option1 = value1 <br />
#log4j.appender.appenderName.option = valueN <br />
#Log4j中appender支持的输出<br />
#org.apache.log4j.ConsoleAppender 控制台<br />
#org.apache.log4j.FileAppender 文件<br />
#org.apache.log4j.DailyRollingFileAppender 每天产生一个日志文件<br />
#org.apache.log4j.RollingFileAppender （文件大小到达指定尺寸的时候产生一个新的文件），<br />
#org.apache.log4j.WriterAppender （将日志信息以流格式发送到任意指定的地方） <br />
#org.apache.log4j.net.SMTPAppender 邮件<br />
#org.apache.log4j.jdbc.JDBCAppender 数据库</p>
<p>＃定义输出的形式<br />
log4j.appender.stdout=org.apache.log4j.ConsoleAppender<br />
log4j.appender.Runlog=org.apache.log4j.DailyRollingFileAppender<br />
log4j.appender.Errorlog=org.apache.log4j.DailyRollingFileAppender</p>
<p><br />
#可以指定输出文件的优先级<br />
log4j.appender.Errorlog.Threshold=ERROR</p>
<p>#指定输出的文件<br />
log4j.appender.Runlog.File=D:\\UserInfoSyn\\WebRoot\\WEB-INF\\runlog\\runlog.log <br />
log4j.appender.Errorlog.File=D:\\UserInfoSyn\\WebRoot\\WEB-INF\\errorlog\\errorlog.log </p>
<p><br />
#Log4j的layout布局<br />
#org.apache.log4j.HTMLLayout 以HTML表格形式布局<br />
#org.apache.log4j.PatternLayout 可以灵活地指定布局模式<br />
#org.apache.log4j.SimpleLayout&nbsp; 包含日志信息的级别和信息字符串<br />
#org.apache.log4j.TTCCLayout&nbsp;&nbsp;&nbsp; 包含日志产生的时间、线程、类别等等信息</p>
<p>log4j.appender.stdout.layout=org.apache.log4j.PatternLayout<br />
log4j.appender.Runlog.layout=org.apache.log4j.PatternLayout<br />
log4j.appender.Errorlog.layout=org.apache.log4j.PatternLayout</p>
<p>#输出格式,log4j javadoc org.apache.log4j.PatternLayout <br />
#-X号:X信息输出时左对齐；<br />
#%p:日志信息级别<br />
# %d{}:日志信息产生时间<br />
# %c:日志信息所在地（类名）<br />
# %m:产生的日志具体信息<br />
# %n:%n:输出日志信息换行<br />
log4j.appender.stdout.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n<br />
log4j.appender.Runlog.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n<br />
log4j.appender.Errorlog.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n</p>
<p>#指定某个包的优先级 <br />
log4j.category.com.neusoft.mbip.dm.util=ERROR</p>
<p><br />
#示例<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</p>
<p><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</p>
<p>########################<br />
# Rolling File????? RollingFileAppender??????????????????<br />
########################<br />
#log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender<br />
#log4j.appender.ROLLING_FILE.Threshold=ERROR<br />
# 文件位置<br />
#log4j.appender.ROLLING_FILE.File=rolling.log<br />
#log4j.appender.ROLLING_FILE.Append=true<br />
#文件大小<br />
#log4j.appender.ROLLING_FILE.MaxFileSize=10KB<br />
#指定采用输出布局和输出格式<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</p>
<p>####################<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</p>
<p>########################<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 />
<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#35;&#108;&#111;&#103;&#52;&#106;&#46;&#97;&#112;&#112;&#101;&#110;&#100;&#101;&#114;&#46;&#77;&#65;&#73;&#76;&#46;&#70;&#114;&#111;&#109;&#61;&#99;&#104;&#101;&#110;&#121;&#108;&#64;&#104;&#111;&#108;&#108;&#121;&#99;&#114;&#109;&#46;&#99;&#111;&#109;">#log4j.appender.MAIL.From=chenyl@hollycrm.com</a><br />
#log4j.appender.MAIL.SMTPHost=mail.hollycrm.com<br />
#log4j.appender.MAIL.Subject=Log4J Message<br />
<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#35;&#108;&#111;&#103;&#52;&#106;&#46;&#97;&#112;&#112;&#101;&#110;&#100;&#101;&#114;&#46;&#77;&#65;&#73;&#76;&#46;&#84;&#111;&#61;&#99;&#104;&#101;&#110;&#121;&#108;&#64;&#104;&#111;&#108;&#108;&#121;&#99;&#114;&#109;&#46;&#99;&#111;&#109;">#log4j.appender.MAIL.To=chenyl@hollycrm.com</a><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</p>
<p>########################<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</p>
<p>########################<br />
# Log Factor 5 Appender<br />
########################<br />
#log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender<br />
#log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000</p>
<p>###################<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 = <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#99;&#111;&#114;&#108;&#105;&#110;&#64;&#99;&#121;&#98;&#101;&#114;&#99;&#111;&#114;&#108;&#105;&#110;&#46;&#110;&#101;&#116;">corlin@cybercorlin.net</a><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</p>
<img src ="http://www.blogjava.net/lisuzhi008/aggbug/148763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lisuzhi008/" target="_blank">黎素智</a> 2007-09-27 16:31 <a href="http://www.blogjava.net/lisuzhi008/articles/148763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据类型 </title><link>http://www.blogjava.net/lisuzhi008/articles/147833.html</link><dc:creator>黎素智</dc:creator><author>黎素智</author><pubDate>Mon, 24 Sep 2007 08:15:00 GMT</pubDate><guid>http://www.blogjava.net/lisuzhi008/articles/147833.html</guid><wfw:comment>http://www.blogjava.net/lisuzhi008/comments/147833.html</wfw:comment><comments>http://www.blogjava.net/lisuzhi008/articles/147833.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lisuzhi008/comments/commentRss/147833.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lisuzhi008/services/trackbacks/147833.html</trackback:ping><description><![CDATA[基本类型有以下四种：<br />
int长度数据类型有：byte(8bits)、short(16bits)、int(32bits)、long(64bits)<br />
float长度数据类型有：单精度（32bits float）、双精度（64bits double）<br />
boolean类型变量的取值有：ture、false<br />
char数据类型有：unicode字符,16位<br />
对应的类类型：Integer、Float、Boolean、Character、Double、Short、Byte、Long<br />
<br />
<strong>转换原则：</strong><br />
<br />
从低精度向高精度转换byte 、short、int、long、float、double、char<br />
注：两个char型运算时，自动转换为int型；当char与别的类型运算时，也会先自动转换为int型的，再做其它类型的自动转换<br />
<br />
<strong>1，基本类型向类类型转换</strong><br />
<br />
<strong>正向转换：</strong><br />
通过类包装器来new出一个新的类类型的变量<br />
Integer a= new Integer(2);<br />
<br />
<strong>反向转换：</strong><br />
通过类包装器来转换<br />
int b=a.intValue();<br />
<br />
<strong>2，类类型向字符串转换</strong><br />
<br />
<strong>正向转换：</strong><br />
因为每个类都是object类的子类，而所有的object类都有一个toString()函数，所以通过toString()函数来转换即可<br />
<br />
<strong>反向转换：</strong><br />
通过类包装器new出一个新的类类型的变量<br />
eg1: int i=Integer.valueOf(&#8220;123&#8221;).intValue()<br />
说明：上例是将一个字符串转化成一个Integer对象，然后再调用这个对象的intValue()方法返回其对应的int数值。<br />
eg2: float f=Float.valueOf(&#8220;123&#8221;).floatValue()<br />
说明：上例是将一个字符串转化成一个Float对象，然后再调用这个对象的floatValue()方法返回其对应的float数值。<br />
eg3: boolean b=Boolean.valueOf(&#8220;123&#8221;).booleanValue()<br />
说明：上例是将一个字符串转化成一个Boolean对象，然后再调用这个对象的booleanValue()方法返回其对应的boolean数值。<br />
eg4:double d=Double.valueOf(&#8220;123&#8221;).doubleValue()<br />
说明：上例是将一个字符串转化成一个Double对象，然后再调用这个对象的doubleValue()方法返回其对应的double数值。<br />
eg5: long l=Long.valueOf(&#8220;123&#8221;).longValue()<br />
说明：上例是将一个字符串转化成一个Long对象，然后再调用这个对象的longValue()方法返回其对应的long数值。<br />
eg6: char=Character.valueOf(&#8220;123&#8221;).charValue()<br />
说明：上例是将一个字符串转化成一个Character对象，然后再调用这个对象的charValue()方法返回其对应的char数值。<br />
<br />
<strong>3，基本类型向字符串的转换</strong><br />
<br />
<strong>正向转换：</strong><br />
如：int a=12;<br />
String b;<br />
b=a+&#8221;&#8221;;<br />
<br />
<strong>反向转换：</strong><br />
通过类包装器<br />
eg1:int i=Integer.parseInt(&#8220;123&#8221;)<br />
说明：此方法只能适用于字符串转化成整型变量<br />
eg2: float f=Float.valueOf(&#8220;123&#8221;).floatValue()<br />
说明：上例是将一个字符串转化成一个Float对象，然后再调用这个对象的floatValue()方法返回其对应的float数值。<br />
eg3: boolean b=Boolean.valueOf(&#8220;123&#8221;).booleanValue()<br />
说明：上例是将一个字符串转化成一个Boolean对象，然后再调用这个对象的booleanValue()方法返回其对应的boolean数值。<br />
eg4:double d=Double.valueOf(&#8220;123&#8221;).doubleValue()<br />
说明：上例是将一个字符串转化成一个Double对象，然后再调用这个对象的doubleValue()方法返回其对应的double数值。<br />
eg5: long l=Long.valueOf(&#8220;123&#8221;).longValue()<br />
说明：上例是将一个字符串转化成一个Long对象，然后再调用这个对象的longValue()方法返回其对应的long数值。<br />
eg6: char=Character.valueOf(&#8220;123&#8221;).charValue()<br />
说明：上例是将一个字符串转化成一个Character对象，然后再调用这个对象的charValue()方法返回其对应的char数值。
<img src ="http://www.blogjava.net/lisuzhi008/aggbug/147833.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lisuzhi008/" target="_blank">黎素智</a> 2007-09-24 16:15 <a href="http://www.blogjava.net/lisuzhi008/articles/147833.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中的时间操作</title><link>http://www.blogjava.net/lisuzhi008/articles/147832.html</link><dc:creator>黎素智</dc:creator><author>黎素智</author><pubDate>Mon, 24 Sep 2007 08:14:00 GMT</pubDate><guid>http://www.blogjava.net/lisuzhi008/articles/147832.html</guid><wfw:comment>http://www.blogjava.net/lisuzhi008/comments/147832.html</wfw:comment><comments>http://www.blogjava.net/lisuzhi008/articles/147832.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lisuzhi008/comments/commentRss/147832.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lisuzhi008/services/trackbacks/147832.html</trackback:ping><description><![CDATA[<p style="font-size: 10pt; margin: 0in; mso-outline-level: 1"><span lang="EN-US" style="font-family: Verdana">java</span><span lang="ZH-CN" style="font-family: SimSun">中的时间操作不外乎这四种情况：</span></p>
<p style="font-size: 10pt; margin: 0in; mso-outline-level: 1"><span lang="EN-US" style="font-family: Verdana">1</span><span lang="ZH-CN" style="font-family: SimSun">、获取当前时间</span></p>
<p style="font-size: 10pt; margin: 0in; mso-outline-level: 1"><span lang="EN-US" style="font-family: Verdana">2</span><span lang="ZH-CN" style="font-family: SimSun">、获取某个时间的某种格式</span></p>
<p style="font-size: 10pt; margin: 0in; mso-outline-level: 1"><span lang="EN-US" style="font-family: Verdana">3</span><span lang="ZH-CN" style="font-family: SimSun">、设置时间</span></p>
<p style="font-size: 10pt; margin: 0in; mso-outline-level: 1"><span lang="EN-US" style="font-family: Verdana">4</span><span lang="ZH-CN" style="font-family: SimSun">、时间的运算</span></p>
<p style="font-size: 10pt; margin: 0in; font-family: SimSun; mso-outline-level: 1">好，下面就针对这三种情况，一个一个搞定。</p>
<p style="font-size: 10pt; margin: 0in; font-family: SimSun; mso-outline-level: 1">&nbsp;</p>
<p style="font-size: 10pt; margin: 0in; font-family: SimSun; mso-outline-level: 1">一、获取当前时间</p>
<p style="font-size: 10pt; margin: 0in; font-family: SimSun; mso-outline-level: 1">&nbsp;</p>
<p style="font-size: 10pt; margin: 0in; mso-outline-level: 1"><span lang="ZH-CN" style="font-family: SimSun">有两种方式可以获得，第一种，使用</span><span lang="EN-US" style="font-family: Verdana">Date</span><span lang="ZH-CN" style="font-family: SimSun">类。</span></p>
<p style="font-size: 10pt; margin: 0in; mso-outline-level: 1"><span lang="EN-US" style="font-family: Verdana">j2SE</span><span lang="ZH-CN" style="font-family: SimSun">的包里有两个</span><span lang="EN-US" style="font-family: Verdana">Date</span><span lang="ZH-CN" style="font-family: SimSun">类，一个是</span><span lang="EN-US" style="font-family: Verdana">java.sql.Date,</span><span lang="ZH-CN" style="font-family: SimSun">一个是</span><span lang="EN-US" style="font-family: Verdana">java.util.Date</span></p>
<p style="font-size: 10pt; margin: 0in; mso-outline-level: 1"><span lang="ZH-CN" style="font-family: SimSun">这里，要使用</span><span lang="EN-US" style="font-family: Verdana">java.util.Date</span><span lang="ZH-CN" style="font-family: SimSun">。获取当前时间的代码如下</span></p>
<span class="Code">
<p lang="EN-US" style="font-size: 10pt; margin: 0in; font-family: Verdana; mso-outline-level: 1">Date date = new Date();</p>
<p style="font-size: 10pt; margin: 0in; font-family: Verdana; mso-outline-level: 1"><span lang="ZH-CN">date.getTime()</span><span lang="EN-US">;</span></p>
</span>
<p style="font-size: 10pt; margin: 0in; mso-outline-level: 1"><span lang="ZH-CN" style="font-family: SimSun">还有一种方式，使用</span><span lang="ZH-CN" style="font-family: Verdana"><span class="Code"><font color="#000000"><span lang="ZH-CN" style="font-family: Verdana">System.currentTimeMillis()</span><span lang="EN-US" style="font-family: Verdana">;</span></font></span></span></p>
<p style="font-size: 10pt; margin: 0in; font-family: SimSun; mso-outline-level: 1">&nbsp;</p>
<p style="font-size: 10pt; margin: 0in; mso-outline-level: 1"><span lang="ZH-CN" style="font-family: SimSun">这两种方式获得的结果是一样的，都是得到一个当前的时间的</span><span lang="EN-US" style="font-family: Verdana">long</span><span lang="ZH-CN" style="font-family: SimSun">型的时间的毫秒值，这个值实际上是当前时间值与</span><span lang="EN-US" style="font-family: Verdana">1970</span><span lang="ZH-CN" style="font-family: SimSun">年一月一号零时零分零秒相差的毫秒数。</span></p>
<p style="font-size: 10pt; margin: 0in; mso-outline-level: 1"><span lang="ZH-CN" style="font-family: SimSun">当前的时间得到了，但实际的应用中最后往往不是要用这个</span><span lang="EN-US" style="font-family: Verdana">long</span><span lang="ZH-CN" style="font-family: SimSun">型的东西，用户希望得到的往往是一个时间的字符串，比如&#8220;</span><span lang="EN-US" style="font-family: Verdana">2006</span><span lang="ZH-CN" style="font-family: SimSun">年</span><span lang="EN-US" style="font-family: Verdana">6</span><span lang="ZH-CN" style="font-family: SimSun">月</span><span lang="EN-US" style="font-family: Verdana">18</span><span lang="ZH-CN" style="font-family: SimSun">号&#8221;，或&#8220;</span><span lang="EN-US" style="font-family: Verdana">2006-06-18</span><span lang="ZH-CN" style="font-family: SimSun">&#8221;，老外可能希望得到的是&#8220;</span><span lang="EN-US" style="font-family: Verdana">06-18-2006</span><span lang="ZH-CN" style="font-family: SimSun">&#8221;，诸如此类等等。这就是下一个要解决的问题</span></p>
<p style="font-size: 10pt; margin: 0in; font-family: SimSun; mso-outline-level: 1">&nbsp;</p>
<p style="font-size: 10pt; margin: 0in; font-family: SimSun; mso-outline-level: 1">二、获取某个时间的某种格式</p>
<p style="font-size: 10pt; margin: 0in; font-family: SimSun; mso-outline-level: 1">&nbsp;</p>
<p style="font-size: 10pt; margin: 0in; mso-outline-level: 1"><span style="font-family: SimSun">获取时间的格式，需要用到一个专门用于时间格式的类</span><span style="font-family: Verdana">java.text.SimpleDateFormat</span><span style="font-family: SimSun">。</span></p>
<p style="font-size: 10pt; margin: 0in; mso-outline-level: 1"><span style="font-family: SimSun">首先，定义一个</span><span style="font-family: Verdana">SimpleDateFormat</span><span style="font-family: SimSun">变量</span></p>
<p style="font-size: 10pt; margin: 0in; font-family: Verdana; mso-outline-level: 1"><span class="Code"><font face="Verdana" color="#000000">SimpleDateFormat sdf = new SimpleDateFormat("",Locale.SIMPLIFIED_CHINESE);</font></span></p>
<p style="font-size: 10pt; margin: 0in; font-family: SimSun; mso-outline-level: 1">这个构造函数的定义如下：</p>
<p style="font-size: 10pt; margin: 0in; mso-outline-level: 1"><span style="font-family: Verdana">SimpleDateFormat(String</span><span style="font-family: SimSun">&nbsp;</span><span style="font-family: Verdana">pattern, Locale</span><span style="font-family: SimSun">&nbsp;</span><span style="font-family: Verdana">locale) </span></p>
<p style="font-size: 10pt; margin: 0in; mso-outline-level: 1"><span lang="ZH-CN" style="font-family: SimSun">第一个参数</span><span lang="EN-US" style="font-family: Verdana">pattern</span><span lang="ZH-CN" style="font-family: SimSun">，我们后面再解释，这里我们使用一个</span><span lang="EN-US" style="font-family: Verdana">"",</span><span lang="ZH-CN" style="font-family: SimSun">第二个参数，是用来设置时区的，这里用到了</span><span lang="EN-US" style="font-family: Verdana">java.util.Locale</span><span lang="ZH-CN" style="font-family: SimSun">这个类，这个类了面定义了很多静态变量，直接拿过来用就</span><span lang="EN-US" style="font-family: Verdana">OK</span><span lang="ZH-CN" style="font-family: SimSun">，我们把时区设置为</span><span lang="ZH-CN" style="font-family: Verdana">Locale.SIMPLIFIED_CHINESE</span><span lang="ZH-CN" style="font-family: SimSun">，只看名字，这个静态变量的意义已经很清楚了。</span></p>
<p style="font-size: 10pt; margin: 0in; font-family: SimSun; mso-outline-level: 1">&nbsp;</p>
<p style="font-size: 10pt; margin: 0in; mso-outline-level: 1"><span lang="ZH-CN" style="font-family: SimSun">接下来我们使用这个</span><span lang="ZH-CN" style="font-family: Verdana">SimpleDateFormat</span><span lang="ZH-CN" style="font-family: SimSun">把当前时间格式化为一个如下格式的时间字符串&#8220;</span><span lang="EN-US" style="font-family: Verdana">XXXX</span><span lang="ZH-CN" style="font-family: SimSun">年</span><span lang="EN-US" style="font-family: Verdana">XX</span><span lang="ZH-CN" style="font-family: SimSun">月</span><span lang="EN-US" style="font-family: Verdana">XX</span><span lang="ZH-CN" style="font-family: SimSun">日</span><span lang="EN-US" style="font-family: Verdana">_XX</span><span lang="ZH-CN" style="font-family: SimSun">时</span><span lang="EN-US" style="font-family: Verdana">XX</span><span lang="ZH-CN" style="font-family: SimSun">分</span><span lang="EN-US" style="font-family: Verdana">XX</span><span lang="ZH-CN" style="font-family: SimSun">秒&#8221;，代码：</span></p>
<span class="Code">
<p style="font-size: 10pt; margin: 0in; font-family: SimSun; mso-outline-level: 1">sdf.applyPattern("yyyy年MM月dd日_HH时mm分ss秒");</p>
<p style="font-size: 10pt; margin: 0in; font-family: SimSun; mso-outline-level: 1">String timeStr = sdf.format(new Date()); </p>
</span>
<p style="font-size: 10pt; margin: 0in; font-family: SimSun; mso-outline-level: 1">&nbsp;</p>
<p style="font-size: 10pt; margin: 0in; mso-outline-level: 1"><span lang="ZH-CN" style="font-family: SimSun">获取时间格式的函数是</span><span lang="EN-US" style="font-family: Verdana">format</span><span lang="ZH-CN" style="font-family: SimSun">，这个函数的参数是</span><span lang="EN-US" style="font-family: Verdana">java.util.Date</span><span lang="ZH-CN" style="font-family: SimSun">对象，这个没有什么花头。</span></p>
<p style="font-size: 10pt; margin: 0in; mso-outline-level: 1"><span lang="ZH-CN" style="font-family: SimSun">要说明一下的是这个</span><span lang="EN-US" style="font-family: Verdana">pattern</span><span lang="ZH-CN" style="font-family: SimSun">，所谓的模式。这里，</span><span lang="EN-US" style="font-family: Verdana">yyyy,MM,dd</span><span lang="ZH-CN" style="font-family: SimSun">等，这就是模式。</span></p>
<p style="font-size: 10pt; margin: 0in; mso-outline-level: 1"><span style="font-family: SimSun">我们可以在</span><span style="font-family: Verdana">SimpleDateFormat</span><span style="font-family: SimSun">的构造函数中指定模式，比如</span></p>
<p style="font-size: 10pt; margin: 0in; font-family: Verdana; mso-outline-level: 1"><span lang="ZH-CN"><span class="Code"><font color="#000000"><font face="Verdana"><span lang="ZH-CN">SimpleDateFormat sdf = new SimpleDateFormat("</span><span lang="EN-US">yyyy-MM-dd</span><span lang="ZH-CN">",Locale.SIMPLIFIED_CHINESE);</span></font></font></span></span></p>
<p style="font-size: 10pt; margin: 0in; font-family: SimSun; mso-outline-level: 1">也可以获取时间格式的时候使用applyPattern函数临时指定，上面的例子就是这样。</p>
<p style="font-size: 10pt; margin: 0in; mso-outline-level: 1"><span lang="ZH-CN" style="font-family: SimSun">什么字符代表什么，这是</span><span lang="EN-US" style="font-family: Verdana">j2se</span><span lang="ZH-CN" style="font-family: SimSun">约定好的，设置模式的时候，我们可以使用约定好的字符加上任何我们想要的字符串。</span></p>
<p style="font-size: 10pt; margin: 0in; mso-outline-level: 1"><span lang="EN-US" style="font-family: Verdana">j2se</span><span lang="ZH-CN" style="font-family: SimSun">对字符所代表的模式的约定列表如下：</span></p>
<p style="font-size: 10pt; margin: 0in; mso-outline-level: 1">&nbsp;</p>
<p style="font-size: 10pt; margin: 0in; mso-outline-level: 1">&nbsp;</p>
<p style="font-size: 10pt; margin: 0in; mso-outline-level: 1"><span lang="ZH-CN" style="font-family: SimSun">
<table cellspacing="1" cellpadding="1" width="500" align="center" summary="" border="0">
    <tbody>
        <tr>
            <td>Letter</td>
            <td><span style="font-weight: bold">Date or Time Component</span> </td>
            <td><span style="font-weight: bold">Presentation </span></td>
        </tr>
        <tr>
            <td>G</td>
            <td>Era designator </td>
            <td>Text </td>
        </tr>
        <tr>
            <td>y</td>
            <td>Year </td>
            <td>Year </td>
        </tr>
        <tr>
            <td>M </td>
            <td>Month in year </td>
            <td>Month </td>
        </tr>
        <tr>
            <td>w </td>
            <td>Week in year </td>
            <td>Number </td>
        </tr>
        <tr>
            <td>W </td>
            <td>Week in month </td>
            <td>Number </td>
        </tr>
        <tr>
            <td>D </td>
            <td>Day in year</td>
            <td>Number </td>
        </tr>
        <tr>
            <td>d </td>
            <td>Day in month </td>
            <td>Number </td>
        </tr>
        <tr>
            <td>F </td>
            <td>Day of week in month </td>
            <td>Number </td>
        </tr>
        <tr>
            <td>E </td>
            <td>Day in week </td>
            <td>Text</td>
        </tr>
        <tr>
            <td>a </td>
            <td>Am/pm marker </td>
            <td>Text&nbsp;</td>
        </tr>
        <tr>
            <td>H </td>
            <td>Hour in day (0-23)</td>
            <td>Number </td>
        </tr>
        <tr>
            <td>k </td>
            <td>Hour in day (1-24)</td>
            <td>Number </td>
        </tr>
        <tr>
            <td>K </td>
            <td>Hour in am/pm (0-11)&nbsp;</td>
            <td>Number </td>
        </tr>
        <tr>
            <td>h&nbsp;&nbsp;</td>
            <td>Hour in am/pm (1-12)&nbsp;</td>
            <td>Number </td>
        </tr>
        <tr>
            <td>m&nbsp;&nbsp;</td>
            <td>Minute in hour&nbsp;</td>
            <td>Number </td>
        </tr>
        <tr>
            <td>s&nbsp;&nbsp;</td>
            <td>Second in minute&nbsp;</td>
            <td>Number </td>
        </tr>
        <tr>
            <td>S&nbsp;&nbsp;</td>
            <td>Millisecond&nbsp;</td>
            <td>Number&nbsp;&nbsp;</td>
        </tr>
        <tr>
            <td>z&nbsp;&nbsp;</td>
            <td>Time zone&nbsp;&nbsp;</td>
            <td>General time zone&nbsp;</td>
        </tr>
        <tr>
            <td>Z&nbsp;&nbsp;</td>
            <td>Time zone&nbsp;</td>
            <td>RFC 822 time zone&nbsp;</td>
        </tr>
    </tbody>
</table>
</span></p>
<img src ="http://www.blogjava.net/lisuzhi008/aggbug/147832.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lisuzhi008/" target="_blank">黎素智</a> 2007-09-24 16:14 <a href="http://www.blogjava.net/lisuzhi008/articles/147832.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>彻底搞定java文件上传 </title><link>http://www.blogjava.net/lisuzhi008/articles/116603.html</link><dc:creator>黎素智</dc:creator><author>黎素智</author><pubDate>Thu, 10 May 2007 14:12:00 GMT</pubDate><guid>http://www.blogjava.net/lisuzhi008/articles/116603.html</guid><wfw:comment>http://www.blogjava.net/lisuzhi008/comments/116603.html</wfw:comment><comments>http://www.blogjava.net/lisuzhi008/articles/116603.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lisuzhi008/comments/commentRss/116603.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lisuzhi008/services/trackbacks/116603.html</trackback:ping><description><![CDATA[<p>JAVA的文件上传遍一直是一个比较关注的问题,而且有几个NB东西提供了这个功能.</p>
<p>用的最多的算是三个(我就知道这三个)比较强的,一个是比较早的jspsmartupload,另一个是出身名族的commonupload,还有一个就是orellay的了.</p>
<p>我用的比较多是前两个,总的感觉是jspsmartuplod比较灵活,功能上更强一些(一点点吧),但是现在网上也不维护,也不能下载了,特别是它上传的时候把上传文件放到内存里,所以上传文件的大小会和内存有关系.commonupload虽然没有提供很多API,但是它有比较灵活,它上传的过程中会把上传的文件先写入磁盘,所以上传的大小只是带宽有关系,我尝试最大的上传文件的大小是700M,当然是本地测试:&gt;</p>
<p>还有是就是在Linux/Unix系统上传文件的中文问题,我在下面的代码有了一些解决.</p>
<p>下面是前两种方式的上传代码:</p>
<p>try{<br>//取session 用户oid<br>int pid = userInfo.getUserId();<br>String sys_user_id = String.valueOf(pid);<br>//取init配置文件的参数值<br>String sitePhysicalPath = (String)init.getObject("SitePhysicalPath");<br>String saveDir = (String)init.getObject("InfoUploadDir");<br>String tempDir = (String)init.getObject("InfoUploadDir");<br>String fileMemo = ""; //文件说明<br>String fileName = null; //存储到数据库的文件名<br>String saveName = null; //存储到本地的文件名<br>String filePath = null; //存储到数据库的文件路径<br>String savePath = null; //存储到本地的文件路径<br>long fileSize = 0; //文件大小<br>int maxPostSize = -1; <br>int dinfo_upload_id = -1;<br>%&gt;<br>&lt;%<br>//初始化<br>mySmartUpload.initialize(pageContext);<br>//上载文件<br>mySmartUpload.upload();<br>//循环取得所有上载文件<br>for(int i=0; i&lt;mySmartUpload.getFiles().getCount(); i++)<br>{<br>//取得上载文件<br>com.jspsmart.upload.File file = mySmartUpload.getFiles().getFile(i);<br>if(!file.isMissing())<br>{<br>fileName = file.getFileName();<br>//取得文件扩展名file.getFileExt()<br>try{<br>saveName = fileName.substring(fileName.lastIndexOf("."));</p>
<p>}catch(Exception e){<br>saveName = "";<br>}<br>//取得文件大小<br>fileSize = file.getSize();<br>//存储路径<br>String sql_id = " SELECT S_INFO_UPLOAD.nextval as seqid FROM dual ";<br>try{<br>Statement stmt = con.createStatement();<br>ResultSet rst = stmt.executeQuery(sql_id);<br>while(rst.next())<br>{<br>dinfo_upload_id = rst.getInt("seqid");<br>}<br>}catch(SQLException sqle){<br>return;<br>}</p>
<p>filePath = sitePhysicalPath + saveDir + Integer.toString(dinfo_upload_id) + saveName;<br>savePath = saveDir + Integer.toString(dinfo_upload_id) + saveName;<br>//存储文件到本地<br>file.saveAs(filePath);<br>//存储文件到数据库<br>switch(i)<br>{<br>case 0: fileMemo = (String)mySmartUpload.getRequest().getParameter("memo1"); break;<br>case 1: fileMemo = (String)mySmartUpload.getRequest().getParameter("memo2"); break;<br>case 2: fileMemo = (String)mySmartUpload.getRequest().getParameter("memo3"); break;<br>case 3: fileMemo = (String)mySmartUpload.getRequest().getParameter("memo4"); break;<br>case 4: fileMemo = (String)mySmartUpload.getRequest().getParameter("memo5"); break;<br>default: fileMemo = "";<br>}</p>
<p>String sql = " INSERT INTO info_upload (info_upload_id,sys_user_id,file_size,file_path,utime,deleted) "<br>+ " VALUES( " + Integer.toString(dinfo_upload_id) + "," + sys_user_id + "," + fileSize + ",'" + savePath + "', SYSDATE , 0 )" ;<br>sqlcmd cmd = new sqlcmd(con,sql);<br>//System.out.println(sql);<br>java.sql.PreparedStatement pstmt = null;<br>java.sql.Statement stmt = null;<br>//fileName = fileName.substring(0, fileName.indexOf("."));<br>String sql_cn = " UPDATE info_upload SET file_name=?,file_memo=? WHERE info_upload_id=? ";<br>java.io.ByteArrayInputStream bais_name = new java.io.ByteArrayInputStream(fileName.getBytes("ISO-8859-1"));<br>java.io.InputStreamReader isr_name = new java.io.InputStreamReader((InputStream)bais_name,"GBK");</p>
<p>java.io.ByteArrayInputStream bais_memo = new java.io.ByteArrayInputStream(fileMemo.getBytes("GBK"));<br>java.io.InputStreamReader isr_memo = new java.io.InputStreamReader((InputStream)bais_memo,"GBK");</p>
<p>try{<br>stmt = con.createStatement();<br>stmt.getConnection().setAutoCommit(false);</p>
<p>pstmt = con.prepareStatement(sql_cn);<br>pstmt.setCharacterStream(1, isr_name, fileName.length());<br>pstmt.setCharacterStream(2, isr_memo, fileMemo.length());<br>pstmt.setInt(3, dinfo_upload_id);</p>
<p>//System.out.println(sql_cn);</p>
<p>pstmt.execute();<br>stmt.executeUpdate("COMMIT");</p>
<p>}catch(Exception exce){<br>System.out.println(exce);<br>stmt.executeUpdate("ROLLBACK");<br>}<br>}<br>}<br>}catch(Exception e){<br>}</p>
<p><br>以上是jspsmart的方式,如果想要其它的方式,请下载全部源代码.<br><br><br><br>//upload_fileUpload.jsp</p>
<p>&lt;%@ include file = "../../backgeneral.jsp"%&gt;<br>&lt;%@ contentType="text/html;charset=GBK" %&gt;<br>&lt;jsp:useBean id="userInfo" scope="session" class="com.ges.hbgov.UserInfo"/&gt;<br>&lt;%@ page import="org.apache.commons.fileupload.*" %&gt;<br>&lt;%<br>try{<br>&nbsp;//request.setCharacterEncoding("GBK");<br>//取session 用户oid<br>&nbsp;&nbsp;&nbsp; int pid = userInfo.getUserId();<br>&nbsp;&nbsp;&nbsp; String sys_user_id = String.valueOf(pid);<br>//取init配置文件的参数值<br>&nbsp;String sitePhysicalPath = (String)init.getObject("SitePhysicalPath");<br>&nbsp;String saveDir&nbsp; = (String)init.getObject("InfoUploadDir");<br>&nbsp;String tempDir&nbsp; = (String)init.getObject("InfoUploadDir");<br>&nbsp;String fileMemo = "";&nbsp;&nbsp;&nbsp; //文件说明<br>&nbsp;String fileName = null;&nbsp; //存储到数据库的文件名<br>&nbsp;String saveName = null;&nbsp; //存储到本地的文件名<br>&nbsp;String filePath = null;&nbsp; //存储到本地的文件路径<br>&nbsp;String savePath = null;&nbsp; //存储到数据库的文件路径<br>&nbsp;long&nbsp;&nbsp; fileSize = 0;&nbsp;&nbsp;&nbsp;&nbsp; //文件大小<br>&nbsp;int maxPostSize = -1;&nbsp;&nbsp;&nbsp; <br>&nbsp;int dinfo_upload_id = -1;<br>%&gt;<br>&lt;%<br>&nbsp;&nbsp;&nbsp; DiskFileUpload df = new DiskFileUpload();<br>&nbsp;&nbsp;&nbsp; //设定上传文件大小<br>&nbsp;df.setSizeMax(maxPostSize);<br>&nbsp;//设定临时目录<br>&nbsp;df.setRepositoryPath(sitePhysicalPath + tempDir);<br>&nbsp;&nbsp;&nbsp; //取得request信息<br>&nbsp;List items = df.parseRequest(request);<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;Iterator iter = items.iterator();<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;int temp = 0;<br>&nbsp;FileItem tempItem = null;</p>
<p>&nbsp;while(iter.hasNext()){<br>&nbsp;&nbsp;temp++;<br>&nbsp;&nbsp;FileItem item = (FileItem)iter.next();<br>&nbsp;&nbsp;if(item.isFormField())&nbsp;&nbsp;&nbsp; //取得文件说明信息<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;fileMemo = item.getString("GBK");<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;{&nbsp;&nbsp; //取得上传文件信息<br>&nbsp;&nbsp;&nbsp;fileName = (String)item.getName();<br>&nbsp;&nbsp;&nbsp;try{<br>&nbsp;&nbsp;&nbsp;&nbsp;fileName = fileName.substring(fileName.lastIndexOf("<a href="file://%22)+1/"><u><font color=#0000ff>\\")+1</font></u></a>);<br>&nbsp;&nbsp;&nbsp;&nbsp;fileName = fileName.substring(fileName.lastIndexOf("/")+1);<br>&nbsp;&nbsp;&nbsp;}catch(Exception e){<br>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e);<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;fileSize = item.getSize();<br>&nbsp;&nbsp;&nbsp;tempItem = item;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;if(temp == 2 &amp;&amp; fileSize != 0)<br>&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp; //每两个iter存储一个上传文件</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;//得到info_title_id<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String SQL_ID="select S_INFO_UPLOAD.nextval as seqid from dual";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.sql.Statement stmt = con.createStatement();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.sql.ResultSet rst= stmt.executeQuery(SQL_ID);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(rst.next()) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dinfo_upload_id = rst.getInt("seqid");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(SQLException e1){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //取得文件扩展名<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br>&nbsp;&nbsp;&nbsp;&nbsp;saveName = fileName.substring(fileName.lastIndexOf("."));<br>&nbsp;&nbsp;&nbsp;}catch(Exception exc){<br>&nbsp;&nbsp;&nbsp;&nbsp;saveName = "";<br>&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filePath = sitePhysicalPath + saveDir + Integer.toString(dinfo_upload_id) + saveName;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //存储文件<br>&nbsp;&nbsp;&nbsp;java.io.File uploadFile = new java.io.File(filePath);<br>&nbsp;&nbsp;&nbsp;tempItem.write(uploadFile);<br>&nbsp;&nbsp;&nbsp;/*try{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileOutputStream fos = new FileOutputStream(filePath);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStream is = tempItem.getInputStream();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;byte[] b = new byte[1024];<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;int nRead;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;long per = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double percent = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while((nRead = is.read(b, 0, 1024))&gt;0){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;fos.write(b, 0, nRead);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;per += nRead;<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;percent = (double)per/fileSize;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;session.setAttribute("percent",Double.toString(percent).substring(2,4));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;session.setAttribute("filename",fileName);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; is.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;fos.close();&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}catch(Exception e){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e);<br>&nbsp;&nbsp;&nbsp;&nbsp;}*/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; savePath = saveDir + Integer.toString(dinfo_upload_id) + saveName;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*/存储数据库<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String sql = " INSERT INTO info_upload (info_upload_id,sys_user_id,file_name,file_memo,file_size,file_path,utime,deleted) "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + " VALUES( " + Integer.toString(dinfo_upload_id) + "," + sys_user_id + ",'" + fileName + "','" + fileMemo + "'," + fileSize + ",'" + savePath + "', SYSDATE , 0 )" ;<br>&nbsp;&nbsp;&nbsp;sqlcmd cmd = new sqlcmd(con,sql);<br>&nbsp;&nbsp;&nbsp;*/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String sql = " INSERT INTO info_upload (info_upload_id,sys_user_id,file_size,file_path,utime,deleted) "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + " VALUES( " + Integer.toString(dinfo_upload_id) + "," + sys_user_id + "," + fileSize + ",'" + savePath + "', SYSDATE , 0 )" ;<br>&nbsp;&nbsp;&nbsp;sqlcmd cmd = new sqlcmd(con,sql);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //System.out.println(sql);<br>&nbsp;&nbsp;&nbsp;java.sql.PreparedStatement pstmt = null;<br>&nbsp;&nbsp;&nbsp;java.sql.Statement stmt = null;<br>&nbsp;&nbsp;&nbsp;//fileName = fileName.substring(0, fileName.indexOf("."));<br>&nbsp;&nbsp;&nbsp;String sql_cn = " UPDATE info_upload SET file_name=?,file_memo=? WHERE info_upload_id=? ";<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;java.io.ByteArrayInputStream bais_name = new java.io.ByteArrayInputStream(fileName.getBytes("ISO-8859-1"));<br>&nbsp;&nbsp;&nbsp;java.io.InputStreamReader isr_name = new java.io.InputStreamReader((InputStream)bais_name,"GBK");</p>
<p>&nbsp;&nbsp;&nbsp;java.io.ByteArrayInputStream bais_memo = new java.io.ByteArrayInputStream(fileMemo.getBytes("GBK"));<br>&nbsp;&nbsp;&nbsp;java.io.InputStreamReader isr_memo = new java.io.InputStreamReader((InputStream)bais_memo,"GBK");<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;try{<br>&nbsp;&nbsp;&nbsp;&nbsp;stmt = con.createStatement();<br>&nbsp;&nbsp;&nbsp;&nbsp;stmt.getConnection().setAutoCommit(false);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;pstmt = con.prepareStatement(sql_cn);<br>&nbsp;&nbsp;&nbsp;&nbsp;pstmt.setCharacterStream(1, isr_name, fileName.length());<br>&nbsp;&nbsp;&nbsp;&nbsp;pstmt.setCharacterStream(2, isr_memo, fileMemo.length());<br>&nbsp;&nbsp;&nbsp;&nbsp;pstmt.setInt(3, dinfo_upload_id);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //System.out.println(sql_cn);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;pstmt.execute();<br>&nbsp;&nbsp;&nbsp;&nbsp;stmt.executeUpdate("COMMIT");</p>
<p>&nbsp;&nbsp;&nbsp;}catch(Exception exce){<br>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(exce);<br>&nbsp;&nbsp;&nbsp;&nbsp;stmt.executeUpdate("ROLLBACK");<br>&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;temp = 0;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;else if (temp == 2 &amp;&amp; fileSize == 0) {temp = 0;} </p>
<p>&nbsp;}<br>&nbsp;&nbsp;&nbsp; //session.setAttribute("percent","ok");<br>}catch(Exception ex){<br>&nbsp;System.out.println(ex);<br>}<br>response.sendRedirect("list.jsp");</p>
<p>%&gt;<br><br><br><br><br>//upload_jspSmart.jsp</p>
<p>&lt;%@ include file = "../../backgeneral.jsp"%&gt;<br>&lt;%@ page language="java" import="java.util.*,java.sql.*,java.io.*"%&gt;<br>&lt;%@ page language="java" import="com.jspsmart.upload.*"%&gt;<br>&lt;%@ page language="java" import="com.ges.hbgov.*"%&gt;<br>&lt;jsp:useBean id="userInfo" scope="session" class="com.ges.hbgov.UserInfo"/&gt;<br>&lt;jsp:useBean id="mySmartUpload" scope="page" class="com.jspsmart.upload.SmartUpload" /&gt;<br>&lt;%<br>//System.out.println("page=" + (String)session.getAttribute("SYS_USER_ID"));<br>if(!userInfo.Request(request)){<br>%&gt;<br>&lt;script language=javascript&gt;<br>&nbsp;function relogin() {<br>&nbsp;&nbsp;this.parent.location.href="../../login.jsp";<br>&nbsp;}<br>&nbsp;relogin();<br>&lt;/script&gt;<br>&lt;%<br>}<br>%&gt;</p>
<p>&lt;%</p>
<p>try{<br>//取session 用户oid<br>&nbsp;&nbsp;&nbsp; int pid = userInfo.getUserId();<br>&nbsp;&nbsp;&nbsp; String sys_user_id = String.valueOf(pid);<br>//取init配置文件的参数值<br>&nbsp;String sitePhysicalPath = (String)init.getObject("SitePhysicalPath");<br>&nbsp;String saveDir&nbsp; = (String)init.getObject("InfoUploadDir");<br>&nbsp;String tempDir&nbsp; = (String)init.getObject("InfoUploadDir");<br>&nbsp;String fileMemo = "";&nbsp;&nbsp;&nbsp; //文件说明<br>&nbsp;String fileName = null;&nbsp; //存储到数据库的文件名<br>&nbsp;String saveName = null;&nbsp; //存储到本地的文件名<br>&nbsp;String filePath = null;&nbsp; //存储到数据库的文件路径<br>&nbsp;String savePath = null;&nbsp; //存储到本地的文件路径<br>&nbsp;long&nbsp;&nbsp; fileSize = 0;&nbsp;&nbsp;&nbsp;&nbsp; //文件大小<br>&nbsp;int maxPostSize = -1;&nbsp;&nbsp;&nbsp; <br>&nbsp;int dinfo_upload_id = -1;<br>%&gt;<br>&lt;%<br>&nbsp;//初始化<br>&nbsp;mySmartUpload.initialize(pageContext);<br>&nbsp;//上载文件<br>&nbsp;&nbsp;&nbsp; mySmartUpload.upload();<br>&nbsp;//循环取得所有上载文件<br>&nbsp;&nbsp;&nbsp; for(int i=0; i&lt;mySmartUpload.getFiles().getCount(); i++)<br>&nbsp;{<br>&nbsp;&nbsp;//取得上载文件<br>&nbsp;&nbsp;com.jspsmart.upload.File file = mySmartUpload.getFiles().getFile(i);<br>&nbsp;&nbsp;if(!file.isMissing())<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;fileName = file.getFileName();<br>&nbsp;&nbsp;&nbsp;//取得文件扩展名file.getFileExt()<br>&nbsp;&nbsp;&nbsp;try{<br>&nbsp;&nbsp;&nbsp;&nbsp;saveName = fileName.substring(fileName.lastIndexOf("."));</p>
<p>&nbsp;&nbsp;&nbsp;}catch(Exception e){<br>&nbsp;&nbsp;&nbsp;&nbsp;saveName = "";<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;//取得文件大小<br>&nbsp;&nbsp;&nbsp;fileSize = file.getSize();<br>&nbsp;&nbsp;&nbsp;//存储路径<br>&nbsp;&nbsp;&nbsp;String sql_id = " SELECT S_INFO_UPLOAD.nextval as seqid FROM dual ";<br>&nbsp;&nbsp;&nbsp;try{<br>&nbsp;&nbsp;&nbsp;&nbsp;Statement stmt = con.createStatement();<br>&nbsp;&nbsp;&nbsp;&nbsp;ResultSet rst = stmt.executeQuery(sql_id);<br>&nbsp;&nbsp;&nbsp;&nbsp;while(rst.next())<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dinfo_upload_id = rst.getInt("seqid");<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;}catch(SQLException sqle){<br>&nbsp;&nbsp;&nbsp;&nbsp;return;<br>&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;filePath = sitePhysicalPath + saveDir + Integer.toString(dinfo_upload_id) + saveName;<br>&nbsp;&nbsp;&nbsp;savePath = saveDir + Integer.toString(dinfo_upload_id) + saveName;<br>&nbsp;&nbsp;&nbsp;//存储文件到本地<br>&nbsp;&nbsp;&nbsp;file.saveAs(filePath);<br>&nbsp;&nbsp;&nbsp;//存储文件到数据库<br>&nbsp;&nbsp;&nbsp;switch(i)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;case 0: fileMemo = (String)mySmartUpload.getRequest().getParameter("memo1"); break;<br>&nbsp;&nbsp;&nbsp;&nbsp;case 1: fileMemo = (String)mySmartUpload.getRequest().getParameter("memo2"); break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 2: fileMemo = (String)mySmartUpload.getRequest().getParameter("memo3"); break;<br>&nbsp;&nbsp;&nbsp;&nbsp;case 3: fileMemo = (String)mySmartUpload.getRequest().getParameter("memo4"); break;<br>&nbsp;&nbsp;&nbsp;&nbsp;case 4: fileMemo = (String)mySmartUpload.getRequest().getParameter("memo5"); break;<br>&nbsp;&nbsp;&nbsp;&nbsp;default: fileMemo = "";<br>&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String sql = " INSERT INTO info_upload (info_upload_id,sys_user_id,file_size,file_path,utime,deleted) "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + " VALUES( " + Integer.toString(dinfo_upload_id) + "," + sys_user_id + "," + fileSize + ",'" + savePath + "', SYSDATE , 0 )" ;<br>&nbsp;&nbsp;&nbsp;sqlcmd cmd = new sqlcmd(con,sql);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //System.out.println(sql);<br>&nbsp;&nbsp;&nbsp;java.sql.PreparedStatement pstmt = null;<br>&nbsp;&nbsp;&nbsp;java.sql.Statement stmt = null;<br>&nbsp;&nbsp;&nbsp;//fileName = fileName.substring(0, fileName.indexOf("."));<br>&nbsp;&nbsp;&nbsp;String sql_cn = " UPDATE info_upload SET file_name=?,file_memo=? WHERE info_upload_id=? ";<br>&nbsp;&nbsp;&nbsp;java.io.ByteArrayInputStream bais_name = new java.io.ByteArrayInputStream(fileName.getBytes("ISO-8859-1"));<br>&nbsp;&nbsp;&nbsp;java.io.InputStreamReader isr_name = new java.io.InputStreamReader((InputStream)bais_name,"GBK");</p>
<p>&nbsp;&nbsp;&nbsp;java.io.ByteArrayInputStream bais_memo = new java.io.ByteArrayInputStream(fileMemo.getBytes("GBK"));<br>&nbsp;&nbsp;&nbsp;java.io.InputStreamReader isr_memo = new java.io.InputStreamReader((InputStream)bais_memo,"GBK");<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;try{<br>&nbsp;&nbsp;&nbsp;&nbsp;stmt = con.createStatement();<br>&nbsp;&nbsp;&nbsp;&nbsp;stmt.getConnection().setAutoCommit(false);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;pstmt = con.prepareStatement(sql_cn);<br>&nbsp;&nbsp;&nbsp;&nbsp;pstmt.setCharacterStream(1, isr_name, fileName.length());<br>&nbsp;&nbsp;&nbsp;&nbsp;pstmt.setCharacterStream(2, isr_memo, fileMemo.length());<br>&nbsp;&nbsp;&nbsp;&nbsp;pstmt.setInt(3, dinfo_upload_id);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //System.out.println(sql_cn);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;pstmt.execute();<br>&nbsp;&nbsp;&nbsp;&nbsp;stmt.executeUpdate("COMMIT");</p>
<p>&nbsp;&nbsp;&nbsp;}catch(Exception exce){<br>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(exce);<br>&nbsp;&nbsp;&nbsp;&nbsp;stmt.executeUpdate("ROLLBACK");<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>&nbsp;}<br>}catch(Exception e){<br>}</p>
<p>response.sendRedirect("list.jsp");<br>%&gt; </p>
<br><br>
<p id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=119592<br><br><br>说明：<br>
<table style="TABLE-LAYOUT: fixed">
    <tbody>
        <tr>
            <td style="WORD-WRAP: break-word">表名: info_upload <br><br>数据结构说明: <br>字段名 说明 类型 空否 主外键 备注 <br>info_upload_file_id 上传文件的ID INTEGER N PK 主键,自增整型 <br>sys_user_id 上传用户的ID INTEGER <br>file_name 文件名称 VARCHAR(100) <br>file_memo 文件说明 VARCHAR(100) <br>file_size 文件大小 LONG <br>file_path 文件路径 VARCHAR(255) <br>utime 上传时间 DATE <br>deleted 文件删除位 SMALLINT <br><br><br>状态位说明: <br><br>deleted字段 <br>值 含义 备注 <br>0 未删除 <br>1 已删除 <br></td>
        </tr>
    </tbody>
</table>
</p>
<img src ="http://www.blogjava.net/lisuzhi008/aggbug/116603.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lisuzhi008/" target="_blank">黎素智</a> 2007-05-10 22:12 <a href="http://www.blogjava.net/lisuzhi008/articles/116603.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>