现在的位置: 首页 > 综合 > 正文

一个项目之后的小总结

2018年02月01日 ⁄ 综合 ⁄ 共 3346字 ⁄ 字号 评论关闭
关键字:   心得    
现在的项目已经进入收尾阶段了,虽然很小的项目,才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; <font color="#ff0000">1#</font>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 代码
 
  1. ..............    
  2. String enc = "MS932";    
  3. FileInputStream fis = null;    
  4. BufferedReader br = null;    
  5. try {    
  6.      fis = new FileInputStream(FILE_PATH);    
  7.      br = new BufferedReader(new InputStreamReader(fis, enc);    
  8. catch (Exception e) {    
  9.      .........    
  10. finally {    
  11.      .........    
  12. }    

关于线程
这次的开发我不负责数据库方面,只需要在Action中调用其他公司给过来的接口,但是我需要做个功能,在每次调用他们的数据库API的时候,要控制超时,就是说如果数据库那边在20秒之后还没有返回,那么就要让自己的程序返回数据库超时的Message。
对于这个功能,我想了一下,只想到了用线程来实现,做法如下:
        先为那个需要控制的API造一个类继承Thread,然后在run()里面运行API操作,之后把这个线程join()到Action中。

java 代码
 
  1. //  XXXAction.java  
  2. ...........  
  3. SearchThread thread = new SearchThread(xxxxxx,  xxxxxxx);  
  4. thread.start();  
  5. try {  
  6.      thread.join(MAX_WAIT_TIME);  
  7.      if (thread.isSuccess()) {  
  8.           result_lst = thread.getResults();  
  9.      } else {  
  10.           throw new DataBaseTimeoutException();  
  11.      }  
  12. catch (Exception e) {  
  13.      thread.interrupt();  
  14.      ........  
  15. }  
java 代码
 
  1. //    SearchThread.java  
  2. class SearchThread extends Thread {  
  3.        private List result = new ArrayList();  
  4.        private boolean success_flag = false;  
  5.        ...........  
  6.   
  7.        public SearchThread(xxxx,xxxxx) {  
  8.             .......  
  9.        }  
  10.   
  11.        public void run() {  
  12.              this.result = API.getSearchResult(xxxx,xxxx,xxxx);  
  13.              this.success_flag = true;  
  14.        }  
  15.  
  16.        public List getResults() {  
  17.              return this.result;  
  18.        }  
  19.   
  20.        public boolean isSuccess() {  
  21.              return this.success_flag;  
  22.        }  
  23. }  

MAX_WAIT_TIME就是最大等待时间20秒,如果join()到达最长等待时间,但 是SearchThread里面的success_flag还没有被设置成true的时候,就是说明已经超时,检索没有完成,这个时候会抛出自定义的 DataBaseTimeoutException,中断线程。
不知道这样的做法是否安全,是否会造成线程的混乱,希望高手能指教。不过负荷测试做到现在貌似没有在线程方面发现什么问题,嘿嘿。

接下来是开发中遇到的一些小问题
有一次在进行了BUG修正后,出现了JSP页面提交的日本语乱码,而且是在第一个文字Filter的时候就已经乱码了,返回页面的自然也成了乱码,查了好久,终于在完全编译之后恢复正常了,至今不解是什么原因,难不成是Eclipse的BUG?
还有一个现象就是如果页面上的某一个图像的src=""那么就会发生再次向Server提交请求的现象,之后把这个图像的src改成某个存在的路径下的不存在的图像名字,就不会发生两次提交的现象了,这个难道是IE的机制?不解中……
还有一点需要注意的是Struts的Action是单例的,所以写在Action里的属性一定要考虑到线程安全的问题,特别是那些控制分页的变量,我就出 现这种错误,被老大发现了之后,把所有的Action里的属性变量全部改成方法里面的局部变量了。 ^^^>_<^^^

大致上就这么多了,这是在JavaEye上的第一篇文章,希望大家多加指点,谢谢……

 

抱歉!评论已关闭.