Struts2属性文件详解

On January 30, 2010, in Struts2, by bruceleey

struts.configuration
该属性指定加载Struts 2配置文件的配置文件管理器.该属性的默认值是org.apache.Struts2.config.DefaultConfiguration, 这是Struts 2默认的配置文件管理器.如果需要实现自己的配置管理器,开发者则可以实现一个实现Configuration接口的类,该类可以自己加载Struts 2配置文件.

struts.locale
指定Web应用的默认Locale.

struts.i18n.encoding
指定Web应用的默认编码集.该属性对于处理中文请求参数非常有用,对于获取中文请求参数值,应该将该属性值设置为GBK或者GB2312;
提示:当设置该参数为GBK时,相当于调用HttpServletRequest的setCharacterEncoding方法.

struts.objectFactory
指定Struts 2默认的ObjectFactory Bean,该属性默认值是spring.

struts.objectFactory.spring.autoWire
指定Spring框架的自动装配模式, 该属性的默认值是name, 即默认根据Bean的name属性自动装配.

struts.objectFactory.spring.useClassCache
该属性指定整合Spring框架时,是否缓存Bean实例,该属性只允许使用true和false两个属性值,它的默认值是true.通常不建议修改该属性值.

struts.objectTypeDeterminer
该属性指定Struts 2的类型检测机制, 通常支持tiger和notiger两个属性值.

struts.multipart.parser
该属性指定处理multipart/form-data的MIME类型(文件上传)请求的框架,该属性支持cos,pell和jakarta等属 性值, 即分别对应使用cos的文件上传框架,pell上传及common-fileupload文件上传框架.该属性的默认值为jakarta.
注意:如果需要使用cos或者pell的文件上传方式,则应该将对应的JAR文件复制到Web应用中.例如,使用cos上传方式,则需要自己下载cos框架的JAR文件,并将该文件放在WEB-INF/lib路径下.

struts.multipart.saveDir
该属性指定上传文件的临时保存路径,该属性的默认值是javax.servlet.context.tempdir.

struts.multipart.maxSize
该属性指定Struts 2文件上传中整个请求内容允许的最大字节数.

struts.custom.properties
该属性指定Struts 2应用加载用户自定义的属性文件,该自定义属性文件指定的属性不会覆盖struts.properties文件中指定的属性.如果需要加载多个自定义属性文件,多个自定义属性文件的文件名以英文逗号(,)隔开.

struts.mapper.class
指定将HTTP请求映射到指定Action的映射器,Struts 2提供了默认的映射器: org.apache.struts2.dispatcher.mapper.DefaultActionMapper.默认映射器根据请求的前缀与Action的name属性完成映射.

struts.action.extension
该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts 2处理.如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开.

struts.serve.static
该属性设置是否通过JAR文件提供静态内容服务,该属性只支持true和false属性值,该属性的默认属性值是true.

struts.serve.static.browserCache
该属性设置浏览器是否缓存静态内容.当应用处于开发阶段时,我们希望每次请求都获得服务器的最新响应,则可设置该属性为false.

struts.enable.DynamicMethodInvocation
该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true.如果需要关闭动态方法调用,则可设置该属性为false.

struts.enable.SlashesInActionNames
该属性设置Struts 2是否允许在Action名中使用斜线,该属性的默认值是false.如果开发者希望允许在Action名中使用斜线,则可设置该属性为true.

struts.tag.altSyntax
该属性指定是否允许在Struts 2标签中使用表达式语法,因为通常都需要在标签中使用表达式语法,故此属性应该设置为true,该属性的默认值是true.

struts.devMode
该属性设置Struts 2应用是否使用开发模式.如果设置该属性为true,则可以在应用出错时显示更多、更友好的出错提示.该属性只接受true和flase两个值,该属性的 默认值是false.通常,应用在开发阶段,将该属性设置为true,当进入产品发布阶段后,则该属性设置为false.

