Archive for » 2008 «

轮回之面试篇

前天,吴老师,德超,晓鑫,我去了哈特对面的一家川菜馆。我清楚地记得,一年前相同的一天,我们也同样去了这家餐馆,那时候还有陈伟,原因是我刚失恋,大家一起出去开导开导我。而一年后,我异常惊奇地发现我们居然又走进了同一家饭馆,而这一年中除了这两次之后,我们没有光顾过这里。

我不得不感叹岁月的轮回,不免唏嘘一番,历史居然是如此的重复。而除了餐馆,还有很多事情同样打上了一个烙印叫做“轮回”。接下来准备记录几篇这样的日志,就先从实习面试开始吧。

两年前的这个时候,同样在为实习奔波,不过那时候有保研打底。现在我已然毫无退路,说没有压力,我还没盲目自信到那种程度,不过心态还是不错的。四月份刚来实习单位的时候,也没有浪投,嗯,我RP还是很好的(找单位最重要的就是积攒RP,所以今天晚饭还请同学喝了杯可乐,呵呵)。最近四天,大大小小面了四次。今天是星期五了,估计这一轮面试轰炸就到此为止了,

1. Intel上海
这个面试来得毫无预计,也是面得最短的,估计双方都没有准备,呵呵。星期二上秦老师课的时候,忽然一个021的电话call来,然后匆忙出教学接。那边说是Intel上海,我就使劲地搜寻,我投过吗?过了一会儿终于想到是一个月前投的,是crackcarr说他们学校BBS上有个职位挺适合我,于是乎我就投了一把。结果就在我差不多忘了的时候,来电话了,然后大概介绍了一下项目经验。然后还没切入正题那边就说我的问题问完了,你有什么问题。当时真是挺晕,在那种情况下接到那么一种电话。权且把这也算是一次面试经历吧。

2. IBM CDL北京
这是吴老师同学推荐的职位,说实话对职位信息了解的不多,星期二晚上接到面试预约电话,星期三下午2点半QQ视频面试。IBM居然用QQ面试,以前还真没听过。星期下午本来是在寝室的,结果那边说视频效果不好,说能不能找个网吧。没辙,只能去附近的网吧找了个包间,开始面试。面试的那边我估计有好几个面试官,不过问题都是一个面试官问的。没怎么涉及技术问题,仔细确认了一下我对IBM产品的使用情况。最后确认了一下如果去实习,应该是做测试方面。一周内等通知吧。

3. 博奥杰上海
BO是和学院合作的公司,星期四的笔试,今天上午面试。BO其实本是我非常非常期待的一个公司,但自从托宋翊涵在BO的同学问过一些实际情况后,便感觉到不是太适合了。这次来学院了,还是去笔试了。笔试16道选择题,三道大题,大题很简单,一道二分法,一道字符串替换,一道考面向对象的设计题。选择题里主要考了多线程,分布式,事务和测试。
今天上午的面试答得不是很好,没有技术问题。问的都是诸如本科在哪实习,现在还愿不愿意回原来的公司实习这样的问题。
面试快完的时候,面试官问我对测试怎么看,然后他谈了一些QA的看法。比如意外的是他明确提到BO其实并不太希望实习生开发,认为成本太大,实习生更多的是测试工作。这个信息是我始料未及的,我还以为在BO能接触到顶级的BI开发,而相当大的一部分其实是在国外的部门做。

4. 百度北京
距4月26号笔试完已经快一个月的时间了,今天才面试,挺无语的一件事情。今天晚上的面试进行的还算顺利,基本上每个问题都能把我自己知道的答出来,总的来说,自我感觉还可以。但还是有一些硬伤,我自己也知道百度很看重,但确实自己实力不足。比如说:项目大都是J2EE,跟C和和网络编程差的比较处;大规模数据的处理,自己确实没有太多经验;Mysql几种数据引擎的使用,自己只是稍微知道一些,数据库的优化这些都是硬伤。

总的来说,第一轮的面试就是这样了,不管顺利通过还是被BS,自己无愧于心,不留下遗憾就好了。

好书莫问出处

记得大四的某个时间,偶然从springside论坛发现了IT图书豆瓣这个东东,于是订了RSS,国外最新的图书一网打尽。

