??xml version="1.0" encoding="utf-8" standalone="yes"?>精品久久久久久久久久久久久久久
,欧洲成人av,国产亚洲一级高清http://www.aygfsteel.com/Jay2009/zh-cnThu, 03 Jul 2025 06:15:05 GMTThu, 03 Jul 2025 06:15:05 GMT60- STRUTS下几UIMAGE标签的用以?qing)区?http://www.aygfsteel.com/Jay2009/archive/2009/04/23/267218.html?j)\?j)\Thu, 23 Apr 2009 11:58:00 GMThttp://www.aygfsteel.com/Jay2009/archive/2009/04/23/267218.htmlhttp://www.aygfsteel.com/Jay2009/comments/267218.htmlhttp://www.aygfsteel.com/Jay2009/archive/2009/04/23/267218.html#Feedback0http://www.aygfsteel.com/Jay2009/comments/commentRss/267218.htmlhttp://www.aygfsteel.com/Jay2009/services/trackbacks/267218.htmlhttp://www.aygfsteel.com/deng947/archive/2006/04/14/41139.html
一 HTML 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);
// 在内存(sh)创徏图象
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=" 提交(g)?/span> "></td>
</tr>
</table>
</form>

]]>- unsupported major.minor version 解决Ҏ(gu)http://www.aygfsteel.com/Jay2009/archive/2009/04/23/267108.html?j)\?j)\Thu, 23 Apr 2009 03:31:00 GMThttp://www.aygfsteel.com/Jay2009/archive/2009/04/23/267108.htmlhttp://www.aygfsteel.com/Jay2009/comments/267108.htmlhttp://www.aygfsteel.com/Jay2009/archive/2009/04/23/267108.html#Feedback5http://www.aygfsteel.com/Jay2009/comments/commentRss/267108.htmlhttp://www.aygfsteel.com/Jay2009/services/trackbacks/267108.htmlunsupported major.minor version 解决Ҏ(gu)
一直以来都是用jdk1.5Q这ơ重q电(sh)信由于其pȝ是在jdk1.4上编译的Q编译的时候出C(jin)unsupported major.minor version49.0的错误,上网查看?jin)一下还是一个很普遍的错误,捣鼓?jin)两天终于捣鼓出一些东西,现分享给大家?/strong>
何谓 major.minorQ且又居w于何处呢?先感性认识ƈ扑ֈ major.minor 来。顺便写一D?代码Q然后用 JDK 1.5 的编译器~译成classQ用UltraEdit或者其他能打开非十q制文g的Y件打开此classQ见下图:
从上图中我们看出来了(jin)什么是 major.minor version ?jin),它相当于一个Y件的L版本P只是在这里是标识的一?Java Class 的主版本号和ơ版本号Q同时我们看?minor_version ?0x0000Qmajor_version ?0x0031Q{换ؓ(f)十制数分别ؓ(f)0 ?49Q即 major.minor 是 49.0 ?jin)?/strong>
现在不妨?JDK 1.1 ?JDK 1.7 ~译器编译出?class 的默?minor.major version 吧。(又走?Sun 的网站上腾出我从来都没用过的古董来Q?br />
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 |
当然你也可以用其他方法查看版本号Q比如javap -verbose XXXX(class??/strong>
那么现在如果到q种问题该知道如何解决了(jin)吧,q(sh)(x)像我所见到有些兄弟那样Q去找个 1.4 ?JDK 下蝲安装Q然后用光新编译所有的代码吗?且不说这U方法的J琐Q而且web应用E序q(sh)一定能成功Q其实大可不必如此费,我们一定还记得 javac q有?-target 参数Q对啦,可以l箋(hu)使用 1.5 JDKQ编译时带上参数 -target 1.4 -source 1.4 ?OK 啦,不过你一定要对哪?API ?1.5 JDK 加入q来的了(jin)如指掌,不能你的 class 文g拿到 JVM 1.4 下就?method not found。目?JVM ?1.3 的话Q编译选项q -target 1.3 -source 1.3 ?jin)?/strong>
相应的如果?ant Q它?javac d也可对应的选择 target ?source
<javac target="1.4" source="1.4" ............................/>
如果是在开发中Q可以肯定的是现在真正算得上?JAVA IDE 对于工程也都有编译选项讄目标代码的。例?Eclipse 的项目属性中?Java Compiler 讄Q如图:(x)
其实理解 major.minor 像是我们可以这么想像,同样是微软g的程序,32 位的应用E序不能拿到 16 位系l中执行那样?br />
如果我们发布前了(jin)解到目标 JVM 版本Q知道怎么?java class 文g中看?major.minor 版本来,׃用等到服务器报出异常才着手去解决Q也p预知到可能发生的问题?br />
其他时候遇到这个问题应具体解决QM问题的根由是低版本的 JVM 无法加蝲高版本的 class 文g造成的,扑ֈ高版本的 class 文g处理一下就行了(jin)?/strong>
|

]]> - 在Spring中用Quartzq行d调度http://www.aygfsteel.com/Jay2009/archive/2009/03/25/259176.html?j)\?j)\Wed, 25 Mar 2009 10:07:00 GMThttp://www.aygfsteel.com/Jay2009/archive/2009/03/25/259176.htmlhttp://www.aygfsteel.com/Jay2009/comments/259176.htmlhttp://www.aygfsteel.com/Jay2009/archive/2009/03/25/259176.html#Feedback0http://www.aygfsteel.com/Jay2009/comments/commentRss/259176.htmlhttp://www.aygfsteel.com/Jay2009/services/trackbacks/259176.html 概述
各种企业应用几乎都会(x)到d调度的需求,拿论坛来说Q每隔半个小时生成精华文章的RSS文gQ每天凌晨统计论坛用L(fng)U分排名Q每?0分钟执行锁定用户解锁d。对于一个典型的MISpȝ来说Q在每月1号凌晨统计上个月各部门的业务数据生成月报表,每半个小时查询用h否已l有快到期的待处理业?#8230;…
Quartz 是开源Q务调度框架中的翘首,它提供了(jin)强大d调度机制Q同时保持了(jin)使用的简单性。Quartz 允许开发h员灵zd定义触发器的调度旉表,q可以对触发器和dq行兌映射。此外,Quartz提供?jin)调度运行环境的持久化机Ӟ可以保存q恢复调度现场,即ɾpȝ因故障关闭,d调度现场数据q不?x)丢失。此外,Quartzq提供了(jin)lg式的侦听器、各U插件、线E池{功能?
Spring为创建Quartz的Scheduler、Trigger和JobDetail提供?jin)便利的FactoryBeanc,以便能够在Spring 容器中n受注入的好处。此外Springq提供了(jin)一些便利工L(fng)直接Spring中的Bean包装成合法的d。Springq一步降低了(jin)使用Quartz的难度,能以更具Spring风格的方式用Quartz。概括来说它提供?jin)两斚w的支持:(x)
1)为Quartz的重要组件类提供更具Bean风格的扩展类Q?nbsp;
2)提供创徏Scheduler的BeanFactoryc,方便在Spring环境下创建对应的lg对象Qƈl合Spring容器生命周期q行启动和停止的动作?br />
创徏JobDetail
可以直接使用Quartz的JobDetail在Spring?a target="_blank">配置一个JobDetail BeanQ但是JobDetail使用带参的构造函敎ͼ对于?fn)惯通过属性配|的Spring用户来说存在使用上的不便。ؓ(f)此Spring通过扩展JobDetail提供?jin)一个更具Bean风格的JobDetailBean。此外,Spring提供?jin)一?span style="color: red">MethodInvokingJobDetailFactoryBeanQ通过q个FactoryBean可以Spring容器中Bean的方法包装成QuartzdQ这样开发者就不必为Job创徏对应的类?
JobDetailBean
JobDetailBean扩展于Quartz的JobDetail。用该Bean声明JobDetailӞBean的名字即是Q务的名字Q如果没有指定所属组Q即使用默认l。除?jin)JobDetail中的属性外Q还定义?jin)以下属性:(x)
?jobClassQ类型ؓ(f)ClassQ实现Job接口的Q务类Q?
?beanNameQ默认ؓ(f)Bean的id名,通过该属性显式指定Bean名称Q对应Q务的名称Q?
?jobDataAsMapQ类型ؓ(f)MapQؓ(f)d所对应的JobDataMap提供倹{之所以需要提供这个属性,是因为除非你手工注册一 个编辑器Q你不能直接配置JobDataMapcd的|所以Spring通过jobDataAsMap讄JobDataMap的|
●applicationContextJobDataKeyQ你可以Spring ApplicationContext的引用保存到JobDataMap中,以便在Job的代码中讉KApplicationContext。ؓ(f)?jin)达到这个目的,你需要指定一个键Q用以在jobDataAsMap中保存ApplicationContextQ如果不讄此键QJobDetailBean׃ApplicationContext攑օ到JobDataMap中;
●jobListenerNamesQ类型ؓ(f)String[]Q指定注册在Scheduler中的JobListeners名称Q以便让q些监听器对本Q务的事gq行监听?br />
下面配置片断使用JobDetailBean?a target="_blank">Spring中配|一个JobDetailQ?/p>
<bean name="jobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="com.baobaotao.quartz.MyJob" />
<property name="jobDataAsMap">?br />
<map>
<entry key="size" value="10" />
</map>
</property>
<property name="applicationContextJobDataKey" value="applicationContext"/>?br />
</bean>
JobDetailBean装?jin)MyJobdc,qؓ(f)Job对应JobDataMap讄?jin)一个size的数据。此外,通过指定applicationContextJobDataKey让Job的JobDataMap持有Spring ApplicationContext的引用。这PMyJob在运行时可以通过JobDataMap讉K到size和ApplicationContext?jin)。来看一下MyJob的代码:(x)
MyJob
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.context.ApplicationContext;
public class MyJob implements Job
{
public void execute(JobExecutionContext jctx) throws JobExecutionException
{
Map dataMap = jctx.getJobDetail().getJobDataMap(); ①获取JobDetail兌的JobDataMap
String size =(String)dataMap.get("size"); ?br />
ApplicationContext ctx = (ApplicationContext)dataMap.get("applicationContext"); ?br />
System.out.println("size:"+size);
dataMap.put("size",size+"0"); ④对JobDataMap所做的更改是否被会(x)持久Q取决于d的类?br />
//do sth
}
}
在②处获取size|在③处还可以Ҏ(gu)?#8220;applicationContext”获取ApplicationContextQ有?jin)ApplicationContext的引用,Job可以毫无障访问Spring容器中的MBean?jin)。MyJob可以在execute()Ҏ(gu)中对JobDataMapq行更改Q如④所C。如果MyJob实现Job接口Q这个更改对于下一ơ执行是不可见的Q如果MyJob实现StatefulJob接口Q这U更改对下一ơ执行是可见的?/p>
MethodInvokingJobDetailFactoryBean
通常情况下,d都定义在一个业务类Ҏ(gu)中。这ӞZ(jin)满Quartz Job接口的规定,q需要定义一个引用业务类Ҏ(gu)的实现类。ؓ(f)?jin)避免创个只包含一行调用代码的Job实现c,Spring为我们提供了(jin)MethodInvokingJobDetailFactoryBeanQ借由该FactoryBeanQ我们可以将一个Bean的某个方法封装成满Quartz要求的Job。来看一个具体的例子Q?br />
<bean id="jobDetail_1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="myService" /> ?nbsp;引用一个Bean
<property name="targetMethod" value="doJob" /> ?nbsp;指定目标Bean的方?br />
<property name="concurrent" value="false" /> ?nbsp;指定最l封装出的Q务是否有状?br />
<bean id="myService" class="com.baobaotao.service.MyService"/>
jobDetail_1MyService#doJob()装成一个Q务,同时通过concurrent属性指定Q务的cdQ默认情况下装为无状态的dQ如果希望目标封装ؓ(f)有状态的dQ仅需要将concurrent讄为false可以了(jin)。Spring通过名ؓ(f)concurrent的属性指定Q务的cdQ能够更直接地描q到d执行的方式(有状态的d不能q发执行Q无状态的d可ƈ发执行)(j)?
MyService服务cL有一个doJob()Ҏ(gu)Q它的代码如下所C:(x)
public class MyService
{
public void doJob()
{①被装成Q务的目标Ҏ(gu)
System.out.println("in MyService.dojob().");
}
}
doJob()Ҏ(gu)卛_以是static也可以是非static的,但不能拥有方法入参。通过MethodInvokingJobDetailFactoryBean产生的JobDetail不能被序列化Q所以不能被持久化到数据?/a>中的Q如果希望用持久化dQ则你只能创建正规的Quartz的Job实现cM(jin)?/p>
创徏Trigger
Quartz中另一个重要的lg是TriggerQ?a target="_blank">Spring
按照怼的思\分别为SimpleTrigger和CronTrigger提供?jin)更具Bean风格?span style="color: red">SimpleTriggerBean?span style="color: red">CronTriggerBean扩展c,通过q两个扩展类更容易在Spring中以Bean的方式配|Trigger?
SimpleTriggerBean
默认情况下,通过SimpleTriggerBean配置的Trigger名字即ؓ(f)Bean的名字,q属于默认组Triggerl。SimpleTriggerBean在SimpleTrigger的基上,新增?jin)以下属性:(x)
?jobDetailQ对应的JobDetailQ?
?beanNameQ默认ؓ(f)Bean的id名,通过该属性显式指定Bean名称Q它对应Trigger的名Uͼ
?jobDataAsMapQ以Mapcd为Trigger兌的JobDataMap提供|
?startDelayQgq多时间开始触发,单位为毫U,默认?Q?
?triggerListenerNamesQ类型ؓ(f)String[]Q指定注册在Scheduler中的TriggerListener名称Q以便让q些监听器对本触发器的事件进行监听?
下面的实例用SimpleTriggerBean定义?jin)一个TriggerQ该Trigger和jobDetail相关联,延迟10U后启动Q时间间隔ؓ(f)20U,重复执行100ơ。此外,我们q(sh)ؓ(f)Trigger讄?jin)JobDataMap数据Q?/p>
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="jobDetail" />
<property name="startDelay" value="1000" />
<property name="repeatInterval" value="2000" />
<property name="repeatCount" value="100" />
<property name="jobDataAsMap"> ?br />
<map>
<entry key="count" value="10" />
</map>
</property>
</bean>
需要特别注意的是,①处配置的JobDataMap是Trigger的JobDataMapQQ务执行时必须通过以下方式获取配置的|(x)
public class MyJob implements StatefulJob
{
public void execute(JobExecutionContext jctx) throws JobExecutionException
{
Map dataMap = jctx.getTrigger().getJobDataMap(); ①获取Trigger的JobDataMap
String count = dataMap.get("count");
dataMap.put("count","30"); ?nbsp;对JobDataMap的更改不?x)被持久Q不影响下次的执?br />
…
}
}
CronTriggerBean
CronTriggerBean扩展于CronTriggerQ触发器的名字即为Bean的名字,保存在默认组中。在CronTrigger的基上,新增的属性和SimpleTriggerBean大致相同Q配|的Ҏ(gu)也和SimpleTriggerBean怼Q下面给Z个简单的例子Q?br />
<bean id="checkImagesTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobDetail "/>
<property name="cronExpression" value="0/5 * * * * ?"/>
</bean>
创徏Scheduler
Quartz的SchedulerFactory是标准的工厂c,不太适合?a target="_blank">Spring环境下用。此外,Z(jin)保证Scheduler能够感知Spring容器的生命周期,完成自动启动和关闭的操作Q必让Scheduler和Spring容器的生命周期相兌。以便在Spring容器启动后,Scheduler自动开始工作,而在Spring容器关闭前,自动关闭Scheduler。ؓ(f)此,Spring提供SchedulerFactoryBeanQ这个FactoryBean大致拥有以下的功能:(x)
1)以更具Bean风格的方式ؓ(f)Scheduler提供配置信息Q?nbsp;
2)让Scheduler和Spring容器的生命周期徏立关联,相生相息Q?nbsp;
3)通过属性配|部分或全部代替Quartz自n的配|文件?nbsp;
来看一个SchedulerFactoryBean配置的例子:(x)
SchedulerFactoryBean配置
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers"> ①注册多个Trigger
<list>
<ref bean="simpleTrigger" />
</list>
</property>
<property name="schedulerContextAsMap"> ②以Mapcd讄SchedulerContext数据
<map>
<entry key="timeout" value="30" />
</map>
</property>
③显式指定Quartz的配|文件地址
<property name="configLocation" value="classpath:com/baobaotao/quartz/quartz.properties" />
</bean>
SchedulerFactoryBean的triggers属性ؓ(f)Trigger[]cdQ可以通过该属性注册多个TriggerQ在①处Q我们注册了(jin)一个Trigger。Scheduler拥有一个类gServletContext的SchedulerContext。SchedulerFactoryBean允许你以Map的Ş式设|SchedulerContext的参数|如②所C。默认情况下QQuartz在类路径下查询quartz.properties配置文gQ你也可以通过configLocation属性显式指定配|文件位|,如③所C?br />
除了(jin)实例中所用的属性外QSchedulerFactoryBeanq拥有一些常见的属性:(x)
●calendarsQ类型ؓ(f)MapQ通过该属性向Scheduler注册CalendarQ?
●jobDetailsQ类型ؓ(f)JobDetail[]Q通过该属性向Scheduler注册JobDetailQ?
●autoStartupQSchedulerFactoryBean在初始化后是否马上启动SchedulerQ默认ؓ(f)true。如果设|ؓ(f)falseQ需要手工启动SchedulerQ?
●startupDelayQ在SchedulerFactoryBean初始化完成后Qgq多秒启动SchedulerQ默认ؓ(f)0Q表C马上启动。如果ƈ非马上拥有需要执行的dQ可通过startupDelay属性让Scheduler延迟一段旉后启动,以便让Spring能够更快初始化容器中剩余的BeanQ?br />
SchedulerFactoryBean的一个重要功能是允许你将Quartz配置文g中的信息转移?a target="_blank">Spring配置文g中,带来的好处是Q配|信息的集中化管理,同时我们不必熟?zhn)多种框架的配|文件结构。回忆一个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理的数据源。如果指定了(jin)该属性,即quartz.properties中已l定义了(jin)数据源,也会(x)被此dataSource覆盖Q?
●transactionManagerQ可以通过该属性设|一个Spring事务理器。在讄dataSourceӞSpring强烈推荐你用一个事务管理器Q否则数据表锁定可能不能正常工作Q?
●nonTransactionalDataSourceQ在全局事务的情况下Q如果你不希望Scheduler执行化数据操作参与到全局事务中,则可以通过该属性指定数据源。在Spring本地事务的情况下Q用dataSource属性就_?jin)?
●quartzPropertiesQ类型ؓ(f)PropertiesQ允怽在Spring中定义Quartz的属性。其值将覆盖quartz.properties配置文g中的讄Q这些属性必LQuartz能够识别的合法属性,在配|时Q你可以需要查看Quartz的相x(chng)档。下面是一个配|quartzProperties属性的例子Q?/p>
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
…
<property name="quartzProperties">
<props>
<prop key="org.quartz.threadPool.class"> ①Quartz属性项1
org.quartz.simpl.SimpleThreadPool
</prop>
<prop key="org.quartz.threadPool.threadCount">10</prop> ①Quartz属性项2
</props>
</property>
</bean>
在实际应用中Q我们ƈ不L在程序部|的时候就可能定需要哪些Q务,往往需要在q行期根据业务数据动态生触发器和Q务。你完全可以在运行期通过代码调用SchedulerFactoryBean获取Scheduler实例Q进行动态的d注册和调度?
结
Spring为Quartz的JobDetail和Trigger提供?jin)更具Bean风格的支持类Q这使我们能够更地方便地在Spring中通过配置定制q些lg实例。Spring的SchedulerFactoryBean让我们可以脱Quartz自n的配|体p,而以更具Spring风格的方式定义Scheduler。此外,q可以n受Scheduler生命周期和Spring 容器生命周期l定的好处?

]]> - 让Eclipse不再以蜗牛般速度q行的解x(chng)?/title>http://www.aygfsteel.com/Jay2009/archive/2009/03/11/259122.html?j)\?j)\Wed, 11 Mar 2009 07:14:00 GMThttp://www.aygfsteel.com/Jay2009/archive/2009/03/11/259122.htmlhttp://www.aygfsteel.com/Jay2009/comments/259122.htmlhttp://www.aygfsteel.com/Jay2009/archive/2009/03/11/259122.html#Feedback0http://www.aygfsteel.com/Jay2009/comments/commentRss/259122.htmlhttp://www.aygfsteel.com/Jay2009/services/trackbacks/259122.html使用下面的命令行启动eclipseQ?nbsp;
eclipse.exe -vmargs -Xverify:none -XX:+UseParallelGC -XX:PermSize=20M -Xms64M -Xmx512M
如果通过快捷方式启动eclipseQ这h作:(x)“右键->属?>目标Q输入框Q?#8221;Q参照上面的命o(h)行在输入框中修改其中的命令行?/p>
myEclipse也可以参照这样用?br />
通常有用的开?/h2>
以下讄在大多数pȝ应该产生比出厂设|更好的性能?/p>
- -Xverify:none - 该开关禁?Java 字节代码验证Q从而加蝲更快Qƈ且在启动q程中不需要加载类Q仅用于验证。该开关羃短了(jin)启动旉Q因此,没有理由不用它?
- -vmargs - 表示后面的所有参数直接传递到所指示?Java VM?nbsp;
- -Xms32m - 该设|告?Java 虚拟机将它的初始堆大设|ؓ(f) 32 兆字节。通过告诉 JVM 最初应该ؓ(f)堆分配多内存?
- -Xmx256m - 该设|告?Java 虚拟机它应该堆用的最大内存数量。对该数量进行强的上限限制意味着 Java q程占用的内存比可用的物?RAM 。对于具有较多内存的pȝ可以提高该显C。当前默认gؓ(f) 128MB?em>注意Q?/strong> 不要该D|ؓ(f)接近或大于?zhn)pȝ中物?RAM 的量Q否则它?yu)造成q行时期间严格的交换?/em>
- -XX:PermSize=20m - ?JVM 开关不仅功能更为强大,而且能够~短启动旉。该讄用于调整内存"怹区域"Q类保存在该区域中)(j)的大。因此我们向 JVM 提示它将需要的内存量。该讄消除?jin)许多系l启动过E中的主要垃圾收集事件?nbsp;
更多吸引人的开?/h2>
- -XX:+UseConcMarkSweepGC ?-XX:+UseParNewGC - 如果(zhn)遇到入侵垃圾收集暂停的问题Q则试q些开兟뀂该开关 JVM 对主要的垃圾攉事gQ也对于ơ要的收集,如果q行在多处理器的工作站上Q用不同的法Q一些算法ƈ不停止整个垃圾收集进E?
- -XX:+UseAdaptiveSizePolicy - 该开兛_能有助于提高垃圾攉器吞吐量q减内存占用。在 JDK5.0 中实现的 garbage collector ergonomics 的一部分?
- -XX:+UseParallelGC - 一些测试表明,臛_在装备相当好的内存的pȝ上,当在单处理器pȝ上用该攉法Ӟơ要垃圾攉的持l时间将减半。注意这是自相矛盄Q该攉器设计用于在h十亿字节堆的多处理器pȝ上工作最佟뀂没有数据表C它在主要垃圾收集上的效果?em>注意Q?/strong> 该收集器?
-XX:+UseConcMarkSweepGC
是相互排斥的?
- -J-XX:CompileThreshold=100 - 该开兛_使启动时间更慢,通过 HotSpot 来编译下载至本机的代码的很多Ҏ(gu)比其他情冉|快。报告的l果?IDE q行之后性能较高Q因为将~译比解释的代码更多?UI 代码。该DC编译之前必调用方法的ơ数?
影响囑Ş行ؓ(f)的选项
- -Dsun.java2d.opengl=true - 启用新的Z OpenGL 的管道,以便 Java 2D 用来支持使用 OpenGL 的快速硬件渲染?
- -Dsun.java2d.d3d=false - 该开关禁?DirectDraw q且可能解决一?HW 配置的性能问题?br />
- -Dawt.nativeDoubleBuffering=true - 该开关 Swing 假设操作pȝ正在处理双倍缓存ƈ且它不应该执行Q何操作。在q程 X q接上该开兛_能不工作Q但是对于本C用,它非常有用,因ؓ(f)(zhn)真正看C(jin)每个重画的完成,q它很Ҏ(gu)注意到某些操作是否正在造成不必要的重画?br />
- Font anti-aliasing 用于 Swing widgetQ可以与 -Dswing.aatext=true 属性一起启用。与环境变量 J2D_PIXMAPS=shared 的设|和导出一起用时非常有用Q至在 Linux q_上可以获得合理的性能?

]]>
- Apache Log4j 使用http://www.aygfsteel.com/Jay2009/archive/2009/03/10/258734.html?j)\?j)\Tue, 10 Mar 2009 05:25:00 GMThttp://www.aygfsteel.com/Jay2009/archive/2009/03/10/258734.htmlhttp://www.aygfsteel.com/Jay2009/comments/258734.htmlhttp://www.aygfsteel.com/Jay2009/archive/2009/03/10/258734.html#Feedback0http://www.aygfsteel.com/Jay2009/comments/commentRss/258734.htmlhttp://www.aygfsteel.com/Jay2009/services/trackbacks/258734.htmllog4j?/h2>
单的说log4j是用于帮助开发h员进行日志输出管理的APIcd。它最重要的特Ҏ(gu)可以配置文g灉|的设|日志信息的优先U、日志信息的输出目的C?qing)日志信息的输出格式?/span>Log4j除了(jin)可以记录E序q行日志信息外还有一重要的功能就是用来显C试信息?/span>
Log4j的类?/h3>