struts.i18n.reload
该属性设置是否每次HTTP请求到达时,系统都重新加载资源文件(允许国际化文件重载).该属性默认值是false.在开发阶段将该属性设置为true会更有利于开发,但在产品发布阶段应将该属性设置为false.
提示:开发阶段将该属性设置了true,将可以在每次请求时都重新加载国际化资源文件,从而可以让开发者看到实时开发效果;产品发布阶段应该将该属性设置为false,是为了提供响应性能,每次请求都需要重新加载资源文件会大大降低应用的性能.

struts.ui.theme
该属性指定视图标签默认的视图主题,该属性的默认值是xhtml.

struts.ui.templateDir
该属性指定视图主题所需要模板文件的位置, 该属性的默认值是template,即默认加载template路径下的模板文件.

struts.ui.templateSuffix
该属性指定模板文件的后缀,该属性的默认属性值是ftl.该属性还允许使用ftl、vm或jsp,分别对应FreeMarker、Velocity和JSP模板.

struts.configuration.xml.reload
该属性设置当struts.xml文件改变后,系统是否自动重新加载该文件.该属性的默认值是false.

struts.velocity.configfile
该属性指定Velocity框架所需的velocity.properties文件的位置.该属性的默认值为velocity.properties.

struts.velocity.contexts
该属性指定Velocity框架的Context位置,如果该框架有多个Context,则多个Context之间以英文逗号(,)隔开.

struts.velocity.toolboxlocation
该属性指定Velocity框架的toolbox的位置.

struts.url.http.port
该属性指定Web应用所在的监听端口.该属性通常没有太大的用户,只是当Struts 2需要生成URL时(例如Url标签),该属性才提供Web应用的默认端口.

struts.url.https.port
该属性类似于struts.url.http.port属性的作用,区别是该属性指定的是Web应用的加密服务端口.

struts.url.includeParams
该属性指定Struts 2生成URL时是否包含请求参数.该属性接受none、get和all三个属性值,分别对应于不包含、仅包含GET类型请求参数和包含全部请求参数.

struts.custom.i18n.resources
该属性指定Struts 2应用所需要的国际化资源文件,如果有多份国际化资源文件,则多个资源文件的文件名以英文逗号(,)隔开.

struts.diSPAtcher.parametersWorkaround
对于某些Java EE服务器,不支持HttpServlet Request调用getParameterMap()方法,此时可以设置该属性值为true来解决该问题.该属性的默认值是false.对于 WebLogic、Orion和OC4J服务器,通常应该设置该属性为true.

struts.freemarker.manager.classname
该属性指定Struts 2使用的FreeMarker管理器.该属性的默认值是org.apache.struts2.views.freemarker.FreemarkerManager,这是Struts 2内建的FreeMarker管理器.

struts.freemarker.wrapper.altMap
该属性只支持true和false两个属性值,默认值是true.通常无需修改该属性值.

struts.xslt.nocache
该属性指定XSLT Result是否使用样式表缓存.当应用处于开发阶段时,该属性通常被设置为true;当应用处于产品使用阶段时,该属性通常被设置为false.

struts.configuration.files
该属性指定Struts 2框架默认加载的配置文件,如果需要指定默认加载多个配置文件,则多个配置文件的文件名之间以英文逗号(,)隔开.该属性的默认值为struts- default.xml,struts-plugin.xml,struts.xml,看到该属性值,所以应该明白为什么Struts 2框架默认加载struts.xml文件了.

Struts2常用标签

On January 28, 2010, in Struts2, by bruceleey

A:
<s:a xhref=”"></s:a>—–超链接,类似于html里的<a></a>
<s:action name=”"></s:action>—–执行一个view里面的一个action
<s:actionerror/>—–如果action的errors有值那么显示出来
<s:actionmessage/>—–如果action的message有值那么显示出来
<s:append></s:append>—–添加一个值到list,类似于list.add();
<s:autocompleter></s:autocompleter>—–自动完成<s:combobox>标签的内容,这个是ajax

B:
<s:bean name=”"></s:bean>—–类似于struts1.x中的,JavaBean的值

C:
<s:checkbox></s:checkbox>—–复选框
<s:checkboxlist list=”"></s:checkboxlist>—–多选框
<s:combobox list=”"></s:combobox>—–下拉框
<s:component></s:component>—–图像符号