今天看javaeye看到“Java Persistence with Hibernate”中文版出来了,这种精品当然在springside论坛上也是有的了,记得当初还很天真地专门跑到china-pub下载了一章试读样章来看。

最近淘到的一本好书并且看了的是“Flexible Rails Flex3 on Rails2”,这本书是2008年1月出版的,居然springside 1月底就神通广大的提供了电子版。

前几天看到一个同学从图书馆借了“Java并发编程实践”这本书,很想看一看。可能是我RPWT吧,从图书馆下面的查书终端上查明明是有两本在馆,结果就是找不着。。。没办法,只能就着英文版的啃。英文版名字叫“Java Concurrency in Practice”,也忘了什么时候下载的。。。

Category: java  Leave a Comment

实训总结

这个总结本应该早就写了,不过本人码字能力实在有限,以前每次写篇总结都要花费大块时间,有时候觉得不划算,加上惰性使然,有时候一拖再拖就拖没了。。。言归正传,log,log,不及时记录“程序”出错了靠什么调试呢,所以还是得及时写。

这次实训做的来说效果还不错,做的项目也不是那种老掉牙的某某信息管理系统,每天从早做到晚,用了三周的时间,,还算比较顺利地完成了。

项目需求来源是从中软烟草办给国家烟草局做的数采系统中抽取的,做的主要是烟草数据的采集与分析,展现等。总的来说,这次的项目要分为三个系统:国家,省和地方。而系统间的信息和数据传递是通过消息中间件(MQ)来传递。项目进行过程中,我把遇到的一些问题都记在一个Q&A文档里,下面就把这些问题扩展一下,作为一个总结。

  • 项目分工及CVS
    这次的项目我是以项目经理的角色参与的,小组除了我还有九个组员。大家水平参差不齐,但都特别认真,用郭德纲的话来说就是:“我很欣慰呐”。一般说来,分工无外乎这么几种分法:垂直的根据逻辑层来分,水平的根据功能模块来分。其实我很希望按垂直的方式来分,三个人(或组)就够了,一个负责持久层和DAO,一个负责控制层和Serivce,一个负责页面展示和CSS等。不过这种分法只适合于配合特别好的团队,对于这次这个临时的团队,我还是老老实实地按水平方式来分吧。最终分成了四个小组,国家局和地方系统各三个人,省局系统一个人,MQ一个人。在各小组之间,有功能类似的地方,如果在俱乐部做这个系统,肯定这些代码就会抽取成通用的service,不过对于这个团队还是别勉为其难了。 
    CVS管理有一点小麻烦,因为这次是管理三个系统的代码。建三个CVS仓库看起来是最简单的,不过这样一些公用的基础代码更新就无法得到通知保证,当然类似把基础代码放在三个CVS中这种stupid的做法排除在外。最后采用的还是一个CVS仓库,基础代码和公用类作为主线(HEAD),在此基础上建立三个分支(BRANCH)。建完之后就等于是四个系统彼此独立(三个分支和一个主线),最后在三个分支上手动将基础代码部分切换到主线上。
  • 基础框架
    这次项目让我比较爽的一点就是我终于扮演了一把以前在DC实习时胜哥的角色,技术总监。系统的基本框架是在寒假时候搭的,花了三天的时间。我曾经很多次对自己的性格进行过分析,结果是我不擅长做类似项目经理这样的角色,我更喜欢把代码写得很整齐,很优雅,而对类似需求一类的事情不很感冒。而对开源的东西很感兴趣,毕竟能看到源代码能让人觉得很踏实。
    “我应该有一个自己的Appfuse”,这是我很早以前的一个计划,这个框架不必太大,但是尽量要可以接受“CHANGE”这六个字母的挑战,在不断的迭代中学习。不过遗憾的是一直都没有静下心来实行,今年寒假过年前利用一些时间静下心来鼓捣了一部分。参考了Appfuse和SpringSide的代码,用到的框架跟Appfuse SpringMVC的版本差不太多。
  • DB2
    一直很纳闷为什么给政府,金融这些部门做系统数据库是DB2和Oracle二选一,应用服务器是WAS和WebLogic二选一。难道Tomcat,Lighttpd,Apache,Mysql这些开源的产品只能飞翔在Web2.0风格的网站上么?承受不了大数据量?类似豆瓣,JavaEye这样的网站流量和数据量并不小。
    这次的项目也一样,强制使用DB2+WAS。用就用吧,DB2就当是MySQL用,没有足够时间研究它的高级特性。以下是一些Q&A:

    Q:db2连接时显示no suitable driver,但是单独写一个jdbc程序连接却可以成功。
    A:将db2的bin下的db2jdbc.dll拷贝到jdk的bin下即可。

    Q:安装db2时安装快结束时显示你的系统用户名没有权限执行某些操作。
    A:很有可能是你的系统用户名的实际名称和显示名称不一致(即任务管理器中的名字为A,但是欢迎屏幕上显示是B)。所以安装前最好在管理工具->计算机管理->本地用户和组->用户设置正确。

    Q:com.ibm.db2.jcc.a.SqlException: 运算 "=" 的操作数的数据类型不兼容。
    A:这个问题原因有很多种。我出现错误的原因是沿用了Mysql的数据逻辑,举个例子:A表的xx_id与B表的id主键有外键关联关系,在Mysql里用varchar存储xx_id没问题,一切OK。但是在DB2中,你就必须把xx_id设为integer,因为Mysql和DB2对表主键约束力不同。虽然主键都用integer存储,但DB2中如果id作为外键与另一个表关联时,另一个表的xx_id就必须是integer。而对于这个问题的发现及解决,得益于在开发中坚持了DAO层的测试先行,所以并未花费多少时间。

    在对DB2的操作上,虽然也有Quest Central这样的工具,不过掌握DB2命令其实是更重要的。因为图形化操作前端始终只能局限在windows上,而部署DB2或者Oracle的系统肯定是非windows系统(大多数是AIX)。所以泡在前端上沾沾自喜,觉得自己掌握了数据库操作的想法是比较幼雅的,嗯,以前我也挺幼雅的。。。
    另外,这次还发现了一个部署时的小问题。对于Ant,Maven这类项目构建工具来说,编译时必须注意一点,有可能你在windows上测试没问题,不过部署到类Unix机器上去,说不定就编译出乱码了。原因见之前的一篇文章

  • OpenSessionInView之怨念(待续)
  • 谁不会加减法(待续)

