??xml version="1.0" encoding="utf-8" standalone="yes"?> Image 标签 <IMG src="../images/03.gif" border="0"> 所有属性包?/span> Basic 属性包?/span> alt Class Id Long Longdesc Name Src Title Usemap Display 属性包?/span> Align Border Dir Height Hspace Ismap Mapfile Style Vspace Width Events 属性包?/span> Onclick Ondbclick Onhelp Onkeydown Onkeypress Onkeyup Onmounsedown Onmousemove Onmouseout Onmouseover Onmouseup 二?/span> HTML-Form Image Button<INPUT type="image" src="../images/03.gif" /> Basic 属性包?/span> Accept Accesskey Alt Checked Class Disabled Id Long Maxlength Name readonly Src Tabindex Title Type Usemap Value Display 属性包?/span> Align Border Dir Height Ismap Isstyle Size Style Width Events 属性包?/span> Onblur Onchange Onclick Ondbclick Onfocus Onhelp Onkeydown Onkeypress Onkeyup Onmounsedown Onmousemove Onmouseout Onmouseover Onmouseup Onselect 三?/span> Struts Q?/span> Basic Image <html:img page="/images/03.gif" border="0" /> Basic 属性包?/span> Action Alt AltKey Bundle imageName locale lowsrc Name Page PageKey Paramname Paramproperty Paramscope Src SrcKey Title titleKey Usemap Display 属性包?/span> Align Border Height Hsapce Ismap Style StyleClass StyleId Vsapce Width Events 属性包?/span> Onclick Ondbclick Onkeydown Onkeypress Onkeyup Onmounsedown Onmousemove Onmouseout Onmouseover Onmouseup Other 属性包?/span> contextRealtive module paramId useLocalEncoding 四?/span> Struts-Form Image Button <html:image page="/images/03.gif" /> Basic 属性包?/span> Accesskey Alt altKey bundle Disabled Indexed Locale Page pageKey property Src SrcKey Tabindex Title titleKey Value Display 属性包?/span> Align Border Style styleClass styleId Events 属性包?/span> Onblur Onchange Onclick Ondbclick Onfocus Onkeydown Onkeypress Onkeyup Onmounsedown Onmousemove Onmouseout Onmouseover Onmouseup ?/span> Struts 必须使用 Struts Q?/span> Basic 下的 Image 标签 ?/span> Struts-Form 下的 Image Button 按钮。其中可以?/span> servlet 随机生成的图片,或?/span> jsp 文g?/span> JSP 下的彩色验证码的解决Q?/span> 随机验证囄的生成文?/span> <%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %> <%! Color getRandColor(int fc,int bc){// l定范围获得随机颜色 Random random = new Random(); if(fc>255) fc=255; if(bc>255) bc=255; int r=fc+random.nextInt(bc-fc); int g=fc+random.nextInt(bc-fc); int b=fc+random.nextInt(bc-fc); return new Color(r,g,b); } %> <% // 讄面不缓?/span> response.setHeader("Pragma","No-cache"); response.setHeader("Cache-Control","no-cache"); response.setDateHeader("Expires", 0); // 在内存中创徏图象 int width=60, height=20; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 获取囑Ş上下?/span> Graphics g = image.getGraphics(); // 生成随机c?/span> Random random = new Random(); // 讑֮背景?/span> g.setColor(getRandColor(200,250)); g.fillRect(0, 0, width, height); // 讑֮字体 g.setFont(new Font("Times New Roman",Font.PLAIN,18)); // 画边?/span> //g.setColor(new Color()); //g.drawRect(0,0,width-1,height-1); // 随机产生 155 条干扰线Q图象中的认证码不易被其它E序探测?/span> g.setColor(getRandColor(160,200)); for (int i=0;i<155;i++) { int x = random.nextInt(width); int y = random.nextInt(height); int xl = random.nextInt(12); int yl = random.nextInt(12); g.drawLine(x,y,x+xl,y+yl); } // 取随Z生的认证?/span> (4 位数?/span> ) String sRand=""; for (int i=0;i<4;i++){ String rand=String.valueOf(random.nextInt(10)); sRand+=rand; // 认证码昄到图象中 g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));// 调用函数出来的颜色相同,可能是因为种子太接近Q所以只能直接生?/span> g.drawString(rand,13*i+6,16); } // 认证码存入 SESSION session.setAttribute("rand",sRand); // 图象生效 g.dispose(); // 输出图象到页?/span> ImageIO.write(image, "JPEG", response.getOutputStream()); %> 使用面Q?/span> <%@ page contentType="text/html;charset=gb2312" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title> 认证码输入页?/span> </title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"> <META HTTP-EQUIV="Expires" CONTENT="0"> </head> <body> <form method=post action="check.jsp"> <table> <tr> <td align=left> pȝ产生的认证码Q?/span> </td> <td><img border=0 src="image.jsp"></td> </tr> <tr> <td align=left> 输入上面的认证码Q?/span> </td> <td><input type=text name=rand maxlength=4 value=""></td> </tr> <tr> <td colspan=2 align=center><input type=submit value=" 提交?/span> "></td> </tr> </form> 一直以来都是用jdk1.5Q这ơ重q电信由于其pȝ是在jdk1.4上编译的Q编译的时候出Cunsupported major.minor version49.0的错误,上网查看了一下还是一个很普遍的错误,捣鼓了两天终于捣鼓出一些东西,现分享给大家?/strong> 何谓 major.minorQ且又居w于何处呢?先感性认识ƈ扑ֈ major.minor 来。顺便写一D?代码Q然后用 JDK 1.5 的编译器~译成classQ用UltraEdit或者其他能打开非十q制文g的Y件打开此classQ见下图: 从上图中我们看出来了什么是 major.minor version 了,它相当于一个Y件的L版本P只是在这里是标识的一?Java Class 的主版本号和ơ版本号Q同时我们看?minor_version ?0x0000Qmajor_version ?0x0031Q{换ؓ十制数分别ؓ0 ?49Q即 major.minor 是 49.0 了?/strong> 现在不妨?JDK 1.1 ?JDK 1.7 ~译器编译出?class 的默?minor.major version 吧。(又走?Sun 的网站上腾出我从来都没用过的古董来Q?br />
当然你也可以用其他方法查看版本号Q比如javap -verbose XXXX(class??/strong> 那么现在如果到q种问题该知道如何解决了吧,q会像我所见到有些兄弟那样Q去找个 1.4 ?JDK 下蝲安装Q然后用光新编译所有的代码吗?且不说这U方法的J琐Q而且web应用E序q不一定能成功Q其实大可不必如此费,我们一定还记得 javac q有?-target 参数Q对啦,可以l箋使用 1.5 JDKQ编译时带上参数 -target 1.4 -source 1.4 ?OK 啦,不过你一定要对哪?API ?1.5 JDK 加入q来的了如指掌,不能你的 class 文g拿到 JVM 1.4 下就?method not found。目?JVM ?1.3 的话Q编译选项q -target 1.3 -source 1.3 了?/strong> 相应的如果?ant Q它?javac d也可对应的选择 target ?source
其实理解 major.minor 像是我们可以这么想像,同样是微软g的程序,32 位的应用E序不能拿到 16 位系l中执行那样?br />
一 HTML Q?/span> Basic
</table>
]]>
JDK ~译器版?/strong>
target 参数
十六q制 minor.major
十进?minor.major
jdk1.1.8
不能?target 参数
00 03 00 2D
45.3
jdk1.2.2
不带(默认?-target 1.1)
00 03 00 2D
45.3
jdk1.2.2
-target 1.2
00 00 00 2E
46.0
jdk1.3.1_19
不带(默认?-target 1.1)
00 03 00 2D
45.3
jdk1.3.1_19
-target 1.3
00 00 00 2F
47.0
j2sdk1.4.2_10
不带(默认?-target 1.2)
00 00 00 2E
46.0
j2sdk1.4.2_10
-target 1.4
00 00 00 30
48.0
jdk1.5.0_11
不带(默认?-target 1.5)
00 00 00 31
49.0
jdk1.5.0_11
-target 1.4 -source 1.4
00 00 00 30
48.0
jdk1.6.0_01
不带(默认?-target 1.6)
00 00 00 32
50.0
jdk1.6.0_01
-target 1.5
00 00 00 31
49.0
jdk1.6.0_01
-target 1.4 -source 1.4
00 00 00 30
48.0
jdk1.7.0
不带(默认?-target 1.6)
00 00 00 32
50.0
jdk1.7.0
-target 1.7
00 00 00 33
51.0
jdk1.7.0
-target 1.4 -source 1.4
00 00 00 30
48.0
Apache Harmony 5.0M3
不带(默认?-target 1.2)
00 00 00 2E
46.0
Apache Harmony 5.0M3
-target 1.4
00 00 00 30
48.0
<javac target="1.4" source="1.4" ............................/>
如果是在开发中Q可以肯定的是现在真正算得上?JAVA IDE 对于工程也都有编译选项讄目标代码的。例?Eclipse 的项目属性中?Java Compiler 讄Q如图:
如果我们发布前了解到目标 JVM 版本Q知道怎么?java class 文g中看?major.minor 版本来,׃用等到服务器报出异常才着手去解决Q也p预知到可能发生的问题?br />
其他时候遇到这个问题应具体解决QM问题的根由是低版本的 JVM 无法加蝲高版本的 class 文g造成的,扑ֈ高版本的 class 文g处理一下就行了?/strong>
]]>
各种企业应用几乎都会到d调度的需求,拿论坛来说Q每隔半个小时生成精华文章的RSS文gQ每天凌晨统计论坛用LU分排名Q每?0分钟执行锁定用户解锁d。对于一个典型的MISpȝ来说Q在每月1号凌晨统计上个月各部门的业务数据生成月报表,每半个小时查询用h否已l有快到期的待处理业?#8230;…
Quartz 是开源Q务调度框架中的翘首,它提供了强大d调度机制Q同时保持了使用的简单性。Quartz 允许开发h员灵zd定义触发器的调度旉表,q可以对触发器和dq行兌映射。此外,Quartz提供了调度运行环境的持久化机Ӟ可以保存q恢复调度现场,即ɾpȝ因故障关闭,d调度现场数据q不会丢失。此外,Quartzq提供了lg式的侦听器、各U插件、线E池{功能?
Spring为创建Quartz的Scheduler、Trigger和JobDetail提供了便利的FactoryBeanc,以便能够在Spring 容器中n受注入的好处。此外Springq提供了一些便利工L直接Spring中的Bean包装成合法的d。Springq一步降低了使用Quartz的难度,能以更具Spring风格的方式用Quartz。概括来说它提供了两斚w的支持:
创徏JobDetail
可以直接使用Quartz的JobDetail在Spring?a target="_blank">配置一个JobDetail BeanQ但是JobDetail使用带参的构造函敎ͼ对于习惯通过属性配|的Spring用户来说存在使用上的不便。ؓ此Spring通过扩展JobDetail提供了一个更具Bean风格的JobDetailBean。此外,Spring提供了一?span style="color: red">MethodInvokingJobDetailFactoryBeanQ通过q个FactoryBean可以Spring容器中Bean的方法包装成QuartzdQ这样开发者就不必为Job创徏对应的类?
JobDetailBean
JobDetailBean扩展于Quartz的JobDetail。用该Bean声明JobDetailӞBean的名字即是Q务的名字Q如果没有指定所属组Q即使用默认l。除了JobDetail中的属性外Q还定义了以下属性:
?jobClassQ类型ؓClassQ实现Job接口的Q务类Q?
?beanNameQ默认ؓBean的id名,通过该属性显式指定Bean名称Q对应Q务的名称Q?
?jobDataAsMapQ类型ؓMapQؓd所对应的JobDataMap提供倹{之所以需要提供这个属性,是因为除非你手工注册一 个编辑器Q你不能直接配置JobDataMapcd的|所以Spring通过jobDataAsMap讄JobDataMap的|
●applicationContextJobDataKeyQ你可以Spring ApplicationContext的引用保存到JobDataMap中,以便在Job的代码中讉KApplicationContext。ؓ了达到这个目的,你需要指定一个键Q用以在jobDataAsMap中保存ApplicationContextQ如果不讄此键QJobDetailBean׃ApplicationContext攑օ到JobDataMap中;
●jobListenerNamesQ类型ؓString[]Q指定注册在Scheduler中的JobListeners名称Q以便让q些监听器对本Q务的事gq行监听?br />
下面配置片断使用JobDetailBean?a target="_blank">Spring中配|一个JobDetailQ?/p>
在②处获取size|在③处还可以Ҏ?#8220;applicationContext”获取ApplicationContextQ有了ApplicationContext的引用,Job可以毫无障访问Spring容器中的MBean了。MyJob可以在execute()Ҏ中对JobDataMapq行更改Q如④所C。如果MyJob实现Job接口Q这个更改对于下一ơ执行是不可见的Q如果MyJob实现StatefulJob接口Q这U更改对下一ơ执行是可见的?/p>
MethodInvokingJobDetailFactoryBean
通常情况下,d都定义在一个业务类Ҏ中。这ӞZ满Quartz Job接口的规定,q需要定义一个引用业务类Ҏ的实现类。ؓ了避免创个只包含一行调用代码的Job实现c,Spring为我们提供了MethodInvokingJobDetailFactoryBeanQ借由该FactoryBeanQ我们可以将一个Bean的某个方法封装成满Quartz要求的Job。来看一个具体的例子Q?br />
jobDetail_1MyService#doJob()装成一个Q务,同时通过concurrent属性指定Q务的cdQ默认情况下装为无状态的dQ如果希望目标封装ؓ有状态的dQ仅需要将concurrent讄为false可以了。Spring通过名ؓconcurrent的属性指定Q务的cdQ能够更直接地描q到d执行的方式(有状态的d不能q发执行Q无状态的d可ƈ发执行)?
MyService服务cL有一个doJob()ҎQ它的代码如下所C:
doJob()Ҏ卛_以是static也可以是非static的,但不能拥有方法入参。通过MethodInvokingJobDetailFactoryBean产生的JobDetail不能被序列化Q所以不能被持久化到数据?/a>中的Q如果希望用持久化dQ则你只能创建正规的Quartz的Job实现cM?/p>
创徏Trigger
Quartz中另一个重要的lg是TriggerQ?a target="_blank">Spring
SimpleTriggerBean
默认情况下,通过SimpleTriggerBean配置的Trigger名字即ؓBean的名字,q属于默认组Triggerl。SimpleTriggerBean在SimpleTrigger的基上,新增了以下属性:
?jobDetailQ对应的JobDetailQ?
?beanNameQ默认ؓBean的id名,通过该属性显式指定Bean名称Q它对应Trigger的名Uͼ
?jobDataAsMapQ以Mapcd为Trigger兌的JobDataMap提供|
?startDelayQgq多时间开始触发,单位为毫U,默认?Q?
?triggerListenerNamesQ类型ؓString[]Q指定注册在Scheduler中的TriggerListener名称Q以便让q些监听器对本触发器的事件进行监听?
下面的实例用SimpleTriggerBean定义了一个TriggerQ该Trigger和jobDetail相关联,延迟10U后启动Q时间间隔ؓ20U,重复执行100ơ。此外,我们qؓTrigger讄了JobDataMap数据Q?/p>
需要特别注意的是,①处配置的JobDataMap是Trigger的JobDataMapQQ务执行时必须通过以下方式获取配置的|
CronTriggerBean
CronTriggerBean扩展于CronTriggerQ触发器的名字即为Bean的名字,保存在默认组中。在CronTrigger的基上,新增的属性和SimpleTriggerBean大致相同Q配|的Ҏ也和SimpleTriggerBean怼Q下面给Z个简单的例子Q?br />
SchedulerFactoryBean的triggers属性ؓTrigger[]cdQ可以通过该属性注册多个TriggerQ在①处Q我们注册了一个Trigger。Scheduler拥有一个类gServletContext的SchedulerContext。SchedulerFactoryBean允许你以Map的Ş式设|SchedulerContext的参数|如②所C。默认情况下QQuartz在类路径下查询quartz.properties配置文gQ你也可以通过configLocation属性显式指定配|文件位|,如③所C?br />
除了实例中所用的属性外QSchedulerFactoryBeanq拥有一些常见的属性:
●calendarsQ类型ؓMapQ通过该属性向Scheduler注册CalendarQ?
●jobDetailsQ类型ؓJobDetail[]Q通过该属性向Scheduler注册JobDetailQ?
●autoStartupQSchedulerFactoryBean在初始化后是否马上启动SchedulerQ默认ؓtrue。如果设|ؓfalseQ需要手工启动SchedulerQ?
●startupDelayQ在SchedulerFactoryBean初始化完成后Qgq多秒启动SchedulerQ默认ؓ0Q表C马上启动。如果ƈ非马上拥有需要执行的dQ可通过startupDelay属性让Scheduler延迟一段旉后启动,以便让Spring能够更快初始化容器中剩余的BeanQ?br />
SchedulerFactoryBean的一个重要功能是允许你将Quartz配置文g中的信息转移?a target="_blank">Spring配置文g中,带来的好处是Q配|信息的集中化管理,同时我们不必熟悉多种框架的配|文件结构。回忆一个Spring集成JPA?a target="_blank">Hibernate框架Q就知道q是Spring在集成第三方框架l常采用的招C一。SchedulerFactoryBean通过以下属性代替框架的自n配置文gQ?
●dataSourceQ当需要?a target="_blank">数据?/a>来持久化d调度数据Ӟ你可以在Quartz中配|数据源Q也可以直接在Spring中通过dataSource指定一个Spring理的数据源。如果指定了该属性,即quartz.properties中已l定义了数据源,也会被此dataSource覆盖Q?
●transactionManagerQ可以通过该属性设|一个Spring事务理器。在讄dataSourceӞSpring强烈推荐你用一个事务管理器Q否则数据表锁定可能不能正常工作Q?
●nonTransactionalDataSourceQ在全局事务的情况下Q如果你不希望Scheduler执行化数据操作参与到全局事务中,则可以通过该属性指定数据源。在Spring本地事务的情况下Q用dataSource属性就_了;
●quartzPropertiesQ类型ؓPropertiesQ允怽在Spring中定义Quartz的属性。其值将覆盖quartz.properties配置文g中的讄Q这些属性必LQuartz能够识别的合法属性,在配|时Q你可以需要查看Quartz的相x。下面是一个配|quartzProperties属性的例子Q?/p>
在实际应用中Q我们ƈ不L在程序部|的时候就可能定需要哪些Q务,往往需要在q行期根据业务数据动态生触发器和Q务。你完全可以在运行期通过代码调用SchedulerFactoryBean获取Scheduler实例Q进行动态的d注册和调度?
结
Spring为Quartz的JobDetail和Trigger提供了更具Bean风格的支持类Q这使我们能够更地方便地在Spring中通过配置定制q些lg实例。Spring的SchedulerFactoryBean让我们可以脱Quartz自n的配|体p,而以更具Spring风格的方式定义Scheduler。此外,q可以n受Scheduler生命周期和Spring 容器生命周期l定的好处?
如果通过快捷方式启动eclipseQ这h作:“右键->属?>目标Q输入框Q?#8221;Q参照上面的命o行在输入框中修改其中的命令行?/p>
myEclipse也可以参照这样用?br />
以下讄在大多数pȝ应该产生比出厂设|更好的性能?/p>
-XX:+UseConcMarkSweepGC
是相互排斥的?
单的说log4j是用于帮助开发h员进行日志输出管理的APIcd。它最重要的特Ҏ可以配置文g灉|的设|日志信息的优先U、日志信息的输出目的C及日志信息的输出格式?/span>Log4j除了可以记录E序q行日志信息外还有一重要的功能就是用来显C试信息?/span>
1、定义配|文?/p>
首先使用配置文g我们的应用程序更加灵z配|。log日志输出方式包括输出优先U、输出目的地、输出格式。Log4j支持两种配置文g格式Q一U是XML格式的文Ӟ一U是JavaҎ文件log4j.propertiesQ键=|。下面将介绍使用log4j.properties文g作ؓ配置文g的方法:
①配|根LoggerQ其语法为:0
log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中Qlevel 是日志记录的优先U,分ؓOFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的别。Log4j只用四个别,优先U从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的U别Q您可以控制到应用程序中相应U别的日志信息的开兟뀂比如在q里定义了INFOU别Q则应用E序中所有DEBUGU别的日志信息将不被打印出来?appenderName是指定日志信息输出到哪个地斏V可同时指定多个输出目的地?
②配|日志信息输出目的地AppenderQ其语法为:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.option = valueN
其中QLog4j提供的appender有以下几U:
org.apache.log4j.ConsoleAppenderQ控制台Q,
org.apache.log4j.FileAppenderQ文ӞQ?
org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文ӞQ?br />
org.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生一个新的文ӞQ?
org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)
③配|日志信息的格式Q布局Q,其语法ؓQ?/p>
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.option = valueN
其中QLog4j提供的layout有以下几U:
org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,
org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,
org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,
org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息)
Log4J采用cMC语言中的printf函数的打印格式格式化日志信息Q打印参数如下: %m 输出代码中指定的消息
%p 输出优先U,即DEBUGQINFOQWARNQERRORQFATAL
%r 输出自应用启动到输出该log信息耗费的毫U数
%c 输出所属的cȝQ通常是所在类的全?
%t 输出产生该日志事件的U程?
%n 输出一个回车换行符QWindowsq_?#8220;\r\n”QUnixq_?#8220;\n”
%d 输出日志旉点的日期或时_默认格式为ISO8601Q也可以在其后指定格式,比如Q?d{yyy MMM dd HH:mm:ss,SSS}Q输出类|2002q?0?8?22Q?0Q?8Q?21
%l 输出日志事g的发生位|,包括cȝ名、发生的U程Q以及在代码中的行数。D例:Testlog4.main(TestLog4.java:10)
2、在代码中用Log4j
①得到记录器
使用Log4jQ第一步就是获取日志记录器Q这个记录器负责控制日志信息。其语法为:
public static Logger getLogger( String name)
通过指定的名字获得记录器Q如果必要的话,则ؓq个名字创徏一个新的记录器。Name一般取本类的名字,比如Q?
static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )
②读取配|文?
当获得了日志记录器之后,W二步将配置Log4j环境Q其语法为:
BasicConfigurator.configure ()Q?自动快速地使用~省Log4j环境?br /> PropertyConfigurator.configure ( String configFilename) Q读取用Java的特性文件编写的配置文g?/p>
例:PropertyConfigurator.configure(".\\src\\log4j.properties")
DOMConfigurator.configure ( String filename ) Q读取XML形式的配|文件?/p>
③插入记录信息(格式化日志信息)
当上两个必要步骤执行完毕Q就可轻村֜使用不同优先U别的日志记录语句插入到您想记录日志的Q何地方,其语法如下:
Logger.debug ( Object message ) ;
Logger.info ( Object message ) ;
Logger.warn ( Object message ) ;
Logger.error ( Object message ) ;
下面是配|文件log4j.properties的内容:
E序说明Q?/p>
?log4j.rootCategory=DEBUG, stdoutQR
要显C所有优先权{于和高于Debug的信息?br /> "stdout"Q?#8221;R”表示定义了两个输出端?/p>
②下面的三行说stdout输出端其实是标准输出ConsoleQ也是屏幕。输出的格式是PatternLayout。{换方式是%5p (%F:%L) - %m%nQ即前五格用来显CZ先权Q再昄当前的文件名Q加当前的行数。最后是logger.debug()或logger.info()或logger.warn()或logger.error()里的信息?n表示回RI?/p>
③再加上下面六行则说明log信息不光昄在屏q上Q而且被保存在一个叫"log.txt"的文仉Q文件最大ؓ100KB。如果文件大超q?00KBQ文件会被备份成"log.txt.1"Q新?log.txt"l箋记录log信息?/p>
我们可以改变log4j.propertiesQ而不需重新~译可以控制log信息是否昄、log信息的输出端cd、输出方式、输出格式,{等。D例如下:
①在log4j.properties文g里把"log4j.rootCategory=DEBUG,stdout,R"改写?log4j.rootCategory=OFF, stdout,R"Q这h有的log信息都不会显CZQ解决了本文开始提出的问题?br /> ②在log4j.properties文g里把"log4j.rootCategory=DEBUG,stdout,R"改写?log4j.rootCategory=INFO, stdout,R"Q这样只昄INFO, WARN, ERROR的log信息Q而DEBUG信息不会被显C;
在webE序中用log4j注意问题
1?nbsp; ׃jsp或servlet在执行状态时没有当前路径概念Q所有用PropertyConfigurator.configureQStringQ语句找log4j.properties文g时要l出相对于当前jsp或servlet的\径{化成Z个绝对的文gpȝ路径。方法是使用servletcontext.getrealpath(string)语句。例Q?/p>
2、相应的log4j.properties讄某个属性时也要在程序中讄l对路径。例Q?/p>
log4j.appender.R.File属性设|日志文件存放位|。可以用d.properties配置文g的方法进行灵z设|?br />
附:[配置文g]