??xml version="1.0" encoding="utf-8" standalone="yes"?>
smsx.cab打印代?没有弹出面讄H口)
依照该规则,?1996 q初QEU SEMPERQ欧z安全电子市场)目决定编写自q跟踪 API?在无数次改进、几ơ具体化和许多工作之后,?API 已经演变?log4jQ一U流行的 Java 日志记录包?nbsp; q个包按 IBM 公共许可证分发,由开放源码权威机构认证?/p>
日志记录有其自己的缺炏V它会降低应用程序的速度。如果太详细Q它可能会屏幕滚动变得看不见?nbsp; Z减低q些影响Qlog4j 被设计成快速且灉|的。由于应用程序很将日志记录当作是主要功能, log4j API 力争易于了解和用?br /> log4jQ它可以控制以Q意间隔输出哪些日志语句?/p>
二、主要组?/p>
1、根cdQ在cd层次l构的顶部,卛_局性的日志U别Q?br />
配置根LoggerQ其语法为:
log4j.rootLogger = [ level ] , appenderName, appenderName, ...
level 是日志记录的cd
appenderName是指定日志信息输出到哪个地斏V您可以同时指定多个输出目的地?
cdlevel ?OFF、FATAL、ERROR、WARN、INFO、DEBUG、log、ALL或自定义的优先?br />
og4j常用的优先FATAL>ERROR>WARN>INFO>DEBUG
配置根LoggerQ其语法为:
log4j.rootLogger = [ level ] , appenderName, appenderName, …
如果为log4j.rootLogger=WARNQ则意味着只有WARN,ERROR,FATAL被输出,DEBUG,INFO被屏蔽掉?/p>
举例Qlog4j.rootCategory=INFO,stdout,Runlog,Errorlog
Ҏ志类别ؓINFOQDEBUG被屏蔽Q其他的被输出?stdout,Runlog,Errorlog分别?个输出目的地?/p>
2、常用输出格?/p>
-X?X信息输出时左寚wQ?br />
%p:日志信息U别
%d{}:日志信息产生旉
%c:日志信息所在地Q类名)
%m:产生的日志具体信?br />
%n:输出日志信息换行
举例Q?br />
log4j.appender.stdout.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n
log4j.appender.Runlog.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n
log4j.appender.Errorlog.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n
3、布局
使用的输出布局Q其中log4j提供4U布局Q?br />
org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q?br />
org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,
org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,
org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息)
举例Q?br />
输出格式为HTML表格
log4j.appender.stdout.layout=org.apache.log4j.HTMLLayout
输出格式为可以灵zd指定布局模式
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
输出格式为包含日志信息的U别和信息字W串
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
输出格式为包含日志生的旉、线E、类别等{信?br /> log4j.appender.stdout.layout=org.apache.log4j.TTCCLayout
4、目的地
配置日志信息输出目的地AppenderQ其语法?/p>
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
...
log4j.appender.appenderName.option = valueN
appenderName是指定日志信息输出到哪个地斏V您可以同时指定多个输出目的地?
log4j支持的输出目的地Q?br />
org.apache.log4j.ConsoleAppender 控制?br />
org.apache.log4j.FileAppender 文g
org.apache.log4j.DailyRollingFileAppender 每天产生一个日志文?br />
org.apache.log4j.RollingFileAppender Q文件大到达指定尺寸的时候生一个新的文ӞQ?br />
org.apache.log4j.WriterAppender Q将日志信息以流格式发送到L指定的地方)
org.apache.log4j.net.SMTPAppender 邮g
org.apache.log4j.jdbc.JDBCAppender 数据?br />
其他如:GUIlg、甚x套接口服务器、NT的事件记录器、UNIX Syslog守护q程{?/p>
举例Q?/p>
输出到控制台
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppenderQ指定输出到控制収ͼ
log4j.appender.Threshold=DEBUGQ指定输出类别)
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayoutQ指定输出布局Q?br />
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%nQ指定输出格式)
输出到文?/p>
log4j.appender.FILE=org.apache.log4j.FileAppenderQ指定输出到文gQ?br />
log4j.appender.FILE.File=file.logQ指定输出的路径及文件名Q?br />
log4j.appender.FILE.Append=false
log4j.appender.FILE.layout=org.apache.log4j.PatternLayoutQ指定输出的布局Q?br />
log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%nQ指定输出的格式Q?/p>
输出到文Ӟ轮换"日志文g",当日志文件达到指定大时Q该文gp关闭q备份,然后创徏一个新的日志文Ӟ
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppenderQ指定输出到文gQ?br />
log4j.appender.ROLLING_FILE.Threshold=ERRORQ指定输出类别)
log4j.appender.ROLLING_FILE.File=rolling.logQ指定输出的路径及文件名Q?br />
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10KBQ指定输出到文g的大)
log4j.appender.ROLLING_FILE.MaxBackupIndex=1
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayoutQ指定采用输出布局Q?br />
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%nQ指定采用输出格式)
输出到Socket
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppenderQ指定输出到SocketQ?br />
log4j.appender.SOCKET.RemoteHost=localhostQ远E主机)
log4j.appender.SOCKET.Port=5001Q远E主机端口)
log4j.appender.SOCKET.LocationInfo=true
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayoutQ布局Q?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%nQ输出格式)
输出到邮?br />
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppenderQ指定输出到邮gQ?br />
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=chenyl@hollycrm.comQ发件hQ?br />
log4j.appender.MAIL.SMTPHost=mail.hollycrm.comQSMTP服务器)
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=chenyl@hollycrm.comQ收件hQ?br />
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayoutQ布局Q?br />
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%nQ格式)
输出到数据库
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppenderQ指定输出到数据库)
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/testQ指定数据库URLQ?br />
log4j.appender.DATABASE.driver=com.mysql.jdbc.DriverQ指定数据库driverQ?br />
log4j.appender.DATABASE.user=rootQ指定数据库用户Q?br />
log4j.appender.DATABASE.password=rootQ指定数据库用户密码Q?br />
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')Q组lSQL语句Q?br />
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayoutQ布局Q?br />
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%nQ格式)
5、日志类别补?br />
有时我们需要对某个特定的部分指定有别于根类别的日志cdQ可以指定某个包的优先
如:
log4j.category.com.neusoft.mbip.dm.util=ERROR Q其中com.neusoft.mbip.dm.util为我们需要特别指定日志类别的部分?br />
或者可以指定输出文件的优先U?br />
log4j.appender.Errorlog.Threshold=ERROR
三?常用log4j配置
常用log4j配置Q一般可以采用两U方式,.properties?xml,下面举两个简单的例子Q?/p>
1、log4j.properties
### 讄org.zblog域对应的U别INFO,DEBUG,WARN,ERROR和输出地A1QA2 ##
log4j.category.org.zblog=ERROR,A1
log4j.category.org.zblog=INFO,A2
log4j.appender.A1=org.apache.log4j.ConsoleAppender
### 讄输出地A1QؓConsoleAppender(控制? ##
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
### 讄A1的输出布局格式PatterLayout,(可以灉|地指定布局模式Q?#
log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n
### 配置日志输出的格?#
log4j.appender.A2=org.apache.log4j.RollingFileAppender
### 讄输出地A2到文Ӟ文g大小到达指定寸的时候生一个新的文Ӟ##
log4j.appender.A2.File=E:/study/log4j/zhuwei.html
### 文g位置##
log4j.appender.A2.MaxFileSize=500KB
### 文g大小##
log4j.appender.A2.MaxBackupIndex=1
log4j.appender.A2.layout=org.apache.log4j.HTMLLayout
##指定采用html方式输出
2、log4j.xml
<?xml version="1.0" encoding="GB2312" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="org.zblog.all" class="org.apache.log4j.RollingFileAppender">
<!-- 讄通道ID:org.zblog.all和输出方式:org.apache.log4j.RollingFileAppender -->
<param name="File" value="E:/study/log4j/all.output.log" /><!-- 讄File参数Q日志输出文件名 -->
<param name="Append" value="false" /><!-- 讄是否在重新启动服务时Q在原有日志的基d新日?-->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%p (%c:%L)- %m%n" /><!-- 讄输出文g目和格?-->
</layout>
</appender>
<appender name="org.zblog.zcw" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="E:/study/log4j/zhuwei.output.log" />
<param name="Append" value="true" />
<param name="MaxFileSize" value="10240" /> <!-- 讄文g大小 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%p (%c:%L)- %m%n" />
</layout>
</appender>
<logger name="zcw.log"> <!-- 讄域名限制Q即zcw.log域及以下的日志均输出C面对应的通道?-->
<level value="debug" /><!-- 讄U别 -->
<appender-ref ref="org.zblog.zcw" /><!-- 与前面的通道id相对?-->
</logger>
<root> <!-- 讄接收所有输出的通道 -->
<appender-ref ref="org.zblog.all" /><!-- 与前面的通道id相对?-->
</root>
</log4j:configuration>
3、配|文件加载方法:
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.xml.DOMConfigurator;
public class Log4jApp {
public static void main(String[] args) {
DOMConfigurator.configure("E:/study/log4j/log4j.xml");//加蝲.xml文g
//PropertyConfigurator.configure("E:/study/log4j/log4j.properties");//加蝲.properties文g
Logger log=Logger.getLogger("org.zblog.test");
log.info("试");
}
}
4、项目用log4j
在web应用中,可以配|文件的加蝲攑֜一个单独的servlet中,q在web.xml中配|该servlet在应用启动时候加载?br />
对于在多人项目中Q可以给每一个h讄一个输出通道Q这样在每个人在构徏LoggerӞ用自q域名Uͼ让调试信
息输出到自己的log文g中?/p>
四、log4j配置举例QpropertiesQ?/p>
#log4j.rootLogger = [ level ] , appenderName, appenderName,
#cdlevel ?OFF、FATAL、ERROR、WARN、INFO、DEBUG、log、ALL或自定义的优先
#Log4j常用的优先FATAL>ERROR>WARN>INFO>DEBUG
#stdout为控制台 QErrorlog为错误记录日?Q?br /> log4j.rootCategory=INFO,stdout,Runlog,Errorlog
#输出的appender的格式ؓ
#log4j.appender.appenderName = fully.qualified.name.of.appender.class
#log4j.appender.appenderName.option1 = value1
#log4j.appender.appenderName.option = valueN
#Log4j中appender支持的输?br />
#org.apache.log4j.ConsoleAppender 控制?br />
#org.apache.log4j.FileAppender 文g
#org.apache.log4j.DailyRollingFileAppender 每天产生一个日志文?br />
#org.apache.log4j.RollingFileAppender Q文件大到达指定尺寸的时候生一个新的文ӞQ?br />
#org.apache.log4j.WriterAppender Q将日志信息以流格式发送到L指定的地方)
#org.apache.log4j.net.SMTPAppender 邮g
#org.apache.log4j.jdbc.JDBCAppender 数据?/p>
Q定义输出的形式
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.Runlog=org.apache.log4j.DailyRollingFileAppender
log4j.appender.Errorlog=org.apache.log4j.DailyRollingFileAppender
#可以指定输出文g的优先
log4j.appender.Errorlog.Threshold=ERROR
#指定输出的文?br />
log4j.appender.Runlog.File=D:\\UserInfoSyn\\WebRoot\\WEB-INF\\runlog\\runlog.log
log4j.appender.Errorlog.File=D:\\UserInfoSyn\\WebRoot\\WEB-INF\\errorlog\\errorlog.log
#Log4j的layout布局
#org.apache.log4j.HTMLLayout 以HTML表格形式布局
#org.apache.log4j.PatternLayout 可以灉|地指定布局模式
#org.apache.log4j.SimpleLayout 包含日志信息的别和信息字符?br />
#org.apache.log4j.TTCCLayout 包含日志产生的时间、线E、类别等{信?/p>
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.Runlog.layout=org.apache.log4j.PatternLayout
log4j.appender.Errorlog.layout=org.apache.log4j.PatternLayout
#输出格式,log4j javadoc org.apache.log4j.PatternLayout
#-X?X信息输出时左寚wQ?br />
#%p:日志信息U别
# %d{}:日志信息产生旉
# %c:日志信息所在地Q类名)
# %m:产生的日志具体信?br />
# %n:%n:输出日志信息换行
log4j.appender.stdout.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n
log4j.appender.Runlog.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n
log4j.appender.Errorlog.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n
#指定某个包的优先U?
log4j.category.com.neusoft.mbip.dm.util=ERROR
#CZ
###################
# Console Appender
###################
#log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
#log4j.appender.Threshold=DEBUG
#log4j.appender.CONSOLE.Target=System.out
#log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
#log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#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
#####################
# File Appender
#####################
#log4j.appender.FILE=org.apache.log4j.FileAppender
#log4j.appender.FILE.File=file.log
#log4j.appender.FILE.Append=false
#log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
#log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
# Use this layout for LogFactor 5 analysis
########################
# Rolling File????? RollingFileAppender??????????????????
########################
#log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
#log4j.appender.ROLLING_FILE.Threshold=ERROR
# 文g位置
#log4j.appender.ROLLING_FILE.File=rolling.log
#log4j.appender.ROLLING_FILE.Append=true
#文g大小
#log4j.appender.ROLLING_FILE.MaxFileSize=10KB
#指定采用输出布局和输出格?br />
#log4j.appender.ROLLING_FILE.MaxBackupIndex=1
#log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
#log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
####################
# Socket Appender
####################
#log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender
#log4j.appender.SOCKET.RemoteHost=localhost
#log4j.appender.SOCKET.Port=5001
#log4j.appender.SOCKET.LocationInfo=true
# Set up for Log Facter 5
#log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
#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
########################
# SMTP Appender
#######################
#log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
#log4j.appender.MAIL.Threshold=FATAL
#log4j.appender.MAIL.BufferSize=10
#log4j.appender.MAIL.From=chenyl@hollycrm.com
#log4j.appender.MAIL.SMTPHost=mail.hollycrm.com
#log4j.appender.MAIL.Subject=Log4J Message
#log4j.appender.MAIL.To=chenyl@hollycrm.com
#log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
#log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
########################
# JDBC Appender
#######################
#log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
#log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
#log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
#log4j.appender.DATABASE.user=root
#log4j.appender.DATABASE.password=
#log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
#log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
#log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
########################
# Log Factor 5 Appender
########################
#log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
#log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
###################
#自定义Appender
###################
#log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
#log4j.appender.im.host = mail.cybercorlin.net
#log4j.appender.im.username = username
#log4j.appender.im.password = password
#log4j.appender.im.recipient = corlin@cybercorlin.net
#log4j.appender.im.layout=org.apache.log4j.PatternLayout
#log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
查看API文档
在准备实验环境时获得的commons-fileupload-1.0.zip文g的解压羃目录中可以看C个docs的子目录Q其中包含了Apache文g上传lg中的各个APIcȝ帮助文档Q从q个文档中可以了解到各个APIcȝ使用帮助信息。打开文g上传lgAPI帮助文档中的index.html面Q在左侧分栏H口面中列Z文g上传lg中的各个APIcȝ名称Q在右侧分栏H口面的底部列Z一D늤例代码,如图1.2所C?br />
?.2
读者不需要逐个去阅d1.2中列出的各个APIcȝ帮助文档Q而应该以?.2中的CZ代码为线索,以其中所使用到的cMؓ入口点,按图索骥地进行阅读,对于CZ代码中调用到的各个APIcȝҎ则应重点掌握?/font>
1. DiskFileUploadc?br />
DiskFileUploadcLApache文g上传lg的核心类Q应用程序开发h员通过q个cL与Apache文g上传lgq行交互。但现在Apache使用ServletFileUploadc,两个cȝҎcM。下面介lDiskFileUploadcM的几个常用的重要Ҏ?br />
1.1QsetSizeMaxҎ
setSizeMaxҎ用于讄h消息实体内容的最大允许大,以防止客L故意通过上传特大的文件来塞满服务器端的存储空_单位为字节。其完整语法定义如下Q?br />
public void setSizeMaxQlong sizeMaxQ?br />
如果h消息中的实体内容的大超q了setSizeMaxҎ的设||该方法将会抛出FileUploadException异常?br />
1.2QsetSizeThresholdҎ
Apache文g上传lg在解析和处理上传数据中的每个字段内容Ӟ需要时保存解析出的数据。因为Java虚拟机默认可以用的内存I间是有限的Q笔者测试不大于100MQ,出限制时将会发?#8220;java.lang.OutOfMemoryError”错误Q如果上传的文g很大Q例如上?00M的文Ӟ在内存中无法保存该文g内容QApache文g上传lg用临时文g来保存这些数据;但如果上传的文g很小Q例如上?00个字节的文gQ显然将其直接保存在内存中更加有效。setSizeThresholdҎ用于讄是否使用临时文g保存解析出的数据的那个界|该方法传入的参数的单位是字节。其完整语法定义如下Q?br />
public void setSizeThreshold(int sizeThreshold)
1.3. setRepositoryPathҎ
setRepositoryPathҎ用于讄setSizeThresholdҎ中提到的临时文g的存攄录,q里要求使用l对路径。其完整语法定义如下Q?br />
public void setRepositoryPath(String repositoryPath)
如果不设|存放\径,那么临时文g被储存?java.io.tmpdir"q个JVM环境属性所指定的目录中Qtomcat 5.5.9这个属性设|ؓ?#8220;<tomcat安装目录>/temp/”目录?br />
1.4. parseRequestҎ
parseRequest Ҏ是DiskFileUploadcȝ重要ҎQ它是对HTTPh消息q行解析的入口方法,如果h消息中的实体内容的类型不?#8220;multipart/form-data”Q该Ҏ抛出FileUploadException异常。parseRequest Ҏ解析出FORM表单中的每个字段的数据,q将它们分别包装成独立的FileItem对象Q然后将q些FileItem对象加入q一个Listcd的集合对象中q回。parseRequest Ҏ的完整语法定义如下:
public List parseRequest(HttpServletRequest req)
parseRequest Ҏq有一个重载方法,该方法集中处理上q所有方法的功能Q其完整语法定义如下Q?br />
parseRequest(HttpServletRequest req,int sizeThreshold,long sizeMax,
String path)
q两个parseRequestҎ都会抛出FileUploadException异常?br />
1.5. isMultipartContentҎ
isMultipartContentҎҎ用于判断h消息中的内容是否?#8220;multipart/form-data”cdQ是则返回trueQ否则返回false。isMultipartContentҎ是一个静态方法,不用创徏DiskFileUploadcȝ实例对象卛_被调用,其完整语法定义如下:
public static final boolean isMultipartContent(HttpServletRequest req)
1.6. setHeaderEncodingҎ
׃览器在提交FORM表单Ӟ会将普通表单中填写的文本内容传递给服务器,对于文g上传字段Q除了传递原始的文g内容外,q要传递其文g路径名等信息Q如后面的图1.3所C。不FORM表单采用的是“application/x-www-form-urlencoded”~码Q还?#8220;multipart/form-data”~码Q它们仅仅是各个FORM表单字段元素内容l织CL一U格式,而这些内容又是由某种字符集编码来表示的。关于浏览器采用何种字符集来~码FORM表单字段中的内容Q请参看W者编著的《深入体验java Web开发内q——核心基》一书中的第6.9.2的讲解,“multipart/form-data”cd的表单ؓ表单字段内容选择字符集编码的原理和方式与“application/x-www-form-urlencoded”cd的表单是相同的。FORM表单中填写的文本内容和文件上传字D中的文件\径名在内存中是它们的某U字W集~码的字节数lŞ式,Apache文g上传lg在读取这些内ҎQ必ȝ道它们所采用的字W集~码Q才能将它们转换成正的字符文本q回?br />
对于览器上传给WEB服务器的各个表单字段的描q头内容QApache文g上传lg都需要将它们转换成字W串形式q回QsetHeaderEncoding Ҏ用于讄转换时所使用的字W集~码Q其原理与笔者编著的《深入体验java Web开发内q——核心基》一书中的第6.9.4节讲解的ServletRequest.setCharacterEncodingҎ相同。setHeaderEncoding Ҏ的完整语法定义如下:
public void setHeaderEncoding(String encoding)
其中Qencoding参数用于指定各个表单字D늚描述头内容{换成字符串时所使用的字W集~码?br />
注意Q如果读者在使用Apache文g上传lg旉C中文字符的ؕ码问题,一般都是没有正调用setHeaderEncodingҎ的原因?/font>
2. FileItemc?br />
FileItemcȝ来封装单个表单字D元素的数据Q一个表单字D元素对应一个FileItem对象Q通过调用FileItem对象的方法可以获得相兌单字D元素的数据。FileItem是一个接口,在应用程序中使用的实际上是该接口一个实现类Q该实现cȝ名称q不重要Q程序可以采用FileItem接口cd来对它进行引用和讉KQؓ了便于讲解,q里FileItem实现cȝ之ؓFileItemcRFileItemc还实现了Serializable接口Q以支持序列化操作?br />
对于“multipart/form-data”cd的FORM表单Q浏览器上传的实体内容中的每个表单字D元素的数据之间用字D分隔界U进行分Ԍ两个分隔界线间的内容UCؓ一个分区,每个分区中的内容可以被看作两部分Q一部分是对表单字段元素q行描述的描q头Q另外一部是表单字段元素的主体内容,如图1.3所C?br />
?1.3
M部分有两U可能性,要么是用户填写的表单内容Q要么是文g内容。FileItemcd象实际上是对图1.3中的一个分区的数据q行装的对象,它内部用了两个成员变量来分别存储描述头和M内容Q其中保存主体内容的变量是一个输出流cd的对象。当M内容的大小于DiskFileUpload.setSizeThresholdҎ讄的界值大时Q这个流对象兌C片内存,M内容会被保存在内存中。当M内容的数据超qDiskFileUpload.setSizeThresholdҎ讄的界值大时Q这个流对象兌到硬盘上的一个时文ӞM内容被保存到该临时文g中。时文件的存储目录由DiskFileUpload.setRepositoryPathҎ讄Q时文件名的格式ؓ“upload_00000005Q八位或八位以上的数字).tmp”q种形式QFileItemcd部提供了l护临时文g名中的数g重复的机Ӟ以保证了临时文g名的唯一性。当应用E序主体内容保存到一个指定的文g中时Q或者在FileItem对象被垃圑֛收器回收Ӟ或者Java虚拟机结束时QApache文g上传lg都会试删除临时文gQ以量保证临时文g能被及时清除?br />
下面介绍FileItemcM的几个常用的ҎQ?br />
2.1. isFormFieldҎ
isFormFieldҎ用于判断FileItemcd象封装的数据是否属于一个普通表单字D,q是属于一个文件表单字D,如果是普通表单字D则q回trueQ否则返回false。该Ҏ的完整语法定义如下:
public boolean isFormField()
2.2. getNameҎ
getNameҎ用于获得文g上传字段中的文g名,对于?.3中的W三个分区所C的描述_getNameҎq回的结果ؓ字符?#8220;C:\bg.gif”。如果FileItemcd象对应的是普通表单字D,getNameҎ返回null。即使用h有通过|页表单中的文g字段传递Q何文Ӟ但只要设|了文g表单字段的name属性,览器也会将文g字段的信息传递给服务器,只是文g名和文g内容部分都ؓI,但这个表单字D仍然对应一个FileItem对象Q此ӞgetNameҎq回l果为空字符?"Q读者在调用Apache文g上传lg时要注意考虑q个情况。getNameҎ的完整语法定义如下:
public String getName()
注意Q如果用户用Windowspȝ上传文gQ浏览器传递该文g的完整\径,如果用户使用Linux或者Unixpȝ上传文gQ浏览器只传递该文g的名U部分?br />
2.3QgetFieldNameҎ
getFieldNameҎ用于q回表单字段元素的name属性|也就是返回图1.3中的各个描述头部分中的name属性|例如“name=p1”中的“p1”。getFieldNameҎ的完整语法定义如下:
public String getFieldName()
2.4. writeҎ
writeҎ用于FileItem对象中保存的M内容保存到某个指定的文g中。如果FileItem对象中的M内容是保存在某个临时文g中,该方法顺利完成后Q时文件有可能会被清除。该Ҏ也可普通表单字D内容写入到一个文件中Q但它主要用途是上传的文g内容保存在本地文件系l中。其完整语法定义如下Q?br />
public void write(File file)
2.5QgetStringҎ
getStringҎ用于FileItem对象中保存的M内容作ؓ一个字W串q回Q它有两个重载的定义形式Q?br />
public java.lang.String getString()
public java.lang.String getString(java.lang.String encoding)
throws java.io.UnsupportedEncodingException
前者用缺省的字符集编码将M内容转换成字W串Q后者用参数指定的字符集编码将M内容转换成字W串。如果在d普通表单字D元素的内容时出C中文q现象Q请调用W二个getStringҎQƈZ传递正的字符集编码名U?br />
2.6. getContentTypeҎ
getContentType Ҏ用于获得上传文g的类型,对于?.3中的W三个分区所C的描述_getContentTypeҎq回的结果ؓ字符?#8220;image/gif”Q即“Content-Type”字段的值部分。如果FileItemcd象对应的是普通表单字D,该方法将q回null。getContentType Ҏ的完整语法定义如下:
public String getContentType()
2.7. isInMemoryҎ
isInMemoryҎ用来判断FileItemcd象封装的M内容是存储在内存中,q是存储在时文件中Q如果存储在内存中则q回trueQ否则返回false。其完整语法定义如下Q?br />
public boolean isInMemory()
2.8. deleteҎ
deleteҎ用来清空FileItemcd象中存放的主体内容,如果M内容被保存在临时文g中,deleteҎ删除该临时文g。尽Apachelg使用了多U方式来量及时清理临时文gQ但pȝ出现异常Ӟ仍有可能造成有的临时文g被永久保存在了硬盘中。在有些情况下,可以调用q个Ҏ来及时删除时文件。其完整语法定义如下Q?br />
public void delete()
3. FileUploadExceptionc?br />
在文件上传过E中Q可能发生各U各L异常Q例如网l中断、数据丢q{。ؓ了对不同异常q行合适的处理QApache文g上传lgq开发了四个异常c,其中FileUploadException是其他异常类的父c,其他几个cd是被间接调用的底层类Q对于Apachelg调用人员来说Q只需对FileUploadException异常c进行捕获和处理卛_?br />
4. ServletRequestContext
ServletRequestContextcL供访问request的方法。实现RequestContext接口?br />