D:
<s:date/>—–获取日期格式
<s:datetimepicker></s:datetimepicker>—–日期输入框
<s:debug></s:debug>—–显示错误信息
<s:div></s:div>—–表示一个块,类似于html的<div></div>
<s:doubleselect list=”" doubleName=”" doubleList=”"></s:doubleselect>—–双下拉框

E:
<s:if test=”"></s:if>
<s:elseif test=”"></s:elseif>
<s:else></s:else>—–这3个标签一起使用,表示条件判断

F:
<s:fielderror></s:fielderror>—–显示文件错误信息
<s:file></s:file>—–文件上传
<s:form action=”"></s:form>—–获取相应form的值

G:
<s:generator separator=”" val=”"></s:generator>—-和<s:iterator>标签一起使用

H:
<s:head/>—–在<head></head>里使用,表示头文件结束
<s:hidden></s:hidden>—–隐藏值

I:
<s:i18n name=”"></s:i18n>—–加载资源包到值堆栈
<s:include value=”"></s:include>—–包含一个输出,servlet或jsp页面
<s:inputtransferselect list=”"></s:inputtransferselect>—–获取form的一个输入
<s:iterator></s:iterator>—–用于遍历集合

L:
<s:label></s:label>—–只读的标签

M:
<s:merge></s:merge>—–合并遍历集合出来的值

O:
<s:optgroup></s:optgroup>—–获取标签组
<s:optiontransferselect doubleList=”" list=”" doubleName=”"></s:optiontransferselect>—–左右选择框

P:
<s:param></s:param>—–为其他标签提供参数
<s:password></s:password>—–密码输入框
<s:property/>—–得到’value’的属性
<s:push value=”"></s:push>—–value的值push到栈中,从而使property标签的能够获取value的属性

R:
<s:radio list=”"></s:radio>—–单选按钮
<s:reset></s:reset>—–重置按钮

S:
<s:select list=”"></s:select>—–单选框
<s:set name=”"></s:set>—–赋予变量一个特定范围内的值
<s:sort comparator=”"></s:sort>—–通过属性给list分类
<s:submit></s:submit>—–提交按钮
<s:subset></s:subset>—–为遍历集合输出子集

T:
<s:tabbedPanel id=”"></s:tabbedPanel>—–表格框
<s:table></s:table>—–表格
<s:text name=”"></s:text>—–I18n文本信息
<s:textarea></s:textarea>—–文本域输入框
<s:textfield></s:textfield>—–文本输入框
<s:token></s:token>—–拦截器
<s:tree></s:tree>—–树
<s:treenode label=”"></s:treenode>—–树的结构

U:
<s:updownselect list=”"></s:updownselect>—–多选择框
<s:url></s:url>—–创建url

Tagged with:  

Struts2 XML标签:Constant

On January 28, 2010, in Struts2, by bruceleey

struts.serve.static.browserCache 该属性设置浏览器是否缓存静态内容。当应用处于开发阶段时,我们希望每次请求都获得服务器的最新响应,则可设置该属性为false。

struts.enable.DynamicMethodInvocation 该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为false。

struts.enable.SlashesInActionNames 该属性设置Struts 2是否允许在Action名中使用斜线,该属性的默认值是false。如果开发者希望允许在Action名中使用斜线,则可设置该属性为true。

struts.tag.altSyntax 该属性指定是否允许在Struts 2标签中使用表达式语法,因为通常都需要在标签中使用表达式语法,故此属性应该设置为true,该属性的默认值是true。

struts.devMode该属性设置Struts 2应用是否使用开发模式。如果设置该属性为true,则可以在应用出错时显示更多、更友好的出错提示。该属性只接受true和flase两个值,该属性的 默认值是false。通常,应用在开发阶段,将该属性设置为true,当进入产品发布阶段后,则该属性设置为false。

struts.i18n.reload该属性设置是否每次HTTP请求到达时,系统都重新加载资源文件。该属性默认值是false。在开发阶段将该属性设置为true会更有利于开发,但在产品发布阶段应将该属性设置为false。

提示 开发阶段将该属性设置了true,将可以在每次请求时都重新加载国际化资源文件,从而可以让开发者看到实时开发效果;产品发布阶段应该将该属性设置为false,是为了提供响应性能,每次请求都需要重新加载资源文件会大大降低应用的性能。