随笔一则~

很庆幸这块儿的上网ban list不包含Google Reader和Lilac BBS,不然我也欣赏不到今天BBS上7o很暴力的一篇贴子,几乎是乐着看完的。

今天看Google Reader有三个贴子我都加star了,都是出自JavaEye。

  • Taylor MDA 1.1.0 模型驱动工具发布
    之前也没用过这个MDA工具,不过比较看好MDA的发展。以前在DC的时候他们是用MagicDraw从数据库设计模型开始做的,一直可以生成到Service接口。不过UML图不是很好看,工具一看就是纯Java写的,很死板。。。听寝室本科在Kingdee实习的同学说, Kingdee也有自己开发的MDA工具,还是以Eclipse插件的形式。不过他们都是自己用,这也是Kingdee可以雇中专生开发的原因。
  • 迁移应用进入基于Annotation MVC的spring 2.5
    这块我刚好在寒假尝试过。我的感受是一开始会很震撼,不过用过之后你可能会更怀念spring2.0的MVC,因为这种散落在各个action中的URL映射信息,维护起来并没有一个XML那样清晰。更何况在SL上次重构后,根本不需要在XML里写URL与action bean的映射了。而且Controller不继承自任何基类,可能你在写实际代码时会遇到小小的麻烦。例如如果你原来的惯用方法是action继承自MultiActionController,那么我不得不告诉你:bind()方法你得自己写了,当然你可以看它的源代码把bind()提取出来作为一个static方法。总之,有时你会觉得不习惯的。
  • Adobe Spry 1.6.1发布 面向设计人员的AJAX框架
    关于Spry,liango比我更有发言权了。在SL中就用到了这个框架,Adobe的表现力当然是不容置疑的。而我现在带的这个项目也准备用这个框架,对于我这个之前CSS基础基本为零的人来说,也不得不化身成救火队员,从搭基础框架到调CSS,div布局,简直Holly Shit了。。。(Dota专用术语)再加上我的话太没约束力,本想玩玩海波龙的OLAP,不过现在看来肯定是没有时间了,郁闷ing。

