由于整合造成的重复工作和变动令人苦不堪言,这两天一直忙于将我的研究生网报管理系统整合到另外的一个框架内。为了在泰山会议前调出一个可以演示的版本,这两天折磨得我差不多快折寿了。
这几天遇到一个又一个难缠得异常奇怪的问题,注意下面提到的问题在整合之前都是不存在的。
今年为了整合需要要将我去年的根目录的链接形式变成一个虚拟目录/wb,这样我程序中所有以/开头,而前边没有附加request.getContentPath()的代码都要发生改变,几乎是痛不欲生。幸亏有学信的lf帮我整理jsp页面,否则就要自杀去了。完全就是体力活,还必须细心,细心再细心。
于是开始是找规律,把/zhaoban,/admin,/edu,/school开头的所有字符串都搜索出来,不能全局替换,因为有些前边写了request.getContentPath(),而大部分则没有写,于是一个一个的查出来,然后替换。好不容易替换完了,又出现了问题,servlet的"/xxx"的链接也要变成request.getContentPath()+"/xxx"的形式,于是再找再替换。替换完了,又出现了问题,原来struts中的action的/xxx.do,不需要写成request.getContentPath()+"/xxx.d"的形式,替换了反而不能正常工作,还好action不多,替换完成。
其实做这种工作,主要的不是技术问题,而是细心,同时要应付自己的心理障碍。一遍又一遍替换完成了,老是觉得还有没有替换干净的地方,测一测没有问题了,但是不一定什么时候又发现了一处问题,于是再去改。页面多起来,servlet多起来,头脑中已经不可能对所有的细节了熟于心,只能靠不断的测试,当然这又是额外的工作量。这里多亏有yzk帮我做测试工作,让我节省了很多精力,特别感谢一下。
经过两天三人的不屑努力,终于大部分功能显得没有问题了,只剩下一些硬骨头了,到了必须解决这些通过简单替换无法解决问题的时候了。难搞的问题有两个:
第一个
在我原来的系统中为了在页面跳转中能够传递request对象中的setAttribute的值,我没有采用方便的response.sendRedirect(),而采用了jsp:forward的形式,这个问题曾经困扰我,在以前的文章中曾经提到过。这个看似成熟的技术在去年的网报工作中是没有问题的。
但是今年改成/wb就出了问题。首先是在上传科目采集数据的时候三个表上传中间的页面跳转要经过一个jump.jsp页面跳转到wait.jsp,成功后会通过jump.jsp自动跳转到/put/success.jsp或/pub/failure.jsp页面。测试发现这里打死也过不去,报告是servlet的问题。开始怀疑在LEV1Servlet中的forward方法使用的不是相对路径链接跳转,而是绝对路径,做了一个试验发现不是的,在其他不涉及/pub/success.jsp和failure.jsp跳转的功能上使用相对context的路径都是没有问题的。那是怎么回事儿呢?回到上传的servlet中,让它跳转到/index.jsp,发现成功跳转,哈哈,原来果然不是servlet的问题。那就是jump.jsp的问题,那么问题出在哪里呢?反复检查jump.jsp文件,怎么也是发现不了问题。一个下午的时间就在这个怪异的问题中过去了,只好暂时把这个问题放一放,应付演示要紧。
晚上过来又去改别的跳转问题,发现凡是涉及到/pub/success.jsp或者/pub/failure.jsp的页面都会出现问题。于是反复检查这两个极其简单的页面,找不出问题。想了好久终于发现凡是跳转到这两个页面的页面都有一个共同的特征就是前边提到的要把requst.setAttribute中的数据带过来,显示在这两个页面上,都采用了jsp:forward,似乎是找到了规律,但是仍然不知道是怎么回事,为什么会造成这个原因呢?页面的异常提示说
org.apache.jasper.JasperException: /include/header.jsp(1,1) Page directive: illegal to have multiple occurrences of contentType with different values (old: text/html;charset=gb2312, new: text/html; charset=gb2312)
这个显然是不对的,因为我检查header.jsp发现关于text/html; charset=gb2312的设置跟这个页面是完全一致的。最后实在是没有办法了,只要到处乱找,一search发现只有在/pub/success.jsp和/pub/failure.jsp这两个页面中的是上面那个所谓的old设置:text/html;charset=gb2312,差在哪里呢,只差在中间的一个空格。wk,当我惊喜的发现这个天大的秘密的时候我都要崩溃了。我至今不知道为什么会因为一个空格之差造成在原来的"/"可以跳转而同样的配置到了"/wb"时却无法跳转,但改了以后的确就可以work了。
返回来我又开始琢磨jump.jsp是不是也是因为这个问题,因为jump.jsp也使用了jsp:forward,但是不幸的是这个似乎不是这个原因,因为报错都是不一样的。直到深夜我都无法解决,最后实在无奈了,我决定重写一个servlet,而不用原来的jsp进行跳转了。效果居然出人意料的好,可以正常实现我的跳转企图。
这个失败令我有一种强烈的失败感,本来以为做了两年的jsp/servlet,也该算是个熟手了吧,而且也没有用什么高深的struts,hibernate之类的东东,没想到还是会碰到一些莫名其妙的问题。
第二个
第二个是整合中的乱码问题。得益于系统原有的CodeConvert,原来在使用get方式传递parameter的时候不曾有过汉字的乱码问题。但是将我的系统整合到jboss以后却出现了这个问题。问了一下cwx和gl,原来jboss中的tomcat的server.xml中有一个URIEncoding=”utf-8“的设置,在我的环境中默认是没有这个设置的(我想默认的设置应该是ISO9805)。也就是说在默认的tomcat的环境中是没有乱码问题的,但是设置成了utf-8以后就有了问题。
为了解决这个问题我做了一个测试,结果如下:
1,默认的tomcat中的server.xml中URIEncoding项并没有设置,在接受参数时request.getParameter()后要经过一步CodeConvert.ISOToGBK,然后正常写入数据库;
2,把server.xml中的URIEncoding设置为utf-8,接受参数以后如果CodeConvert.ISOToGBK()转换一下,看到的是全角的???,不转换是半角的???;
3,把server.xml中的URIEncoding设置为GBK,接受参数以后就是汉字,无须CodeConvert.ISOToGBK(),如果转换则看到??
也就是说用URIEncoding="GBK"的设置或者不设置,都是有办法解决乱码问题的,惟独用了utf-8以后无法解决。我找gl了解情况,他说这样主要是可以兼顾繁体中文,他提了一个用模板的方法,但我这里没有用struts,所以到现在还不知道最后怎么来解决这个问题,还是等smzhou和cwx大牛过来问问他们吧。
这个显然是不对的,因为我检查header.jsp发现关于text/html; charset=gb2312的设置跟这个页面是完全一致的。最后实在是没有办法了,只要到处乱找,一search发现只有在/pub/success.jsp和/pub/failure.jsp这两个页面中的是上面那个所谓的old设置:text/html;charset=gb2312,差在哪里呢,只差在中间的一个空格。wk,当我惊喜的发现这个天大的秘密的时候我都要崩溃了。我至今不知道为什么会因为一个空格之差造成在原来的"/"可以跳转而同样的配置到了"/wb"时却无法跳转,但改了以后的确就可以work了。
返回来我又开始琢磨jump.jsp是不是也是因为这个问题,因为jump.jsp也使用了jsp:forward,但是不幸的是这个似乎不是这个原因,因为报错都是不一样的。直到深夜我都无法解决,最后实在无奈了,我决定重写一个servlet,而不用原来的jsp进行跳转了。效果居然出人意料的好,可以正常实现我的跳转企图。
这个失败令我有一种强烈的失败感,本来以为做了两年的jsp/servlet,也该算是个熟手了吧,而且也没有用什么高深的struts,hibernate之类的东东,没想到还是会碰到一些莫名其妙的问题。
第二个
第二个是整合中的乱码问题。得益于系统原有的CodeConvert,原来在使用get方式传递parameter的时候不曾有过汉字的乱码问题。但是将我的系统整合到jboss以后却出现了这个问题。问了一下cwx和gl,原来jboss中的tomcat的server.xml中有一个URIEncoding=”utf-8“的设置,在我的环境中默认是没有这个设置的(我想默认的设置应该是ISO9805)。也就是说在默认的tomcat的环境中是没有乱码问题的,但是设置成了utf-8以后就有了问题。
为了解决这个问题我做了一个测试,结果如下:
1,默认的tomcat中的server.xml中URIEncoding项并没有设置,在接受参数时request.getParameter()后要经过一步CodeConvert.ISOToGBK,然后正常写入数据库;
2,把server.xml中的URIEncoding设置为utf-8,接受参数以后如果CodeConvert.ISOToGBK()转换一下,看到的是全角的???,不转换是半角的???;
3,把server.xml中的URIEncoding设置为GBK,接受参数以后就是汉字,无须CodeConvert.ISOToGBK(),如果转换则看到??
也就是说用URIEncoding="GBK"的设置或者不设置,都是有办法解决乱码问题的,惟独用了utf-8以后无法解决。我找gl了解情况,他说这样主要是可以兼顾繁体中文,他提了一个用模板的方法,但我这里没有用struts,所以到现在还不知道最后怎么来解决这个问题,还是等smzhou和cwx大牛过来问问他们吧。
Trackback: http://tb.donews.net/TrackBack.aspx?PostId=485191