2009年1月20日星期二
【转贴】Apache Commons工具集简介收藏
导读:
Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动。我选了一些比较常用的项目做简单介绍。文中用了很多网上现成的东西,我只是做了一个汇总整理。
一、Commons BeanUtils
http://jakarta.apache.org/commons/beanutils/index.html
说明:针对Bean的一个工具集。由于Bean往往是有一堆get和set组成,所以BeanUtils也是在此基础上进行一些包装。
使用示例:功能有很多,网站上有详细介绍。一个比较常用的功能是Bean Copy,也就是copy bean的属性。如果做分层架构开发的话就会用到,比如从PO(Persistent Object)拷贝数据到VO(Value Object)。
传统方法如下:
//得到TeacherForm
TeacherForm teacherForm=(TeacherForm)form;
//构造Teacher对象
Teacher teacher=new Teacher();
//赋值
teacher.setName(teacherForm.getName());
teacher.setAge(teacherForm.getAge());
teacher.setGender(teacherForm.getGender());
teacher.setMajor(teacherForm.getMajor());
teacher.setDepartment(teacherForm.getDepartment());
//持久化Teacher对象到数据库
HibernateDAO= ;
HibernateDAO.save(teacher);
使用BeanUtils后,代码就大大改观了,如下所示:
//得到TeacherForm
TeacherForm teacherForm=(TeacherForm)form;
//构造Teacher对象
Teacher teacher=new Teacher();
//赋值
BeanUtils.copyProperties(teacher,teacherForm);
//持久化Teacher对象到数据库
HibernateDAO= ;
HibernateDAO.save(teacher);
二、Commons CLI
http://jakarta.apache.org/commons/cli/index.html
说明:这是一个处理命令的工具。比如main方法输入的string[]需要解析。你可以预先定义好参数的规则,然后就可以调用CLI来解析。
使用示例:
// create Options object
Options options = new Options();
// add t option, option is the command parameter, false indicates that
// this parameter is not required.
options.addOption("t", false, "display current time");
options.addOption("c", true, "country code");
CommandLineParser parser = new PosixParser();
CommandLine cmd = parser.parse( options, args);
if(cmd.hasOption("t")) {
// print the date and time
}else {
// print the date
}
// get c option value
String countryCode = cmd.getOptionValue("c");
if(countryCode == null) {
// print default date
}else {
// print date for country specified by countryCode
}
三、Commons Codec
http://jakarta.apache.org/commons/codec/index.html
说明:这个工具是用来编码和解码的,包括Base64,URL,Soundx等等。用这个工具的人应该很清楚这些,我就不多介绍了。
四、Commons Collections
http://jakarta.apache.org/commons/collections/
说明:你可以把这个工具看成是java.util的扩展。
使用示例:举一个简单的例子
OrderedMap map = new LinkedMap();
map.put("FIVE", "5");
map.put("SIX", "6");
map.put("SEVEN", "7");
map.firstKey(); // returns "FIVE"
map.nextKey("FIVE"); // returns "SIX"
map.nextKey("SIX"); // returns "SEVEN"
五、Commons Configuration
http://jakarta.apache.org/commons/configuration/
说明:这个工具是用来帮助处理配置文件的,支持很多种存储方式
1. Properties files
2. XML documents
3. Property list files (.plist)
4. JNDI
5. JDBC Datasource
6. System properties
7. Applet parameters
8. Servlet parameters
使用示例:举一个Properties的简单例子
# usergui.properties, definining the GUI,
colors.background = #FFFFFF
colors.foreground = #000080
window.width = 500
window.height = 300
PropertiesConfiguration config = new PropertiesConfiguration("usergui.properties");
config.setProperty("colors.background", "#000000);
config.save();
config.save("usergui.backup.properties);//save a copy
Integer integer = config.getInteger("window.width");
Commons DBCP
http://jakarta.apache.org/commons/dbcp/
说明:Database Connection pool, Tomcat就是用的这个,不用我多说了吧,要用的自己去网站上看说明。
六、Commons DbUtils
http://jakarta.apache.org/commons/dbutils/
说明:我以前在写数据库程序的时候,往往把数据库操作单独做一个包。DbUtils就是这样一个工具,以后开发不用再重复这样的工作了。值得一体的是,这个工具并不是现在流行的OR-Mapping工具(比如Hibernate),只是简化数据库操作,比如
QueryRunner run = new QueryRunner(dataSource);
// Execute the query and get the results back from the handler
Object[] result = (Object[]) run.query("SELECT * FROM Person WHERE name=?", "John Doe");
七、Commons FileUpload
http://jakarta.apache.org/commons/fileupload/
说明:jsp的上传文件功能怎么做呢?
使用示例:
// Create a factory for disk-based file items
FileItemFactory factory = new DiskFileItemFactory();
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Parse the request
List /* FileItem */ items = upload.parseRequest(request);
// Process the uploaded items
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (item.isFormField()) {
processFormField(item);
} else {
processUploadedFile(item);
}
}
八、Commons HttpClient
http://jakarta.apache.org/commons/httpclient/
说明:这个工具可以方便通过编程的方式去访问网站。
使用示例:最简单的Get操作
GetMethod get = new GetMethod("http://jakarta.apache.org");
// execute method and handle any error responses.
...
InputStream in = get.getResponseBodyAsStream();
// Process the data from the input stream.
get.releaseConnection();
九、Commons IO
http://jakarta.apache.org/commons/io/
说明:可以看成是java.io的扩展,我觉得用起来非常方便。
使用示例:
1.读取Stream
标准代码:
InputStream in = new URL( "http://jakarta.apache.org" ).openStream();
try {
InputStreamReader inR = new InputStreamReader( in );
BufferedReader buf = new BufferedReader( inR );
String line;
while ( ( line = buf.readLine() ) != null ) {
System.out.println( line );
}
} finally {
in.close();
}
使用IOUtils
InputStream in = new URL( "http://jakarta.apache.org" ).openStream();
try {
System.out.println( IOUtils.toString( in ) );
} finally {
IOUtils.closeQuietly(in);
}
2.读取文件
File file = new File("/commons/io/project.properties");
List lines = FileUtils.readLines(file, "UTF-8");
3.察看剩余空间
long freeSpace = FileSystemUtils.freeSpace("C:/");
十、Commons JXPath
http://jakarta.apache.org/commons/jxpath/
说明:Xpath你知道吧,那么JXpath就是基于Java对象的Xpath,也就是用Xpath对Java对象进行查询。这个东西还是很有想像力的。
使用示例:
Address address = (Address)JXPathContext.newContext(vendor).
getValue("locations[address/zipCode='90210']/address");
上述代码等同于
Address address = null;
Collection locations = vendor.getLocations();
Iterator it = locations.iterator();
while (it.hasNext()){
Location location = (Location)it.next();
String zipCode = location.getAddress().getZipCode();
if (zipCode.equals("90210")){
address = location.getAddress();
break;
}
}
十一、Commons Lang
http://jakarta.apache.org/commons/lang/
说明:这个工具包可以看成是对java.lang的扩展。提供了诸如StringUtils, StringEscapeUtils, RandomStringUtils, Tokenizer, WordUtils等工具类。
十二、Commons Logging
http://jakarta.apache.org/commons/logging/
说明:你知道Log4j吗?
十三、Commons Math
http://jakarta.apache.org/commons/math/
说明:看名字你就应该知道这个包是用来干嘛的了吧。这个包提供的功能有些和Commons Lang重复了,但是这个包更专注于做数学工具,功能更强大。
十四、Commons Net
http://jakarta.apache.org/commons/net/
说明:这个包还是很实用的,封装了很多网络协议。
1. FTP
2. NNTP
3. SMTP
4. POP3
5. Telnet
6. TFTP
7. Finger
8. Whois
9. rexec/rcmd/rlogin
10. Time (rdate) and Daytime
11. Echo
12. Discard
13. NTP/SNTP
使用示例:
TelnetClient telnet = new TelnetClient();
telnet.connect( "192.168.1.99", 23 );
InputStream in = telnet.getInputStream();
PrintStream out = new PrintStream( telnet.getOutputStream() );
...
telnet.close();
十五、Commons Validator
http://jakarta.apache.org/commons/validator/
说明:用来帮助进行验证的工具。比如验证Email字符串,日期字符串等是否合法。
使用示例:
// Get the Date validator
DateValidator validator = DateValidator.getInstance();
// Validate/Convert the date
Date fooDate = validator.validate(fooString, "dd/MM/yyyy");
if (fooDate == null) {
// error...not a valid date
return;
}
十六、Commons Virtual File System
http://jakarta.apache.org/commons/vfs/
说明:提供对各种资源的访问接口。支持的资源类型包括
1. CIFS
2. FTP
3. Local Files
4. HTTP and HTTPS
5. SFTP
6. Temporary Files
7. WebDAV
8. Zip, Jar and Tar (uncompressed, tgz or tbz2)
9. gzip and bzip2
10. res
11. ram
这个包的功能很强大,极大的简化了程序对资源的访问。
使用示例:
从jar中读取文件
// Locate the Jar file
FileSystemManager fsManager = VFS.getManager();
FileObject jarFile = fsManager.resolveFile( "jar:lib/aJarFile.jar" );
// List the children of the Jar file
FileObject[] children = jarFile.getChildren();
System.out.println( "Children of " + jarFile.getName().getURI() );
for ( int i = 0; i
System.out.println( children[ i ].getName().getBaseName() );
}
从smb读取文件
StaticUserAuthenticator auth = new StaticUserAuthenticator("username", "password", null);
FileSystemOptions opts = new FileSystemOptions();
DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts, auth);
FileObject fo = VFS.getManager().resolveFile("smb://host/anyshare/dir", opts);
2009年1月19日星期一
话“福”字倒贴的文化
"福"字文化内涵丰富,是中华民族先进文化的重要组成部分,是一个正文化、活文化体系,倒着贴福的滑稽做法和无聊的戏说,有悖中国的"年文化"、"门文化"与福文化,有失民族文化的高贵与尊严,是一种伪文化、垃圾文化和非吉祥文化。
又一年新春。忙活了一年的人们,都张罗着贴"福"字,纳福,祝福,以祈"春至福临"。
你看过2004年猴年中央电视台的春节联欢晚会吗?你一定会记得,大幕开启,首先映入眼帘的是舞台背景上一个硕大无比、光彩夺目的"福"字。这 是晚会的主题。随着镜头转动,看到流光溢彩的舞台布满"福"字,舞台对面幕墙上对应着"福星高照"四个金光闪闪的大字。演出开始,欢快的乐曲响起,喜气洋 洋登场的演员,手舞"福"字,齐声向全国人民拜年祝福。顿时,晚会现场一片欢腾。这台晚会紧扣全国人民建设小康社会,走向幸福生活的主题,充满了吉祥、喜 庆、祝愿的色彩,与人们追求幸福、创造幸福的共同心理和愿望产生共鸣,给我们留下深刻印象。
说到福,不能不说"福"字。福是什么?福是一种感觉和满足,一种意境和状态,一种期待,一种文化。心中有天地,哪怕身处斗室,一样遨游于宇宙 间。心有多少福,你的世界就有多大福。境由心造,福在心里。"福"字,是中国几千个汉字当中最受人喜欢的美好字,是吉祥意义最丰富、最淳厚、最集中、最典 型的字。中华民族五千年文明史,福是最吉祥的象征、最真诚的祝愿,福是人们向往和追求的最高境地。不论寒微草泽,还是富贵显达,都企福纳福。历朝历代,为 民造福是为官者取信于民的誓言,期望幸福是芸芸众生的谋求,福满人间是太平盛世的向往,福星高照是万千家室的憧憬。岁月沧桑,时光轮回,福字深深留在人们 心中,生生不息的福运之火穿透时空隧道,穿透心灵空间,穿透数千年风涛烟云依然燃烧。福字在中华民族的历史长河中,伴随社会文明进步的发展史,伴随人们谋 求美满明天的奋斗史。福,中华大地随处可见的独有现象,足可看出对这一最具中国传统文化特质的精神理念的自觉性认识,被广泛植根于中国人的思维形态中,成 为中华民族一种特有的优良文化,一种独具象征意义的吉祥符号,一种由一个汉字拓展出来的文化��"福文化"。福,就像撕不清陶醉、拽不断回味的一坛陈年老 酒,说不完的内容,道不尽的涵义。福是抽象的,但人对福的诠释与解读是具象的,如今已经成了一种追求,一种动力,一种奋斗目标。这就是文化的力量,思想的 力量。
实际,贴"福"是人们和谐向上、崇尚美好的一种心理反映。福,幸福,福气,福运。福之所至,小到个体,大到人类。《韩非子》:"福者,备 也。"福,无处不在,无人不求。人在心底对福的涌动表现形式是各异的,不随意表达的,特别是对永久性福运追求的表现,不同的场合空间表达方式是不一样的。 春节,是劳动人民最看重的吉祥节日,人们在这样的重大喜庆时刻表达对福的追求是最完美的,有一种表达方式叫挥春,就是在大红纸上书写吉祥话,贴到门窗和墙 上,而贴福字是最常见的一种古老挥春方式,在那时生产力不发达的远古时代,人们祈求有田有衣是最大的心理满足,福字结构引申义"一口田、衣禄全"最能说明 人们心里的全部企盼。据南宋吴自牧著的描写南宋都城临安市情风物的书《梦梁录》记载:"岁旦在迩,席铺百货,画门神桃符,迎春牌儿……";"士庶家不论大 小,钉桃符,贴春牌",也有的把"福"字精描细做成寿星、寿桃、五谷丰登、龙凤呈祥等图案。"腊月二十四,家家写大字"。"贴春牌"和"写大字"就是写在 红纸上的"福"字,一种对幸福的向往与追求。
门上贴福字这种挥春习俗由来已久。相传明代明太祖朱元璋有一年元宵节出访,在一个镇上看见一幅画,画了一个骑在马上的赤脚女人抱着大西瓜。由于 当朝的马皇后是淮西人,朱元璋认为是讥讽马皇后出身寒微(古代细脚是身份的象征,只有富家小姐缠足),令御林军把画画的人和围观的人家满门抄斩,心腹悄悄 在挂画的那家门口倒贴一个福字作记号,人们看着倒贴福字很喜庆,各家都贴上倒着的福字,御林军无法识别,事情不了了之。后来全府的人知道曾有大事发生,都 认为是倒贴的福字福佑,逢凶化吉,平安吉祥。
还有一说,贴福字源于清朝。咸丰年间的一个春节,恭王府管家为讨主子欢心,悉心写了几个斗大的福字,叫人贴到库房和王府的大门上,有个家人不识 字,竟把福字倒贴在了大门上,恭亲王的福晋(妻子)很气恼,事办到这份上显得自己没成色,怕福晋怪罪连累自身,管家能言善辩,忙为自己的不足辩解:"奴才 常听人说恭亲王寿高福大,如今大福真的到(倒)了,吉庆之兆。"恭亲王转怒为喜,心想"怪不得过往行人都说恭亲王府福到(倒)了。吉语说千遍,金银增万 贯。"遂赏管家和家丁各50两银子。这事很快传出去,倒贴"福"字由达官府第传入陌巷人家。清代的主流文体是楹联,楹联文学的全盛时期是清代。1840年 孙髯的昆明大观楼长联是清代楹联发展的重要里程碑,标志着楹联已成为可与诗词曲赋分庭抗礼、媲美争妍的独立文体,以楹联赠答作文字游戏成为风尚,但贴福字 源于清朝显然有些附会。
当然也有的说贴"福"字源于3100多年前的周朝辅佐周武王建立周朝的大功臣姜子牙。《史记》记载,姜子牙年登八十被周文王重用,因随周武王伐 纣有功,被封在山东营丘,建立了齐国,姜子牙的后人就以齐国的国名作为自己的姓氏。姜子牙的神奇故事,经过小说《封神榜》渲染,广为流传在民间,成了人们 心中的一个神化人物。说姜子牙(即姜太公)封神时,他老婆也来讨封。姜子牙说:"你嫁到我家穷了一辈子,你命穷,封你为穷神吧。"老婆一听有个神字很满 意,便问占哪里?姜子牙说:"有福的地方不能去。"这事传出去,老百姓就在门窗上雕刻福字,过年到处贴上大福字,就是牛棚、猪圈、鸡舍、厕所、粪堆也贴上 便于区别的倒福字,驱赶穷神。给人视觉和心理不雅的地方倒贴福字成了一种共识和约定俗成。
春节,已有四千多年历史。公元前两千一百多年,人们以木星运动一周的时间为一岁,把春节叫作"岁"。公元前一千年前,人们以"年"表示春节。" 年"在当时的含义是五谷丰登的意思,获得丰收叫"有年",获得大丰收称"大有年",当时就有挂物庆贺的朦胧,过春节贴红纸牌贴福字是人们幸福感多样性的暗 示和昭示。
"福"在特定条件和环境下,人对物质及精神需求满足程度的感受、认识和评价,受物质文化生活条件及所处环境的支配,又受人的理想、道德、信念和 认知水平的制约。它随人类文明的产生而产生,又随社会文明的进步发展而演化。人类文明由低级向高级以至超级发展,永远不会停止,"福"字内涵也是从初级 (生存需要)向高级(衣食住行及精神满足)乃至超级发展(物质、精神、健康全面发展),是一个永无止境、永无定势及统一标准的观念感受。毛泽东1964年 春创作的《贺新郎・读史》开头:"人猿相揖别。只几个石头磨过,小儿时节。"16个字概括了类人猿演变到人200多万年的历史,刻画了原始人时期至石器时 代人类"小儿时节"的境况。那时人比兽类高级之处是手脚分工,能打磨石头做工具进行"生产劳动",与猛兽争食,茹毛饮血生存,不可能具有福的追求和思维。 到结绳记事,造网渔猎。神农氏继位,制犁耙种地,用产物与他人交换"各得其所。"以后黄帝、尧、舜氏等做桨、做船,牛马运输,巢穴安门挡风防兽,制作弓 弩,发明文字,建立书契制度,朦朦胧胧的"幸福"感产生,并用一个象形符号"�"或"富"记载。"�"为象形,"腹"字的初文,"田"象腹形,"十"符表 示充满之意,即"�"有腹满和富的意思。所以东汉刘熙的《释名・释言语》说"福者,富也"。东汉许慎《说文解字》把福的含义向前推进一步:"福,佑之", 神灵保�。后来"福"字的定型,使福义提升到"物质和精神"并重两个层面。演绎到极致要算近代康熙。康熙三岁没了母亲,是孝庄皇太后一手把他拉扯大。康熙 12年(公元1673年)60大寿的孝庄太后病重无策,康熙查知古有"承帝事"请福续寿之说,决定为祖母请福。斋戒三日,精选一只镌有"赐福苍生"正楷金 字的毛笔,在丝绢制作的纸笺上挥就了倾注对祖母挚爱的"福"字,郑重加顶象征皇权的"康熙御笔之宝"玉玺,寓意鸿运当头,镇天下妖邪,对一般书法作品这是 空前绝后的。康熙的福字,福寿合一,福中有寿,福寿双全,绝无仅有;暗含"多子、多才、多田、多寿、多福"汉字,独一无二的"五福"合一。字形瘦窄,谐称 "长寿福"。当时康熙19岁,即位13年,风华正茂,书法极佳,但一生罕有题字,据考今天北京城只有"福"和交泰殿悬挂的匾额"无为"三个字。太后得御" 福",说"福之本源",自此病愈,活到75岁寿终。1962年,周恩来总理批示重修恭王府时欣然命名为"中华第一福",又称"天下第一福",被列为中华文 化遗产瑰宝、国家级重点保护文物藏于故宫。
福文化是中华民族先进文化的重要组成部分,中华民族智慧的源泉,从学术角度看,是中华大文化的分支,从中华民族精神和发展看,福文化可作为中华 大文化的根本和归宿。福文化,中华民族世世代代的伟大信念和不懈追求;福文化,生生不息,流淌于每个中华儿女血管里的精神血液。它是历史发展的内在思想动 力,也是我们建设社会主义和谐社会的宝贵资源。人们对福的心理认同感和崇尚、追求,福文化蕴含的丰富的和谐、勤劳思想和道德意识,与我们党执政为民的根本 宗旨,与"三个代表"重要思想的根本要求,与构建社会主义和谐社会、全面建设小康社会的宏伟目标是一致的,相通的。无论从哪个角度讲,福文化的内涵与外延 厚重多元,福和福所折射的文化是一个正文化、活文化体系,博大精深,渊源流长,寓意深刻,严肃庄重又不失活泼喜庆,之所以被全民族所传承、所颂和、所寄 托,就在于它是所有美好事物和谐的集合,那些头朝下、脚朝上倒着贴福的滑稽做法和无聊的戏说,有悖中国的"年文化"、"门文化"与福文化的应有之意,是一 种伪文化、垃圾文化和非吉祥文化,而且那种掩盖着祸、灾和龌龊的偶然性、奇遇性和投机性的福,永远不是每一个人所希望的侥幸和虚惊。民俗讲规范,随意倒着 贴,轻率对待民俗文化姑且不论,而且失去了文化的高贵和尊严,况且福字倒贴的地方恰恰是与福义相反的寓意,可不能把"福"字倒着贴。
[转]Eclipse下的JavaScript编辑器中文无法保存问题解决
在保存脚本的时候如果有中文就会提示 保存错误
解决办法
依次选择 window(窗口)>>preferences(首选项)>>general(常规)>>content types
在右边的窗口中打开列表,选中"JavaScript",在下面的"default encoding"右边的输入框中输入"GBK"或"GB2312",再点"update"按钮,我选的中"GBK",就可以了
2009年1月17日星期六
jstl -- fn函数 17个(转)
摘自:http://yangtonggan.blog.hexun.com/17498669_d.html
URI: http://java.sun.com/jsp/jstl/functions
前缀 : fn
称呼 Functions 标签库为标签库,倒不如称呼其为函数库来得更容易理解些。因为 Functions 标签库并没有提供传统的标签来为 JSP 页面的工作服务,而是被用于 EL 表达式语句中。在 JSP2.0 规范下出现的 Functions 标签库为 EL 表达式语句提供了许多更为有用的功能。 Functions 标签库分为两大类,共 16 个函数。
长度函数: fn:length
字符串处理函数: fn:contains 、 fn:containsIgnoreCase 、 fn:endsWith 、 fn:escapeXml 、 fn:indexOf 、 fn:join 、 fn:replace 、 fn:split 、 fn:startsWith 、 fn:substring 、 fn:substringAfter 、 fn:substringBefore 、 fn:toLowerCase 、 fn:toUpperCase 、 fn:trim
以下是各个函数的用途和属性以及简单示例。
9.7.1 长度函数 fn:length 函数
长度函数 fn:length 的出现有重要的意义。在 JSTL1.0 中,有一个功能被忽略了,那就是对集合的长度取值。虽然 java.util.Collection 接口定义了 size 方法,但是该方法不是一个标准的 JavaBean 属性方法(没有 get,set 方法),因此,无法通过 EL 表达式" ${collection.size} "来轻松取得。
fn:length 函数正是为了解决这个问题而被设计出来的。它的参数为 input ,将计算通过该属性传入的对象长度。该对象应该为集合类型或 String 类型。其返回结果是一个 int 类型的值。下面看一个示例。
<%ArrayList arrayList1 = new ArrayList();
arrayList1.add("aa");
arrayList1.add("bb");
arrayList1.add("cc");
%>
<%request.getSession().setAttribute("arrayList1", arrayList1);%>
${fn:length(sessionScope.arrayList1)}
假设一个 ArrayList 类型的实例" arrayList1 ",并为其添加三个字符串对象,使用 fn:length 函数后就可以取得返回结果为" 3 "。
9.7.2 判断函数 fn:contains 函数
fn:contains 函数用来判断源字符串是否包含子字符串。它包括 string 和 substring 两个参数,它们都是 String 类型,分布表示源字符串和子字符串。其返回结果为一个 boolean 类型的值。下面看一个示例。
${fn:contains("ABC", "a")}<br>
${fn:contains("ABC", "A")}<br>
前者返回" false ",后者返回" true "。
9.7.3 fn:containsIgnoreCase 函数
fn:containsIgnoreCase 函数与 fn:contains 函数的功能差不多,唯一的区别是 fn:containsIgnoreCase 函数对于子字符串的包含比较将忽略大小写。它与 fn:contains 函数相同,包括 string 和 substring 两个参数,并返回一个 boolean 类型的值。下面看一个示例。
${fn:containsIgnoreCase("ABC", "a")}<br>
${fn:containsIgnoreCase("ABC", "A")}<br>
前者和后者都会返回" true "。
9.7.4 词头判断函数 fn:startsWith 函数
fn:startsWith 函数用来判断源字符串是否符合一连串的特定词头。它除了包含一个 string 参数外,还包含一个 subffx 参数,表示词头字符串,同样是 String 类型。该函数返回一个 boolean 类型的值。下面看一个示例。
${fn:startsWith ("ABC", "ab")}<br>
${fn:startsWith ("ABC", "AB")}<br>
前者返回" false ",后者返回" true "。
9.7.5 词尾判断函数 fn:endsWith 函数
fn:endsWith 函数用来判断源字符串是否符合一连串的特定词尾。它与 fn:startsWith 函数相同,包括 string 和 subffx 两个参数,并返回一个 boolean 类型的值。下面看一个示例。
${fn:endsWith("ABC", "bc")}<br>
${fn:endsWith("ABC", "BC")}<br>
前者返回" false ",后者返回" true "。
9.7.6 字符实体转换函数 fn:escapeXml 函数
fn:escapeXml 函数用于将所有特殊字符转化为字符实体码。它只包含一个 string 参数,返回一个 String 类型的值。
9.7.8 字符匹配函数 fn:indexOf 函数
fn:indexOf 函数用于取得子字符串与源字符串匹配的开始位置,若子字符串与源字符串中的内容没有匹配成功将返回" -1 "。它包括 string 和 substring 两个参数,返回结果为 int 类型。下面看一个示例。
${fn:indexOf("ABCD","aBC")}<br>
${fn:indexOf("ABCD","BC")}<br>
前者由于没有匹配成功,所以返回 -1 ,后者匹配成功将返回位置的下标,为 1 。
9.7.9 分隔符函数 fn:join 函数
fn:join 函数允许为一个字符串数组中的每一个字符串加上分隔符,并连接起来。它的参数、返回结果和描述如表 9.25 所示:
表 9.25 fn:join 函数
参数 | 描述 |
array | 字符串数组。其类型必须为 String[] 类型 |
separator | 分隔符。其类型必须为 String 类型 |
返回结果 | 返回一个 String 类型的值 |
下面看一个示例。
<% String[] stringArray = {"a","b","c"}; %>
<%request.getSession().setAttribute("stringArray", stringArray);%>
${fn:join(sessionScope.stringArray,";")}<br>
定义数组并放置到 Session 中,然后通过 Session 得到该字符串数组,使用 fn:join 函数并传入分隔符" ; ",得到的结果为" a;b;c "。
9.7.10 替换函数 fn:replace 函数
fn:replace 函数允许为源字符串做替换的工作。它的参数、返回结果和描述如表 9.26 所示:
表 9.26 fn:replace 函数
参数 | 描述 |
inputString | 源字符串。其类型必须为 String 类型 |
beforeSubstring | 指定被替换字符串。其类型必须为 String 类型 |
afterSubstring | 指定替换字符串。其类型必须为 String 类型 |
返回结果 | 返回一个 String 类型的值 |
下面看一个示例。
${fn:replace("ABC","A","B")}<br>
将" ABC "字符串替换为" BBC ",在" ABC "字符串中用" B "替换了" A "。
9.7.11 分隔符转换数组函数 fn:split 函数
fn:split 函数用于将一组由分隔符分隔的字符串转换成字符串数组。它的参数、返回结果和描述如表 9.27 所示:
表 9.27 fn:split 函数
参数 | 描述 |
string | 源字符串。其类型必须为 String 类型 |
delimiters | 指定分隔符。其类型必须为 String 类型 |
返回结果 | 返回一个 String[] 类型的值 |
下面看一个示例。
${fn:split("A,B,C",",")}<br>
将" A,B,C "字符串转换为数组 {A,B,C} 。
9.7.12 字符串截取函数 fn:substring 函数
fn:substring 函数用于截取字符串。它的参数、返回结果和描述如表 9.28 所示:
表 9.28 fn:substring 函数
参数 | 描述 |
string | 源字符串。其类型必须为 String 类型 |
beginIndex | 指定起始下标(值从 0 开始)。其类型必须为 int 类型 |
endIndex | 指定结束下标(值从 0 开始)。其类型必须为 int 类型 |
返回结果 | 返回一个 String 类型的值 |
下面看一个示例。
${fn:substring("ABC","1","2")}<br>
截取结果为" B "。
9.7.14 起始到定位截取字符串函数 fn:substringBefore 函数
fn:substringBefore 函数允许截取源字符从开始到某个字符串。它的参数和 fn:substringAfter 函数相同,不同的是 substring 表示的是结束字符串。下面看一个示例。
${fn:substringBefore("ABCD","BC")}<br>
截取的结果为" A "。
9.7.15 小写转换函数 fn:toLowerCase 函数
fn:toLowerCase 函数允许将源字符串中的字符全部转换成小写字符。它只有一个表示源字符串的参数 string ,函数返回一个 String 类型的值。下面看一个示例。
${fn:toLowerCase("ABCD")}<br>
转换的结果为" abcd "。
9.7.16 大写转换函数 fn:toUpperCase 函数
fn:toUpperCase 函数允许将源字符串中的字符全部转换成大写字符。它与 fn:toLowerCase 函数相同,也只有一个 String 参数,并返回一个 String 类型的值。下面看一个示例。
${fn:toUpperCase("abcd")}<br>
转换的结果为" ABCD "。
9.7.17 空格删除函数 fn:trim 函数
fn:trim 函数将删除源字符串中结尾部分的"空格"以产生一个新的字符串。它与 fn:toLowerCase 函数相同,只有一个 String 参数,并返回一个 String 类型的值。下面看一个示例。
${fn:trim("AB C ")}D<br>
转换的结果为" AB CD ",注意,它将只删除词尾的空格而不是全部,因此" B "和" C "之间仍然留有一个空格。自定义JSTL函数库(转)
摘自:http://blog.sina.com.cn/s/blog_5329b1d80100bi72.html
jstl标签库的配置
* 将jstl.jar和standard.jar拷贝到WEB-INF/lib下(如果使用el表达式,不用拷贝这两个jar)
注意:jstl必须在能够支持j2ee1.4/servlet2.4/jsp2.0版本上的容器才能运行,这个环境
是目前较为常用的环境
标签库的使用
* 采用taglib指令引入
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
自定义函数库:
1、定义类和方法(方法必须是public static)
2、编写自定义tld文件,并且将此文件放到WEB-INF或WEB-INF任意子目录下
3、在jsp中采用taglib指令引入自定义函数库
4、采用 前缀+冒号+函数名 调用即可
MyFunctions.java
public class MyFunctions {
public static String sayHello(String name) {
return "Hello " + name;
}
myfunctions.tld
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>my functions library</description>
<display-name>my functions</display-name>
<tlib-version>1.0</tlib-version>
<short-name>my</short-name>
<uri>http://www.bjsxt.com/functions</uri>
<function>
<name>sayHello</name>
<function-class>com.bjsxt.struts.MyFunctions</function-class>
<function-signature>java.lang.String sayHello(java.lang.String)</function-signature>
</function>
</taglib>
}
jstl_fn.jsp
注意与前面的配置文件myfunctions.tld相对应,
prefix对应<short-name>my</short-name>
uri对应 <uri>http://www.bjsxt.com/functions</uri>
<%@ taglib prefix="my" uri="http://www.bjsxt.com/functions"%>
<li>测试自定义函数库</li><br>
${my:sayHello(name) }<br>
EL表达式操作收藏(转)
摘自:http://blog.csdn.net/HAWK6/archive/2008/12/19/3558376.aspx
很久没写JAVA程序了,新工作用JAVA写WEBGAME程序时遇到EL表达式使用,对EL表达式(${})记不太清就在网上查了些资料记载下来
一、EL简介
1.语法结构
${expression}
2.[]与.运算符
EL 提供.和[]两种运算符来存取数据。
当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用 []。例如:
${user.My-Name}应当改为${user["My-Name"] }
如果要动态取值时,就可以用[]来做,而.无法做到动态取值。例如:
${sessionScope.user[data]}中data 是一个变量
3.变量
EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。
因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找。
假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null。
属性范围在EL中的名称
Page PageScope
Request RequestScope
Session SessionScope
Application ApplicationScope
二、EL隐含对象
1.与范围有关的隐含对象
与范围有关的EL 隐含对象包含以下四个:pageScope、requestScope、sessionScope 和applicationScope;
它们基本上就和JSP的pageContext、request、session和application一样;
在EL中,这四个隐含对象只能用来取得范围属性值,即getAttribute(String name),却不能取得其他相关信息。
例如:我们要取得session中储存一个属性username的值,可以利用下列方法:
session.getAttribute("username") 取得username的值,
在EL中则使用下列方法
${sessionScope.username}
2.与输入有关的隐含对象
与输入有关的隐含对象有两个:param和paramValues,它们是EL中比较特别的隐含对象。
例如我们要取得用户的请求参数时,可以利用下列方法:
request.getParameter(String name)
request.getParameterValues(String name)
在EL中则可以使用param和paramValues两者来取得数据。
${param.name}
${paramValues.name}
3.其他隐含对象
cookie
JSTL并没有提供设定cookie的动作,
例:要取得cookie中有一个设定名称为userCountry的值,可以使用${cookie.userCountry}来取得它。
header和headerValues
header 储存用户浏览器和服务端用来沟通的数据
例:要取得用户浏览器的版本,可以使用${header["User-Agent"]}。
另外在鲜少机会下,有可能同一标头名称拥有不同的值,此时必须改为使用headerValues 来取得这些值。
initParam
initParam取得设定web站点的环境参数(Context)
例:一般的方法String userid = (String)application.getInitParameter("userid");
可以使用 ${initParam.userid}来取得名称为userid
pageContext
pageContext取得其他有关用户要求或页面的详细信息。
${pageContext.request.queryString} 取得请求的参数字符串
${pageContext.request.requestURL} 取得请求的URL,但不包括请求之参数字符串
${pageContext.request.contextPath} 服务的web application 的名称
${pageContext.request.method} 取得HTTP 的方法(GET、POST)
${pageContext.request.protocol} 取得使用的协议(HTTP/1.1、HTTP/1.0)
${pageContext.request.remoteUser} 取得用户名称
${pageContext.request.remoteAddr } 取得用户的IP 地址
${pageContext.session.new} 判断session 是否为新的
${pageContext.session.id} 取得session 的ID
${pageContext.servletContext.serverInfo} 取得主机端的服务信息
三、EL运算符
1.算术运算符有五个:+、-、*或$、/或div、%或mod
2.关系运算符有六个:==或eq、!=或ne、<或lt、>或gt、<=或le、>=或ge
3.逻辑运算符有三个:&&或and、||或or、!或not
4.其它运算符有三个:Empty运算符、条件运算符、()运算符
例:${empty param.name}、${A?B:C}、${A*(B+C)}
四、EL函数(functions)。
语法:ns:function( arg1, arg2, arg3 …. argN)
其中ns为前置名称(prefix),它必须和taglib 指令的前置名称一置
以上是EL表达式使用基本语法内容
Java拷贝文件(转)
import java.io.*;
public class jCOPY {
public static void main(String args[]){
try {
jCOPY j = new jCOPY(); j.CopyFile(new File(args[0]),new File(args[1]));
}
catch (Exception e) {
e.printStackTrace();
}
}
public void CopyFile(File in, File out) throws Exception {
FileInputStream fis = new FileInputStream(in);
FileOutputStream fos = new FileOutputStream(out);
byte[] buf = new byte[1024];
int i = 0;
while((i=fis.read(buf))!=-1) {
fos.write(buf, 0, i);
}
fis.close();
fos.close();
}
}
javascript中replace() (转)
在javascript中,String的函数replace()简直太让人喜爱了。它灵活而强大的字符替换处理能力,让我不禁想向大家介绍它。
replace()最简单的算是能力就是简单的字符替换。示例代码如下:
<script language="javascript">
var strM = "javascript is a good script language";
//在此我想将字母a替换成字母A
alert(strM.replace("a","A"));
</script>
我想大家运行后可以看到结果,它只替换了首字母。但如果加上正则表达式结果就不一样了!呵呵,没错。replace()支持正则表达式,它可以按照正则表达式的规则匹配字符或字符串,然后给予替换!
<script language="javascript">
var strM = "javascript is a good script language";
//在此我想将字母a替换成字母A
alert(strM.replace(/a/,"A"));
</script>
呵呵,您一定发现了。这样还是只替换了第一个字母a。如果您熟悉正则,那这就难不住您。稍加修改就OK了。
<script language="javascript">
var strM = "javascript is a good script language";
//在此将字母a全部替换成字母A
alert(strM.replace(/a/g,"A"));
</script>
还可以这样,看看效果!
<script language="javascript">
var strM = "javascript is a good script language";
alert(strM.replace(/(javascript)\s*(is)/g,"$1 $2 fun. it $2"));
</script>
我这儿举的例子都是很简单的应用,replace()在此点上与您使用正则表达式的能力成正比。您正则表达式越强,呵呵,那您就会越疯狂的爱上它。
当然,我这儿推荐replace()的原因并不因为它能与正则表达式合作,而在于它还能与函数进行合作,发挥出强大的功能。
先看看简单例子:将所有单词首字母换成大写。
<script language="javascript">
var strM = "javascript is a good script language";
function change(word)
{
return word.indexOf(0).toUpperCase()+word.substring(1);
}
alert(strM.replace(/\b\w+\b/g,change));
</script>
由上可知,当正则表达式有"g"标志时,代表将处理整个字符串,即函数change的变换将应用于所有匹配的对象。而该函数有三个或更多参数,具体个数视正则表达式而定。
有了函数与正则表达式的配合,replace()处理字符串的功能空前强大起来了!
最后还举个例子,将字符串所有单词倒序,用replace()处理是如此简单。
<script language="javascript">
var strM = "javascript is a good script language";
function change(word)
{
var result = word.match(/(\w)/g);
if ( result )
{
var str = "";
for ( var i=result.length-1; i>=0; i-- )
{
str += result;
}
return str;
}
else
{
return "null";
}
}
alert(strM.replace(/\b(\w)+\b/g,change));
</script>
关于war包 jar包 ear包 及打包方法(转)
摘自:http://hi.baidu.com/zhangxuan1224/blog/item/76406b8bd60fd515c8fc7a1c.html
war包:是做好一个web应用后,通常是网站打成包部署到容器中
jar包:通常是开发的时候要引用的通用类,打成包便于存放管理。
ear包:企业级应用 通常是EJB打成ear包
各种包的打法:
转:
兄弟,对java着迷吗,或者是为了自己的生计,不论怎样都欢迎你进入精彩java世界,welcome!可能你刚刚对每个人说:Hello World!也或者……ok!这已经足够了。那就让我们开始吧,开始这个魔幻世界的旅程:
jar文件听说过吗,没有?或者陌生!好,没关系,这就是我们的第一站:打包发布。
为什么会有这个玩意呢,首先,这是jar的全称:JavaTM Archive (JAR) file,是的,就是java存档文件。这有点类似zip文件,想一想它是干什么的用的呢,压缩!?没错就是要压缩,将我们原先零散的东西放到一下,重新 组织,所有这些目的只有一个:方便!好了,不用管他是怎么压缩的,我们的重点是哪些是我们要压缩的(输入),还有压缩成了什么(输出),进而将它发布(部 署)。
那我们的输入(要压缩的东西)主要是class文件,还有辅助的资源(这其中可能有图片,jsp文件,html文件等等)。Jar技术在jdk1.1版本 中就已存在,在1.2中又有了增强。接下来说说jar的好处吧,这是官方的描述:安全,快速下载,压缩,猎取包,版本化包,可携。
说了这么多,我们现在开始实施。
先打开命令提示符(win2000或在运行筐里执行cmd命令,win98为DOS提示符),输入jar �help,然后回车(如果你盘上已经有了jdk1.1或以上版本),看到什么:
用法:jar {ctxu}[vfm0Mi] [jar-文件] [manifest-文件] [-C 目录] 文件名 ...
选项:
-c 创建新的存档
-t 列出存档内容的列表
-x 展开存档中的命名的(或所有的〕文件
-u 更新已存在的存档
-v 生成详细输出到标准输出上
-f 指定存档文件名
-m 包含来自标明文件的标明信息
-0 只存储方式;未用ZIP压缩格式
-M 不产生所有项的清单(manifest〕文件
-i 为指定的jar文件产生索引信息
-C 改变到指定的目录,并且包含下列文件:
如果一个文件名是一个目录,它将被递归处理。
清单(manifest〕文件名和存档文件名都需要被指定,按'm' 和 'f'标志指定的相同顺序。
示例1:将两个class文件存档到一个名为 'classes.jar' 的存档文件中:
jar cvf classes.jar Foo.class Bar.class
示例2:用一个存在的清单(manifest)文件 'mymanifest' 将 foo/ 目录下的所有文件存档到一个名为 'classes.jar' 的存档文件中:
jar cvfm classes.jar mymanifest -C foo/ .
来个小例子试试看:
我们只有一个HelloWorld,如下:
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hi, Hello World!");
}
}
我将这个java文件存到C盘跟目录下,ok,接下来,
在先前打开的命令提示符下(跳转到C盘提示符下),我们输入javac HelloWorld.java,然后继续输入:jar cvf hello.jar HelloWorld.class,回车后去你的C盘看看,多了什么,没错 hello.jar 。
基本的步骤我们现在都知道了,你可以自己去尝试一下随着jar后面的参数的不同,结果有什么变化。
紧接着我们看看如何运行我们的jar包。
在进入正题之前,你要先打开我们刚刚做好的jar包看看,多了什么呢,META-INF目录?再看看里面是什么,还有一个MANIFEST.MF文件是不是?用文本编辑器(我这里是UltraEdit)打开它看看:
Manifest-Version: 1.0
Created-By: 1.4.2 (Sun Microsystems Inc.)
就是这样。这里我们对它进行修改,加一句:Main-Class: HelloWorld (在第三行)。这个就是我们之前写的那个类,也就是我们的入口类。也即,
Manifest-Version: 1.0
Created-By: 1.4.2 (Sun Microsystems Inc.)
Main-Class: HelloWorld
接下来,我们在命令提示符里执行:
jar umf MANIFEST.MF app.jar
这样我们使用了我们自己的MANIFEST.MF文件对原来默认的进行了更新。你不妨可以再进去看看是不是添上了Main-Class: HelloWorld这一句。
Ok,这个最后的一步了,来验证我们做的一切,在命令提示符中输入:
java -jar hello.jar(执行)
出现了什么,��Hi, Hello World!
我们再来看看jar文件在tomcat中发布,注意:在tomcat中我们就不能再用jar这种格式,而改war格式,它是专门用于web应用的,其实整个过程下来基本上和jar是类似的:
先准备我们要打包的资源。
找到存放tomcat的webapps目录,进到其中,新建一个文件夹,这里命名为hello,再进去新建WEB-INF文件夹,再进去新建 classes文件夹,此时我们也将我们唯一的servlet,HelloWorld.java放到这里,在与classes目录同级下建立一文件 web.xml。Ok,目前我们初步建立了一个简单的web应用。
这是HelloWorld.java:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("text/html");
PrintWriter out = res.getWriter();
out.println("<HTML>");
out.println("<HEAD><TITLE>Hello, World!</TITLE></HEAD>");
out.println("<BODY>");
out.println("Hello, World!");
out.println("</BODY></HTML>");
}
}//end here!
对它编译。下面是web.xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC
'-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN'
'http://java.sun.com/j2ee/dtds/web-app_2_3.dtd'>
<web-app>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>
</web-app>
开始压缩,形成war档:
在命令提示符下进到先前创制的hello目录下,执行 jar cvf hello.war * ,我们便得到hello.war。将它拷贝至webapps目录下,ok,来看最后一步,打开tomcat的目录conf中的server.xml,加入:
<Context path="/hello" docBase="hello.war" debug="0"
reloadable="true"/>
大功告成!运行它,启动tomcat,后在浏览器中输入http://localhost:8080/hello/HelloWorld,有了吗?
最后,如果你想用ant来完成以上的打包活动,下面就告诉你:
对于jar来说。在build.xml中,
<target name="jar">
<jar destfile="${app_home}/hello.jar">
<fileset dir="${dest}" includes="**"/>
<!--fileset dir="${dest}" includes="**/action.properties"/-->
</jar>
</target>
对于war,
<war warfile="hello.war" webxml="./WEB-INF/web.xml">
<fileset dir="html"/>
<lib dir="lib/">
<exclude name="oracle*.jar"/>
</lib>
<classes dir="build/servlets">
<include name="**/*.class"/>
</classes>
</war>
好了,就这么多,希望对你有点帮助。:)
我上传了上面打过的两个包,hello.jar和hello.war。 『 点击下载 』
『 点击下载 』
第一rar文件对应的是hello.jar,下载后将其名改为hello.jar
第二rar文件对应hello.war,下载后改为hello.war。
这是由于上传不了jar格式和war格式的文件,你只好照我上面说的去做了 :)
补充:
############
jar基本操作:
############
1. 创建jar文件
jar cf jar-file input-file(s)
c---want to Create a JAR file.
f---want the output to go to a file rather than to stdout.
eg: 1)jar cf myjar.jar query_maintain_insert.htm
2)jar cvf myjar.jar query_maintain_insert.htm
v---Produces verbose(详细的) output.
3)jar cvf myjar.jar query_maintain_insert.htm mydirectory
4)jar cv0f myjar.jar query_maintain_insert.htm mydirectory
0---don't want the JAR file to be compressed.
5)jar cmf MANIFEST.MF myjar.jar yahh.txt
m---Used to include manifest information from an existing manifest file.
6)jar cMf MANIFEST.MF myjar.jar yahh.txt
M---the default manifest file should not be produced.
7)jar cvf myjar.jar *
*---create all contents in current directory.
2. 察看jar文件
jar tf jar-file
t---want to view the Table of contents of the JAR file.
eg: 1)jar vft yahh.jar
v---Produces verbose(详细的) output.
3. 提取jar文件
jar xf jar-file [archived-file(s)]
x---want to extract files from the JAR archive.
eg: 1)jar xf yahh.jar yahh.txt(仅提取文件yahh.txt)
2)jar xf yahh.jar alex/yahhalex.txt(仅提取目录alex下的文件yahhalex.txt)
3)jar xf yahh.jar(提取该jar包中的所有文件或目录)
4. 修改Manifest文件
jar cmf manifest-addition jar-file input-file(s)
m---Used to include manifest information from an existing manifest file.
5. 更新jar文件
jar uf jar-file input-file(s)
u---want to update an existing JAR file.