现在的项目已经进入收尾阶段了,虽然很小的项目,才5个画面,但是也经过了近半年的开发(从项目一开始到现在的负荷测试),多多少少有一些小小的总结,因为是刚工作,第一次做项目,以前只是在培训的时候做过,如果有不正确的地方,希望各大高手多加指正。
系统说明:
开发平台: 日本语Windows XP
IDE: Eclipse 3.2
服务器: Redhat Linux + Tomcat 5.5 + Apache2.0
JDK: JDK1.4.3 (在JDK1.4.3的环境下需要下载安装Tomcat5.5的
Compatability Package,安装方法是解压缩复制到tomcat安装目录下)
Framework: Struts1.3.8
数据库: Oracle
关于文字乱码
由于做的是对日项目,必然会涉及到文字编码转换的问题,经过查找网页和自己的领悟,得出了以下总结。
<%@ page language="java" contentType="text/html;
1#charset=windows-31j" pageEncoding="UTF-8" %>
在这句话里面有2个编码:
第一个charset=windows-31j的作用是告诉JVM用windows-31j的编码格式输出数据给JSP页面,如果此项未定义,则服务器是 Tomcat的情况下,默认为ISO-8859-1;如果服务器是Apache+Tomcat则以 APACHE_ROOT/conf/httpd.conf中的charset为准,默认为ISO-8859-1。
第二个pageEncoding="UTF-8"的作用是告诉JVM用UTF-8解释这个JSP,未定义的情况下参照charset。
2#charset=Shift_JIS">
这句话里面的charset作用是告诉浏览器用Shift_JIS来显示页面,此项不能设置为Windows-31j,因为IE的编码中没有 Windows-31j这一项,IE如果发现请求编码为Shift_JIS则自动会调用Windows-31j来进行解析,但是如果是IE不能辨识的编码 类型,IE会根据自己的推理自动选择一个与
1#charset类型最接近的编码进行解析,很有可能出现乱码。
接下来是关于日本语版windows和日本语版Linux的JVM的文字编码问题。
Windows平台的JVM默认文字编码是MS932,但是Linux是UTF-8。所以被Windows JVM以java IO写出去的文件,如果在Linux JVM上同样用Java IO读取,就会出现乱码,原因就在这里。所以如果开发平台和服务器平台不一样的话,建议写文件和读文件的时候都指定一个统一的文字编码,这个文字编码可以 写在ApplicationResource.properties里面,这样能保证两边的读写操作文字编码一致。
java 代码
- ..............
- String enc = "MS932";
- FileInputStream fis = null;
- BufferedReader br = null;
- try {
- fis = new FileInputStream(FILE_PATH);
- br = new BufferedReader(new InputStreamReader(fis, enc);
- } catch (Exception e) {
- .........
- } finally {
- .........
- }
关于线程
这次的开发需要做个功能,在每次调用数据库fasade的时候,要控制超时,就是说如果数据库那边在20秒之后还没有返回,那么就要让自己的程序返回数据库超时的Message。
对于这个功能,我想了一下,只想到了用线程来实现,做法如下:
先为那个需要控制的fasade方法造一个类继承Thread,然后在run()里面执行方法,之后把这个线程join()到Action中。
java 代码
-
- ...........
- SearchThread thread = new SearchThread(xxxxxx, xxxxxxx);
- thread.start();
- try {
- thread.join(MAX_WAIT_TIME);
- if (thread.isSuccess()) {
- result_lst = thread.getResults();
- } else {
- throw new DataBaseTimeoutException();
- }
- } catch (Exception e) {
- thread.interrupt();
- ........
- }
java 代码
-
- class SearchThread extends Thread {
- private List result = new ArrayList();
- private boolean success_flag = false;
- ...........
-
- public SearchThread(xxxx,xxxxx) {
- .......
- }
-
- public void run() {
- this.result = FasadeXXX.getSearchResult(xxxx,xxxx,xxxx);
- this.success_flag = true;
- }
- public List getResults() {
- return this.result;
- }
-
- public boolean isSuccess() {
- return this.success_flag;
- }
- }
MAX_WAIT_TIME就是最大等待时间20秒,如果join()到达最长等待时间,但 是SearchThread里面的success_flag还没有被设置成true的时候,就是说明已经超时,检索没有完成,这个时候会抛出自定义的 DataBaseTimeoutException,中断线程。
不知道这样的做法是否安全,是否会造成线程的混乱,希望高手能指教。不过负荷测试做到现在貌似没有在线程方面发现什么问题,嘿嘿。
接下来是开发中遇到的一些小问题
有一次在进行了BUG修正后,出现了JSP页面提交的日本语乱码,而且是在第一个文字Filter的时候就已经乱码了,返回页面的自然也成了乱码,查了好久,终于在完全编译之后恢复正常了,至今不解是什么原因,难不成是Eclipse的BUG?
还有一个现象就是如果页面上的某一个图像的src=""那么就会发生再次向Server提交请求的现象,之后把这个图像的src改成某个存在的路径下的不存在的图像名字,就不会发生两次提交的现象了,这个难道是IE的机制?不解中……
还有一点需要注意的是Struts的Action是单例的,所以写在Action里的属性一定要考虑到线程安全的问题,特别是那些控制分页的变量,我就出 现这种错误,被老大发现了之后,把所有的Action里的属性变量全部改成方法里面的局部变量了。 ^^^>_<^^^
大致上就这么多了,这是在JavaEye上的第一篇文章,希望大家多加指点,谢谢……