显示下一条  |  关闭

瞌睡虫的日记

 
 
 
 
 
 

山东省 济南市

 发消息  写留言

 
博客等级加载中...
今日访问加载中...
总访问量加载中...
最后登录加载中...
 
 
 
 
 
 
 
心情随笔列表加载中...
 
 
 
 
 

日历

 
 
模块内容加载中...
 
 
 
 
 

天气

 
 
模块内容加载中...
 
 
 
 
 
 
 
 
 
 
 
下载音乐盒  曲目表歌词秀
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
博友列表加载中...
 
 
 
 
 
 
 
列表加载中...
 
 
 
 
 
 
 
 

超级 乞丐

2009-8-16 20:40:40 阅读8 评论0 162009/08 Aug16

 

我拎着刚买的levi’s从茂业出来,站在门口等一个朋友。一个职业乞丐发现了我,非常专业的、径直的停在我面前。这一停,于是就有了后面这个让我深感震撼的故事,就象上了一堂生动的市场调查案例课。为了忠实于这个乞丐的原意,我凭记忆尽量重复他原来的话。

“先生……行行好,给点吧。”我一时无聊便在口袋里找出一个硬币扔给他并同他攀谈起来。

乞丐很健谈。“……我只在华强北一带乞讨,你知道吗?我一扫眼就见到你。在茂业买levi’s,一定舍得花钱……”

“哦?你懂的蛮多嘛!”我很惊讶。

“做乞丐,也要用科学的方法。”他说。

我一愣,饶有兴趣地问“什么科学的方法?”

“你看看我和其他乞丐有什么不同的地方先?”我仔细打量他,头发很乱、衣服很破、手很瘦,但都不脏。

他打断我的思考,说:“人们对乞丐都很反感,但我相信你并没有反感我,这点我看的出来。这就是我与其他乞丐的不同之处。”

我点头默认,确实不反感,要不我怎么同一个乞丐攀谈起来。

“我懂得swot分析,优势、劣势、机会和威胁。对于我的竞争对手,我的优势是我不令人反感。机会和威胁都是外在因素,无非是深圳人口多和深圳将要市容整改等。”

“我做过精确的计算。这里每天人流上万,穷人多,有钱人更多。理论上讲,我若是每天向每人讨1块钱,那我每月就能挣30万。但是,并不是每个人都会给,而且每天也讨不了这么多人。所以,我得分析,哪些是目标客户,哪些是潜在客户。”他润润嗓子继续说,“在华强北区域,我的目标客户是总人流量的3成,成功几率70%。潜在客户占2成,成功几率50%;剩下5成,我选择放弃,因为我没有足够的时间在他们身上碰运气。”

“那你是怎样定义你的客户呢?”我追问。

“首先,目标客户。就像你这样的年轻先生,有经济基础,出手大方。另外还有那些情侣也属于我的目标客户,他们为了在异性面前不丢面子也会大方施舍。其次,我把独自一人的漂亮女孩看作潜在客户,因为她们害怕纠缠,所以多数会花钱免灾。这两类群体,年龄都控制在20~30岁。年龄太小,没什么经济基础;年龄太大,可能已结婚,财政大权掌握在老婆手中。这类人,根本没戏,恨不得反过来找我要钱。”

“那你每天能讨多少钱。”我继续问。

“周一到周五,生意差点,两百块左右吧。周末,甚至可以讨到四、五百。”

“这么多?”

见我有些怀疑,他给我算了一笔帐。“和你们一样,我也是每天工作8小时,上午11点到晚上7点,周末正常上班。我每乞讨1次的时间大概为5秒钟,扣除来回走动和搜索目标的时间,大概1分钟乞讨1次得1块钱,8个小时就是480块,再乘以成功几率60%[(70%+50%)÷2],得到将近300块。”

“千万不能黏着客户满街跑。如果乞讨不成,我决不死缠滥打。因为他若肯给钱的话早就给了,所以就算腆着脸纠缠,成功的机会还是很小。不能将有限的时间浪费在无施舍欲望的客户身上,不如转而寻找下一个目标。”

强!这个乞丐听上去真不可貌相,倒像是一位资深的市场营销总监。

“你接着说。”我更感兴趣了,看来今天能学到新的东西了。

“有人说做乞丐是靠运气吃饭,我不以然。给你举个例子,女人世界门口,一个帅气的男生,一个漂亮的女孩,你选哪一个乞讨?”

我想了想,说不知道。

“你应该去男的那儿。身边就是美女,他不好意思不给。但你要去了女的那边,她大可假装害怕你远远地躲开。”

“再给你举个例子。那天cocopark门口,一个年轻女孩,拿着一个购物袋,刚买完东西;还有一对青年男女,吃着冰淇淋;第三个是衣着考究的年轻男子,拿着笔记本包。我看一个人只要3秒钟,我毫不犹豫地走到女孩面前乞讨。女孩在袋子里掏出两个硬币扔给我,并奇怪我为什么只找她乞讨。我回答说,那对情侣,在吃东西,不方便掏钱;那个男的是高级白领,身上可能没有零钱;你刚从超市买东西出来,身上肯定有零钱。”

有道理!我越听越有意思。

“所以我说,知识决定一切!”我听十几个总裁讲过这句话,第一次听乞丐也这么说。

“要用科学的方法来乞讨。天天躺在天桥上,怎么能讨到钱?走天桥的都是行色匆匆的路人,谁没事走天桥玩,爬上爬下的多累。要用知识武装自己,学习知识可以把一个人变得很聪明,聪明的人不断学习知识就可以变成人才。21世纪最需要的是什么?就是人才。”

“有一次,一人给我50块钱,让我替他在楼下喊‘安红,我想你’,喊100声。我一合计,喊一声得花5秒钟,跟我乞讨一次花费的时间相当,所得的酬劳才5毛钱,于是我拒绝了他。”

“在深圳,一般一个乞丐每月能讨个千儿八百。运气好时的大概两千多点。全深圳十万个乞丐,大概只有十个乞丐,每月能讨到一万以上。我就是这万里挑一中的一个。而且很稳定,基本不会有很大的波动。”

太强了!我越发佩服这个乞丐了。

“我常说我是一个快乐的乞丐。其他乞丐说是因为我讨的钱多,所以快乐。我对他们说,你们正好错了。正是因为我有快乐、积极的心态,所以讨的钱多。”

说的多好啊!

“乞讨就是我的工作,要懂得体味工作带来的乐趣。雨天人流稀少的时候,其他乞丐都在抱怨或者睡觉。千万不要这样,用心感受一下这坐城市的美。晚上下班后带着老婆孩子逛街玩耍看夜景,一家三口其乐融融,也不枉此生了。若是碰到同行,有时也会扔个硬币,看着他们高兴的道谢走开,就仿佛看见自己的身影。”

“你还有老婆孩子?”我不禁大声赞叹,引来路人侧目。

“我老婆在家做全职太太,孩子念小学。我在福田区按揭了一套房,十年分期,

还差六年就还清了。我要努力挣钱,供我儿子读大学念市场营销专业,然后子承父业当一个比我更出色的乞丐。”

“我5年前在微硬中华大区做市场策划,2年前升为营销经理,月薪5千。那时按揭 了一台1万多的三星笔记本,每个月还款2千,要死要活的。后来我想这样永远也出不了头,就辞职不干了,下海来做乞丐,我愿意做一个高素质的乞丐。”