Category: java  Leave a Comment

中软实训(小黑篇)

记得之间和zlj闲聊时就说,第二个本子一定得买个小黑,我们都很清楚这样的选择不会后悔。也有人说IBM在中国被神化了,不过我还是憧憬开着高分屏在eclipse写代码的情景。

本以后第二个本子会在工作的时候才买,可我的asus不争气地在抗过三年半后基本算是彻底罢工了:在来北京后本子就彻底花屏了,很是奇怪。没办法,买本子的事被提上议程。从确定买本子到最终买本子,前前后后就三天的时间。基本是在毫无预计的情况做了这个决定。

上周三晚上决定要买个小黑,于是打电话给crackcarr让他准备带我去中关村看水货。然后打算第二天就走,无奈出行路线都没法搞定,于是周四baidu了一下路线,周五早上跟老师讨论了一下项目的需求就匆匆出发了。坐345,换462到了和谐家园,然后就和crackcarr直奔中关村。

中饭是在清华吃的,老陈请吃pizza,还有高策和小花。博士这生活就是安逸啊,俨然也都是有米人了。吃完中饭也没太闲聊,我们就打车直奔太平洋电脑城。虽然那天是做好了买本子的打算,不过还是要去asus碰碰运气看能不能很快的修好m2c。在太平洋12城asus维修处简单地问了问,对于我这种过保的机器,想一两百块钱就修好基本没戏,而且我这花屏肯定是显卡的问题。m2c显卡虽然是独立的,但要换也要跟主板一块换。不跟她们废话了,离开asus维修点,上到15楼终于到了目的地-华正基业。

之所以来这里,是因为我本科寝室有三个人在这里买的水货,crackcarr和这里销售的都混熟了。看本的过程很顺利,中间我去取钱的时候很担心IBM的散热问题,想起以前寝室的三台T42风扇还是心有余悸的。不过crackcarr让我尽管放心,那只是那批T42的问题。最后挑中的型号是T61 AP4,不到10K,让我感叹比第一个本子真是便宜多了。考虑到以后可能会玩玩vista,而平时跑Java应用也都不是省油的灯,于是内存直接加到了4G。在xp中右键点电脑属性只显示是3G,不过BIOS里面是4G。回来用了下,也没感觉4G有想象中的牛X之处。倒是自启的N多IBM软件让我嗷嗷不爽,正常启居然有45个之多,实在是很不习惯。还是先不动它们,等我摸清楚都是干什么再来优化。

晚上回到crackcarr家已经七点多了,一家人还在等我们吃饭,实在是很惭愧。到北京实在是没少麻烦crackcarr,特此鸣谢一下。晚上是在crackcarr家睡的,还见证了他的小法师升到70,俨然很激动的样子。

Category: dailylife  2 Comments

中软实训(流水篇)

年后到来北京之前的这段时间,都花在串亲戚上了,mini web也就没怎么鼓捣了。从16号从南昌坐了一个四位数的火车到北京,已经有一个多星期的时间了,最近两天终于是能上网了(不过是包含了N多限制的)。

实训基地是在中软的昌平基地,说自己在北京有点惭愧,因为貌似在北京市地图的昌平区找不到这块地方。。。实训为期三周,周六周日也算在内,给我们组分配的是一个类似国家烟草办的项目,具体需求来自中软的烟草办。实训第一天,我被稀里糊涂地被推到PM的位置,不过从我对自身的分析来看,还是不太适合做项目经理这种角色的。我更愿意安安心心地整个技术架构什么的,结果这一周大部分时间是在与需求博奕,这个惨。

而这个项目从技术上对我来说,有几个地方像WebSphere MQ,OLAP等,是我从来没接触的,而且带我们的老师很nice(是中软的某某CTO,具体CTO之前的定语不太清楚),也算是不虚此行了。不过比较遗憾的是在PM的位置基本没时间去尝试这些了,杂七杂八的事情太多,而且项目的基础代码都得我来写,action层以上才能放手交给其他人。

