??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲乱码中文字幕综合,成人免费淫片视频软件,精品国产一区二区精华http://www.aygfsteel.com/Jay2009/zh-cnSat, 17 May 2025 04:07:40 GMTSat, 17 May 2025 04:07:40 GMT60STRUTS下几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 Q?/span> Basic

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=" 提交(g)?/span> "></td>

</tr>
</table>

</form>



?j)\ 2009-04-23 19:58 发表评论
]]>
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会(x)像我所见到有些兄弟那样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来的了(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>



?j)\ 2009-04-23 11:31 发表评论
]]>
在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ؓ(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档。下面是一个配|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定的好处?

 



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

E序说明Q?/p>

?log4j.rootCategory=DEBUG, stdoutQR

要显C所有优先权{于和高于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箋记录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


?j)\ 2009-03-10 13:25 发表评论
]]>
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 />


?j)\ 2009-03-06 15:14 发表评论
]]>
开博了(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


?j)\ 2009-03-06 09:54 发表评论
]]>
վ֩ģ壺 ۶| | | | | | | ͼ| ¡| | ̶| Ρɽ| | ۶| | ԭ| | ˮ| ֵ| | ء| | | | | °Ͷ| ʼ| | | | | | | Ȫ| ɼ| | | ־| | ӳ| Ϻӿ|