- Logger - 日志写出器,供程序员输出日志信息
- Appender - 日志目的圎ͼ把格式化好的日志信息输出到指定的地方?
- Layout - 日志格式化器Q用来把E序员的logging request格式化成字符?
log4j使用Ҏ(gu)
1、定义配|文?/p>
首先使用配置文g我们的应用程序更加灵z配|。log日志输出方式包括输出优先U、输出目的地、输出格式。Log4j支持两种配置文g格式Q一U是XML格式的文Ӟ一U是JavaҎ(gu)文件log4j.propertiesQ键=|(j)。下面将介绍使用log4j.properties文g作ؓ(f)配置文g的方法:(x)
①配|根LoggerQ其语法为:(x)0
log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中Qlevel 是日志记录的优先U,分ؓ(f)OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的别。Log4j只用四个别,优先U从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的U别Q?zhn)可以控制到应用程序中相应U别的日志信息的开兟뀂比如在q里定义?jin)INFOU别Q则应用E序中所有DEBUGU别的日志信息将不被打印出来?appenderName是指定日志信息输出到哪个地斏V可同时指定多个输出目的地?
②配|日志信息输出目的地AppenderQ其语法为:(x)
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.option = valueN
其中QLog4j提供的appender有以下几U:(x)
org.apache.log4j.ConsoleAppenderQ控制台Q,
org.apache.log4j.FileAppenderQ文Ӟ(j)Q?
org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文Ӟ(j)Q?br />
org.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生一个新的文Ӟ(j)Q?
org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)(j)
③配|日志信息的格式Q布局Q,其语法ؓ(f)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:(x)
org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,
org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,
org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,
org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息)(j)
Log4J采用cMC语言中的printf函数的打印格式格式化日志信息Q打印参数如下:(x) %m 输出代码中指定的消息
%p 输出优先U,即DEBUGQINFOQW(xu)ARNQERRORQFATAL
%r 输出自应用启动到输出该log信息耗费的毫U数
%c 输出所属的cȝQ通常是所在类的全?
%t 输出产生该日志事件的U程?
%n 输出一个回车换行符QW(xu)indowsq_?#8220;\r\n”QUnixq_?#8220;\n”
%d 输出日志旉点的日期或时_(d)默认格式为ISO8601Q也可以在其后指定格式,比如Q?d{yyy MMM dd HH:mm:ss,SSS}Q输出类|(x)2002q?0?8?22Q?0Q?8Q?21
%l 输出日志事g的发生位|,包括cȝ名、发生的U程Q以?qing)在代码中的行数。D例:(x)Testlog4.main(TestLog4.java:10)
2、在代码中用Log4j
①得到记录器
使用Log4jQ第一步就是获取日志记录器Q这个记录器负责控制日志信息。其语法为:(x)
public static Logger getLogger( String name)
通过指定的名字获得记录器Q如果必要的话,则ؓ(f)q个名字创徏一个新的记录器。Name一般取本类的名字,比如Q?
static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )
②读取配|文?
当获得了(jin)日志记录器之后,W二步将配置Log4j环境Q其语法为:(x)
BasicConfigurator.configure ()Q?自动快速地使用~省Log4j环境?br />
PropertyConfigurator.configure ( String configFilename) Q读取用Java的特性文件编写的配置文g?/p>
例:(x)PropertyConfigurator.configure(".\\src\\log4j.properties")
DOMConfigurator.configure ( String filename ) Q读取XML形式的配|文件?/p>
③插入记录信息(格式化日志信息)(j)
当上两个必要步骤执行完毕Q就可轻村֜使用不同优先U别的日志记录语句插入到(zhn)想记录日志的Q何地方,其语法如下:(x)
Logger.debug ( Object message ) ;
Logger.info ( Object message ) ;
Logger.warn ( Object message ) ;
Logger.error ( Object message ) ;
下面是配|文件log4j.properties的内容:(x)
log4j.rootCategory=DEBUG, stdoutQR
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p (%F:%L) - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=log.txt
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy MMM dd HH:mm:ss} %-5p %c - %m%n
E序说明Q?/p>
?log4j.rootCategory=DEBUG, stdoutQR
要显C所有优先权{于和高?sh)Debug的信息?br />
"stdout"Q?#8221;R”表示定义?jin)两个输出端?/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文件最大ؓ(f)100KB。如果文件大超q?00KBQ文件会(x)被备份成"log.txt.1"Q新?log.txt"l箋(hu)记录log信息?/p>
我们可以改变log4j.propertiesQ而不需重新~译可以控制log信息是否昄、log信息的输出端cd、输出方式、输出格式,{等。D例如下:(x)
①在log4j.properties文g里把"log4j.rootCategory=DEBUG,stdout,R"改写?log4j.rootCategory=OFF, stdout,R"Q这h有的log信息都不?x)显CZ(jin)Q解决了(jin)本文开始提出的问题?br />
②在log4j.properties文g里把"log4j.rootCategory=DEBUG,stdout,R"改写?log4j.rootCategory=INFO, stdout,R"Q这样只昄INFO, WARN, ERROR的log信息Q而DEBUG信息不会(x)被显C;
在webE序中用log4j注意问题
1?nbsp; ׃jsp或servlet在执行状态时没有当前路径概念Q所有用PropertyConfigurator.configureQStringQ语句找log4j.properties文g时要l出相对于当前jsp或servlet的\径{化成Z个绝对的文gpȝ路径。方法是使用servletcontext.getrealpath(string)语句。例Q?/p>
//得到当前jsp路径
String prefix = getServletContext().getRealPath("/");
//dlog4j.properties
PropertyConfigurator.configure(prefix+"\\WEB-INF\\log4j.properties");
2、相应的log4j.properties讄某个属性时也要在程序中讄l对路径。例Q?/p>
log4j.appender.R.File属性设|日志文件存放位|。可以用d.properties配置文g的方法进行灵z设|?br />
附:(x)[配置文g]
### set log levels ###
log4j.rootLogger = debug , stdout , D , E

### 输出到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{ 1 }:%L - %m%n

### 输出到日志文?nbsp;###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG ## 输出DEBUGU别以上的日?/strong>
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

### 保存异常信息到单独文?nbsp;###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = logs/error.log ## 异常日志文g?br />
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR ## 只输出ERRORU别以上的日?!!
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

]]> - Struts1.1机制[摘录]http://www.aygfsteel.com/Jay2009/archive/2009/03/06/258210.html?j)\?j)\Fri, 06 Mar 2009 07:14:00 GMThttp://www.aygfsteel.com/Jay2009/archive/2009/03/06/258210.htmlhttp://www.aygfsteel.com/Jay2009/comments/258210.htmlhttp://www.aygfsteel.com/Jay2009/archive/2009/03/06/258210.html#Feedback0http://www.aygfsteel.com/Jay2009/comments/commentRss/258210.htmlhttp://www.aygfsteel.com/Jay2009/services/trackbacks/258210.htmlStruts1.1机制[摘录]
Struts 的底层机制是MVCQ下面是Struts 1.1中的MVC实现C意图:(x)