struts.ui.theme该属性指定视图标签默认的视图主题,该属性的默认值是xhtml。

struts.ui.templateDir该属性指定视图主题所需要模板文件的位置,该属性的默认值是template,即默认加载template路径下的模板文件。

struts.ui.templateSuffix该属性指定模板文件的后缀,该属性的默认属性值是ftl。该属性还允许使用ftl、vm或jsp,分别对应FreeMarker、Velocity和JSP模板。

struts.configuration.xml.reload该属性设置当struts.xml文件改变后,系统是否自动重新加载该文件。该属性的默认值是false。

struts.velocity.configfile该属性指定Velocity框架所需的velocity.properties文件的位置。该属性的默认值为velocity.properties。

struts.velocity.contexts该属性指定Velocity框架的Context位置,如果该框架有多个Context,则多个Context之间以英文逗号(,)隔开。

struts.velocity.toolboxlocation该属性指定Velocity框架的toolbox的位置。

struts.url.http.port该属性指定Web应用所在的监听端口。该属性通常没有太大的用户,只是当Struts 2需要生成URL时(例如Url标签),该属性才提供Web应用的默认端口。

struts.url.https.port该属性类似于struts.url.http.port属性的作用,区别是该属性指定的是Web应用的加密服务端口。

struts.url.includeParams该属性指定Struts 2生成URL时是否包含请求参数。该属性接受none、get和all三个属性值,分别对应于不包含、仅包含GET类型请求参数和包含全部请求参数。
struts.custom.i18n.resources该属性指定Struts 2应用所需要的国际化资源文件,如果有多份国际化资源文件,则多个资源文件的文件名以英文逗号(,)隔开。
struts.dispatcher.parametersWorkaround 对于某些Java EE服务器,不支持HttpServlet Request调用getParameterMap()方法,此时可以设置该属性值为true来解决该问题。该属性的默认值是false。对于 WebLogic、Orion和OC4J服务器,通常应该设置该属性为true。

struts.freemarker.manager.classname 该属性指定Struts 2使用的FreeMarker管理器。该属性的默认值是 org.apache.struts2.views.freemarker.FreemarkerManager,这是Struts 2内建的FreeMarker管理器。

struts.freemarker.wrapper.altMap该属性只支持true和false两个属性值,默认值是true。通常无需修改该属性值。

struts.xslt.nocache 该属性指定XSLT Result是否使用样式表缓存。当应用处于开发阶段时,该属性通常被设置为true;当应用处于产品使用阶段时,该属性通常被设置为false。

struts.configuration.files 该属性指定Struts 2框架默认加载的配置文件,如果需要指定默认加载多个配置文件,则多个配置文件的文件名之间以英文逗号(,)隔开。该属性的默认值为struts- default.xml,struts-plugin.xml,struts.xml,看到该属性值,读者应该明白为什么Struts 2框架默认加载struts.xml文件了。

Tagged with:  

我奋斗了18年不是为了和你一起喝咖啡

On January 26, 2010, in 杂谈, by bruceleey

3年前,麦子的一篇《我奋斗了18年才和你坐在一起喝咖啡》引起多少共鸣,一个农家子弟经过18年的奋斗,才取得和大都会里的同龄人平起平坐的权利,一代 人的真实写照。然而,3年过去,我恍然发觉,他言之过早。18年又如何?再丰盛的年华叠加,我仍不能和你坐在一起喝咖啡。
那年我25,无 数个夙兴夜寐,换来一个学位,额上的抬头纹分外明显,脚下却半步也不敢停歇。如果不想让户口打回原籍,子子孙孙无穷匮,得赶紧地找份留京工作。你呢?你不 着急,魔兽世界和红色警报?早玩腻了!你野心勃勃地筹划着“创业创业”。当时李彦宏、陈天桥、周云帆,牛人们还没有横空出世,百度、 Google、完美时空更是遥远的名词,可青春所向披靡不可一世,你在校园里建起配送网站,大张旗鼓地招兵买马,大小媒体的记者蜂拥而至。334寝室很快 在全楼名噪一时,小姑娘们从天南地北寄来粉粉的信纸,仰慕地写道:“从报上得知你的精彩故事……”得空,爬上楼顶吹吹风,你眉飞色舞地转向我,以照顾自己 人的口气说,兄弟,一起发财如何?