老师给我们作了几次讲座,发现企业关注的技术点和学校里还是很不一样的,毕竟我也不可能一辈子待在学校,所以接触这些企业中运用的技术在新鲜之余,也将会影响我的学习路线。

说到企业的东东,很难不与heavy,big这些词相联系。mysql和tomcat可能大家都玩得很溜,可当笔记本遇上WebSphere和DB2,这个就比较难了,基本就是被玩了。。。不过话说我现在用的是4G内存,这些就不是问题了,嗯,详见中软实训(小黑篇)。

Acegi初探 - FAQ

Q:Resource或User在取roles时遇到hibernate session close的问题.

A:可以在roles属性定义上加上fetch = FetchType.EAGER.不行的话也可以尝试在相应的domain类上加上@Proxy(lazy = false),默认是延迟加载的.

Q:ehcache的警告:

2008-02-04 11:32:12,916 WARN [net.sf.ehcache.CacheManager] - <Creating a new instance of CacheManager using the diskStorePath "D:\tomcat\temp" which is already used by an existing CacheManager.
The source of the configuration was InputStream java.io.ByteArrayInputStream@1001ba5.
The diskStore path for this CacheManager will be set to D:\tomcat\temp\ehcache_auto_created_1202095932916.
To avoid this warning consider using the CacheManager factory methods to create a singleton CacheManager or specifying a separate ehcache configuration (ehcache.xml) for each CacheManager instance.>

A:google了一下,一般说是spring的EhCacheFactoryBean仍使用的是ehcache1.1的Cache构造方法.不过我对照了一下二者的源码(试验时spring的版本是2.5,ehcache的版本是3.0),spring使用的却是ehcache1.2.4的构造方法.而最终解决办法是在配置文件中的cacheManager中添加<property name="shared" value="true" />,不过网上也有添加完仍然不成功的.

Q:一直报No bean named ” is defined的错误.

A:有可能是在filterChainProxy定义中将chain的各个filter分行写了,这些filter需要写在一行里.

Q:默认登录表单的j_username等怎么修改.

A:这些以j_开头的都是acegi中默认的名字,都可以通过覆写父类方法或修改配置文件等方式进行修改.例如j_username可以在表单中改为domain的相应字段(比如username),然后在xml中authenticationProcessingFilter定义处用一个bean代替默认的,这个bean只需要继承自AuthenticationProcessingFilter,然后覆写obtainUsername和obtainPassword两个方法即可.

Q:AntPath说明.

A:?匹配单个字符,*匹配0个或多个字符,**匹配URL中的0个或多个目录.要注意的是这个*与正则表达式的中*略有不同,它不能匹配/.即/*.htm只能匹配类似/index.htm这种一级的URL,若要匹配多级需要用/**/*.htm.

待续…

Category: SL, java  Leave a Comment

Acegi初探

在大四实习结束看到SL的代码时,acegi已经作为一个安全方面的解决方案配置在SL中了.在那之前,仅仅是听说过这个框架,脑海中第一印象是"很好很强大",并没有任何切身的感受.之后,虽然由于rememberme和取roles时session close等问题曾经在JIRA上和BTLiu讨论和研究过,但acegi的很多东西还是beyond my control,也一直让我有一种危机感,毕竟使用一些不能完全驾驭的东西是很危险的.

最近在鼓捣我的web mini system时,尝试着对acegi一探究竟.首先从官网下载了最新的1.0.6版本,用里面的acegi-security-samples-tutorial-1.0.6.war能最快的部署一个acegi例子.这个例子很简单,却清晰地表达acegi的几个最基本功能:对登录,注销的控制,对资源的权限控制,用户,角色与资源的映射关系以及cookie的控制.但这样的一个例子还是有它几个不足之处:用户角色关系配置在properties文件中,更好做法是配置在数据库中;角色资源映射关系配置在xml中,更好做法是通过实现ObjectDefinitionSource通过数据库读取,然后返回acegi默认形式的权限资源映射字符串.而在实现这两者时,ss的做法是使用cache优化:即只在第一次从数据库读取,然后都初始化在缓存中,之后都从缓存中取.