首先Q控制器QActionServletQ进行初始化工作Q读取配|文Ӟstruts-config.xmlQ,Z同的Struts模块初始化相应的ModuleConfig对象。比如配|文件中的Action映射定义都保存在ActionConfig集合中。相应地有ControlConfig集合、FormBeanConfig集合、ForwardConfig集合和MessageResourcesConfig集合{?br />
控制器接收HTTPhQƈ从ActionConfig中找出对应于该请求的Action子类Q如果没有对应的ActionQ控制器直接请求{发给JSP或者静(rn)态页面。否则控制器请求分发至具体Actionc进行处理?br />
在控制器调用具体Action的executeҎ(gu)之前QActionForm对象利用HTTPh中的参数来填充自己(可选步骤,需要在配置文g中指定)(j)。具体的ActionForm对象应该是ActionForm的子cd象,它其实就是一个JavaBean。此外,q可以在ActionFormcM调用validateҎ(gu)来检查请求参数的合法性,q且可以q回一个包含所有错误信息的ActionErrors对象。如果执行成功,ActionForm自动这些参C息以JavaBeanQ一般称之ؓ(f)form beanQ的方式保存在Servlet Context中,q样它们可以被其它Action对象或者JSP调用?br />
Struts这些ActionForm的配|信息都攑֜FormBeanConfig集合中,通过它们Struts能够知道针对某个客户h是否需要创建相应的ActionForm实例?br />
Action很简单,一般只包含一个executeҎ(gu)Q它负责执行相应的业务逻辑Q如果需要,它也q行相应的数据检查。执行完成之后,q回一个ActionForward对象Q控制器通过该ActionForward对象来进行{发工作。我们主张将获取数据和执行业务逻辑的功能放到具体的JavaBean当中Q而Action只负责完成与控制有关的功能。遵循该原则Q所以在上图中我Action对象归ؓ(f)控制器部分?br />
提示Q其实在Struts 1.1中,ActionMapping的作用完全可以由ActionConfig来替代,只不q由于它是公共API的一部分以及(qing)兼容性的问题得以保留。ActionMapping通过l承ActionConfig来获得与其一致的功能Q你可以{同地看待它们。同理,其它例如ActionForward与ForwardConfig的关pM是如此?br />
下图l出?jin)客L(fng)从发?gu)求到获得响应整个q程的图解说明?br />

ActionServlet
首先来了(jin)解MVC中的控制器。在Struts 1.1中缺省采用ActionServletcL充当控制器,当然如果ActionServlet不能满需求,也可以通过l承它来实现自己的类。可以在/WEB-INF/web.xml中来具体指定?br style="font-family: " />
要掌握ActionServletQ就必须?jin)解它所扮演的角艌Ӏ首先,ActionServlet表示MVCl构中的控制器部分,它需要完成控制器所需的前端控制及(qing)转发h{职责。其ơ,ActionServlet被实Cؓ(f)一个专门处理HTTPh的ServletQ它同时hservlet的特炏V在Struts 1.1中它主要完成以下功能Q?br />
接收客户端请求;
Ҏ(gu)客户端的URI请求映到一个相应的Actionc;
从请求中获取数据填充Form BeanQ如果需要)(j)Q?br />
调用Actioncȝexecute()Ҏ(gu)获取数据或者执行业务逻辑Q?br />
选择正确的视囑֓应客戗?/span>
此外QActionServletq负责初始化和清除应用配|信息的d。ActionServlet的初始化工作在initҎ(gu)中完成,它可以分Z个部分:(x)初始化ActionServlet自n的一些信息以?qing)每个模块的配置信息。前者主要通过initInternal、initOther和initServlet三个Ҏ(gu)来完成?br style="font-family: " />
我们可以?WEB-INF/web.xml中指定具体的控制器以?qing)初始参数?br />
ActionForm
对于ActionForm你可以从以下几个斚w来理解:(x)
1、ActionForm表示HTTPH体中的数据Q可以将其看作是模型和视囄中介Q它负责保存视图中的数据供模型或者视图用。Struts 1.1文档中把它比作HTTP和Action之间的防火墙Q这体现?jin)ActionFormh的过滤保护的作用Q只有通过ActionForm验证的数据才能够发送到Action处理?br />
2、ActionForm是与一个或多个ActionConfig兌的JavaBeanQ在相应的action的executeҎ(gu)被调用之前,ActionForm?x)自动利用请求参数来填充自己Q初始化属性)(j)?br />
3、ActionForm是一个抽象类Q必通过l承来实现自qcR?br />
4、ActionForm首先利用属性的getter和setterҎ(gu)来实现初始化Q初始化完毕后,ActionForm的validateҎ(gu)被调用,可以(g)查请求参数的正确性和有效性,q且可以错误信息以ActionErrors的Ş式返回到输入H体。否则,ActionForm被作ؓ(f)参数传给action的executeҎ(gu)以供使用?br />
5、ActionForm bean的生命周期可以设|ؓ(f)sessionQ缺省)(j)和requestQ当讄为sessionӞ记得在resetҎ(gu)中将所有的属性重新设|ؓ(f)初始倹{?br />
6、由于ActionForm对应于HTTPH体Q所以随着面的增多,ActionForm会(x)急速增加。而且可能同一cd面字段会(x)在不同的ActionForm中出玎ͼq且在每个ActionForm中都存在相同的验证代码。ؓ(f)?jin)解册个问题,可以为整个应用实C个ActionForm或者至一个模块对应于一个ActionForm?br />
但是Q聚合的代h(hun)是复用性很差,而且隄护。针对这个问题,在Struts 1.1中提Z(jin)DynaActionForm的概c(din)?br />
DynaActionFormc?br />
DynaActionForm的目的就是减ActionForm的数目,利用DynaActionForm不必创徏一个个具体的ActionFormc,而是在配|文件中配置出所需的虚拟ActionForm。例如,在下表中通过指定<form-bean>的type?org.apache.struts.action.DynaActionForm"来创Z个动态的ActionForm--loginForm?br />
<form-beans>
<form-bean name="loginForm" type="org.apache.struts.action.DynaActionForm">
<form-property name="actionClass" type="java.lang.String"/>
<form-property name="username" type="java.lang.String"/>
<form-property name="password" type="java.lang.String"/>
</form-bean>
</form-beans>
动态的ActionForm的用方法跟普通的ActionForm相同Q但是要注意一点:(x)普通的ActionForm对象需要ؓ(f)每个属性提供getter和setterҎ(gu)Q如果用DynaActionFormQ它?yu)属性保存在一个HashMapcd象中Q同时提供相应的get(name) ?nbsp;set(name)Ҏ(gu)Q其中参数name是要讉K的属性名。例如要讉KDynaActionForm中username的|可以采用cM的代码:(x)
String username = (String)form.get("username")Q?br />
׃值存放于一个HashMap对象Q所以要记得对get()Ҏ(gu)q回的Object对象做强制性类型{换。正是由于这点区别,如果在Action中非帔RJ地使用ActionForm对象Q徏议还是用普通的ActionForm对象?br />
Action
我们通过l承ActioncL实现具体的执行类。具体Actioncȝ功能一般都在executeQ以前是performҎ(gu)Q方法中完成Q其中主要涉?qing)到以下几个斚wQ?br />
a、辅助ActionFormq行一些表单数据的(g)查;
b、执行必要的业务逻辑Q比如存取数据库Q调用实体bean{;
c、更新服务器端的bean数据Q后l对象中可能?x)用到这些数据,比如在JSP中利用bean:write来获得这些数据;
d、根据处理结果决定程序的dQƈ以ActionForward对象的Ş式返回给ActionServlet?nbsp;
提示Q由于在Action和ActionForm中都可以实现验证Ҏ(gu)Q那么如何来安排它们之间的分工呢Q一般来_(d)我们U着MVC分离的原则,也就是视囄的验证工作放在ActionForm来完成,比如输入不能为空Qemail格式是否正确Q利用ValidatorForm可以很轻村֜完成q些工作。而与具体业务相关的验证则攑օAction中,q样可以获得最大ActionForm重用性的可能?br />
前面提到q,我们d业务逻辑执行分离到单独的JavaBean中,而Action只负责错误处理和程控制。而且考虑到重用性的原因Q在执行业务逻辑的JavaBean中不要引用Q何与Web应用相关的对象,比如HttpServletRequestQHttpServletResponse{对象,而应该将其{化ؓ(f)普通的Java对象?br />

]]> - 开博了(jin)http://www.aygfsteel.com/Jay2009/archive/2009/03/06/258122.html?j)\?j)\Fri, 06 Mar 2009 01:54:00 GMThttp://www.aygfsteel.com/Jay2009/archive/2009/03/06/258122.htmlhttp://www.aygfsteel.com/Jay2009/comments/258122.htmlhttp://www.aygfsteel.com/Jay2009/archive/2009/03/06/258122.html#Feedback0http://www.aygfsteel.com/Jay2009/comments/commentRss/258122.htmlhttp://www.aygfsteel.com/Jay2009/services/trackbacks/258122.html

]]>
վ֩ģ壺
|
տ|
̫|
|
|
|
ɽ|
|
|
|
|
|
ء|
|
|
|
ˮ|
ղ|
|
|
ɽ|
|
ƽ|
|
|
|
|
|
|
׳|
ƺ|
|
|
|
|
|
ƽ|
|
¡|
ʯ|
ƽ|