好呀,可惜,我不能。创业于你,是可进可退可攻可守的棋,启动资金有三姑六眷帮忙筹集,就算铩 羽而归,父母那三室一厅、温暖的灶台也永不落空。失败于我,意味着覆水难收一败涂地,每年夏天,为了节省三五百块钱的机器钱,爹娘要扛着腰肌劳损在大日头 下收割5亩农田。我穿着借来的西服完成了第一次面试,戴着借来的手表与心爱的女孩进行了第一次约会。当你拿到了第一笔投资兴奋地报告全班时,我冷静地穿越 大半个北京城,去做最后一份家教。没错,“这活儿技术含量忒低”,但在第一个月工资下发前,我租来的立锥之地与口粮全靠它维持。

不多久,互联网就遭遇了寒流,你也对创业意兴阑珊,进了家国有性质的通信公司,我被一家外企聘用。坐井观天的我,竟傻傻地以为扳回了一局。明面上的工资, 我比你超出一截,税后8000,出差住5星级宾馆,一年带薪休假10天。玩命一样地投入工作,坚信几年后也有个童话般的结尾,“和公主过上幸福的生活 ”。

好景不长,很快,我明白了为什么大家说白领是句骂人的话。写字楼的套餐,标价35,几乎没人搭理它。午餐时间,最抢手的是各 层拐角处的微波炉,“白领 ”们端着带来的便当,排起了长长的队伍。后来,物业允许快餐公司入住,又出现了“千人排队等丽华”的盛况。这些月入近万的人士节约到抠门的程度。一位同 事,10块钱的感冒药都找保险公司理赔;另一位,在脏乱差的火车站耗上3个小时,为的是18:00后返程能多得150元的晚餐补助。

这幕幕喜剧未能令我发笑,我读得懂,每个数字后都凝结着加班加点与忍气吞声;俯首帖耳被老板盘剥,为的是一平米一平米构筑起自己的小窝。白手起家的过程 艰辛而漫长,整整3年,我没休过一次长假没吃过一回鸭脖子;听到“华为25岁员工胡新宇过劳死”的新闻,也半点儿不觉得惊讶,以血汗、青春换银子的现象在 这个行业太普遍了。下次,当你在上地看见一群人穿着西装革履拎着IBM笔记本奋力挤上4毛钱的公交车,千万别奇怪,我们就是一群IT民工。

惟一让人欣慰的是,我们离理想中的目标一步步靠近。

突如其来地,你的喜讯从天而降:邀请大家周末去新居暖暖房。怎么可能?你竟比我快?可豁亮的100多平方米、红苹果家具、37寸液晶大彩电无可质疑地摆 在眼前。你轻描淡写地说,老头子给了10万,她家里也给了10万,老催着我们结婚……回家的路上,女朋友郁郁不说话,她和我一样,来自无名的山城。我揽过 她的肩膀,鼓励她也是鼓励自己,没关系,我们拿时间换空间。

蜜月你在香港过的,轻而易举地花掉了半年的工资,回来说,意思不大, 不像TVB电视里拍的那样美轮美奂;我的婚礼,在家乡的土路、乡亲的围观中巡游,在低矮昏暗的老房子里拜了天地,在寒冷的土炕上与爱人相拥入眠。幸运的 是,多年后黯淡的图景化作妻子博客里光芒四射的图画,她回味:“有爱的地方,就有天堂。”

我们都想给深爱的女孩以天堂,天堂的含义却迥然不同。你的老婆当上了全职太太,每天用电驴下载《老友记》和《越狱》;我也想这么来着,老婆不同意,你养我,谁养我爸妈?不忍心让你一个人养7个人。当你的女孩敷着倩碧面膜舒服地翘起脚,我的女孩却在人海中顽强地搏杀。