从acegi-security-samples-tutorial-1.0.6中copy一份配置文件,作如下修改:

  • filterInvocationInterceptor中改为<property name="objectDefinitionSource" ref="filterDefinitionSource" />.image 上图是acegi的类图,从图中可以看出filterDefinitionSource bean可以有两种实现方式,一种是继承AbstractMethodDefinitionSource来实现,这种可以intercept到方法级别;另一种是继承AbstractMethodDefinitionSource来实现,这种是intercept到URL级别,也就是说处理时会仅仅去resource表中取type为URL的信息,传过来的URL会去掉?后面的字符串再进行匹配.这两种ss都有详细的代码说明,在此不再赘述.
  • userDetailsService.这个配置ss是用了JdbcDaoImpl,把sql查询语句在xml中配置.而我沿用了SL中的做法,是用UserDao来实现,当然它必须实现UserDetailsService接口,相应的domain类User实现了UserDetails接口.
  • cache的配置是完全按照ss的方法进行配置,遇到一些问题可能在FAQ篇中会有所提及.
  • 一些login,loginfail,accessdeny的页面根据实际情况配置.我这三项分别是由三个action方法进行控制,login.htm,loginFail.htm,accessDeny.htm,如下:
    1. @RequestMapping("/login.htm")
    2. public String login() {
    3.     return "login";
    4. }
    5. @RequestMapping("/loginFail.htm")
    6. public String loginFail(Model model, HttpServletRequest request) {
    7.     String flash = AcegiExceptionUtils.getFlash(request);
    8.     model.addAttribute("flash", flash);
    9.     return "login";
    10. }
    11. @RequestMapping("/loginDeny.htm")
    12. public String loginDeny(Model model, HttpServletRequest request) {
    13.     // 处理代码
    14.     return "login";
    15. }

    可以看到,login()方法其实只是做个转向,逻辑都由acegi处理了.而loginFail中会出现两种常见的异常,AuthenticationServiceException表示用户名不存在,BadCredentialsException表示密码错误.

数据库设计仍然沿用了SL的五表结构:users,roles,resources,user_role,role_resource.其中若filterDefinitionSource的lookupAttributes方法实现时是采用的AntPath风格,resource表的配置也应是AntPath风格的.image详细的AntPath说明见FAQ.

按照这种方式配置后,如果用户请求/admin/下的任何URL,会转向/login.htm,然后验证用户名和密码,如果匹配,再根据user,role和resource的对应关系判断是否能access.最后如果能的话转向之前用户请求的URL,这个URL会保存在session中,key是ACEGI_SAVED_REQUEST_KEY.而当其他用户有请求时,因为第一次resourceCache已经初始化(目前userCache好像还没配好,因为每一次access控制台Hibernate都有从users表取数据的debug信息),role和resource的对应关系判断会从resourceCache中取,从控制台上可以看出这一点,没有从数据库取role和resource的debug信息.

当然,这种方式只是intercept到URL级别,如果要更细的控制action下的方法,可以实现MethodDefinitionSource接口(ss中是这样做的).而说到方法控制,SL重构时通过实现spring的MethodNameResolver接口,自定义了一套方法规则,算是比较RESTful.不过那是spring2.0,现在试用2.5,对方法的控制可以在controller的参数列表中直接以annotation的形式得到,而实际上这跟request.getParameter("method")没有太大改进.而从根本上来说,类似含有"?method="的URL还是比较不爽的,暂时还没找到2.5中如何沿用SL重构时的做法,因为2.5的controller是不继承自任何action的.更多2.5与2.0在web mvc上的区别可以单独写一些东西出来,嗯.

总的来说,这次的acegi研究是以官方的例子一步步迭代完成的,这样有助于逐渐控制风险,也更能清楚地理解为什么这样做的需求.当然权限控制是一个很大的话题,如何用好acegi,再配合业务上的控制规则(例如业务ID的层级关系设置,然后通过AOP的方式在service方法后添加HQL代码),是需要实验的经验积累的.

Category: SL, java  Leave a Comment

My Blog History

