Articles in the Development Category
Development, Featured »
Development, Featured »
Development »
Development »
今天居然发现以前写的一个东西,用DWR做出来的AJAX效果居然么有了,console里居然报错NoClassDefFoundError,后面还有一个org/apache/bsf/BSFException。
删除%CATALINA_HOME%\common\endorsed下xercesImpl.jar xmlParserAPIs.jar两个包搞定。
应该又是Tomcat的class load机制搞出来的错误,只是神奇的是不知道为什么开始跑了2年没出错,怎么今天冒出来个Exception,也不记得改了什么设置啊,真奇怪啊~~~~
Development »
今天应用迁移,以前写的那个系统要迁到另一个服务器上,本来以为很简单的,结果装完Tomcat以后程序居然报错,说什么“&&”是不能用于boolean、Boolean,感觉很莫名其妙,&&可是基本操作符啊,怎么会出这个错误,以前从来没遇到过。不过象这种层面问题,肯定是和编译有关。初步猜测和Tomcat版本有关,因为我以前装的什么版本已经忘了,刚装的是一个5.0.30。换了一个5.0.28(Apache上5.x的版本最老的就是这个了),覆盖安装,还是不行。后来我试了很多乱七八糟的方法,换了好几个版本,挣扎了2、3个小时,终于把这个狗屎问题解决了,得到以下提示:
不知道从什么版本开始,Tomcat不能自动编译Java 5(1.5)的JSP文件,——错误提示我javac的时候使用“-source -1.5”而不是“source -1.3”,个人认为它后台使用1.3 compatible的方式进行编译。而1.5的什么泛型、autoboxing就全部被枪毙,无法通过编译。错误从这里产生。
解决方法是修改/conf/web.xml 文件:找到名为“jsp”的servlet并修改如下内容,增加 compilerSourceVM 和 compilerTargetVM 两个设置:
<servlet> <servlet-name>jsp</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> <init-param> <param-name>fork</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>xpoweredBy</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>compilerSourceVM</param-name> <param-value>1.5</param-value> </init-param> <init-param> <param-name>compilerTargetVM</param-name> <param-value>1.5</param-value> </init-param> <load-on-startup>3</load-on-startup></servlet>
我看网上有人说还要拷贝tools.jar以及ant-1.6.x.jar到common/libs下面,并删除common/lib/jasper-compiler-jdt.jar,不过好像5.0.30版本并没有这种问题。5.5版本以上我确定Tomcat会安装common/lib/jasper-compiler-jdt.jar文件。
Tomcat版本直接切忌不要覆盖安装,我花了很长时间发现覆盖安装以后版本的文件恨混乱,我覆盖装了5.0.28,结果Tomcat Monitor还是显示5.0.30………。
不要设置“CATALINA_HOME”环境变量,否则你可能无法使用2个Tomcat。记得很早以前是要手工设置这个变量的,但是现在千万不要设置这个环境变量。今天装JIRA的时候发现JIRA无论如何启动不起来,发现其老是去找8080端口,而我已经在server.xml文件中把它端口改到8081去了,很奇怪。后来想起来可能是“CATALINA_HOME”影响了JIRA的启动过程,去掉这个变量,啊,整个世界清净了………
Development »
一年多没整过技术文章了吧………今天下午调整了一下原来的代码,解决了ValueList自动排序的乱码问题。
其实如果你页面上全部都用UTF-8,是不会出现ValueList自动排序的乱码的,因为ValueList默认是使用UTF-8进行编码。但是我原来写的那个应用太小,而且也不会有i18n的需求,没心情全部把汉字写到resource文件中,那样比较繁琐,——我可是又当程序员又当美工的。所以当时是全部页面都用了GBK编码。
另外先提一下另一个需要特别注意的地方:如果使用GBK编码,那么请一起把Tomcat的server.xml文件一起改掉,在“connector”element后面加一个attribute:“URIEncoding=’GBK’”,否则默认会是UTF-8。这里不把编码改掉的话,那么你所有的GET查询都可能出现乱码。
好了,现在说ValueList这里容易出现乱码的问题。ValueList一个比较方便的功能就是允许对属性进行自动排序,而这个排序是通过GET方式完成的。然后我发现我原来写的那个东西,查中文字很正常,不会有乱码,但是查了中文字以后再进行自动排序就不行了,表单上显示属性由中文字变为乱码,很明显,页面和GET编码都是GBK,那么只有可能是ValueList的自动排序的URL的编码有问题。
相信有经验的程序员不会花太多时间,问题很快定位在LinkEncoder,不过这是一个接口,默认实现是DefaultLinkEncoder,里面有一行代码:private String encoding = “UTF-8″,以及getter和setter,一看到这个地球人就都知道了,Spring配置一下“encoding”属性为“GBK”就行了。
打开ValueList配置文件,先用Spring把DefaultLinkEncoder这个bean的“encoding”属性写为“GBK”,再在什么“classicLook”、“simpleLook”、“microsoftLook”啊,反正是xxxLook这些bean下面都加一行
,然后就OK了。记住在所有的xxxLook下面都加这一行,我开始就是只在“classicLook”下面加了,结果我页面上实际使用的是“simpleLook”,搞得我还以为哪里还有bug呢。
Development, iLife »
Yesterday, some fellow asked a favor for Tomcat, and then I came to realize that there had been quite a long time since the last time I developed as a damn programmer. The last version of Tomcat I could recognized was 5.5.xx, but now the major version has already been upgraded to 6.xx.
The world that I used to be familiar with, I used to play with, simply fades its color from time to time. The technologies once were glory just perish to embrace the new ones. For me, the word “programming” gradually lost its meaning in …
Development »
感觉C#的.NET确实很多地方和Java很像,包括语法,甚至一些API。但是边看边说吧:
1. 虽然一个文件里支持多个namespace和class。但是个人觉得这个功能不是太必要,Java中一个文件一个public class可以让人一眼明了这个文件的功能,强制开发人员组织自己的class。特别是namespace,.NET要求namespace前后加括号来区分一个文件中不同的namespace,觉得完全没必要啊,反而namespace多加的括号在比较长的文件里会影响阅读——因为它多加了一列缩进。
2. namespace可以有alias。感觉这个更没用。用了那么久Java,感觉碰到名字冲突的情况实在少之又少。.NET的这个功能估计在98%的情况下都只会增加程序阅读的难度和混乱。
3. .NET中方法名是习惯大写开头。不是太习惯,个人觉得有点影响阅读——不是一眼就能区分出类和方法。其它的也是一样,比如常量,Java里的常量一般都是大写加下划线的,但是.NET里怎么没看出各种变量之间的区别。感觉.NET好像没有象Java一样强调编码规范,比如Java中对各个地方的命名都有官方的推荐。
4. 看的是传说中的Jeffrey Richter大牛的《Applied Miscrosoft .NET Framework Programming》,感觉到处都有在强调性能,象primitive的autoboxing的性能,inline初始化字段和构造函数对性能的影响;这个和Java的书不太一样,Java的书大多强调标准、规范和Pattern之类的东西,很少有象这书那样细节的强调性能。所以我现在有点理解微软阵营的人对Java的性能的怀疑。但是我认为现在的Enterprise Application第一强调的不会是性能,可维护性、稳定性、可扩展性、标准可能是更重要的。现在很明显的就是Java阵营的人对模式、设计等东西的讨论氛围要比微软阵营的人要好。
觉得微软为了性能在设计C#的时候做了很多妥协,比如struct的概念。很难说这是C#的好处还是短处,struct的引入使人会用过程的思想来考虑问题,而且struct和类还是有很多不同的地方,用的不好反而影响性能。相对来说,struct在实际中又能够带来的性能提升?在多少应用中它是必须的?
Development »
发现ruby连接数据库的时候还是很诡异的。自己一个人乱弄的话估计n年也连不上。感觉很不方便。
首先先安装ruby,gem。使用“gem install mysql”命令远程安装mysql的ruby驱动,但是可惜的是,不要以为大功告成了,这样的情况下你依然很有可能连不上mysql的。测试一下,用“rails test”新建一个app,然后输入“rake db:migrate”(注意,必须在test这个目录下执行该命令,——前面使用“rails test”建立的是名字为“test”的app),成功的话不会报错。我的环境是:Windows XP sp2, ruby 1.8.4, mysql 5.0.24, rake 0.7.1, 报错找不到“libmysql.dll”。靠,晕死,没办法,google+baidu吧。很快找到“把mysql安装目录下的libmysql.dll”拷贝到环境变量下,比如windows/system32,ruby的bin目录。我是把这个文件拷贝到了ruby的bin目录,以为大功告成拉?!!哈哈,对不起,还是有可能出错,原因是mysql目录下有2个“libmysql.dll”文件。一个在“\MySQL Server 5.0\bin\”下,一个在“\MySQL Tools for 5.0\”下,使用server下面的那个dll会报错“undefined method `each’ for #<Mysql:0x3874b20> ”。
必须使用“MySQL Tools”下面的“libmysql.dll”。
Development »
在通常情况下iBATIS的参数在sqlmap中使用#param#的形式,参数名以’#’包着,但当使用sql的LIKE语句时就发生了问题,在单引号中无法使用#param#这种形式。奶奶的,害的我昨天弄了半天,现在总结一下,解决方法:
当应用SELECT * FROM TABLE WHERE COL LIKE ‘value%’时如果要把’value’以参数代替,可以把整个LIKE后面的字符串全改为参数,即 SELECT * FROM TABLE WHERE COL LIKE #param#,此时参数param的值为字符串”value%”。
使用’$’将参数名包起来,即SELECT * FROM TABLE WHERE COL LIKE ‘$param$%’,此时参数param的值就是字符串”value”。这个方法最好用了!
使用“||”连接。譬如:SELECT * FROM TABLE WHERE COL LIKE #param#||’%’。
但是本人使用的不简单是iBATIS这个东西,是和ValueList(http://valuelist.sourceforget.net)一起用的,ValueList在生产查询列表的时候需要两个iBATIS查询语句,一个查结果,一个查结果的行数,最二球的是我改了查结果的语句,没有该查结果行数的语句,结果就变得很奇怪………


Twitter
Google Profile
Picasa Web Album
Google Reader
Flickr
豆瓣网