两个人赚钱的速度快得多。到2004年年底,我们也攒到了人生中第一个10万,谁知中国的楼市在此时被魔鬼唤醒,海啸般狂飙突进,摧毁一切渺小虚弱的个 体。2005年3月,首付还够买西四环的郦城,到7月,只能去南城扫楼了。我们的积蓄本来能买90平方米的两居来着,9月中旬,仅仅过去2个月,只够买 80多平。

没学过经济学原理?没关系。生活生动地阐释了什么叫资产泡沫与流动性泛滥。这时专家跳出来发言了,“北京房价应该降 30%,上海房价应该降40%。” 要不,再等等?我险些栖身于温吞的空方阵营,是你站出来指点迷津:赶快买,房价还会涨。买房的消息传回老家,爹娘一个劲儿地唏嘘:抵得上俺们忙活半年。在 他们看来,7500元一平方米是不可思议的天价。3年后的2008,师弟们纷纷感叹,你赚大发了,四环内均价1万4,已无楼可买。

几天前,我看见了水木上一句留言,颇为感慨:“工作5年还没买房真活该,2003年正是楼市低迷与萧条之时。等到今天,踏空的不仅是黄金楼市,更是整个人生。”

真要感谢你,在我不知理财为何物之时,你早早地告诉我什么叫消费什么叫投资。

并非所有人都拥有前瞻的眼光和投资的观念。许多和我一样来自小地方、只知埋头苦干的兄弟们,太过关注脚下的麦田,以至于错过一片璀璨的星空。你的理论 是,赚钱是为了花,只有在流通中才能增值,买到喜爱的商品,让生活心旷神怡。而我的农民兄弟——这里特指是出身农家毕业后留在大城市的兄弟,习惯于把人民 币紧紧地捏在手中。存折数字的增长让他们痴迷。该买房时,他们在租房;该还贷时,他们宁可忍受7%的贷款利率,也要存上5年的定期。辛苦赚来的银子在等待 中缩水贬值。他们往往在房价的巅峰处,无可奈何地接下最后一棒;也曾天真地许愿,赚够100万就回家买房。可等到那一天真的到来,老家的房价,二线、三线 城市甚至乡镇的都已疯长。

这便是我和你的最大差别,根深蒂固的分歧、不可逾越的鸿沟也在于此。我曾经以为,学位、薪水、公司名气 一样了,我们的人生便一样了。事实上,差别不体现在显而易见的符号上,而是体现在世世代代的传承里,体现在血液里,体现在头脑中。18年的积累,家庭出 身、生活方式、财务观念,造就了那样一个你,也造就了这样一个我,造就了你的疏狂佻达与我的保守持重。当我还清贷款时,你买了第二套住房;上证指数 6000点,当我好容易试水成为股民,你清仓离场,转投金市;我每月寄1000元回去,承担起赡养父母的责任,你笑嘻嘻地说,养老,我不啃老就不错了;当 我思考着要不要生孩子、养孩子的成本会在多大程度上折损生活品质时,4个老人已出钱出力帮你抚养起独二代;黄金周去一趟九寨沟挺好的了,你不满足,你说德 国太拘谨美国太随意法国才是你向往的时尚之都……

我的故事,是一代“移民”的真实写照——迫不得已离乡背井,祖国幅员辽阔,我却 像候鸟一样辗转迁徙,择木而栖。现行的社会体制,注定了大城市拥有更丰富的教育资源、医疗资源、生活便利。即便取得了一纸户口,跻身融入的过程依然是充满 煎熬,5年、10年乃至更长时间的奋斗才获得土著们唾手可得的一切。曾经愤慨过,追寻过,如今,却学会了不再抱怨,在一个又一个缝隙间心平气和。差距固然 存在,但并不令人遗憾,正是差距和为弥补差距所付出的努力,加强了生命的张力,使其更有层次更加多元。

可以想见的未来是,有一天 我们的后代会相聚于迪斯尼(这点自信我还是有的),讲起父亲的故事,我的那一个,虽然不一定更精致更华彩,无疑曲折有趣得多。那个故事,关于独立、勇气、 绝地反弹、起死回生,我给不起儿子名车豪宅,却能给他一个不断成长的心灵。我要跟他说,无论贫穷富贵,百万家资或颠沛流离,都要一样地从容豁达。