算起来,这是我的第三个blog了.记得大二那年,blog开始流行,rss倒不是太火,什么GReader,Zhuxia还没出世呢,冥冥中记得当时用过一个叫做看天下的阅读器,C/S架构的.当时俱乐部重量级人物如cliff和magicyang都用的是blogdriver,于是跟风也用起了blogdriver.现在再翻翻当年的老黄历,文章写的是有点naive了:(

Blogdriver的blog一直持续写到Lightning快做完的时候,那时候算是开发任务接近完成,自己也确实思想上很松懈,玩魔兽世界的程度可以算是沉迷那种了.加上本身绝不是文彩出众那种人,blogdriver的blog有大半年没更新过,而第一个blog就这样废弃了.作为backup,此blog的大部分文章保存在Blogdriver类别中.

第二个blog是在space上,记录了我从大三快结束,大四实习,以及到现在为止的一些生活片断,大部分是保存在dailylife类别中.而大四这一年经历的,思考的绝非这一个blog能够承载.

这次,特别感谢cowoo,为我提供了免费的空间,我只需要调调主题,注册个域名,就拥有一个真正属于自己的小窝了.而从一次次的blog变更和一篇篇blog中,其实折映出了我不同的心态.客观,严谨,GTD式的学习,生活和思考,也正是这个blog所要记载的主题.

其实人生就像是一篇文档,需要时常记录,保存,分享.那些已有的或灵光乍现的经历或感悟或许会因"掉电"和"异常"而消失, so, log my life, backup my life.

PS:由于此blog的空间在国外,教育网可能需要用代理才能访问.不过RSS应该是没有问题的.

Mini Web System - Displaytag

绕了一个大圈,终于把displaytag的导出中文搞定了.先占个位,有空再写.这一天,整杀毒整了半天,晚上又跟displaytag耗上了……睡觉睡觉.

displaytag(简称dt)最早是在DC实习的时候用过,优点就不说了,根据以往的经验,还是有几个地方用的不是很爽.

  • pagesize的设置是硬编码在tag的table属性里的,若要在页面上以下拉框的形式展现每页显示条数,dt本身不提供接口,需要外部扩展.
  • 尽管提供了分页功能,但其实是一次性全取出数据然后进行分页,大数据量时这种分页机制肯定是不可行的.不过倒是提供了外部分页扩展的接口,可以加以实现.
  • css, 包括与页面其他部分整合的问题.dt的输出是一个table,如果页面元素不规范的话,很可能table嵌table.另外,dt的css默认是 screen.css,它还include了其他的几个css,就是主色调是土黄的那套.以前DC实习的时候是整个项目的主css就是根据这个 screen.css改的,或许是考虑重新写一个css不一定能很好展现dt显示的效果吧,可也不能总这样迁就dt呀.可能正是这个原因,用了dt的站点风格都有点千篇一律的味道,在这个web2.0的时代这可不是什么好事.

再说说dt导出的问题吧,以导出excel为例,正常来说,会遇到表中的中文数据导出之后是乱码.Google一下,修改方法我就不赘述了.可我修改完源码,编译后还是报Excel处理类找不到的错误.于是在那个类里加上import相应信息,这回变成了TableProperties报properties文件未正确初始化的错误,跟踪了下在 DEFAULT_FILENAME前面加"/"能正确初始化了.又是修改displaytag-export-poi-1.1的源码,又是 displaytag-1.1的源码,整到后来错误越来越离谱,实在没法跟踪了.没辙,只好看看官网新版本是不是修复了bug,上去一看先下了最新版本 (1.1.1)的src,看到Excel处理类与1.1相比恰好修改过该处bug,下了两个1.1.1的jar包放工程里,导入excel无乱码.

为什么我自己修改1.1版本的源码重新打包不好使么,原因无非有两种:一是1.1.1确实修复了比较多的BUG;二是编译时候依赖的包不对. displaytag-export-poi-1.1依赖的包还是很少的,应该编译没问题.而displaytag-1.1依赖的包实在太多了,我在下的时候都基本下的最新依赖包,而像有个支持webwork所依赖的必须是1.x的包,2.x包名,方法都改了.而编译时出现了一些warning,也是不详的预兆.这也给以后要编译源码时提了个醒,一定要看清楚依赖包的版本再重新编译.

Category: java  2 Comments