听完,我激动地说:“你有没有兴趣收我做徒弟。”

作者  | 2009-8-16 20:40:40 | 阅读(8) |评论(0) | 阅读全文>>

ubuntu新手用apache2和iasp构建ASP开发环境实战

2008-4-3 13:23:28 阅读35 评论0 32008/04 Apr3

原文地址:http://forum.ubuntu.org.cn/viewtopic.php?t=62042

从网上了解到ubuntu最近发行了版本号为7.04的新版本,该版本的性能、界面和易用性都获得了很多网友的好评。按捺不住好奇心,遂上网下载了一份LiveCD的ISO文件,刻盘,安装到了我的惠普v3009tu笔记本电脑上,开始了我的ubuntu之旅。

经过几天的试用之后,发现ubuntu 7.04的确不错,使我几乎有了放弃windows的冲动。但很快发现有许多在windows上的应用现在在ubuntu上实现起来还是比较麻烦的。

本人常在windows下学习开发ASP的网站,离开windows,这ASP还能用吗?上网一查,嘿!还真有办法实现。下面就将自己在该版本ubuntu上构建ASP开发环境的“艰苦之旅”描述一下。

一、硬件准备:没什么可说的,惠普v3009tu笔记本电脑。

二、操作系统安装过程:从ubuntu 7.04 LiveCD安装,原先电脑上有windows xp mce 2005,当然是构建双系统啰,安装过程中选择手动分区,将原来windows xp下的扩展分区(原来只有第一个分区是主分区,即windows中的C盘)中的E盘(约15G)删除,重新分三个区,分别挂载为根分区“/”、“/home”和swap,组件选择中我增加了gcc,其他过程略去。

三、资料查找过程:

我萌发构建ASP环境之后,首先想到的就是上网去查找资料,用百度去搜索(百度有“百度快照”,对查看过期信息很有用),发现关于这方面的资料实在是太少了,费了三四个小时,才找到了一些零零碎碎的信息。其中有一篇文章多次被搜索到,但大多支离破碎,只有这个网址http://www.djhui.cn/blog/post/23.html的还算完整,更重要的是该页面下方提供了一个下载该文中提到的关键软件“iasp”的有效链接http://www.linuxeden.com/download/data/soft/1083.html。真是万幸!

四、实战第一阶段:

我从上面那个链接中将iasp下载了回来,开始了我的“艰苦之旅”。

首先,我将下载回来的“iASP2.1.01.tar.gz”压缩包放到“/home”目录,在右键菜单中选“解压缩到此处”,得到文件夹“iASP2.1“,打开,看到三个文件:iasp21.tar、install.sh、readme。马上用文本编辑器打开“readme”,仔细阅读了起来。

从“readme“中得知,该软件是由一家叫“stryon“的公司开发的,但奇怪的是当我想获取更多关于此软件的资料而去访问“readme“中提供的公司网址,却死活都打不开,去搜索关于该公司的资料,也几乎没有。真是奇怪,怀疑它是不是已经倒闭了或被卖给别人了。不管他。

“readme“中提到的这样几点我特别留心了一下:

1、系统中必须安装有Java Development Kit (JDK) 1.1.7或以上版本的软件,对Linux系统,强烈建议安装可用的、最新的JDK;

2、iasp 2.1.01版(也就是我下载回来的版本)完全支持apache2.0;

3、要为你的Linux上的系统获取一个自由的许可证,请访问他们的公司网站(网站都打不开了,怎么获取啊?后面还有个电话和传真,我就不打了)。

根据readme提示,我用“新立得软件包管理器”安装了“apache2“(版本显示是2.0.55-4)和”sun-java6-jdk“(版本显示是6.0)。

装好后,想到最好测试一下这两个软件。可怎么测试呢?我连软件装到哪儿去了都不知道。还是上网查,结果查到的又是些支离破碎的资料,又费了我好多时间。