至此,喝不喝咖啡又有什么打紧呢?生活姿态的优雅与否,不取决于你所坐的位置、所持的器皿、所付的茶资。它取决于你品茗的态度。

我奋斗了18年,不是为了和你一起喝咖啡。

我奋斗了18年才和你坐在一起喝咖啡

On January 26, 2010, in 杂谈, by bruceleey

我的白领朋友们,如果我是一个初中没毕业就来沪打工的民工,你会和我坐在“星巴克”一起喝咖啡吗?不会,肯定不会。比较我们的成长历程,你会发现,为了一些在你看来唾手可得的东西,我却需要付出巨大的努力。

从我出生的一刻起,我的身份就与你有了天壤之别,因为我只能报农村户口,而你是城市户口。如果我长大以后一直保持农村户口,那么我就无法在城市中找到一份正式工作,无法享受养老保险、医疗保险。你可能会问我:“为什么非要到城市来?农村不很好吗?空气新鲜,又不像城市这么拥挤。”可是农村没有好的医疗条件,去年SARS好像让大家一夜之间发现农村的医疗保健体系竟然如此落后,物质供应也不丰富,因为农民挣的钱少,贵一点儿的东西就买不起,所以商贩也不会进太多货。春节联欢晚会的小品中买得起等离子彩电的农民毕竟是个别现象,绝大多数农民还在为基本的生存而奋斗,于是我要进城,要通过自己的奋斗获得你生下来就拥有的大城市户口。
考上大学是我跳出农门的惟一机会。我要刻苦学习,小学升初中,初中升高中,高中考大学,我在独木桥上奋勇搏杀,眼看着周围的同学一批批落马,前面的道路越来越窄,我这个佼佼者心里不知是喜是忧。激烈的竞争让我不敢疏忽,除了学习功课,我无暇顾及业余爱好,学校也没有这些发展个人特长的课程。进入高中的第一天,校长就告诉我们这三年只有一个目标——高考。于是我披星戴月,早上5∶30起床,晚上 11∶00睡觉,就连中秋节的晚上,我还在路灯下背政治题。

而你的升学压力要小得多,竞争不是那么激烈,功课也不是很沉重,你可以有充足的时间去发展个人爱好,去读课外读物,去球场挥汗如雨,去野外享受蓝天白云。如果你不想那么辛苦去参加高考,只要成绩不是太差,你可以在高三时有机会获得保送名额,哪怕成绩忒差,也会被“扫”进一所本地三流大学,而那所三流大学我可能也要考到很高的分数才能进去,因为按地区分配的名额中留给上海本地的名额太多了。

我们的考卷一样我们的分数线却不一样,但是当我们都获得录取通知书的时候,所交的学费是一样的。每人每年6000元,四年下来光学费就要2.4万元,再加上住宿费每人每年1500元,还有书本教材费每年1000元、生活费每年4000元(只吃学校食堂),四年总共5万元。 2003年上海某大学以“新建的松江校区环境优良”为由,将学费提高到每人每年1万元,这就意味着仅学费一项四年就要4万元,再加上其他费用,总共6.6 万元。6.6万元对于一个上海城市家庭来说也许算不上沉重的负担,可是对于一个农村的家庭,这简直是一辈子的积蓄。我的家乡在东部沿海开放省份,是一个农业大省,相比西部内陆省份应该说经济水平还算比较好,但一年辛苦劳作也剩不了几个钱。以供养两个孩子的四口之家为例,除去各种日常必需开支,一个家庭每年最多积蓄3000元,那么6.6万元上大学的费用意味着22年的积蓄!前提是任何一个家庭成员都不能生大病,而且另一个孩子无论学习成绩多么优秀,都必须剥夺他上大学的权利,因为家里只能提供这么多钱。我属于比较幸运的,东拼西凑加上助学贷款终于交齐了第一年的学费,看着那些握着录取通知书愁苦不堪全家几近绝望的同学,我的心中真的不是滋味。教育产业化时代的大学招收的?

