六月雨
2008 要做的事
鱼 发表于 2008-02-18 20:28:45
2008,不仅仅是一个数字,也标志着崭新的一年来到了,在这一年里,有很多事是我必须要做好的。
首先,要把工作的事做好,把java相关知识真正掌握,熟练运用,并进一步深入研究。。。
期盼,有正在学习java和从事java相关工作的朋友能留下您的痕迹,我们共同进步。。。
收藏:
QQ书签
del.icio.us
订阅:
Google
抓虾
[转]可以随时牵手,但不要随便分手!
鱼 发表于 2008-01-30 11:45:46
你发觉到了吗?
爱的感觉,总是在一开始觉得很甜蜜,
总觉得多一个人陪、多一个人帮你分担,
你终於不再孤单了,至少有一个人想著你、
恋著你,不论做什么事情,
只要能一起,就是好的,
但是慢慢的,随著彼此的认识愈深,
你开始发现了对方的缺点,
於是问题一个接著一个发生,
你开始烦、累,甚至想要逃避,
有人说爱情就像在捡石头,
总想捡到一个适合自己的,
但是你又如何知道什么时候能够捡到呢?
她适合你,那你又适合她吗?
其实,爱情就像磨石子一样,
或许刚捡到的时候,你不是那么的满意,
但是记住人是有弹性的,
很多事情是可以改变的,
只要你有心、有勇气,
与其到处去捡未知的石头,
还不如好好的将自己已经拥有的石头磨亮,你开始磨了吗?
很多人以为是因为感情淡了,
所以人才会变得懒惰。
错!
其实是人先被惰性征服,
所以感情才会变淡的。
在某个聚餐的场合,
有人提议多吃点虾子对身体好,
这时候有个中年男人忽然说「十年前,当我老婆还是我的女朋友的时候,
她说要吃十只虾,我就剥二十只给她!
现在,如果她要我帮她剥虾壳,开玩笑!我连帮她脱衣服都没兴趣了,还剥虾壳咧!」
听到了吗?明白了吗?
难怪越来越多人只想要谈一辈子的恋爱,
却迟迟不肯走入婚姻。
因为,婚姻容易让人变得懒惰。
如果每个人都
懒得讲话、
懒得倾听、
懒得制造惊喜、
懒得温柔体贴,
那么夫妻或是情人之间,
又怎么会不渐行渐远渐无声呢?
所以请记住:
有活力的爱情,
是需要适度殷勤灌溉的,
谈恋爱,更是不可以偷懒的喔!
有一对情侣,相约下班後去用餐、逛街,
可是女孩因为公司会议而延误了,
当她冒著雨赶到的时候已经迟到了30多分钟,
他的男朋友很不高兴的说:
「你每次都这样,现在我甚么心情也没了,
我以後再也不会等你了!
刹那间,女孩终於决堤崩溃了,
她心里在想:或许,他们再也没有未来了
同样的在同一个地点,另一对情侣也面临同样的处境;
女孩赶到的时候也迟到了半个钟头,
他的男朋友说:「我想你一定忙坏了吧!」
接著他为女孩拭去脸上的雨水,并且脱去外套盖在女孩身上,
此刻,女孩流泪了
但是流过她脸颊的泪却是温馨的。
你体会到了吗?
其实爱、恨往往只是在我们的一念之间!
爱不仅要懂得宽容更要及时,
很多事可能只是在於你心境的转变罢了!
懂了吗?
当有个人爱上你,而你也觉得他不错。
那并不代表你会选择他。
我们总说:「我要找一个自己很爱很爱的人,才会谈恋爱。」
但是当对方问你,怎样才算是很爱很爱的时候,
你却无法回答他,因为你自己也不知道。
没错,我们总是以为,我们会找到一个自己很爱很爱的人。
可是後来,当我们猛然回首,我们才会发觉自己曾经多么天真。
假如从来没有开始,你怎么知道自己会不会很爱很爱那个人呢?
其实,很爱很爱的感觉,是要在一起经历了许多事情之後才会发
现的。
或许每个人都希望能够找到自己心目中百分之百的伴侣,
但是你有没有想过『在你身边会不会早已经有人默默对你付出很久了,只是你没发
觉而已呢?』
所以,还是仔细看看身边的人吧!他或许已经等你很久喽!
当你爱一个人的时候,爱到八分绝对刚刚好。
所有的期待和希望都只有七八分;剩下两三分用来爱自己。
如果你还继续爱得更多,很可能会给对方沉重的压力,让彼此喘不过气来,
完全丧失了爱情的乐趣。
所以请记住,
喝酒不要超过六分醉,
吃饭不要超过七分饱,
爱一个人不要超过八分
那天朋友问我:「到底该怎么做才算是爱一个人呢?」
我笑著跟他说:「其实每个人的爱情观都不一样,说对了叫开导,但就怕说错反倒变成误导。那就糟糕了! 」
如果你也正在为爱迷惘,或许下面这段话可以给你一些启示:
爱一个人,要了解,也要开解;
要道歉,也要道谢;
要认错,也要改错;
要体贴,也要体谅;
是接受,而不是忍受;
是宽容,而不是纵容;
是支持,而不是支配;
是慰问,而不是质问;
是倾诉,而不是控诉;
是难忘,而不是遗忘;
是彼此交流,而不是凡事交代;
是为对方默默祈求,
而不是向对方诸多要求;
可以浪漫,但不要浪费;
可以随时牵手,
但不要随便分手。
爱的感觉,总是在一开始觉得很甜蜜,
总觉得多一个人陪、多一个人帮你分担,
你终於不再孤单了,至少有一个人想著你、
恋著你,不论做什么事情,
只要能一起,就是好的,
但是慢慢的,随著彼此的认识愈深,
你开始发现了对方的缺点,
於是问题一个接著一个发生,
你开始烦、累,甚至想要逃避,
有人说爱情就像在捡石头,
总想捡到一个适合自己的,
但是你又如何知道什么时候能够捡到呢?
她适合你,那你又适合她吗?
其实,爱情就像磨石子一样,
或许刚捡到的时候,你不是那么的满意,
但是记住人是有弹性的,
很多事情是可以改变的,
只要你有心、有勇气,
与其到处去捡未知的石头,
还不如好好的将自己已经拥有的石头磨亮,你开始磨了吗?
很多人以为是因为感情淡了,
所以人才会变得懒惰。
错!
其实是人先被惰性征服,
所以感情才会变淡的。
在某个聚餐的场合,
有人提议多吃点虾子对身体好,
这时候有个中年男人忽然说「十年前,当我老婆还是我的女朋友的时候,
她说要吃十只虾,我就剥二十只给她!
现在,如果她要我帮她剥虾壳,开玩笑!我连帮她脱衣服都没兴趣了,还剥虾壳咧!」
听到了吗?明白了吗?
难怪越来越多人只想要谈一辈子的恋爱,
却迟迟不肯走入婚姻。
因为,婚姻容易让人变得懒惰。
如果每个人都
懒得讲话、
懒得倾听、
懒得制造惊喜、
懒得温柔体贴,
那么夫妻或是情人之间,
又怎么会不渐行渐远渐无声呢?
所以请记住:
有活力的爱情,
是需要适度殷勤灌溉的,
谈恋爱,更是不可以偷懒的喔!
有一对情侣,相约下班後去用餐、逛街,
可是女孩因为公司会议而延误了,
当她冒著雨赶到的时候已经迟到了30多分钟,
他的男朋友很不高兴的说:
「你每次都这样,现在我甚么心情也没了,
我以後再也不会等你了!
刹那间,女孩终於决堤崩溃了,
她心里在想:或许,他们再也没有未来了
同样的在同一个地点,另一对情侣也面临同样的处境;
女孩赶到的时候也迟到了半个钟头,
他的男朋友说:「我想你一定忙坏了吧!」
接著他为女孩拭去脸上的雨水,并且脱去外套盖在女孩身上,
此刻,女孩流泪了
但是流过她脸颊的泪却是温馨的。
你体会到了吗?
其实爱、恨往往只是在我们的一念之间!
爱不仅要懂得宽容更要及时,
很多事可能只是在於你心境的转变罢了!
懂了吗?
当有个人爱上你,而你也觉得他不错。
那并不代表你会选择他。
我们总说:「我要找一个自己很爱很爱的人,才会谈恋爱。」
但是当对方问你,怎样才算是很爱很爱的时候,
你却无法回答他,因为你自己也不知道。
没错,我们总是以为,我们会找到一个自己很爱很爱的人。
可是後来,当我们猛然回首,我们才会发觉自己曾经多么天真。
假如从来没有开始,你怎么知道自己会不会很爱很爱那个人呢?
其实,很爱很爱的感觉,是要在一起经历了许多事情之後才会发
现的。
或许每个人都希望能够找到自己心目中百分之百的伴侣,
但是你有没有想过『在你身边会不会早已经有人默默对你付出很久了,只是你没发
觉而已呢?』
所以,还是仔细看看身边的人吧!他或许已经等你很久喽!
当你爱一个人的时候,爱到八分绝对刚刚好。
所有的期待和希望都只有七八分;剩下两三分用来爱自己。
如果你还继续爱得更多,很可能会给对方沉重的压力,让彼此喘不过气来,
完全丧失了爱情的乐趣。
所以请记住,
喝酒不要超过六分醉,
吃饭不要超过七分饱,
爱一个人不要超过八分
那天朋友问我:「到底该怎么做才算是爱一个人呢?」
我笑著跟他说:「其实每个人的爱情观都不一样,说对了叫开导,但就怕说错反倒变成误导。那就糟糕了! 」
如果你也正在为爱迷惘,或许下面这段话可以给你一些启示:
爱一个人,要了解,也要开解;
要道歉,也要道谢;
要认错,也要改错;
要体贴,也要体谅;
是接受,而不是忍受;
是宽容,而不是纵容;
是支持,而不是支配;
是慰问,而不是质问;
是倾诉,而不是控诉;
是难忘,而不是遗忘;
是彼此交流,而不是凡事交代;
是为对方默默祈求,
而不是向对方诸多要求;
可以浪漫,但不要浪费;
可以随时牵手,
但不要随便分手。
收藏:
QQ书签
del.icio.us
订阅:
Google
抓虾
struts校验表单
鱼 发表于 2008-01-05 13:17:29
[转载]
用Validator(验证器)提供的丰富的内置验证方法简化Struts的开发过程。
Struts框架的一个主要好处是它提供了对接收到的表单数据进行验证的内置界面。如果有任何验证失败,则应用程序都会重新显示HTML表单,这样就可以改正无效的数据了。如果验证成功,则处理过程会继续进行。Struts框架的简单验证界面会减少与处理数据验证有关的令人头疼的事情,这样你就可以把精力集中到验证代码上,而不是放到捕获数据、重新显示不完整或无效数据的技巧上。
但是,Struts内置的验证界面也有缺点。例如,在整个应用程序中验证代码常常会大量重复,因为许多域需要相同的验证逻辑。对一些相似字段的验证逻辑进行任何修改都要求在几个地方修改代码,还要重新编译受影响的代码。为了解决这个问题并增强Struts验证界面的功能,作为Struts的第三方附加件创建了Validator框架。后来,Validator被集成到核心Struts代码库中,并从Struts中分离出来,现在它是一个独立的Jakarta Commons项目。虽然Validator是一个独立的框架,但它仍能与其他程序封装在一起后提供,并与Struts无缝集成。
Validator概述
没有Validator,你就不得不编写验证表单数据所需的全部代码,并把它放入form Bean对象的validate( )方法中。对于想在其上进行数据验证的每个form Bean域来说,都需要编写逻辑代码来实现验证。此外,你还必须编写代码来存储验证失败时的出错消息。
有了Validator,你就不必在form Bean中编写用于验证或存储错误消息的任何代码。相反,form Bean提供了Validator的一个Actionform子类,它提供验证或存储错误消息的功能。
可把Validator框架作为一个可用于form Bean验证的可插入的验证例行程序系统来进行安装。每个验证例行程序都只是一个Java方法,负责执行特定类型的验证任务,验证可能通过,也可能失败。 默认情况下,Validator与几个有用的验证例行程序封装在一起来提供,这些例行程序能满足大多数情况下的验证要求。但是,如果Validator框架没有提供你需要的验证例行程序,那么你可以自己创建定制的验证例行程序,并将它插入到该框架中。此外,Validator还支持服务器端和客户端(javascript)的验证,而form Bean只提供服务器端验证界面。
Validator使用两个XML配置文件来分别确定安装哪个验证例行程序和如何将它们应用于给定的应用程序。第一个配置文件validator-rules.xml说明应该被插入到框架中的验证例行程序,并提供每个验证的逻辑的名称。validator-rules.xml文件还定义了每个验证例行程序的客户端javascript代码。可以配置Validator让它把这个javascript代码发送到浏览器上,这样验证就可以在客户端和服务器端进行了。
第二个配置文件validation.xml确定哪个验证例行程序应用到哪个form Bean。文件中的定义使用struts-config.xml文件给出的form Bean的逻辑名称以及validator-rules.xml文件给出的验证例行程序的逻辑名称,以便把二者关联起来。
使用Validator框架包括启用Validator插件、配置Validator的两个配置文件,以及创建提供Validator的Actionform子类的form Beans。下面详细解释如何配置和使用Validator。
启用Validator插件
虽然Validator框架是与Struts封装在一起提供的,但在默认状况下Validator并不被启用。为了启用Validator,要向你的应用程序的struts-config.xml文件中添加下面的插件定义。
<!-- Validator Configuration -->
<plug-in className="org.apache.struts
.validator.ValidatorPlugIn">
<set-property property="pathnames"
value="/WEB-INF/
validator-rules.xml, /WEB-INF/
validation.xml"/>
</plug-in>
该定义告诉Struts为你的应用程序加载并初始化Validator插件。在初始化时,该插件装入由路径名属性指定的、用逗号分隔的Validator配置文件清单。每个配置文件的路径应该用与Web应用程序的相关的路径来指定,如前面的例子所示。
请注意,你的应用程序的struts-config.xml文件必须与Struts Configuration Document Type Definition(Struts配置文档类型定义,DTD)一致,后者规定文件中元素出现的顺序。所以,你必须把Validator插件定义放到该文件的适当位置。确保文件中元素适当排列的最简便方法就是使用诸如Struts Console的工具,它自动格式化你的配置文件,以便与DTD保持一致。
配置validator-rules.xml
Validator框架可以设置为可插入系统,其验证例行程序仅仅是插入到该系统中执行具体验证的Java方法。validator-rules.xml文件说明性地插入Validator用于执行验证的验证例行程序中。Struts示例应用程序带有这个文件的预配置拷贝。在大多数情况下,你不必修改这个预配置拷贝,除非你要向该框架中添加自己定制的验证。
清单1 是一个示例validator-rules.xml文件,说明如何将验证例行程序插入到Validator中。validator-rules.xml文件中的每个验证例行程序都有自己的定义,它用validator标记声明,利用name属性为该验证例行程序指定逻辑名,并指定该例行程序的类和方法。该例行程序的逻辑名称供该文件中的其他例行程序以及validation.xml文件中的验证定义用于引用该例行程序。
请注意,validator标记放在javascript的标记中,javascript标记用于定义客户端javascript代码,以便在客户端执行与服务器端相同的验证。
提供的验证程序
默认情况下,Validator中包括几个基本验证例行程序,你可以用它们来处理大多数验证问题。这些例行程序具有逻辑名称,如required(用于输入要求的值)、CreditCard(用于输入信用卡号码值)、email(用于输入电子邮件地址值),等等。
创建form Bean
为了使用Validator,你的应用程序的form Bean必须归到Validator的Actionform的某一子类,而不是Actionform本身。Validator的Actionform子类提供了Actionform的validate( )方法(它嵌入到Validator框架中)的实施过程。你不必从头编写验证代码并把它投入validate( )方法中,相反,可以完全忽略该方法,因为Validator为你提供了验证代码。
与Struts提供的核心功能相类似,Validator提供给你两种可供选择的方法来创建form Bean。 你可以选择的第一种方法就是像下面这样创建一个特定的form Bean对象:
package com.jamesholmes.minihr;
import org.apache.struts.validator
.Validatorform;
public class Logonform extends Validatorform {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String
username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String
password) {
this.password = password;
}
}
这个类与你不是用Validator所创建的类相似,但它提供Validatorform而不是Actionform。这个类也不提供Actionform的空reset( )和validate( )方法的实施过程,因为Validatorform提供了相应过程。
在struts-config.xml文件中配置这个特定form Bean的方法与配置正则form Bean的方法相同:
<form-beans>
<form-bean name="logonform"
type="com.jamesholmes
.minihr.Logonform"/>
</form-beans>
用表单标记的name属性给特定form Bean指定的逻辑名是在定义validation.xml文件中的验证时所使用的名称,如下所示:
<!DOCTYPE form-validation
PUBLIC "-//Apache Software Foundation//
DTD Commons Validator Rules
Configuration 1.0//EN"
"http://jakarta.apache.org/
commons/dtds/validator_1_0.dtd">
<form-validation>
<formset>
<form name="logonform">
<field property="username"
depends="required">
<arg0 key="prompt.username"/>
</field>
</form>
</formset>
</form-validation>
Validator使用该表单标记的name属性的值将验证定义与要应用这些定义的form Bean的名称相匹配。
创建form Bean时可以选择的第二种方法是在struts-config.xml文件中定义一个动态form Bean,如下所示:
<form-beans>
<form-bean name="logonform"
type="org.apache
.struts.validator.DynaValidatorform">
<form-property name="username"
type="java.lang.String"/>
<form-property name="password"
type="java.lang.String"/>
</form-bean>
</form-beans>
动态form Bean不要求创建特定的form Bean对象;相反,要定义form Bean应该具有的属性和类型,而Struts为你动态创建form Bean。 Validator允许你使用这个概念,就像在核心Struts中使用这个概念一样。与使用Validator的惟一区别就是要指定form Bean是org.apache.struts.validator.DynaValidatorform类型,而不是org.apache.struts.action.DynaActionform类型。
分配给动态form Bean的逻辑名是在定义validation.xml文件中的验证时使用的名称。Validator使用与之相匹配的名称将这些验证与form Bean联系在一起。
除了创建form Bean的这两种标准方法之外,Validator还提供了一个高级特性,用于将多个验证定义与一个form Bean定义联系起来。当你使用基于validatorform或基于DynaValidatorform的form Bean时,Validator使用struts-config.xml文件中的form Bean的逻辑名称,将form Bean映射到validation.xml文件中的验证定义。这种机制在大多数情况下非常有用,但在某些时候,form Bean要在多个操作中共享。 一个操作可能使用form Bean的所有域(fields),而另一个操作可能只使用这些域的一个子集。因为验证定义被连接到form Bean,所以只使用域的一个子集的操作就无法绕过对未使用域的验证。当验证form Bean时,就会对未使用的域生成错误消息,因为Validator无从知道不去验证未使用的域,它只是简单地把它们看作缺失或无效。
为了解决这个问题,Validator提供了两个附加的Actionform子类,它使你能够将验证与操作相关联,而不是与form Bean相关联。这样你就可以根据哪个操作正在使用form Bean来指定把哪些验证用于该form Bean了。对于特定的form Bean,你要像下面这样声明org.apache.struts.validator.ValidatorActionform子类:
public class Addressform extends ValidatorActionform {
...
}
对于动态form Bean,在struts-config.xml文件中为form Bean定义指定org.apache.struts.validator.DynaValidatorActionform的类型,如下所示:
<form-bean name="addressform"
type="org.apache.struts
.validator.DynaValidatorActionform">
...
</form-bean>
在validation.xml文件中,把一组验证映射到一个操作路径,而不是映射到form Bean名,因为如果你定义了Create Address和Edit Address两个操作(它们使用同一个form Bean),那么每个操作都会有一个惟一的操作名,如下所示:
<action-mappings>
<action path="/createAddress"
type="com.jamesholmes
.minihr.CreateAddressAction"
name="addressform"/>
<action path="/editAddress"
type="com.jamesholmes
.minihr.EditAddressAction"
name="addressform"/>
</action-mappings>
下面的validation.xml文件片断显示了两组验证,它们用于同一个form Bean,但却有不同的操作路径:
<formset>
<form name="/createAddress">
<field property="city"
depends="required">
<arg0 key="prompt.city"/>
</field>
</form>
<form name="/editAddress">
<field property="state"
depends="required">
<arg0 key="prompt.state"/>
</field>
</form>
</formset>
因为form Bean要么属于ValidatorActionform子类,要么属于DynaValidatorActionform子类,所以Validator知道用一个操作路径代替form Bean的逻辑名称来找出用于form Bean的验证。
配置validation.xml文件
validation.xml文件用于声明将应用到form Beans的一组验证。要验证的每个form Bean在这个文件中都有自己的定义。在这个定义中,指定要应用到该form Bean的各域的验证。下面是一个validation.xml文件的例子,说明如何定义验证:
<!DOCTYPE form-validation
PUBLIC "-//Apache Software Foundation//
DTD Commons Validator Rules
Configuration 1.0//EN"
"http://jakarta.apache.org/
commons/dtds/validator_1_0.dtd">
<form-validation>
<formset>
<form name="logonform">
<field property="username"
depends="required">
<arg0 key="prompt.username"/>
</field>
<field property="password"
depends="required">
<arg0 key="prompt.password"/>
</field>
</form>
</formset>
</form-validation>
validation.xml文件的第一个元素是form-validation。这个元素是该文件的主元素,而且只定义一次。在form-validation元素内定义form-set元素,它包括多个表单元素。一般来说,在文件中只定义一个form-set元素,但是如果要将验证国际化,那就要在每个地方单独使用一个form-set元素。
每个表单元素使用name属性将名称与其所包含的域验证集关联起来。Validator使用这个逻辑名称将这些验证映射到在struts-config.xml文件中定义的一个form Bean。根据要验证的form Bean的类型,Validator力求将该名称与form Bean的逻辑名称或操作路径相匹配。在表单元素内,field元素定义要应用到form Bean的特定域的验证。field元素的property属性对应于特定form Bean中的域名。depends属性利用validator-rules.xml文件指定验证例行程序的逻辑名称,这些例行程序将应用到域验证中。
配置ApplicationResources.properties
Validator使用Struts的资源绑定(Resource Bundle)机制将错误消息具体化。不用在框架中对错误消息进行硬编码,Validator使你能在ApplicationResources.properties文件中为一个消息指定一个键值,如果验证失败则将返回该键值。validator-rules.xml文件中的每个验证例行程序都用validator标记的msg属性指定错误消息的键值,如下所示:
<validator name="required"
classname="org.apache
.struts.validator.FieldChecks"
method="validateRequired"
methodParams="java.lang
.Object, org.apache.commons.validator
.ValidatorAction, org.apache.commons
.validator.Field, org.apache.struts
.action.ActionErrors, javax.servlet
.http.HttpServletRequest"
msg="errors.required">
如果在验证例行程序运行时验证失败,则返回与msg属性指定的键值对应的消息。
下面的片段显示来自ApplicationResources.properties文件的验证出错时的默认消息集,它们由Struts示例应用程序提供。每个消息的键值对应于每个由validator-rules.xml文件中的验证例行程序所指定的消息,它们由Struts示例应用程序提供。
# Error messages for Validator framework validations
errors.required={0} is required.
errors.minlength={0} cannot be less than {1} characters.
errors.maxlength={0} cannot be greater than {2} characters.
errors.invalid={0} is invalid.
errors.byte={0} must be a byte.
errors.short={0} must be a short.
errors.integer={0} must be an integer.
errors.long={0} must be a long.0. errors.float={0} must be a float.
errors.double={0} must be a double.
errors.date={0} is not a date.
errors.range={0} is not in the range {1} through {2}.
errors.creditcard={0} is not a valid credit card number.
errors.email={0} is an invalid e-mail address.
请注意,每条消息都有占位符,形式为{0}、{1}或{2}。在运行期间,占位符被另一个值代替,如所验证的域的名称。这一特性特别有用,它使你能够创建可被几个不同的域重复使用的通用验证错误消息。
例如,下面给出required验证的错误消息errors.required:
errors.required={0} is required.
当你使用validation.xml文件中的该required验证时,必须定义用于替换该错误消息中的{0}的值,如下所示:
<form name="auctionform">
<field property="bid" depends="required">
<arg0 key="prompt.bid"/>
</field>
</form>
错误消息最多可以有4个占位符:{0}和{3}。这些占位符分别称为arg0到arg3,你可以通过使用arg0~arg3标记来指定它们。在上面的例子中,arg0标记指定了用于替换{0}占位符的值。该标记的key属性指定来自ApplicationResources.properties文件的一个消息键值,它的值用于替换占位符,如下所示: 下一步
阅读
关于Validator的更多文章
jakarta.apache.org/commons/validator
关于Struts Console的更多文章
www.jamesholmes.com/struts
prompt.bid=Auction Bid
使用消息键值代替占位符的值,这一方法使你不必在validation.xml文件中对替换值反复硬编码。但是,如果你不想使用Resource Bundle的键值/值机制来指定占位符的值,则可以使用arg0标记的如下语法显式地指定占位符的值:
<arg0 key="Auction Bid" resource="false"/>
在这个例子中,resource属性的值设为false,以便通知Validator要把该key属性指定的值作为占位符的值,而不要作为ApplicationResources.properties文件中消息的一个键值。
启用客户端验证
Validator除了提供了简化服务器端表单数据验证过程的框架外,它还提供了执行客户端验证时易于使用的方法。在validator-rules.xml文件中定义的每一个验证例行程序都可以随意指定javascript代码,这些代码可以在浏览器(客户端上的)中运行,从而执行与服务器端进行的验证相同的验证过程。在客户端进行验证时,除非所有表单都通过验证,否则这些表单不允许被提交。
为了启用客户端验证,必须在每个需要验证的JSP中放上Struts HTML Tag Library(标记库)的javascript标记,如下所示:
<html:javascript formName="logonform"/>
javascript标记要求使用formName属性来为想要对其执行验证的表单指定validation.xml文件中给出的表单定义名,如下所示:
<form name="logonform">
<field property="username"
depends="required">
<arg0 key="prompt.username"/>
</field>
<field property="password"
depends="required">
<arg0 key="prompt.password"/>
</field>
</form>
为表单定义指定的服务器端的所有验证都将在客户端运行。由于客户端验证用javascript执行,所以可以有多种方法不去执行它。要确保验证过程总是能运行,不论你是否选择启用了客户端验证,Validator都在服务器端执行这些验证。
结论
Validator框架针对表单数据的验证提供了可配置的系统,从而为核心Struts框架添加了很多有价值的功能。通过把Validator框架用于你的应用程序,你可以节约时间并简化Struts应用程序的开发过程。
用Validator(验证器)提供的丰富的内置验证方法简化Struts的开发过程。
Struts框架的一个主要好处是它提供了对接收到的表单数据进行验证的内置界面。如果有任何验证失败,则应用程序都会重新显示HTML表单,这样就可以改正无效的数据了。如果验证成功,则处理过程会继续进行。Struts框架的简单验证界面会减少与处理数据验证有关的令人头疼的事情,这样你就可以把精力集中到验证代码上,而不是放到捕获数据、重新显示不完整或无效数据的技巧上。
但是,Struts内置的验证界面也有缺点。例如,在整个应用程序中验证代码常常会大量重复,因为许多域需要相同的验证逻辑。对一些相似字段的验证逻辑进行任何修改都要求在几个地方修改代码,还要重新编译受影响的代码。为了解决这个问题并增强Struts验证界面的功能,作为Struts的第三方附加件创建了Validator框架。后来,Validator被集成到核心Struts代码库中,并从Struts中分离出来,现在它是一个独立的Jakarta Commons项目。虽然Validator是一个独立的框架,但它仍能与其他程序封装在一起后提供,并与Struts无缝集成。
Validator概述
没有Validator,你就不得不编写验证表单数据所需的全部代码,并把它放入form Bean对象的validate( )方法中。对于想在其上进行数据验证的每个form Bean域来说,都需要编写逻辑代码来实现验证。此外,你还必须编写代码来存储验证失败时的出错消息。
有了Validator,你就不必在form Bean中编写用于验证或存储错误消息的任何代码。相反,form Bean提供了Validator的一个Actionform子类,它提供验证或存储错误消息的功能。
可把Validator框架作为一个可用于form Bean验证的可插入的验证例行程序系统来进行安装。每个验证例行程序都只是一个Java方法,负责执行特定类型的验证任务,验证可能通过,也可能失败。 默认情况下,Validator与几个有用的验证例行程序封装在一起来提供,这些例行程序能满足大多数情况下的验证要求。但是,如果Validator框架没有提供你需要的验证例行程序,那么你可以自己创建定制的验证例行程序,并将它插入到该框架中。此外,Validator还支持服务器端和客户端(javascript)的验证,而form Bean只提供服务器端验证界面。
Validator使用两个XML配置文件来分别确定安装哪个验证例行程序和如何将它们应用于给定的应用程序。第一个配置文件validator-rules.xml说明应该被插入到框架中的验证例行程序,并提供每个验证的逻辑的名称。validator-rules.xml文件还定义了每个验证例行程序的客户端javascript代码。可以配置Validator让它把这个javascript代码发送到浏览器上,这样验证就可以在客户端和服务器端进行了。
第二个配置文件validation.xml确定哪个验证例行程序应用到哪个form Bean。文件中的定义使用struts-config.xml文件给出的form Bean的逻辑名称以及validator-rules.xml文件给出的验证例行程序的逻辑名称,以便把二者关联起来。
使用Validator框架包括启用Validator插件、配置Validator的两个配置文件,以及创建提供Validator的Actionform子类的form Beans。下面详细解释如何配置和使用Validator。
启用Validator插件
虽然Validator框架是与Struts封装在一起提供的,但在默认状况下Validator并不被启用。为了启用Validator,要向你的应用程序的struts-config.xml文件中添加下面的插件定义。
<!-- Validator Configuration -->
<plug-in className="org.apache.struts
.validator.ValidatorPlugIn">
<set-property property="pathnames"
value="/WEB-INF/
validator-rules.xml, /WEB-INF/
validation.xml"/>
</plug-in>
该定义告诉Struts为你的应用程序加载并初始化Validator插件。在初始化时,该插件装入由路径名属性指定的、用逗号分隔的Validator配置文件清单。每个配置文件的路径应该用与Web应用程序的相关的路径来指定,如前面的例子所示。
请注意,你的应用程序的struts-config.xml文件必须与Struts Configuration Document Type Definition(Struts配置文档类型定义,DTD)一致,后者规定文件中元素出现的顺序。所以,你必须把Validator插件定义放到该文件的适当位置。确保文件中元素适当排列的最简便方法就是使用诸如Struts Console的工具,它自动格式化你的配置文件,以便与DTD保持一致。
配置validator-rules.xml
Validator框架可以设置为可插入系统,其验证例行程序仅仅是插入到该系统中执行具体验证的Java方法。validator-rules.xml文件说明性地插入Validator用于执行验证的验证例行程序中。Struts示例应用程序带有这个文件的预配置拷贝。在大多数情况下,你不必修改这个预配置拷贝,除非你要向该框架中添加自己定制的验证。
清单1 是一个示例validator-rules.xml文件,说明如何将验证例行程序插入到Validator中。validator-rules.xml文件中的每个验证例行程序都有自己的定义,它用validator标记声明,利用name属性为该验证例行程序指定逻辑名,并指定该例行程序的类和方法。该例行程序的逻辑名称供该文件中的其他例行程序以及validation.xml文件中的验证定义用于引用该例行程序。
请注意,validator标记放在javascript的标记中,javascript标记用于定义客户端javascript代码,以便在客户端执行与服务器端相同的验证。
提供的验证程序
默认情况下,Validator中包括几个基本验证例行程序,你可以用它们来处理大多数验证问题。这些例行程序具有逻辑名称,如required(用于输入要求的值)、CreditCard(用于输入信用卡号码值)、email(用于输入电子邮件地址值),等等。
创建form Bean
为了使用Validator,你的应用程序的form Bean必须归到Validator的Actionform的某一子类,而不是Actionform本身。Validator的Actionform子类提供了Actionform的validate( )方法(它嵌入到Validator框架中)的实施过程。你不必从头编写验证代码并把它投入validate( )方法中,相反,可以完全忽略该方法,因为Validator为你提供了验证代码。
与Struts提供的核心功能相类似,Validator提供给你两种可供选择的方法来创建form Bean。 你可以选择的第一种方法就是像下面这样创建一个特定的form Bean对象:
package com.jamesholmes.minihr;
import org.apache.struts.validator
.Validatorform;
public class Logonform extends Validatorform {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String
username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String
password) {
this.password = password;
}
}
这个类与你不是用Validator所创建的类相似,但它提供Validatorform而不是Actionform。这个类也不提供Actionform的空reset( )和validate( )方法的实施过程,因为Validatorform提供了相应过程。
在struts-config.xml文件中配置这个特定form Bean的方法与配置正则form Bean的方法相同:
<form-beans>
<form-bean name="logonform"
type="com.jamesholmes
.minihr.Logonform"/>
</form-beans>
用表单标记的name属性给特定form Bean指定的逻辑名是在定义validation.xml文件中的验证时所使用的名称,如下所示:
<!DOCTYPE form-validation
PUBLIC "-//Apache Software Foundation//
DTD Commons Validator Rules
Configuration 1.0//EN"
"http://jakarta.apache.org/
commons/dtds/validator_1_0.dtd">
<form-validation>
<formset>
<form name="logonform">
<field property="username"
depends="required">
<arg0 key="prompt.username"/>
</field>
</form>
</formset>
</form-validation>
Validator使用该表单标记的name属性的值将验证定义与要应用这些定义的form Bean的名称相匹配。
创建form Bean时可以选择的第二种方法是在struts-config.xml文件中定义一个动态form Bean,如下所示:
<form-beans>
<form-bean name="logonform"
type="org.apache
.struts.validator.DynaValidatorform">
<form-property name="username"
type="java.lang.String"/>
<form-property name="password"
type="java.lang.String"/>
</form-bean>
</form-beans>
动态form Bean不要求创建特定的form Bean对象;相反,要定义form Bean应该具有的属性和类型,而Struts为你动态创建form Bean。 Validator允许你使用这个概念,就像在核心Struts中使用这个概念一样。与使用Validator的惟一区别就是要指定form Bean是org.apache.struts.validator.DynaValidatorform类型,而不是org.apache.struts.action.DynaActionform类型。
分配给动态form Bean的逻辑名是在定义validation.xml文件中的验证时使用的名称。Validator使用与之相匹配的名称将这些验证与form Bean联系在一起。
除了创建form Bean的这两种标准方法之外,Validator还提供了一个高级特性,用于将多个验证定义与一个form Bean定义联系起来。当你使用基于validatorform或基于DynaValidatorform的form Bean时,Validator使用struts-config.xml文件中的form Bean的逻辑名称,将form Bean映射到validation.xml文件中的验证定义。这种机制在大多数情况下非常有用,但在某些时候,form Bean要在多个操作中共享。 一个操作可能使用form Bean的所有域(fields),而另一个操作可能只使用这些域的一个子集。因为验证定义被连接到form Bean,所以只使用域的一个子集的操作就无法绕过对未使用域的验证。当验证form Bean时,就会对未使用的域生成错误消息,因为Validator无从知道不去验证未使用的域,它只是简单地把它们看作缺失或无效。
为了解决这个问题,Validator提供了两个附加的Actionform子类,它使你能够将验证与操作相关联,而不是与form Bean相关联。这样你就可以根据哪个操作正在使用form Bean来指定把哪些验证用于该form Bean了。对于特定的form Bean,你要像下面这样声明org.apache.struts.validator.ValidatorActionform子类:
public class Addressform extends ValidatorActionform {
...
}
对于动态form Bean,在struts-config.xml文件中为form Bean定义指定org.apache.struts.validator.DynaValidatorActionform的类型,如下所示:
<form-bean name="addressform"
type="org.apache.struts
.validator.DynaValidatorActionform">
...
</form-bean>
在validation.xml文件中,把一组验证映射到一个操作路径,而不是映射到form Bean名,因为如果你定义了Create Address和Edit Address两个操作(它们使用同一个form Bean),那么每个操作都会有一个惟一的操作名,如下所示:
<action-mappings>
<action path="/createAddress"
type="com.jamesholmes
.minihr.CreateAddressAction"
name="addressform"/>
<action path="/editAddress"
type="com.jamesholmes
.minihr.EditAddressAction"
name="addressform"/>
</action-mappings>
下面的validation.xml文件片断显示了两组验证,它们用于同一个form Bean,但却有不同的操作路径:
<formset>
<form name="/createAddress">
<field property="city"
depends="required">
<arg0 key="prompt.city"/>
</field>
</form>
<form name="/editAddress">
<field property="state"
depends="required">
<arg0 key="prompt.state"/>
</field>
</form>
</formset>
因为form Bean要么属于ValidatorActionform子类,要么属于DynaValidatorActionform子类,所以Validator知道用一个操作路径代替form Bean的逻辑名称来找出用于form Bean的验证。
配置validation.xml文件
validation.xml文件用于声明将应用到form Beans的一组验证。要验证的每个form Bean在这个文件中都有自己的定义。在这个定义中,指定要应用到该form Bean的各域的验证。下面是一个validation.xml文件的例子,说明如何定义验证:
<!DOCTYPE form-validation
PUBLIC "-//Apache Software Foundation//
DTD Commons Validator Rules
Configuration 1.0//EN"
"http://jakarta.apache.org/
commons/dtds/validator_1_0.dtd">
<form-validation>
<formset>
<form name="logonform">
<field property="username"
depends="required">
<arg0 key="prompt.username"/>
</field>
<field property="password"
depends="required">
<arg0 key="prompt.password"/>
</field>
</form>
</formset>
</form-validation>
validation.xml文件的第一个元素是form-validation。这个元素是该文件的主元素,而且只定义一次。在form-validation元素内定义form-set元素,它包括多个表单元素。一般来说,在文件中只定义一个form-set元素,但是如果要将验证国际化,那就要在每个地方单独使用一个form-set元素。
每个表单元素使用name属性将名称与其所包含的域验证集关联起来。Validator使用这个逻辑名称将这些验证映射到在struts-config.xml文件中定义的一个form Bean。根据要验证的form Bean的类型,Validator力求将该名称与form Bean的逻辑名称或操作路径相匹配。在表单元素内,field元素定义要应用到form Bean的特定域的验证。field元素的property属性对应于特定form Bean中的域名。depends属性利用validator-rules.xml文件指定验证例行程序的逻辑名称,这些例行程序将应用到域验证中。
配置ApplicationResources.properties
Validator使用Struts的资源绑定(Resource Bundle)机制将错误消息具体化。不用在框架中对错误消息进行硬编码,Validator使你能在ApplicationResources.properties文件中为一个消息指定一个键值,如果验证失败则将返回该键值。validator-rules.xml文件中的每个验证例行程序都用validator标记的msg属性指定错误消息的键值,如下所示:
<validator name="required"
classname="org.apache
.struts.validator.FieldChecks"
method="validateRequired"
methodParams="java.lang
.Object, org.apache.commons.validator
.ValidatorAction, org.apache.commons
.validator.Field, org.apache.struts
.action.ActionErrors, javax.servlet
.http.HttpServletRequest"
msg="errors.required">
如果在验证例行程序运行时验证失败,则返回与msg属性指定的键值对应的消息。
下面的片段显示来自ApplicationResources.properties文件的验证出错时的默认消息集,它们由Struts示例应用程序提供。每个消息的键值对应于每个由validator-rules.xml文件中的验证例行程序所指定的消息,它们由Struts示例应用程序提供。
# Error messages for Validator framework validations
errors.required={0} is required.
errors.minlength={0} cannot be less than {1} characters.
errors.maxlength={0} cannot be greater than {2} characters.
errors.invalid={0} is invalid.
errors.byte={0} must be a byte.
errors.short={0} must be a short.
errors.integer={0} must be an integer.
errors.long={0} must be a long.0. errors.float={0} must be a float.
errors.double={0} must be a double.
errors.date={0} is not a date.
errors.range={0} is not in the range {1} through {2}.
errors.creditcard={0} is not a valid credit card number.
errors.email={0} is an invalid e-mail address.
请注意,每条消息都有占位符,形式为{0}、{1}或{2}。在运行期间,占位符被另一个值代替,如所验证的域的名称。这一特性特别有用,它使你能够创建可被几个不同的域重复使用的通用验证错误消息。
例如,下面给出required验证的错误消息errors.required:
errors.required={0} is required.
当你使用validation.xml文件中的该required验证时,必须定义用于替换该错误消息中的{0}的值,如下所示:
<form name="auctionform">
<field property="bid" depends="required">
<arg0 key="prompt.bid"/>
</field>
</form>
错误消息最多可以有4个占位符:{0}和{3}。这些占位符分别称为arg0到arg3,你可以通过使用arg0~arg3标记来指定它们。在上面的例子中,arg0标记指定了用于替换{0}占位符的值。该标记的key属性指定来自ApplicationResources.properties文件的一个消息键值,它的值用于替换占位符,如下所示: 下一步
阅读
关于Validator的更多文章
jakarta.apache.org/commons/validator
关于Struts Console的更多文章
www.jamesholmes.com/struts
prompt.bid=Auction Bid
使用消息键值代替占位符的值,这一方法使你不必在validation.xml文件中对替换值反复硬编码。但是,如果你不想使用Resource Bundle的键值/值机制来指定占位符的值,则可以使用arg0标记的如下语法显式地指定占位符的值:
<arg0 key="Auction Bid" resource="false"/>
在这个例子中,resource属性的值设为false,以便通知Validator要把该key属性指定的值作为占位符的值,而不要作为ApplicationResources.properties文件中消息的一个键值。
启用客户端验证
Validator除了提供了简化服务器端表单数据验证过程的框架外,它还提供了执行客户端验证时易于使用的方法。在validator-rules.xml文件中定义的每一个验证例行程序都可以随意指定javascript代码,这些代码可以在浏览器(客户端上的)中运行,从而执行与服务器端进行的验证相同的验证过程。在客户端进行验证时,除非所有表单都通过验证,否则这些表单不允许被提交。
为了启用客户端验证,必须在每个需要验证的JSP中放上Struts HTML Tag Library(标记库)的javascript标记,如下所示:
<html:javascript formName="logonform"/>
javascript标记要求使用formName属性来为想要对其执行验证的表单指定validation.xml文件中给出的表单定义名,如下所示:
<form name="logonform">
<field property="username"
depends="required">
<arg0 key="prompt.username"/>
</field>
<field property="password"
depends="required">
<arg0 key="prompt.password"/>
</field>
</form>
为表单定义指定的服务器端的所有验证都将在客户端运行。由于客户端验证用javascript执行,所以可以有多种方法不去执行它。要确保验证过程总是能运行,不论你是否选择启用了客户端验证,Validator都在服务器端执行这些验证。
结论
Validator框架针对表单数据的验证提供了可配置的系统,从而为核心Struts框架添加了很多有价值的功能。通过把Validator框架用于你的应用程序,你可以节约时间并简化Struts应用程序的开发过程。
收藏:
QQ书签
del.icio.us
订阅:
Google
抓虾
一个合格程序员该做的事情——你做好了吗?
鱼 发表于 2008-01-05 13:09:51
转自Sina Blog.
程序员每天该做的事
1、总结自己一天任务的完成情况
最好的方式是写工作日志,把自己今天完成了什么事情,遇见了什么问题都记录下来,日后翻看好处多多
2、考虑自己明天应该做的主要工作
把明天要做的事情列出来,并按照优先级排列,第二天应该把自己效率最高的时间分配给最重要的工作
3、考虑自己一天工作中失误的地方,并想出避免下一次再犯的方法
出错不要紧,最重要的是不要重复犯相同的错误,那是愚蠢
4、考虑自己一天工作完成的质量和效率能否还能提高
一天只提高1%,365天你的效率就能提高多少倍你知道吗? (1+0.01)^365 = 37 倍
5、看一个有用的新闻网站或读一张有用的报纸,了解业界动态
闭门造车是不行的,了解一下别人都在做什么,对自己能带来很多启示
6、记住一位同事的名字及其特点
你认识公司的所有同事吗?你了解他们吗?
7、清理自己的代码
今天完成的代码,把中间的调试信息,测试代码清理掉,按照编码风格整理好,注释都写好了吗?
8、清理自己的桌面
当日事当日毕,保持清洁干劲的桌面才能让你工作时不分心,程序员特别要把电脑的桌面清理干净
程序员每周该做的事
1、向你的老板汇报一次工作
让你的老板知道你在做什么,这很重要。可以口头、书面、邮件,看你老板的工作方式而定
2、进行一次自我总结(非正式)
这周之内自己表现得怎么样?该加分还是扣分?
3、制定下周计划
把下周要做的事情列出来,一样要分清楚优先级
4、整理自己的文件夹、书柜和电脑文件
把桌面以外的地方也要清理干净,电脑的文件夹,收到的邮件,把过时的垃圾全部清理掉
5、与一个非公司的朋友沟通
它山之石,可以攻玉
6、看一本杂志
找一本适合自己的专业杂志
7、纠正自己或同事一个细节上的不正确做法
《细节决定成败》看过了吗?没看过强烈建议先看看
程序员每月该做的事
1、至少和一个同事一起吃饭或喝茶
不光了解自己工作伙伴的工作,还要了解他们的生活
2、自我考核一次
相对正式地考核自己一下,你对得起这个月的工资吗?
3、对你的同事考核一次
你的同事表现怎么样?哪些人值得学习,哪些人需要帮助?
3、制定下月的计划,确定下月的工作重点
4、总结自己工作质量改进状况
自己的质量提高了多少?
5、有针对性地对一项工作指标做深入地分析并得出改进的方案
可以是对自己的,也可以是对公司的,一定要深入地分析后拿出自己的观点来。要想在老板面前说得上话,做的成事,工作上功夫要做足。
6、与老板沟通一次
最好是面对面地沟通,好好表现一下自己,虚心听取老板的意见,更重要的是要了解老板当前关心的重点
程序员每年该做的事
1、年终总结
每个公司都会做的事情,但你真正认真地总结过自己吗?
2、兑现给自己、给家人的承诺
给老婆、儿子的新年礼物买了没有?给自己的呢?
3、下年度工作规划
好好想想自己明年的发展目标,争取升职/加薪、跳槽还是自己出来干?
4、掌握一项新技术
至少是一项,作为程序员一年要是一项新技术都学不到手,那就一定会被淘汰。
掌握可不是看本书就行的,要真正懂得应用,最好你能够写一篇教程发表到你的blog
5、推出一种新产品
可以是一个真正的产品,也可以只是一个类库,只要是你创造的东西就行,让别人使用它,也为世界作点贡献。当然如果真的很有价值,收点注册费也是应该的
6、与父母团聚一次
常回家看看,常回家看看
程序员每天该做的事
1、总结自己一天任务的完成情况
最好的方式是写工作日志,把自己今天完成了什么事情,遇见了什么问题都记录下来,日后翻看好处多多
2、考虑自己明天应该做的主要工作
把明天要做的事情列出来,并按照优先级排列,第二天应该把自己效率最高的时间分配给最重要的工作
3、考虑自己一天工作中失误的地方,并想出避免下一次再犯的方法
出错不要紧,最重要的是不要重复犯相同的错误,那是愚蠢
4、考虑自己一天工作完成的质量和效率能否还能提高
一天只提高1%,365天你的效率就能提高多少倍你知道吗? (1+0.01)^365 = 37 倍
5、看一个有用的新闻网站或读一张有用的报纸,了解业界动态
闭门造车是不行的,了解一下别人都在做什么,对自己能带来很多启示
6、记住一位同事的名字及其特点
你认识公司的所有同事吗?你了解他们吗?
7、清理自己的代码
今天完成的代码,把中间的调试信息,测试代码清理掉,按照编码风格整理好,注释都写好了吗?
8、清理自己的桌面
当日事当日毕,保持清洁干劲的桌面才能让你工作时不分心,程序员特别要把电脑的桌面清理干净
程序员每周该做的事
1、向你的老板汇报一次工作
让你的老板知道你在做什么,这很重要。可以口头、书面、邮件,看你老板的工作方式而定
2、进行一次自我总结(非正式)
这周之内自己表现得怎么样?该加分还是扣分?
3、制定下周计划
把下周要做的事情列出来,一样要分清楚优先级
4、整理自己的文件夹、书柜和电脑文件
把桌面以外的地方也要清理干净,电脑的文件夹,收到的邮件,把过时的垃圾全部清理掉
5、与一个非公司的朋友沟通
它山之石,可以攻玉
6、看一本杂志
找一本适合自己的专业杂志
7、纠正自己或同事一个细节上的不正确做法
《细节决定成败》看过了吗?没看过强烈建议先看看
程序员每月该做的事
1、至少和一个同事一起吃饭或喝茶
不光了解自己工作伙伴的工作,还要了解他们的生活
2、自我考核一次
相对正式地考核自己一下,你对得起这个月的工资吗?
3、对你的同事考核一次
你的同事表现怎么样?哪些人值得学习,哪些人需要帮助?
3、制定下月的计划,确定下月的工作重点
4、总结自己工作质量改进状况
自己的质量提高了多少?
5、有针对性地对一项工作指标做深入地分析并得出改进的方案
可以是对自己的,也可以是对公司的,一定要深入地分析后拿出自己的观点来。要想在老板面前说得上话,做的成事,工作上功夫要做足。
6、与老板沟通一次
最好是面对面地沟通,好好表现一下自己,虚心听取老板的意见,更重要的是要了解老板当前关心的重点
程序员每年该做的事
1、年终总结
每个公司都会做的事情,但你真正认真地总结过自己吗?
2、兑现给自己、给家人的承诺
给老婆、儿子的新年礼物买了没有?给自己的呢?
3、下年度工作规划
好好想想自己明年的发展目标,争取升职/加薪、跳槽还是自己出来干?
4、掌握一项新技术
至少是一项,作为程序员一年要是一项新技术都学不到手,那就一定会被淘汰。
掌握可不是看本书就行的,要真正懂得应用,最好你能够写一篇教程发表到你的blog
5、推出一种新产品
可以是一个真正的产品,也可以只是一个类库,只要是你创造的东西就行,让别人使用它,也为世界作点贡献。当然如果真的很有价值,收点注册费也是应该的
6、与父母团聚一次
常回家看看,常回家看看
收藏:
QQ书签
del.icio.us
订阅:
Google
抓虾
jsp基础
鱼 发表于 2008-01-05 12:57:03
JSP的容器是TOMCAT,如果我们要发布一个网页,我们把它发布到TOMCAT的webapps(web应用)目录下。这个目录下必须有一个WEB-INF(文件夹,必须是大写的),这里放一个web.xml文件。
JSP的三种脚本:
1.表达格式:<%= %>
2.servlet格式:<% %>
3.声明格式:<%! %>
JSP的标签
指令/动作
指令标签:page/include/taglib(这三个是最常用的),一个指令,对JSP的设定和要求。
1.Page:用来定义整个JSP页面的一些属性和这些属性的值。
如:<%@ page contentType=”text/html;charset=GB2312”%>
2.page指令的格式:<%@ page 属性1=”属性1的值” 属性2=”属性2的值”…%>
属性值总是用单引号或双引号括起来,import属性在一个页面可以设置多次,其它的在一个页面中只能设一次。
3.当你为import指定多个属性值时,JSP引擎把JSP页面转译成的JAVA程序中导入那些包…
4.在一个JSP页面中,也可也使用多个page指令来指定属性及其值。需要注意的是:可以使用多个page指令给属性import几个值,但其它属性只能使用一次page指令指定该属性一个值。
5.下面是错的:<%@ page contentType=”text/html;charset=GB2312”%>
<% @ page contentType=”text/html;charset=GB2312”%>
:<%@ page languane=”java”%>现在只有JAVA一个值.
:有些包不用import引入,java.lang.*;/javax.servlet.*/javax.servlet.jsp.*/javax.servlet.http.*
contentType:
作用:定义JSP页面响应的MIME(Multipurpose Internet Mail Extention)类型和JSP页面字符的编码。
一般形式:”MIME类型”
“MIME类型;charset= 编码”
如:<%page contentType=”text/html;charset=GB2312”%>
默认值:contentType=”text/html;charset=GB2312”
Session属性:
作用:用于设置是否需要使用内置的session对象。
我们一般不关闭它。
Buffer属性:
设置out的缓冲区的大小或不使用缓冲区
默认值是8kb.
可以取值”none”,一般不变。
autoFlush属性
指定out的缓冲区被填满时,缓冲区是否自动刷新。
取值:true(默认)/false(这样设,是表明你要自已手动控制。如果满,出现缓存溢出异常)。
isTreadSafe
用来设置JSP页面是否可多线程访问。
取值:true(默认)/false。
info
为JSP页面准备一个字符串,属性值是某个字符串。
例如:<%@ page info=”we are students”%>
示例:(没打完!!!)
<%@ page contentType=”text/html;…”%>
<%@ page info=”我!张惠妹。”%>
<HTML>
<BODY bgcolor=cyan><FONT SIZE=5>
<P>谁呀?
<% …%>
</p>
</body>
</html>
Include指令标签
在JSP页面出现该指令的位置处,静态插入一个文件。
<%@ include file=”文件的名字”%>
注意:被插入文件必须是可访问的,并且在根内,就是目录以内的。不能超出。
<html>
<head>
<title>标签示例</title>
</head>
<body bgcolor=cyan>
<h3>
<%@ include file="Hello.txt"%>
</h3>
</body>
</html>
Include动作标签
告诉JSP页面动态包含一个文件
格式:<jsp:include page=”文件的名字”/>
或:<jsp:include page=”文件的名字”>
</jsp:include>
示例:<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
<title>用Include动作标签来显示中文</title>
</head>
<body bgcolor=cyan><font size=1>
<p>加载的文件:
<jsp:include page="Hello.txt"/>
</body>
</html>
Hello.txt的内容:{
<H4>你好,祝学习进步!
<BR>ipnuJSP要有Java语言的基础。
<br>要认真学习JSP的基本语法。
</h4>
}
Param动作标签
以“名字——值”对的形式国其它标签提供附加信息,与jsp:include、jsp:forward、jsp:plugin标签一起使用.
示例:
Forward动作标签
从该指令处停止当前页面的继续执行,而转向另一JSP页面
格式:
练习:首先随机获取一个数,如果该数大于0.5就转向页面A.jsp;否则转向页面B.jsp
A.jsp存放在DemoForward/Myfile下
B.jsp存放在DemoForward/下
DemoForward.jsp存放在DemoForward/下
结果没有出来,因为目录没有设置
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
</head>
<body bgcolor=cyan>
<%double i=Math.random();
if(i>0.5){%>
<jsp:forward page="myfile/a.jsp"></jsp:forward>
<%
}else{
%>
<jsp:forward page="b.jsp"/>
<%}%>
</body>
</html>
JSP内置对象
out/request/response/application/pageContext/page/session/config
在JSP中不需要声明,可以直接使用。
Out
常用方法:out.print()/out.println()/out.newLine()/out.flush()把缓冲区中的内容输出到屏幕/out.close()
Request对象
封装了用户提交的信息
调用相应的方法可以获取封装的信息
客户端向服务器发送一个请求(request),服务器应答(response)
Request:我们可以从它里面得到用户的输入。
<form action=”tom.jsp” method=”post”>
<input type=”text” name=”boy” value=”ok”>//boy代表用户输入的值
<input type=”submit” value=”送出” name=”submit”>
接收:String str=request.getParameter(“boy”);对应表单中的name
练习: 通过表单向accept.jsp提交一个正数,然后由accept.jsp计算这个数的平方根并显示
获取客户提交的信息
String textContent=request.getParameter(“girl”);
If textContent=””
{…}
处理汉字信息
Response重定向:
Response.sendRedirect(URL url)
作用:将客户重新引导至另一个页面,原来request里的东西没了,变成新的了!
JSP的三种脚本:
1.表达格式:<%= %>
2.servlet格式:<% %>
3.声明格式:<%! %>
JSP的标签
指令/动作
指令标签:page/include/taglib(这三个是最常用的),一个指令,对JSP的设定和要求。
1.Page:用来定义整个JSP页面的一些属性和这些属性的值。
如:<%@ page contentType=”text/html;charset=GB2312”%>
2.page指令的格式:<%@ page 属性1=”属性1的值” 属性2=”属性2的值”…%>
属性值总是用单引号或双引号括起来,import属性在一个页面可以设置多次,其它的在一个页面中只能设一次。
3.当你为import指定多个属性值时,JSP引擎把JSP页面转译成的JAVA程序中导入那些包…
4.在一个JSP页面中,也可也使用多个page指令来指定属性及其值。需要注意的是:可以使用多个page指令给属性import几个值,但其它属性只能使用一次page指令指定该属性一个值。
5.下面是错的:<%@ page contentType=”text/html;charset=GB2312”%>
<% @ page contentType=”text/html;charset=GB2312”%>
:<%@ page languane=”java”%>现在只有JAVA一个值.
:有些包不用import引入,java.lang.*;/javax.servlet.*/javax.servlet.jsp.*/javax.servlet.http.*
contentType:
作用:定义JSP页面响应的MIME(Multipurpose Internet Mail Extention)类型和JSP页面字符的编码。
一般形式:”MIME类型”
“MIME类型;charset= 编码”
如:<%page contentType=”text/html;charset=GB2312”%>
默认值:contentType=”text/html;charset=GB2312”
Session属性:
作用:用于设置是否需要使用内置的session对象。
我们一般不关闭它。
Buffer属性:
设置out的缓冲区的大小或不使用缓冲区
默认值是8kb.
可以取值”none”,一般不变。
autoFlush属性
指定out的缓冲区被填满时,缓冲区是否自动刷新。
取值:true(默认)/false(这样设,是表明你要自已手动控制。如果满,出现缓存溢出异常)。
isTreadSafe
用来设置JSP页面是否可多线程访问。
取值:true(默认)/false。
info
为JSP页面准备一个字符串,属性值是某个字符串。
例如:<%@ page info=”we are students”%>
示例:(没打完!!!)
<%@ page contentType=”text/html;…”%>
<%@ page info=”我!张惠妹。”%>
<HTML>
<BODY bgcolor=cyan><FONT SIZE=5>
<P>谁呀?
<% …%>
</p>
</body>
</html>
Include指令标签
在JSP页面出现该指令的位置处,静态插入一个文件。
<%@ include file=”文件的名字”%>
注意:被插入文件必须是可访问的,并且在根内,就是目录以内的。不能超出。
<html>
<head>
<title>标签示例</title>
</head>
<body bgcolor=cyan>
<h3>
<%@ include file="Hello.txt"%>
</h3>
</body>
</html>
Include动作标签
告诉JSP页面动态包含一个文件
格式:<jsp:include page=”文件的名字”/>
或:<jsp:include page=”文件的名字”>
</jsp:include>
示例:<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
<title>用Include动作标签来显示中文</title>
</head>
<body bgcolor=cyan><font size=1>
<p>加载的文件:
<jsp:include page="Hello.txt"/>
</body>
</html>
Hello.txt的内容:{
<H4>你好,祝学习进步!
<BR>ipnuJSP要有Java语言的基础。
<br>要认真学习JSP的基本语法。
</h4>
}
Param动作标签
以“名字——值”对的形式国其它标签提供附加信息,与jsp:include、jsp:forward、jsp:plugin标签一起使用.
示例:
Forward动作标签
从该指令处停止当前页面的继续执行,而转向另一JSP页面
格式:
练习:首先随机获取一个数,如果该数大于0.5就转向页面A.jsp;否则转向页面B.jsp
A.jsp存放在DemoForward/Myfile下
B.jsp存放在DemoForward/下
DemoForward.jsp存放在DemoForward/下
结果没有出来,因为目录没有设置
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
</head>
<body bgcolor=cyan>
<%double i=Math.random();
if(i>0.5){%>
<jsp:forward page="myfile/a.jsp"></jsp:forward>
<%
}else{
%>
<jsp:forward page="b.jsp"/>
<%}%>
</body>
</html>
JSP内置对象
out/request/response/application/pageContext/page/session/config
在JSP中不需要声明,可以直接使用。
Out
常用方法:out.print()/out.println()/out.newLine()/out.flush()把缓冲区中的内容输出到屏幕/out.close()
Request对象
封装了用户提交的信息
调用相应的方法可以获取封装的信息
客户端向服务器发送一个请求(request),服务器应答(response)
Request:我们可以从它里面得到用户的输入。
<form action=”tom.jsp” method=”post”>
<input type=”text” name=”boy” value=”ok”>//boy代表用户输入的值
<input type=”submit” value=”送出” name=”submit”>
接收:String str=request.getParameter(“boy”);对应表单中的name
练习: 通过表单向accept.jsp提交一个正数,然后由accept.jsp计算这个数的平方根并显示
获取客户提交的信息
String textContent=request.getParameter(“girl”);
If textContent=””
{…}
处理汉字信息
Response重定向:
Response.sendRedirect(URL url)
作用:将客户重新引导至另一个页面,原来request里的东西没了,变成新的了!
收藏:
QQ书签
del.icio.us
订阅:
Google
抓虾