先说apache2测试,资料说apache2安装位置是在“/usr/local/apache2”,启动方法是在终端中输入“sudo /usr/local/apache2/bin/apachectl start“。可我在“/usr/local/apache2“中根本就找不到“bin“目录(还有资料说的“conf“目录在这也找不到),真是奇怪了!用ubuntu面板上的“位置-搜索文件…”功能搜索,也找不到(顺便提一下,ubuntu的搜索功能给人感觉不好使)。后来还是在linuxsir.org上找到了一篇《apache2安装与配置》的文档(http://www.linuxsir.org/main/?q=node/229),比较完整。用该文档中所说方法,终端中输入“sudo /etc/init.d/apache2 start”启动apache2成功。中间会提示没有主机名,用127.0.0.1做主机名,这是因为没有apache2没有配置,没关系,我现在只要apache2能启动成功就行了。打开浏览器浏览“http://127.0.0.1/”,内容出来了。兴奋了一会儿!但心中一直奇怪为什么和有些资料上说的不一样,会不会一个是在以Redhat为代表的linux中的情况,而另一个是在以Debian为代表的linux中的情况呢?

再说jdk的测试,又是找了半天才在“/usr/lib/jvm/java-6-sun-1.6.0.00/”下找到了,终端中进入该目录中的“bin“目录,运行”sudo java -version“,显示如下:

java version "1.6.0"

Java(TM) SE Runtime Environment (build 1.6.0-b105)

Java HotSpot(TM) Client VM (build 1.6.0-b105, mixed mode, sharing)

测试成功。

既然这两款软件安装成功了,下面就该安装iasp了。

五、实战第二阶段:

终端中进入前面提到的“/home/iASP2.1“文件夹,根据“readme“的提示,运行”sudo ./install.sh“,过程如下:

***********************************************************************

* Instant ASP(tm)2.1.01 Enterprise Edition Install *

* *

* Instant ASP(tm)2.1.01 requires Java Development Kit(preferably the *

* latest version for your operating system)for its operation.Zeus and *

* SWS Beta users may skip the following step. *

***********************************************************************

i686

Please enter the full path to your JDK's bin directory.

e.g. /usr/jdk1.1.6/bin, Q/q(quit), S/s(skip):

> (输入了我前面找到的“/usr/lib/jvm/java-6-sun-1.6.0.00/bin”)

Enter the absolute directory under which Instant ASP should be installed.

(./iasp21 will be created underneath.)

> (输入安装“iasp”的目录,我输入了“/usr/local”,这样程序会在此目录中自动建一个“iasp21“的目录,程序就被安装到了这里)

接着提示安装结束,并询问是否配置web服务器。输入“n“,结束安装。

安装过程可谓是一帆风顺,接下来开始配置iasp。

先终端中运行“sudo /etc/init.d/apache2 stop”,停止apache2服务。接着进入iasp的安装目录“/usr/local/iasp21“,用“ls“命令查看一下有什么东西,显示如下:

admin default.html index.html README_EN stop-admin.sh

bin docs lib servlets stop-server.sh

connector.sh icon logs start-admin.sh

default.htm index.htm properties start-server.sh

这里,connector.sh是配置程序,stop-server.sh是启动iasp服务,start-server.sh是停止iasp服务,start-admin.sh是开启远程管理,stop-admin.ah是关闭远程管理。

我运行“sudo ./connector.sh”,开始iasp提供的web服务器配置,过程如下:

*************************************************************************

Welcome to Instant ASP connection wizard. This wizard will

allow you to configure Instant ASP for one or more web servers.

Copyright 1998-2001 Halcyon Software, Inc.

*************************************************************************

Do you want to continue (Y/N)? (输入“y“)

Please choose a servlet interface

[1] Instant ASP native servlet interface

[2] Apache JServ

Enter a number [1/2]: (输入“1”)

***** Please select a web server *****

[1] Netscape

[2] Apache

[3] Xitami

[0] Quit

Enter a number [0-4]: (输入“2”)

***** Please choice Apache version *****

[1] Apache 1.3.0

[2] Apache 1.3.1

[3] Apache 1.3.2

[4] Apache 1.3.3

[5] Apache 1.3.4

[6] Apache 1.3.6

[7] Apache 1.3.9

[8] Apache 1.3.11

[9] Apache 1.3.12

[10] Apache 1.3.14

[11] Apache 1.3.2X

[12] Apache 2.X

[0] Quit

Note: If you are using Apache Web Server higher version or have additional

modules, such as Front Page Server Extensions, Raven SSL, or you are

using Apache Strong Hold Server. Please configure iASP according

to /bin/apache/source/readme.txt

Enter a number [0-10]:(输入“12”)

Please enter the path to the Apache /conf directory >

输入apache2的配置文件“httpd.conf“所在目录,到这里我犯难了。资料上说的都是在”/usr/local/apache2/conf“下,但我的apache2安装后根本就没有这个目录,还是linuxsir.org上的那篇文章帮了忙,我在我的电脑的“/etc/apache2”目录下找到了它。所以我在这里输入了“/etc/apache2“。

setting for "Proxy host IP address" <127.0.0.1> (直接回车)

setting for "Proxy port" <9098> (直接回车)

setting for "Server manager port" <9095>(直接回车)

"httpd.conf"configuration completed.

Would you like to configure another web server (Y/N)?(输入n)

Configuration successful.

You can access the Instant ASP documentation and samples

from the virtual directory /iasp/

看起来一切顺利。

我马上运行“sudo /etc/init.d/apache2 start“,OK,再进入“/usr/local/iasp21”,运行“./start-server.sh”,OK。

我立马打开浏览器浏览“http://127.0.0.1/iasp“,哇!iasp的默认页面出现了!太兴奋了!

点击左边的链接看看,都正常;欸,有个“Samples“,一定是例子,快打开看看,嗯,页面出来了,右边出现一个表格,我点了第一个“General”,又出现一个表格,第一个是“HelloWold“的测试,每个测试又都分“Vbscrip“和”Jscript“,我当然选“Vbscript”啰,“view“是查看源代码的,“run”则是运行ASP文件的,我点“run“,不幸的事情发生了——出来的是源代码!

费了九牛二虎之力,换来的是这么个结果!问题出在哪儿呢?

六、实战第三阶段

难道是apache的版本不对?可iasp的“readme”中说的是“full supports Apache2.0“啊!不行,再来一遍!将apache2卸载,将“/usr/local/iasp21“删除,重来一遍,非常小心地又重来了一遍,问题依旧!

肯定是iasp的ASP引擎没有起作用啊,怎么办?此时已是深夜1点!接着来。前面那篇文章用的软件版本和我这个不一样,换成和他的一样的!于是,又将apach2卸掉,重新用“新立得”装上apache 1.3.34版,重新来过,又折腾了半天,问题依旧!看来问题的原因不在软件的版本上。

想到我前面找半天没找到apache的bin目录,我想难道我通过“新立得”安装的软件不全?这样,我去apache的官网下载软件包回来自己装,看看如何。于是把apache2.0.59下了回来(没敢下2.2.4的版本)。

把下回来的文件放在“/home“目录,解压,得到httpd-2.0.59目录,进入,发现一大堆文件,其中有INSTALL,用文本编辑器打开,仔细阅读了起来。其中这句“If you are building on Mac OS X (Darwin), make sure to use libtool 1.4.2 or newer.”引起了我的注意,查看我的系统,确实没装“libtool”。马上用“新立德”装上了“libtool 1.5.22-4“。

接着终端中进入“/home/httpd-2.0.59“目录,根据INSTALL中的提示,开始安装apache2.0.59。过程如下:

sudo ./configure --prefix=/usr/local/apache2

sudo make

sudo make install

安装过程还是很顺利,成功了。

这次是自己手动安装的,我明确知道了apache2装在了哪儿,马上进入“/usr/local/apache2”,浏览了一下,发现果然和通过“新里得”安装的不一样,有了conf、bin等十几个目录。进入bin,也发现了apachectl文件,用这个启动看看,运行“sudo /usr/local/apache2/bin/apachectl start”,又成功了!浏览器浏览“http://127.0.0.1“,显示的页面中有“您能看见这个页面,说明Apache web server 已经安装成功。”的提示,也成功了!

安装好apache2后,再重新安装并配置iasp,过程一切正常!不过在准备重启动apache2后,新问题出现了——apache2启动不了!出错提示什么mod_iasp.c is not compatible with this version of Apache (found 20020329,need 20020903),应该是mod_iasp.c的版本不对。难道又是软件版本的问题?

七、实战第四阶段

头疼啊!此时是深夜2点了!还干吗?干吧,反正明天没什么事。于是就又去上网查原因,可网上关于此问题的资料依然是难觅踪影,好不容易发现了一个帖子说什么iasp的确是支持apach2的,但要自己重新编译mod_iasp.c的文件,具体在iasp的安装目录中的“/user/local/iasp21/bin/apache/source/2.0/readme.txt”文件中有说明。打开该文件一看,果然如此!文件中有一段说明如下:

If you are using Apache Web Server and have additional modules

such as Front Page Server Extensions, Raven SSL, or you are

using Apache Strong Hold Server, you need to build the iasp

module for Apache Web Server according to the following steps:

*************************************************************

* Compile iASP module for Apache 2.0 on UNIX *

*************************************************************

1. Compile the iasp module with following command:

[Apache-Root]/bin/apxs -i -c *.c

then mod_iasp.so is copied to [Apache-Root]/libexec/

2. Configure the iasp in apache configuration file:

LoadModule iasp_module "[Apache-Root]/libexec/mod_iasp.so"

Alias /iasp "[iASP-Root]"

IaspConfig server "[iASP-Root]/properties/server.properties"

IaspConfig rules "[iASP-Root]/properties/rules.properties"

3. Restart Apache and iasp server.

NOTE: [Apache-Root] is Apache installed path.

[iASP-Root] is iASP installed path.

马上就按该文件中的提示来做啊!运行“sudo /usr/local/apache2/bin/apxs -i -c *.c“,但是,不成功!报错:

……

libtool: compile: libobj name `*.lo' may not contain shell special characters.

gcc: *.c: No such file or directory

gcc: no input files

apxs:Error: Command failed with rc=65536

.

八、实战第五阶段

晕倒啊!查看“/usr/local/apache2”目录,没有readme.txt中所说的“libexec”目录啊,这是为什么呢?而我看出错提示,好像是说没有*.c的文件啊。这个.c的文件在哪儿呢?我在“/usr/local/apache2”的反反复复的找,就是找不到.c类的文件。怎么回事呢?

人已非常困了,我在文件管理器中乱点那些目录,翻来翻去,笔记本电脑屏幕的亮光刺的眼睛很难受,人愈发得困了!不由得恨起来ubuntu系统中居然不能正常使用我的惠普笔记本的fn+f7、fn+f8键来调节屏幕亮度(这个问题也困扰了我两天,调节亮度要么是最亮,要么是最暗,更要命的是,这个功能还时灵时不灵,要它暗的时候它就是不暗!不过笔者写这篇文章时已通过软件变通解决了部分问题,虽然麻烦些)。就这么昏昏沉沉的,突然,眼前一亮,我发现了*.c文件!马上振作起来,是的,没错,.c文件,在“/user/local/iasp21/bin/apache/source/2.0“中呢!mod_iasp.c它在那儿看着我笑呢!

找到这个文件,我似乎是突然间就明白了,我刚才都是在这个目录之外在执行编译的,那怎么能找到.c文件呢!看我笨得!我马上在终端中“cd /user/local/iasp21/bin/apache/source/2.0“

重新执行“sudo /usr/local/apache2/bin/apxs -i -c *.c“,成功!马上到apache2安装目录中去找libexec目录,可惜,我没有找到!看看编译成功的提示,输出的文件原来并没有放到什么libexec目录,而是放到了apache2的modules目录中,打开一看,果然在那儿呢!这回我想应该没问题了!马上运行“sudo gedit /user/local/apache2/conf/httpd.conf”,将“LoadModule iasp_module "/user/local/iasp21/bin/apache/linux/2.0/mod_iasp.so"”这句改成了“/user/local/apache2/modules/mod_iasp.so”,保存。

看来这个该死的“readme.txt”文件,它也不说清楚点儿!

重启apache2,重启iasp,这次再也看不到ASP的“<% %>”了!看看“HelloWorld“吧!

世界是多么美好啊!

一看时间,天哪!凌晨4点多了!赶快去睡觉吧!要不明天老婆孩子老头老娘就又要开我的批斗会了!

唉!折磨人的Linux啊!

九、补遗:

  后来又发现一个问题,就是我的ASP只能运行一会儿,然后就出现服务无法连接的提示,好像是iasp运行一会儿就停止了。经检查,是因为我在终端中运行的iasp,把终端窗口关了,iasp服务就停止了。我后来在桌面创建了一个到“/usr/local/iasp/start-server.sh“的启动器,通过它来启动就没有问题了。

作者  | 2008-4-3 13:23:28 | 阅读(35) |评论(0) | 阅读全文>>

JBoss启动错误

2008-3-19 13:42:48 阅读311 评论0 192008/03 Mar19

 ...............

WARN   [BasicMBeanRegistry]   javax.management.MBeanRegistrationException:   preRegister()   failed:   [ObjectName= 'jboss.remoting:service=NetworkRegistry ',   Class=org.jboss.remoting.network.NetworkRegistry   (org.jboss.remoting.network.NetworkRegistry@9a8a68)]
12:42:41,638   ERROR   [MainDeployer]   Could   not   create   deployment:   file:/opt/jboss/server/default/conf/jboss-service.xml
org.jboss.deployment.DeploymentException:   -   nested   throwable:   (java.lang.reflect.InvocationTargetException)
at   org.jboss.system.ServiceConfigurator.install(ServiceConfigurator.java:196)
at   org.jboss.system.ServiceController.install(ServiceController.java:226)
at   sun.reflect.NativeMethodAccessorImpl.invoke0(Native   Method)

........

JBoss启动时报错,处理方法是修改/etc/hosts

127.0.0.1 localhost.domain localhost

192.168.0.5 ubuntu.domain ubuntu

#IPv6

注意,这里的域名是一定要有的,否则还会出错

作者  | 2008-3-19 13:42:48 | 阅读(311) |评论(0) | 阅读全文>>

Struts-config.xml的配置

2008-2-18 17:21:30 阅读8 评论0 182008/02 Feb18

Struts的核心是struts-config.xml配置文件,在这个文件里描述了所有的Struts组件。 

在这里包括配置主要的组件及次要的组件,下面是struts-config.xml包含主要元素的内容: 

一、    struts-config.xml的主要元素: 

<?xml version=”1.0” encoding=”ISO-8859-1”?> 

<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" 

"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"> 

<struts-config> 

   

   <data-sources> 

       <data-source> 

       </data-source> 

   </data-sources> 

   <form-beans> 

       <form-bean / > 

   </form-beans> 

   <global-forwards> 

       <forward / > 

   </global-forwards> 

   <action-mappings> 

       <action / > 

   </action-mappings> 

<controller / > 

   <message-resources / > 

   <plug-in /> 

</struts-config> 

    注意:以上各元素的顺序是非常重要的,你的struts-config.xml配置文件必须按照这个顺序进行配置,否 

则在你的容器启动的时候就会出错。 

二、    struts-config.xml的子元素: 

1.<icon / >子元素 

   它包含<small-icon / >及<large-icon / >,它的作用是图形化其父元素, 

<small-icon/>的内容是一个16x16的图像文件,而<large-icon/>的内容是一个32x32的图像文件。如下例子: 

   <icon> 

     <small-icon> 

         /images/smalllogo.gif 

     </small-icon> 

     <large-icon> 

        /images/largelogo.gif 

     </large-icon> 

</icon> 

2.<display-name / >子元素 

   它提供对父元素的短文字(short textual)描述信息,如下: 

   <display-name> 

           short textual discription of its parent element 

   </display-name> 

3.<description / >子元素 

   它提供对父元素的完全(full-length textual)的描述信息,如下: 

  <description> 

    full-length textual discription of its parent element 

  </description> 

4.<set-property / >子元素 

       它用来设置它的父元素中设定的JavaBean的属性值,它一般用在指定的GenericDataSource 属性, 

扩展的ActionMappings以及扩展的 global forwards。如下: 

       <set-property property="name of bean property" value="value of bean property" /> 

         例如: 

        <set-property property="driverClass" value="org.gjt.mm.mysql.Driver" /> 

        <set-property property="user" value="admin"/> 

        <set-property property="maxCount" value="4"/> 

        <set-property property="minCount" value="2"/> 

        <set-property property="password" value=""/> 

        <set-property property="url" value="jdbc:mysql://localhost:3306/struts"/> 

三、    配置JDBC数据源 

其配置形式如下: 

<data-sources> 

<data-source> 

<set-property property="driverClass" value="fully qualified path of JDBC driver"/> 

<set-property property="url" value="data source URL"/> 

<set-property property=”mincount” value="the minimum number of connections to open"/> 

<set-property property="password" value="the password used to create connections"/> 

<set-property property="user" value="the username used to create connections"/> 

</data-source> 

</data-sources> 

<data-source>的属性及其描述信息如下: 

属  性              描 述 信 息 

Key          绑定在ServletContext上的DataSource实例的索引键, 

             若不设定则缺省为Action.DATA_SOURCE_KEY,如果在应用程序中有多于一个的DataSource, 

             则必须设置Key的值。 

DriverClass    所用的JDBC驱动类(必须的)如:com.microsoft.jdbc.sqlserver.SQLServerDriver 

url    所用的JDBC的URL(必须的)如:jdbc:microsoft:sqlserver://xg088:1433 

MaxCount    同时打开的最大连结数,缺省值为2(可选的) 

MinCount    同时打开的最小连结数,缺省值为1(可选的) 

User    连结到数据库的用户名(必须的) 

Password    连结到数据库的密码(必须的) 

Description    关于DataSource的描述信息(可选的) 

ReadOnly    如果设为true,则表示该连结是只读的,缺省为false。(可选的) 

LoginTimeout    创建连结的最大允许时间,以秒为单位。(可选的) 

AutoCommit    如果为true,则每次execute之后会强制回滚。缺省为true。(可选的) 

举例说明: 

<data-sources> 

    <data-source> 

        <set-property property=”key” value=” value="WILEY_DATA_SOURCE" /> 

<set-property property="driverClass" value="org.gjt.mm.mysql.Driver" /> 

<set-property property="url" value="jdbc:mysql://localhost/wileyusers" /> 

<set-property property="maxCount" value="5"/> 

<set-property property="minCount" value="1"/> 

<set-property property="user" value="sa"/> 

<set-property property="password" value="yourpassword"/> 

</data-source> 

</data-sources> 

四、    配置FormBean 

<form-bean / >用来定义将要绑定到Action的FormBean的实例。语法如下: 

 <form-beans> 

    <form-bean name="name used to uniquely identify a FormBean" 

            type=”fully qualified class name of FormBean"/> 

 </form-beans> 

例: 

<form-beans> 

    <form-bean name="lookupForm" type="wiley.LookupForm" /> 

</form-beans> 

五、    配置全局转发 

   全局转发可以定义几个<forward/>子元素,struts首先会在<action-mappings>元素中找对应的<forward>, 

若找不到,则到全局转发配置中找。语法如下: 

<global-forwards> 

  <forward name="unique target identifier" path="context-relative path to targetted resource "/> 

</global-forwards> 

   除了name及path属性之外,还有一个redirect属性,如果redirect设为true的时候,则用 

HttpServletResponse.sendRedirect()方法,否则用RequestDispatcher.forward()方法,缺省为false。 

注:如果为true,则用HttpServletResponse.sendRedirect()方法,此时存储在原来的HttpServletRequest中 

的值将会丢失。 

例子: 

<global-forwards> 

<forward name="success" path="/welcome.jsp"/> 

<forward name="failure" path="/index.jsp"/> 

</global-forwards> 

六、    配置<action-mappings> 

   它可以定义几个<action / >子元素,它主要是定义Action实例到ActionServlet类中,语法如下: 

<action-mappings> 

 <action path="context-relative path mapping action to a request" 

   type="fully qualified class name of the Action class" 

   name="the name of the form bean bound to this Action"> 

   <forward name="forwardname1" path="context-relative path"/> 

   <forward name="forwardname2" path="context-relative path"/> 

 </action> 

</action-mappings> 

<action/>属性及其描述信息如下: 

属  性    描 述 信 息 

Path    在浏览器的URL中输入的字符(必须的) 

Type    连结到本映射的Action的全称(可选的) 

Name    与本操作关联的Action Bean在<form-bean/>中定义name名(可选的) 

Scope    指定ActionForm Bean的作用域(session和request),缺省为session。(可选的) 

Input    当Bean发生t误时返回的控制。(可选的) 

ClassName    指定一个调用这个Action类的ActionMapping类的全名。缺省用 

org.apache.struts.action.ActionMapping,(可选的) 

Forward    指定处理相应请求所对应的JSP页面。(可选的) 

Include    如果没有forward的时候,它起forward的作用。(可选的) 

Validate    若为true,则会调用ActionForm的validate()方法,否则不调用,缺省为true。(可选的) 

例子: 

<action-mappings> 

<action path="/lookupAction" type="wiley.LookupAction" name="LookupForm" 

  scope="request" 

  validate="true" 

  input="/index.jsp"> 

<forward name="success" path="/quote.jsp"/> 

<forward name="faliue" path="/index.jsp"/> 

</action> 

</action-mappings> 

七、    配置RequestProcessor 

    在struts-config.xml文件中用<controller/>子元素来定义RequestProcessor,其语法格式如下: 

<controller processorClass="fully qualified class name" /> 

<controller />元素属性及其描述信息如下: 

属  性    描  述 

processorClass    指定自定义的RequestProcessor类的全名 

BufferSize    指定用来下载所用的缓存大小。缺省是4096字节。 

contentType    定义response文本类型,缺省是text/html 

Debug    定义当前系统的除错级别,缺省是0 

Locale    如果是true,则在用户的session中存放Locale对象,缺省为true 

maxFileSize    指定下载文件最大的大小。缺省是250M 

multipartClass    指定去代替org.apache.struts.upload.DiskMultipartRequestHandler类的类的全名。 

Nocache    如果是true,则会关闭每个response的缓存功能。缺省是false 

TempDir    指定上载文件所用的临时目录。缺省值由容器决定 

例子: 

① <controller processorClass="wiley.WileyRequestProcessor" /> 

② <controller 

    contentType="text/html;charset=UTF-8" 

    debug="3" 

    locale="true" 

    nocache="true" 

    processorClass="org.apache.struts.action.RequestProcessor"/> 

八、    配置Message Resources 

    在struts-config.xml文件中用<message-resources />元素来定义消息资源。其语法如下: 

       <message-resources  parameter="wiley.ApplicationResources"/> 

<message-resources />元素属性及其描述信息如下: 

属  性    描  述 

Parameter    给定资源文件全名 

ClassName    定义处理消息资源的类名的全名,缺省是org.apache.struts.config.MessageResourcesConfig 

Factory    定义MessageResourcesFactory类的全名,缺省是 

org.apache.struts.util.property.MessageResourcesFacotry 

Key    定义绑定在这个资源包中的ServletContext的属性主键,缺省值是Action.MESSAGES_KEY. 

Null    如果为true,则找不到消息key时,则返回null,缺省是true. 

例子: 

① <message-resources parameter="wiley.ApplicationResources"/> 

② <message-resources 

    parameter="StorefrontMessageResources" 

    null="false"/> 

<message-resources 

    key="IMAGE_RESOURCE_KEY" 

    parameter="StorefrontImageResources" 

    null="false"/> 

注意:设定key的目的如下: 

<html:img altKey="navbar.home.image.alt" bundle="IMAGE_RESOURCE_KEY" 

      pageKey="navbar.home.image" width="125" height="15" border="0"/> 

这里说明要到StorefrontImageResources.properties资源文件中找主键值是”navbar.home.image”所对应的 

值。 

这里StorefrontImageResources.properties的内容如下: 

…… 

navbar.home.image=/images/home.gif 

navbar.home.image.alt=Home 

…… 

此处navbar.home.image.alt说明的和<img alt=”Home”……/>一样。 

九、    配置Plug-in 

配置Plug-in如下: 

<plug-in className="wiley.WileyPlugin"/> 

也可如下: 

<plug-in className="com.oreilly.struts.storefront.service.memory.StorefrontMemoryDatabasePlugIn"> 

  <set-property property="pathname" value="/WEB-INF/database.xml"/> 

</plug-in> 

作者  | 2008-2-18 17:21:30 | 阅读(8) |评论(0) | 阅读全文>>

Struts标签

2008-2-18 17:20:24 阅读60 评论0 182008/02 Feb18

       Struts提供了五个标签库,即:HTML、Bean、Logic、Template和Nested。

其中的Template在1.2后被Titles所替代。

 标签库

 说明

 HTML 标签

 用来创建能够和Struts 框架和其他相应的HTML 标签交互的HTML 输入表单

 Bean 标签

 在访问JavaBeans 及其属性,以及定义一个新的bean 时使用

 Logic 标签

 管理条件产生的输出和对象集产生的循环

 Template 标签

 随着Tiles框架包的出现,此标记已开始减少使用

 Nested 标签

 增强对其他的Struts 标签的嵌套使用的能力

 

标签的公共特征

 

使用固定属性名称的Struts 标签:

 属性

 说明

 id

 命名自定义标签创建时的脚本变量名。

 name

 指出关键字值,在该关键字下可以找到一个存在的bean 。如果给出了scope属性,则仅仅在scope中查找。否则,根据标准的顺序在各种scope中查找:(page, request, session, or application)。

 property

 指出bean 中的某个属性,可以在其中检索值。如果没有标明,则使用对象本身的值。

 scope

 定义了Bean在哪个范围(page, request, session, or application)中被查找。如果没有标明按顺序查找。脚本变量(见id)将在相同的范围中创建。

 

Struts 标签也支持嵌套引用,例如:

Property="foo.bar.baz"

这相当于进行下面的调用:

getFoo().getBar().getBaz();

或者做为setter:

getFoo().getBar().setBaz(value);

 

虽然Struts 标签的设计原意是为了避免使用scriptlet,scriptlet的表达式还能够提供给所有的Struts 标签使用。但请确保使用完整的表达式:

 错误:

 <html:link href="'<%= "/" + name %>/index.jsp>'>

 

 正确:

 <html:link href="'<%= "/" + name + "/index.jsp" %>'>   // 表达式必须提供整个属性值

 

 

Html 标签库

<html>标签

它有两个属性:locale和xhtml,两者都不是必需的。

 <html:html locale=\"true\">

 此行代码解析后:

 <html lang=\"en\">

说明:生成的结果取决于Struts应用程序所位于的服务器的locale。如果你将应用程序部署到一个不同locale的服务器,你不需要改变代码,Locale会自动调整。 

<base>标签:表示所包含页面的绝对位置。这个标签只有内嵌在head标签中才有效。

 <html:base/>

 此行代码解析后:

 <base href=\"http://www.mymain.com/myStrutsApp/testing.jsp\">

<img>标签

最重要的属性page:图象文件的路径,前面必须带有一个斜线。

其它属性:heignt、width、alt。

  <html:img page=\"/logo.gif\" height=\"50\" width=\"200\" alt=\"Web Logo\"/>

<link>标签

 <html:link page=\"/index.html\">Click demo</html:link>

 此行代码解析后:

  <a href=\"/index.html\">Click demo</a>

<errors>标签:通过一个简单的<html:errors/>标签,你就可以在一个JSP页面上显示完全自定义的错误信息。功能超强大!!

说明:这个标签在Request对象的属性集合中查找reserved key。如果它找到一个reserved key,它就假设这个key是一个String、或是一个String数组  

      (它包含在模块的MessageResources中查找的message keys)、或是类型为org.apache.struts.action.ActionErrors的一个对象。

         如果在应用程序资源中存在相应的信息,那么就可以用下面这些可选的message keys:  

        · errors.header  or errors.prefix:相应的信息在错误信息的单独列表前显示。 

        · errors.footer or errors.suffix:相应的信息在错误信息的单独列表后显示。 

<form>标签系列

使用<form>标签时必须遵循一些规则: 

标签中必须包含一个action属性,它是这个标签中唯一必需的属性。如果不具备该属性则JSP页面会抛出一个异常。之后你必须给这个action属性指定一个有效值。一个有效值是指应用程序的Struts配置文件中元素里的任何一个子元素的访问路径。而且相应的元素中必须有一个name属性,它的值是form bean的名称。

 <html:form action=\"/login\" > 

 如果你有上述一个标签 ,那么你的Struts配置文件的元素中必须有一个如下显示为粗体的元素: 

<action-mappings> 

     <action path=\"/login\" 

      type=\"com.javapro.struts.LoginAction\"  

      name=\"loginForm\"

      scope=\"request\"

      input=\"/login.jsp\">

      <forward name=\"success\" path=\"/mainMenu.jsp\"/>

    </action>

    .

    .

    .

</action-mappings> // 这就是说一个form标签是和form bean相关联的。

任何包含在<form>中用来接收用户输入的标签(<text>、<password>、<hidden>、<textarea>、<radio>、<checkbox>、<select>)必须在相关的form bean中有一个指定的属性值。比如,如果你有一个属性值被指定为“username”的<text>标签,那么相关的form bean中也必须有一个名为“username”的属性。输入<text>标签中的值会被用于生成form bean的userName属性。

<form>标签还有一些不是必须但很有用的“次要”属性。

比如,你可以用focus属性来生成JavaScript,它会“定焦”(focus)到该form所包含的一个元素上。使用focus属性时你需要给它指定元素的名称。

 <body>

 <html:form action=\"/login\" focus=\"password\">

 User Name: <html:text property=\"userName\"/>

 <br>Password: <html:text property=\"password\"/>

 <br><html:submit/>

 </html:form>

 </body>

 代码解析后:

 <body>

 <form name=\"loginForm\" method=\"post\" action=\"/myStrutsApp/login.do\">

 User Name: <input type=\"text\" name=\"userName\" value=\"\">

 <br>Password: <input type=\"text\" name=\"password\" value=\"\">

 <br><input type=\"submit\"  value=\"Submit\">

 </form>

 <script language=\"JavaScript\" type=\"text/javascript\">

  <!--

 if (document.forms[\"loginForm\"].elements[\"password\"].type != \"hidden\") 

      document.forms[\"loginForm\"].elements[\"password\"].focus()

  // -->

 </script>

 </body>

有没有看到这个标签库是如何建立JavaScript来定焦到password元素上的? 这也是该库让人着迷的地方之一。你不用担心如何在客户端进行编程,它会帮你自动生成。

还可以看到,<form>标签中method属性的缺省值是POST。

<text>标签、<hidden>标签、<textarea>标签、<radio>标签、<checkbox>标签、<submit>标签、<reset>标签:

都有一个property属性,最后会被转换成HTML中的name属性,当然还有name和value属性。

<password>标签

  <html:password property=\"password\"  redisplay=\"false\"/>

该标签中的一个很重要的属性是"redisplay",它用于重新显示以前输入到这个区域中的值。该属性的缺省值为true。然而,为了使password不能被重新显示,你或许希望将该属性的值设为false。

<select>标签和<option>标签:   <html:select property=\"color\" size=\"3\">

  <html:option value=\"r\">red</html:option>

  <html:option value= \"g\">green</html:option>

  <html:option value= \"b\">blue</html:option>

 </html:select>

遗补:1.) <html:link>标签

forward属性:链接到一个global forward上;action属性:链接到一个action mapping上;

href属性:这个链接会转发给控制器,由控制器做决定;page属性:一个相对的链接。

用page属性链接到action上:

  <html:link page="/html-link.do">

  Linking with the page attribute.

 </html:link>

注意,上面的代码中你不必指定web的关联。相反的,如果你使用href属性,你就必须像下面所示指出web的关联(这里的关联就是struts-exercise):

 <html:link href="/struts-exercise-taglib/html-link.do">

  Using Href

 </html:link>

很明显,当你在相同的web应用程序中做链接是,它比page属性更加好。你也能用href在不同的服务器上创建链接:

 <html:link href="http://otherserver/strutsTut/html-link.do">

 Using Href

 </html:link>

另一种链接到html-link.do的方法是用action属性:

 <html:link action="/html-link">

 Using Action attribute

 </html:link>

你也可以以硬编码的方式使用参数:

 <html:link page="/htmllink.do?doubleProp=3.3&longProp=32">

  Double and long via hard coded changes

 </html:link>

或者使用paramId, paramName, and paramProperty属性:

 <html:link page="/html-link.do" paramId="booleanProperty" paramName="testbean" 

  paramProperty="nested.booleanProperty">

  Boolean via paramId, paramName, and paramValue

</html:link>

解析后的代码:

 <a href="/struts-exercise-taglib/html-link.do?booleanProperty=false">

   Boolean via paramId, paramName, and paramValue

 </a>

另外,还能使用带name属性的Map来实现传递多个参数:

 <%

java.util.HashMap newValues = new java.util.HashMap();

newValues.put("floatProperty", new Float(444.0));

newValues.put("intProperty", new Integer(555));

newValues.put("stringArray", new String[]

{ "Value 1", "Value 2", "Value 3" });

pageContext.setAttribute("newValues", newValues);

%>

...

 <html:link action="/html-link" name="newValues">

   Float, int, and stringArray via name (Map)

 </html:link>

你也能够链接到Map类型的action上,上面的代码解析后的结果:

 <html:messages property="property2" message="true" id="msg" header="messages.header" footer="messages.footer">

 <tr><td><%= pageContext.getAttribute("msg") %></td></tr>

 </html:messages>

2.) select和option标签

<html:select> 的属性:property-与ActionForm中的某个属性对应;size-显示option的数目;multiple-默认为fales,表示不能多选,当设定为true时,property对应的ActionForm的属性必须为数组。

<html:select property="name" size=6 multiple="true">

<html:option>的属性:key、local、bundle-指定Resource Bundle中的内容。

例如 <html:option value="color1">Orange</html:option>

<html:option value="color1" bundle="htmlselect.Colors" key="htmlselect.red"/>

它和配置文件中的<message-resources>元素的key属性匹配 --> <message-resource parmeter="HtmlSelectColors" key="htmlselect.Colors"/>

<message-resource>中配置的资源文件为HtmlSelectColors.properties,相关内容为 htmlselect.red=RED

<html:options>标签,提供了一组<option>元素,在<html:select>元素中可以包含多个<html:options>元素。非常灵活,可以取得集合或数组中的值。

例1 <html:options collection="coll" property="value" labelProperty="label" /> 这指在coll的集合中存放了options,value指实际能被提交的值,label是显示给用户的值。

例2 <html:options property="value" labelProperty="label" /> collection属性不被指定时,将使用表单相关的form bean,form bean中value属性存放option value,label属性值显示给用户。

例3 <html:options name="valueBean" property="values" labelName="labelsBean" labelProperty="labels" /> 这个意思是value值存放在名为valueBean的bean的vlaues属性中,它是一个collection;label值也是同样的意思。

<html:optionsCollection>标签,和<html:options>的用法很相似。

例如 <html:select property="custId"><html:optionsCollection property="customers" label="name" value="custId" /></html:select>

这个标签和org.apache.structs.util.LabelValueBean结合的很好,如果把label和value都放到这个对象中,可以很简单的这样应用:

<html:select property="custId"><html:optionsCollection property="customers" /></html:select>

Bean 标签库

       此标签库和Java Bean有很强的关联性,设计的本意是要在JSP 和JavaBean 之间提供一个接口。Struts 提供了一套小巧有用的标签库来操纵JavaBean和相关的对象:cookie、 header、 parameter、 define、write、message、 include、page、resource、size、struts。

bean:cookie、bean:header、bean:parameter

这三个标签用来重新得到cookie, request header和request parameter。

bean:header和bean:parameter标签定义了一个字符串;bean:cookie标签定义了一个Cookie对象。你可以使用value属性做为默认值。如果找不到指定的值,且默认值没有设定的话,会抛出一个request time异常。如果你期望返回多个值的话,可把multiple属性设为true。

 <bean:cookie id="sessionID" name="JSESSIONID" value="JSESSIONID-ISUNDEFINED"/>

 // 这段代码定义了一个名为sessionID的脚本变量,如果找不到一个名为JSESSIONID的cookie,那sessionID 

 // 的值就被设置为JSESSIONID-ISUNDEFINED。

下面代码会输出一些Cookie对象的一些属性:

 <jsp:getProperty name="sessionID " property="comment"/> …

 <jsp:getProperty name="sessionID" property="domain"/> …

 <jsp:getProperty name="sessionID" property="maxAge"/> …

 <jsp:getProperty name="sessionID" property="path"/> …

 <jsp:getProperty name="sessionID" property="value"/> …

 <jsp:getProperty name="sessionID" property="version"/> …

下面是在request中输出所有header的例子: 

 <%

       java.util.Enumeration names =((HttpServletRequest) request).getHeaderNames();

%>

<%

       while (names.hasMoreElements()) {

       String name = (String) names.nextElement();

%>

<bean:header id="head" name="<%= name %>"/>

… <%= name %>

… <%= head %>

<%

       }

%>

下面是parameter的例子:

 <bean:parameter id="param1" name="param1"/>

 <bean:parameter id="param2" name="param2" multiple="true"/> // 此处定义了一个param2[]。

 <bean:parameter id="param3" name="param3" value="UNKNOWN VALUE"/>

于其它标签结合使用:

 <bean:header id="browser" name="User-Agent"/>

<P>You are viewing this page with: <bean:write name="browser"/></P>

----------------------------------------------------------------------------------------------------------------------------------

<bean:cookie id="username" name="UserName" scope="session"

value="New User" />

<P>Welcome <bean:write name="username" property="value"/!</P> 

 // 根据cookie创建一个新的Bean,如果用户名称已经存储在cookie中,它就不显示为一个新用户。 

bean:define:有三个用途。

一是定义新字符串常量:

 <bean:define id="foo" value="This is a new String"/>

 <bean:define id="bar" value='<%= "Hello, " + user.getName() %>'/>

 <bean:define id="last" scope="session" value='<%= request.getRequestURI() %>'/>

二是复制一个现有的bean给新的bean:

 <bean:define id="foo" name="bar"/>   

 <bean:define id="baz" name="bop" type="com.mycompany.MyClass"/> //定义脚本变量的类型,默认为Object

三是复制一个现有的bean的属性给新的bean:

 <bean:define id="bop" name="user" property="role[3].name"/>

  <bean:define id="foo" name="bar" property="baz" scope="request" toScope="session"/> 

  //toScope属性指新bean的scope,默认为page   

上段代码的意思是把名为bar的bean的baz属性赋值给foo,foo的类型为String(默认)。

bean:include

这个标签和bean:include标签和相似,不同点就是它定义了一个可以复用的脚本变量。用id属性命名一个新的脚本变量,还支持forward、href、page和transaction.属性,和html:link中的属性意义一样。

 <bean:include id="footerSpacer" page="/long/path/footerSpacer.jsp"/> 

 然后你能够在多个地方(scope为page)调用:

 <bean:write name="footerSpacer" /> 

bean:message

用来实现对国际化的支持的一个标签,配合java.util数据包中定义的Locale和ResourceBundle类来完成这个任务,用java.text.MessageFormat类配置消息的格式。

   首先要指定资源文件的名称。这个文件会包含用默认语言编写的在程序中会出现的所有消息,这些消息以“关键字-值”的形式存储。文件需要存储在类路径下,路径要作为初始化参数传送给ActionServlet。

   实现国际化的规定:所有的资源文件必须都存储在基本资源文件所在的目录中。基本资源文件包含的是用默认地区语言-本地语言编写的消息。如果基本资源文件的名称是ApplicationResources.properties,那么用其他特定语言编写的资源文件的名称就应该是ApplicationResources_xx.properties(xx为ISO编码,如英语是en)。因此这些文件应包含相同的关键字,但关键字的值是用特定语言编写的。

   然后,ActionServlet的区域初始化参数必须与一个true值一起传送,这样ActionServlet就会在用户会话中的Action.LOCALE_KEY关键字下存储一个特定用户计算机的区域对象。现在可以运行一个国际化的web站点,它可以根据用户计算机上的设置的区域自动以相应的语言显示。

使用特定的字符串来替换部分消息:

 在资源文件中的定义:info.myKey = The numbers entered are {0},{1},{2},{3}

 标记的使用:<bean:message key="info.myKey" arg0="5" arg1="6" arg2="7" arg3="8"/>

 Jsp页面的显示:The numbers entered are 5,6,7,8 // 最多支持4个参数

bean:page:把Jsp中的内部对象做为脚本变量。

<bean:page id="requestObj" property="request"/> 

bean:resource:获得应用程序的资源,这个资源可以是一个String或从java.io.InputStream中读入。使用ServletContext.getResource()ServletContext.getResourceAsStream() 方法检索web应用中的资源,如果在检索资源时发生问题,就会产生一个ruquest time异常。  <bean:resource id="webxml" name="/WEB-INF/web.xml"/>

使用input属性时,资源会做为一个InputStream,如果不指定就被当成一个String。

bean:size:得到存储在array、collection或map中的数目,类型为java.lang.Integer。

 <bean:size id="count" name="employees" />

bean:struts:复制Struct 对象(三种类型)给新的bean,scope为page。

 <bean:struts id="form" formBean="CustomerForm"/>   

 <bean:struts id="fwd" forward="success"/>

 <bean:struts id="map" mapping="/saveCustomer"/>

bean:write:以字符串形式输出bean的属性值。

filter属性:设为true时,将HTML保留字转换为实体("<" 转换为 <);

ignore属性:如果对象不存在,不会抛出异常。

 <bean:write name="userRegistration" property="email" scope="request"/>

 Logic 标签库

此标签库可以分为三种类型:条件、循环、转发/重定向。

一.) 条件类型 logic:empty和logic:notEmpty

logic:empty标签判断脚本变量是否为null,是否是一个空的字符串(长度为0),是否是一个空的collection或map(调用isEmpty()方法来判断)。logic:notEmpty标签类似。

 <logic:empty name="myBean">

  The bean is missing

 </logic:empty>

 <logic:notEmpty name="myBean">

  The bean is not missing

 </logic:notEmpty>

上段代码表示当一个名为myBean的bean在所有的scope中都不存在时,输出The bean is missing;存在的话输出The bean is not missing。

此标签有三个属性:name、property和scope。

logic:equal, logic:notEqual, logic:lessThan, logic:greaterThan,logic:lessEqual, and logic:greaterEqual

这堆logic:*equal*标签从名字上就能知道意思,它们使用起来有些笨拙。

有如下属性:name、property、scope、value、cookie、header、parameter。

 <logic:equal name="bean" property="doubleProperty" value="<%= doub1 %>">

   equal

 </logic:equal>

 <logic:greaterEqual name="bean" property="doubleProperty" value="<%= doub1 %>">

   greaterEqual

 </logic:greaterEqual> 

logic:present和logic:notPresent

检查header、request parameter、cookie、JavaBean或JavaBean propertie是否存在且不等于null。另外还可以检查当前用户的身份,使用属性user和role。

其它的属性有:name、property、scope、cookie、header、parameter。

 <logic:notPresent name="myBean"  property="prop" scope="page">

 The bean property bean.prop is present

 </logic:notPresent>

上段代码检查在page作用域内名为myBean的bean是否有一个prop属性。

logic:match和logic:notMatch

比较两字符串是否相等,可以比较字符串的开始的、结尾的或其中的某个部分。

location属性:指定从某个位置开始进行比较。

其它的属性有:name、property、scope、value、cookie、header、parameter。

下面的例子是检查浏览器类型:

 <logic:match header="User-Agent" value="Mozilla">

 Mozilla!

 </logic:match>

 <logic:notMatch header="User-Agent" value="Mozilla">

 Not Mozilla :(

 </logic:notMatch>

检查bean属性是否匹配"hello world"字符串:

 <logic:match name="bean" property="stringProperty" value="hello world">

 Hello World!

 </logic:match>

 <logic:notMatch name="bean" property="stringProperty" value="hello world">

 I'm so sad and lonely.

 </logic:notMatch> 

检查名为"name"的请求参数是否是"xyz"的子字符串,但是子字符串必须从"xyz"的索引位置1开始(也就是说子字符串必须是"y"或"yz"):

 <logic:match parameter="name"  value="xyz" location="1">

     The parameter name is a sub-string of the string xyz from index 1

 </logic:match>

二.) 循环类型

logic:iterate

重复嵌套在此标签体内的指定集合的元素,集合必须为如下类型:array 、Collection(包括ArrayList和Vector)、Enumeration、Iterator、Map(包括HashMap、Hashtable和TreeMap)。例如:

 <logic:iterate id="employee" name="department" property="employees" scope= "request">

 <bean:write name="employee" property="username" />

 <bean:write name="employee" property="name" />

 <bean:write name="employee" property="phone" />

 </logic:iterate> 

上面的代码迭代了一个employee的集合,是department属性employees的一个集合,作用域为request。

为了输出第五个到第十个employee,需要使用length和offset属性:

 <logic:iterate id="employee" name="department" property="employees" scope= "request" length="10" offset="5">

 <bean:write name="employee" property="username" />

 <bean:write name="employee" property="name" />

 <bean:write name="employee" property="phone" />

 </logic:iterate>

 你可以定义一个变量保存当前的索引值:       

 <ol>

 <logic:iterate id="element" name="bean" property="stringArray" indexId="index">

 <li>

 <em>

 <bean:write name="element"/>

 </em> 

 [<bean:write name="index"/>]</li>

 </logic:iterate>

 </ol> 

三.) 转发/重定向类型

logic:forward和logic:redirect

logic:forward标签和jsp:forward标签和相似,但它可以使用global forward中的一个ActionForward:  

 <logic:forward name="login" />

----------------------------------------------------------------------------------------------------------------------------------

 与上面相关的global forward中的代码:

 <global-forwards>

 <forward name="login" path="/loginForm.jsp"/>

 </global-forwards>

logic:redirect标签和上面的标签类似,但它默认调用的方法是response.sendRedirect(),取代了上面的requestDispatcher.forward()。最大的不同是它支持所有html:link标签的属性,所以你能够指定request参数:

 <logic:redirect name="login" paramId="employeeId" paramName="employee" property="id" />

作者  | 2008-2-18 17:20:24 | 阅读(60) |评论(0) | 阅读全文>>

查看所有日志>>

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2012

   
创建博客 登录  
 关注