我终于可以如愿以偿地在大学校园里汲取知识的养分!努力学习获得奖学金,假期打工挣点生活费,我实在不忍心多拿父母一分钱,那每一分钱都是一滴汗珠掉在地上摔成八瓣挣来的血汗钱啊!

来到上海这个大都市,我发现与我的同学相比我真是土得掉渣。我不会作画,不会演奏乐器,不认识港台明星,没看过武侠小说,不认得MP3,不知道什么是 walkman,为了弄明白营销管理课上讲的“仓储式超市”的概念,我在“麦德隆”好奇地看了一天,我从来没见过如此丰富的商品。

我没摸过计算机,为此我花了半年时间泡在学校机房里学习你在中学里就学会的基础知识和操作技能。我的英语是聋子英语、哑巴英语,我的发音中国人和外国人都听不懂,这也不能怪我,我们家乡没有外教,老师自己都读不准,怎么可能教会学生如何正确发音?基础没打好,我只能再花一年时间矫正我的发音。我真的很羡慕大城市的同学多才多艺,知识面那么广,而我只会读书,我的学生时代只有学习、考试、升学,因为只有考上大学,我才能来到你们中间,才能与你们一起学习,所有的一切都必须服从这个目标。    

我可以忍受城市同学的嘲笑,可以几个星期不吃一份荤菜,可以周六周日全天泡在图书馆和自习室,可以在周末自习回来的路上羡慕地看着校园舞厅里的成双成对,可以在寂寞无聊的深夜在操场上一圈圈地奔跑。我想有一天我毕业的时候,我能在这个大都市挣一份工资的时候,我会和你这个生长在都市里的同龄人一样——做一个上海公民,而我的父母也会为我骄傲,因为他们的孩子在大上海工作!  

终于毕业了,在上海工作难找,回到家乡更没有什么就业机会。能幸运地在上海找到工作的应届本科生只有每月2000元左右的工资水平,也许你认为这点钱应该够你零花的了,可是对我来说,我还要租房,还要交水电煤电话费还要还助学贷款,还想给家里寄点钱让弟妹继续读书,剩下的钱只够我每顿吃盖浇饭,我还是不能与你坐在“星巴克”一起喝咖啡!  

如今的我在上海读完了硕士,现在有一份年薪七八万的工作。我奋斗了18年,现在终于可以与你坐在一起喝咖啡。我已经融入到这个国际化大都市中了,与周围的白领朋友没有什么差别。可是我无法忘记奋斗历程中那些艰苦的岁月,无法忘记那些曾经的同学和他们永远无法实现的夙愿。于是我以第一人称的方式写下了上面的文字,这些是最典型的中小城市和农村平民子弟奋斗历程的写照。每每看到正在同命运抗争的学子,我的心里总是会有一种沉重的责任感。

写这篇文章不是为了怨天尤人,这个世界上公平是相对的,这并不可怕,但是对不公平视而不见是非常可怕的。我在上海读硕士的时候,曾经讨论过一个维达纸业的营销案例,我的一位当时曾有三年工作经验,现任一家中外合资公司人事行政经理的同学,提出一个方案:应该让维达纸业开发高档面巾纸产品推向9亿农民市场。我惊讶于她提出这个方案的勇气,当时我问她是否知道农民兄弟吃过饭后如何处理面部油腻,她疑惑地看着我,我用手背在两侧嘴角抹了两下,对如此不雅的动作她投以鄙夷神色。

在一次宏观经济学课上,我的另一同学大肆批判下岗工人和辍学务工务农的少年:“80%是由于他们自己不努力,年轻的时候不学会一门专长,所以现在下岗活该!那些学生可以一边读书一边打工嘛,据说有很多学生一个暑假就能赚几千元,学费还用愁吗?” 我的这位同学太不了解贫困地区农村了。

我是70年代中期出生的人,我的同龄人正在逐渐成为社会的中流砥柱,我们的行为将影响社会和经济的发展。把这篇文章送给那些在优越环境中成长起来的年轻人和很久以前曾经吃过苦现在已经淡忘的人,关注社会下层,为了这个世界更公平些,我们应该做些力所能及的事情,让社会责任感驻留我们的头脑。

我花了18年时间才能和你坐在一起喝咖啡。

作者:麦子。