posts - 0,  comments - 3,  trackbacks - 0
1.命令行参数(Command-line arguments) 

   -install (Windows) install Resin as a service (but doesn't automatically start.) 

   -install-as xxx (Windows) install Resin as a named service (but doesn't utomatically start.)  

   -remove (Windows) install Resin as a service (but doesn't automatically start.) 

   -remove-as xxx (Windows) remove Resin as a named service (but doesn't automatically start.) 

2.JDK参数(JDK arguments:在Httpd.sh参数的配置) 
    <1>.文件位置:${resin30}/bin/httpd.sh 

    <2>.args='-J-server -Xms200m -Xmx1024m -Xloggc:./log/gc.log -XX:MaxNewSize=256m -XX:MaxPermSize=256m -Djava.awt.headless=true' 
参数说明: 

    (1)J-server -Xms200m -Xmx1024m 其中,-Xms200m 表示启动时,初时内存大小,-Xmx1024m最大内存占用大小。(-Xmn100m可选) 

    (2)-XX:MaxNewSize=256m -XX:MaxPermSize=256m 表示:内存的永久保存区域(PermGen space)的大小,PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存溢出,解决方法也一定是加大内存。说说为什么会内存益出:这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理 
    一般 -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m这些值不需要设置的,除非perm溢出,设置一下MaxPermSize就行,启动脚本加上-server后,也不用在设置MaxNewSize。 

    (3)-Djava.awt.headless=true 解决在linux/unix验证码图片不能显示的问题。 

3.通用 JVM 参数
 

    指定传递到启动应用程序服务器进程的 Java 虚拟机代码的命令行参数。 

    下面是可以在“通用 JVM 参数”字段中输入的可选命令行参数。如果输入多个自变量,请在每个自变量之间输入空格。 
重要: 如果该参数表明它仅适用于 IBM Developer Kit,您就无法为另一个 JVM 使用该参数,例如 Sun JDK 或 HP JDK。 
-Xquickstart 
    可以使用 -Xquickstart 来以低于缺省方式的优化级别进行初始编译。之后,根据采样结果的不同,可以采用缺省方式下初始编译的级别来进行重新编译。适合于早期的平均速度比长期运行吞吐量更为重要的应用程序 -Xquickstart。在某些调试方案、测试装置和短时间运行的工具中,可以将启动时间缩短 15% 到 20%。 

-Xverify:none 
    如果在类装入期间要跳过类验证阶段,可以使用 -Xverify:none。在启用即时(JIT)编译器的情况下使用 -Xverify:none 能够将启动时间缩短 10-15%。 

-Xnoclassgc 
    可以使用 -Xnoclassgc 来禁用类垃圾回收。此操作可以提高类重用程度,并可以略微提高性能。但是,其代价是您无法收集这些类拥有的资源。可以使用 verbose:gc 配置设置(此设置将输出类垃圾回收统计信息)来监控垃圾回收。检查这些统计信息将帮助您理解再生的资源和再生资源必需的垃圾回收量之间的平衡。然而,如果在您的工作负载中反复地垃圾回收同一组类,那么您应该禁用垃圾回收。缺省情况下,启用类垃圾回收。 

-Xgcthreads 
    可以同时使用数个垃圾回收线程,这也称为并行垃圾回收。在“通用 JVM 参数”字段中输入此值时,还要输入您的机器的处理器数,例如,-Xgcthreadsn,其中 n 是处理器数。在具有 n 个处理器的节点上,缺省线程数是 n。如果您的机器有多个处理器,那么您应该使用并行垃圾回收。此参数仅对于 IBM Developer Kit 是有效的。 

-Xnocompactgc 
     可以使用 -Xnocompactgc 来禁用堆压缩,这是成本最高的垃圾回收操作。在 IBM Developer Kit 中避免压缩。如果您禁用堆压缩,那么消除了所有相关的开销。 

-Xinitsh 
    可以使用 -Xinitsh 来设置存储类对象的堆的初始大小。方法定义和静态字段也与类对象一起存储。尽管系统堆大小没有上限,但是设置初始大小,以避免产生涉及调用操作系统内存管理器的扩展系统堆大小的花销。您可以通过了解 WebSphere Application Server 产品中装入的类数目(大约是 8,000 个类)以及它们的平均大小,来计算理想的初始系统堆大小。了解应用程序可帮助您将它们计算进去。您只可以为 IBM Developer Kit 使用此参数。 

-Xgpolicy 
    可以使用 -Xgpolicy 来设置垃圾回收策略。如果垃圾回收策略(gcpolicy)设置为 optavgpause,使用并发作标记跟踪在堆满之前从堆栈启动的应用程序线程。垃圾回收器暂停变得协调统一了,并且长时间的暂停也不再明显了。其代价是吞吐量降低,这是因为线程可能必须要执行额外的操作。缺省的建议值为 optthruput。输入值 -Xgcpolicy:[optthruput|optavgpause]。您只可以为 IBM Developer Kit 使用此参数。 

-XX 
    基于 Sun 的 Java Development Kit(JDK)V1.4.2 有生成垃圾回收功能,这允许分隔内存池以包含不同时效的对象。垃圾回收循环根据时效收集与其他对象彼此独立的对象。使用其他参数,您可以单独设置内存池的大小。为了实现更好的性能,您应该对包含短期存活对象的池的大小进行设置,以使该池中的对象的存活时间不会超过一个垃圾回收循环。新生成的池的大小由 NewSize 和 MaxNewSize 参数确定。 

    第一次垃圾回收循环中存活下来的对象转移到另一个池中。生还者池的大小由参数 SurvivorRatio 确定。如果垃圾回收变成了瓶颈,您可以尝试定制生成池设置。要监控垃圾回收统计信息,使用 Tivoli Performance Viewer 中的对象统计信息或 verbose:gc 配置设置。输入下列值: 
-XX:NewSize (lower bound) 
-XX:MaxNewSize (upper bound) 
-XX:SurvivorRatio=NewRatioSize 
缺省值为:NewSize=2m MaxNewSize=32m SurvivorRatio=2。但是,如果 JVM 的堆大小大于 1GB,那么应该使用值:-XX:newSize=640m -XX:MaxNewSize=640m -XX:SurvivorRatio=16,或者将堆的总大小的 50% 到 60% 分配给新生成的池。 

-Xminf 
    可以使用 -Xminf 来指定最小可用堆大小百分比。如果可用空间低于指定量,那么堆增长。在启用复位的方式中,此选项指定中间件和瞬态堆的可用空间的最小百分率。这是一个 0 到 1 之间的浮点数。缺省值为 .3(30%)。 

-server | -client 
    基于 Sun 的 Java Development Kit(JDK)V1.4.2 中的 Java 热点技术引入了一种自适应 JVM,该 JVM 包含用于随着时间的推移而优化字节码执行的算法。JVM 以两种方式运行,分别为 -server 和 -client。如果您使用缺省值 -client 方式,将会获得较快的启动时间以及较小的内存占用量,但是获得的扩展性能也较低。如果有足够的时间来允许 HotSpot JVM 通过执行连续执行字节代码来热身,您可以使用 -server 方式以增强性能。在大多数情况下,应该使用 -server 方式,这将长时间地保持运行时执行高效运行。您可以监控进程大小以及服务器启动时间,来检查 -client 和 -server 之间的区别。 

附:查看端口占用情况 

    netstat -ano 
   在使用Netstat命令的同时加上参数“-o”的话,就可以让我们进一步知晓端口的关联进程标识符 (PID)了。 
   查看系统进程可以使用同时按“Ctrl+Alt+Delete”组合键的方法,在打开的“Windows任务管理器”的“进程”选项卡中进行。但默认状态下,“进程”选项卡中是没有PID这一项存在的,这样我们就无法知道进程相对应的PID是什么了。因此,要首先激活进程对应的PID项显示状态才行。方法如下: 
单击“Windows任务管理器”窗口中“查看”下的“选择列”菜单项,然后单击选中“PID”(进程标识符)复选框。 

使用jconsole查看resin运行情况,配置参数: 
-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=9889 
-Dcom.sun.management.jmxremote.authenticate=false
posted @ 2010-07-29 09:49 赵永亮 阅读(318) | 评论 (0)编辑 收藏

校内网大家都知道吧,最近校内网推出了应用程序开发接口供校内网用户来开发应用程序扩展,今天我们来介绍下校内网开发的标识语言XNML,利用它我们就可以为校内网开发自己想要的应用程序了。


什么是XNML
XNML是校内网为校内网用户提供的一种标识语言,使用它我们可以调用校内网的指定数据,利用这些数据可以开发我们需要的应用程序。


XNML编写程序的原理是什么
我们先分析一下从一个用户发出浏览网页请求到呈现网页内容的这个过程:
1、校内网用户访问你用XNML写的网页,此时会对校内网的服务器发送请求。
2、校内网的应用程序(app)服务器接收用户请求,并根据该应用程序的相关配置找到编程者存放应用程序的另一台服务器(我们的XNML代码就放在这台服务器上)
3、读取编程者编写的网页程序,把其中的XNML标签翻译转换成相应的表现形式(这个过程不需要我们了解,校内网也不会公开)
4、转换过后,结果就会呈现在刚才发出请求的用户面前。
我们所写的代码被校内网的服务器读取并翻译,最后呈现出来。翻译的内容就是我们在程序中所用到的XNML。XNML就充当着这样的角色:临时变量。


该怎么看待XNML
谈谈个人的理解,XNML就像校内网提供的一个中间接口,我们不用直接访问校内网的数据库,直接利用这个接口,就可以得到我们需要的数据。
比如我们需要得到ID为12345这个校内网用户的姓名和这个用户所在的网络,怎么得到呢,我们只需要在自己的网页程序(HTML形式)中,写入

<xn:name uid="123456" linked="false" shownetwork="true" />
就可以了,上面的这个XNML片段在校内网中被调用的时候就会自动被校内网服务器解释成如下字符串:
张三(XXXX大学)
这个用户的姓名及所在网络的字符串,也就是说,在显示的时候,他会以该编号用户的姓名和所在网络替换咱们写的这句代码。

posted @ 2010-01-06 17:58 赵永亮 阅读(354) | 评论 (0)编辑 收藏

一个农夫养了一头牛,三年后,这头牛每年会生出1头牛,生出来的牛三年后,又可以每年生出一头牛……问农夫10年后有多少头牛?n年呢?(用JAVA实现

1.
Java code
public class Cow { static int count = 1; private static void feedCow(int year,int age){ year++; age++; if(year<=30){ if(age>=3){ count++; feedCow(year,0); } feedCow(year,age); } } public static void main(String[] args) { new Cow().feedCow(0, 0); System.out.println(count); } }


2.
Java code
public class Cow { public static int count = 0; public Cow(int year){ count++; for(int i=3+year;i<=10;i++){ new Cow(i); } } public static void main(String[] args) { new Cow(0); System.out.println(count); } }
posted @ 2009-11-03 20:41 赵永亮 阅读(186) | 评论 (0)编辑 收藏

项目开发过程中,需求涉及到了各种文档转换为HTML或者网页易显示格式,现在将实现方式整理如下:
一、使用Jacob转换Word,Excel为HTML

“JACOB一个Java-COM中间件.通过这个组件你可以在Java应用程序中调用COM组件和Win32 libraries。”

首先下载Jacob包,JDK1.5以上需要使用Jacob1.9版本(JDK1.6尚未测试),与先前的Jacob1.7差别不大

1、将压缩包解压后,Jacob.jar添加到Libraries中;

2、将Jacob.dll放至“WINDOWS\SYSTEM32”下面。

需要注意的是:
【使用IDE启动Web服务器时,系统读取不到Jacob.dll,例如用MyEclipse启动Tomcat,就需要将dll文件copy到MyEclipse安装目录的“jre\bin”下面。
一般系统没有加载到Jacob.dll文件时,报错信息为:“java.lang.UnsatisfiedLinkError: no jacob in java.library.path”】

新建类:

Java代码 复制代码
  1. public class JacobUtil   
  2. {   
  3.     public static final int WORD_HTML = 8;   
  4.   
  5.     public static final int WORD_TXT = 7;   
  6.   
  7.     public static final int EXCEL_HTML = 44;   
  8.   
  9.     /**  
  10.      * WORD转HTML  
  11.      * @param docfile WORD文件全路径  
  12.      * @param htmlfile 转换后HTML存放路径  
  13.      */  
  14.     public static void wordToHtml(String docfile, String htmlfile)   
  15.     {   
  16.         ActiveXComponent app = new ActiveXComponent("Word.Application"); // 启动word   
  17.         try  
  18.         {   
  19.             app.setProperty("Visible"new Variant(false));   
  20.             Dispatch docs = app.getProperty("Documents").toDispatch();   
  21.             Dispatch doc = Dispatch.invoke(   
  22.                     docs,   
  23.                     "Open",   
  24.                     Dispatch.Method,   
  25.                     new Object[] { docfile, new Variant(false),   
  26.                             new Variant(true) }, new int[1]).toDispatch();   
  27.             Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {   
  28.                     htmlfile, new Variant(WORD_HTML) }, new int[1]);   
  29.             Variant f = new Variant(false);   
  30.             Dispatch.call(doc, "Close", f);   
  31.         }   
  32.         catch (Exception e)   
  33.         {   
  34.             e.printStackTrace();   
  35.         }   
  36.         finally  
  37.         {   
  38.             app.invoke("Quit"new Variant[] {});   
  39.         }   
  40.     }   
  41.   
  42.     /**  
  43.      * EXCEL转HTML  
  44.      * @param xlsfile EXCEL文件全路径  
  45.      * @param htmlfile 转换后HTML存放路径  
  46.      */  
  47.     public static void excelToHtml(String xlsfile, String htmlfile)   
  48.     {   
  49.         ActiveXComponent app = new ActiveXComponent("Excel.Application"); // 启动word   
  50.         try  
  51.         {   
  52.             app.setProperty("Visible"new Variant(false));   
  53.             Dispatch excels = app.getProperty("Workbooks").toDispatch();   
  54.             Dispatch excel = Dispatch.invoke(   
  55.                     excels,   
  56.                     "Open",   
  57.                     Dispatch.Method,   
  58.                     new Object[] { xlsfile, new Variant(false),   
  59.                             new Variant(true) }, new int[1]).toDispatch();   
  60.             Dispatch.invoke(excel, "SaveAs", Dispatch.Method, new Object[] {   
  61.                     htmlfile, new Variant(EXCEL_HTML) }, new int[1]);   
  62.             Variant f = new Variant(false);   
  63.             Dispatch.call(excel, "Close", f);   
  64.         }   
  65.         catch (Exception e)   
  66.         {   
  67.             e.printStackTrace();   
  68.         }   
  69.         finally  
  70.         {   
  71.             app.invoke("Quit"new Variant[] {});   
  72.         }   
  73.     }   
  74.   
  75. }  

当时我在找转换控件时,发现网易也转载了一偏关于Jacob使用帮助,但其中出现了比较严重的错误:String htmlfile = "C:\\AA";

只指定到了文件夹一级,正确写法是String htmlfile = "C:\\AA\\xxx.html";

 

到此WORD/EXCEL转换HTML就已经差不多了,相信大家应该很清楚了:)

 

二、使用XPDF将PDF转换为HTML

 

1、下载xpdf最新版本,地址:http://www.foolabs.com/xpdf/download.html

我下载的是xpdf-3.02pl2-win32.zip

 

2、下载中文支持包

我下载的是xpdf-chinese-simplified.tar.gz

 

3、下载pdftohtml支持包

地址:http://sourceforge.net/projects/pdftohtml/

我下载的是:pdftohtml-0.39-win32.tar.gz

 

4、解压调试

1) 先将xpdf-3.02pl2-win32.zip解压,解压后的内容可根据需要进行删减,如果只需要转换为txt格式,其他的exe文件可以删除,只保留pdftotext.exe,以此类推;

2) 然后将xpdf-chinese-simplified.tar.gz解压到刚才xpdf-3.02pl2-win32.zip的解压目录;

3) 将pdftohtml-0.39-win32.tar.gz解压,pdftohtml.exe解压到xpdf-3.02pl2-win32.zip的解压目录;

4) 目录结构:

 +---[X:\xpdf]

           |-------各种转换用到的exe文件

           |

           |-------xpdfrc

           |

           +------[X:\xpdf\xpdf-chinese-simplified]

                                      |

                                      |

                                      +-------很多转换时需要用到的字符文件

 

xpdfrc:此文件是用来声明转换字符集对应路径的文件

 

5) 修改xpdfrc文件(文件原名为sample-xpdfrc)

修改文件内容为:

 

Txt代码 复制代码
  1. #----- begin Chinese Simplified support package   
  2. cidToUnicode    Adobe-GB1       xpdf-chinese-simplified\Adobe-GB1.cidToUnicode   
  3. unicodeMap      ISO-2022-CN     xpdf-chinese-simplified\ISO-2022-CN.unicodeMap   
  4. unicodeMap      EUC-CN          xpdf-chinese-simplified\EUC-CN.unicodeMap   
  5. unicodeMap  GBK    xpdf-chinese-simplified\GBK.unicodeMap   
  6. cMapDir         Adobe-GB1       xpdf-chinese-simplified\CMap   
  7. toUnicodeDir                    xpdf-chinese-simplified\CMap   
  8. fontDir  C:\WINDOWS\Fonts   
  9. displayCIDFontTT Adobe-GB1 C:\WINDOWS\Fonts\simhei.ttf   
  10. #----- end Chinese Simplified support package  

 

6) 创建bat文件pdftohtml.bat(放置的路径不能包含空格)

内容为:

 

Txt代码 复制代码
  1. @echo off   
  2. set folderPath=%1  
  3. set filePath=%2  
  4. cd /d %folderPath%   
  5. pdftohtml -enc GBK %filePath%   
  6. exit  

 

7) 创建类

 

Java代码 复制代码
  1. public class ConvertPdf   
  2. {   
  3.     private static String INPUT_PATH;   
  4.     private static String PROJECT_PATH;   
  5.        
  6.     public static void convertToHtml(String file, String project)   
  7.     {   
  8.         INPUT_PATH = file;   
  9.         PROJECT_PATH = project;   
  10.         if(checkContentType()==0)   
  11.         {   
  12.             toHtml();   
  13.         }   
  14.     }   
  15.        
  16.     private static int checkContentType()   
  17.     {   
  18.         String type = INPUT_PATH.substring(INPUT_PATH.lastIndexOf(".") + 1, INPUT_PATH.length())   
  19.                 .toLowerCase();   
  20.         if (type.equals("pdf"))   
  21.             return 0;   
  22.         else  
  23.             return 9;   
  24.     }   
  25.        
  26.     private static void toHtml()   
  27.     {   
  28.         if(new File(INPUT_PATH).isFile())   
  29.         {   
  30.             try  
  31.             {   
  32.                 String cmd = "cmd /c start X:\\pdftohtml.bat \"" + PROJECT_PATH + "\" \"" + INPUT_PATH + "\"";   
  33.                 Runtime.getRuntime().exec(cmd);   
  34.             }   
  35.             catch (IOException e)   
  36.             {   
  37.                 e.printStackTrace();   
  38.             }   
  39.         }   
  40.     }   
  41.        
  42. }  

String cmd = "....";此处代码是调用创建的bat文件进行转换 

 

8) 测试转换

 

 

Java代码 复制代码
  1. public static void main(String[] args)   
  2. {   
  3.     ConvertPdf.convertToHtml("C:\\test.pdf""X:\\xpdf");   
  4. }  

 

 

以上就是整理的内容,后续还会添加视频转换为FLV格式,如果需要的话:)

说的不是很详细,碰到问题的朋友可以自己努力解决一下:)

posted @ 2009-11-03 19:50 赵永亮 阅读(171) | 评论 (0)编辑 收藏
Java作为一门优秀的面向对象的程序设计语言,正在被越来越多的人使用。本文试图列出作者在实际开发中碰到的一些Java语言的容易被人忽视的细节,希望能给正在学习Java语言的人有所帮助。
 
1,拓宽数值类型会造成精度丢失吗?
    Java语言的8种基本数据类型中7种都可以看作是数值类型,我们知道对于数值类型的转换有一个规律:从窄范围转化成宽范围能够自动类型转换,反之则必须强制转换。请看下图:
byte-->short-->int-->long-->float-->double
char-->int
我们把顺箭头方向的转化叫做拓宽类型,逆箭头方向的转化叫做窄化类型。一般我们认为因为顺箭头方向的转化不会有数据和精度的丢失,所以Java语言允许自动转化,而逆箭头方向的转化可能会造成数据和精度的丢失,所以Java语言要求程序员在程序中明确这种转化,也就是强制转换。那么拓宽类型就一定不会造成数据和精度丢失吗?请看下面代码:
Java代码 复制代码
  1. int i=2000000000;   
  2. int num=0;   
  3. for(float f=i;f<i+50;f++){   
  4.     num++;   
  5. }   
  6. System.out.println(num);  

请考察以上代码输出多少?
如果你回答50 ,那么请运行一下,结果会让你大吃一惊!没错,输出结果是0,难道这个循环根本就没有执行哪怕一次?确实如此,如果你还不死心,我带你看一个更诧异的现象,运行以下代码,看输出什么?
int i=2000000000;
float f1=i;
float f2=i+50;
System.out.println(f1==f2);
    哈哈,你快要不相信你的眼睛了,结果竟然是true;难道f1和f2是相等的吗?是的,就是这样,这也就能解释为什么上一段代码输出的结果是0,而不是50了。那为什么会这样呢?关键原因在于你将int值自动提升为float时发生了数据精度的丢失,i的初始值是2000000000,这个值非常接近Integer.MAX_VALUE,因此需要用31位来精确表示,而float只能提供24位数据的精度(另外8位是存储位权,见IEEE745浮点数存储规则)。所以在这种自动转化的过程中,系统会将31位数据的前24位保留下来,而舍弃掉最右边的7位,所以不管是2000000000还是2000000050,舍弃掉最右边7位后得到的值是一样的。这就是为什么f1==f2的原因了。
    类似的这种数值拓宽类型的过程中会造成精度丢失的还有两种情况,那就是long转化成float和long转化成double,所以在使用的时候一定要小心。

2,i=i+1和i+=1完全等价吗?
    可能有很多程序员认为i+=1只是i=i+1的简写方式,其实不然,它们一个使用简单赋值运算,一个使用复合赋值运算,而简单赋值运算和复合赋值运算的最大差别就在于:复合赋值运算符会自动地将运算结果转型为其左操作数的类型。看看以下的两种写法,你就知道它们的差别在哪儿了:
  (1) byte i=5;
      i+=1;
  (2) byte i=5;
      i=i+1;
    第一种写法编译没问题,而第二种写法却编译通不过。原因就在于,当使用复合赋值运算符进行操作时,即使右边算出的结果是int类型,系统也会将其值转化为左边的byte类型,而使用简单赋值运算时没有这样的优待,系统会认为将i+1的值赋给i是将int类型赋给byte,所以要求强制转换。理解了这一点后,我们再来看一个例子:
  byte b=120;
  b+=20;
  System.out.println("b="+b);
  说到这里你应该明白了,上例中输出b的值不是140,而是-116。因为120+20的值已经超出了一个byte表示的范围,而当我们使用复合赋值运算时系统会自动作类型的转化,将140强转成byte,所以得到是-116。由此可见,在使用复合赋值运算符时还得小心,因为这种类型转换是在不知不觉中进行的,所以得到的结果就有可能和你的预想不一样。

3,位移运算越界怎么处理
    考察下面的代码输出结果是多少?
    int a=5;
    System.out.println(a<<33);
    按照常理推测,把a左移33位应该将a的所有有效位都移出去了,那剩下的都是零啊,所以输出结果应该是0才对啊,可是执行后发现输出结果是10,为什么呢?因为Java语言对位移运算作了优化处理,Java语言对a<<b转化为a<<(b%32)来处理,所以当要移位的位数b超过32时,实际上移位的位数是b%32的值,那么上面的代码中a<<33相当于a<<1,所以输出结果是10。

4,判断奇数
  以下的方法判断某个整数是否是奇数,考察是否正确:
   public boolean isOdd(int n){
       return (n%2==1);
   }
   很多人认为上面的代码没问题,但实际上这段代码隐藏着一个非常大的BUG,当n的值是正整数时,以上的代码能够得到正确结果,但当n的值是负整数时,以上方法不能做出正确判断。例如,当n=-3时,以上方法返回false。因为根据Java语言规范的定义,Java语言里的求余运算符(%)得到的结果与运算符左边的值符号相同,所以,-3%2的结果是-1,而不是1。那么上面的方法正确的写法应该是:
   public boolean isOdd(int n){
       return (n%2!=0);
   }

5,可以让i!=i吗?
在本题中,要求你声明一个i值,使得以下程序输出"No i!=i":
//在此声明i,并赋值。
if(i==i){
      System.out.println("Yes i==i");
  }else{
      System.out.println("No i!=i");
  }

    当你看到这个命题的时候一定会以为我疯了,或者Java语言疯了。这看起来是绝对不可能的,一个数怎么可能不等于它自己呢?或许就真的是Java语言疯了,不信请将i做出以下声明,再运行上面的代码。
  double i=0.0/0.0;
    上面的代码输出"No i!=i",为什么会这样呢?关键在0.0/0.0这个值,在IEEE 754浮点算术规则里保留了一个特殊的值用来表示一个不是数字的数量。这个值就是NaN("Not a Number"的缩写),对于所有没有良好定义的浮点计算都将得到这个值,比如:0.0/0.0;其实我们还可以直接使用Double.NaN来得到这个值。在IEEE 754规范里面规定NaN不等于任何值,包括它自己。所以就有了i!=i的代码。

6,2.0-1.1==0.9吗?
考察下面的代码:
Java代码 复制代码
  1. double a=2.0,b=1.1,c=0.9;   
  2. if(a-b==c){   
  3.   System.out.println("YES!");   
  4. }else{   
  5.   System.out.println("NO!");   
  6. }  

以上代码输出的结果是多少呢?你认为是“YES!”吗?那么,很遗憾的告诉你,不对,Java语言再一次欺骗了你,以上代码会输出“NO!”。为什么会这样呢?其实这是由实型数据的存储方式决定的。我们知道实型数据在内存空间中是近似存储的,所以2.0-1.1的结果不是0.9,而是0.88888888889。所以在做实型数据是否相等的判断时要非常的谨慎。一般来说,我们不建议在代码中直接判断两个实型数据是否相等,如果一定要比较是否相等的话我们也采用以下方式来判断:
  if(Math.abs(a-b)<1e-5){
     //相等
  }else{
    //不相等
  }
上面的代码判断a与b之差的绝对值是否小于一个足够小的数字,如果是,则认为a与b相等,否则,不相等。
posted @ 2009-11-03 18:47 赵永亮 阅读(147) | 评论 (0)编辑 收藏

1。应用服务器处理业务逻辑,web服务器则主要是让客户可以通过浏览器进行访问。
2。应用服务器处理业务逻辑,web服务器是用于处理HTML文件的。web服务器通常比应用服务器简单,如apache就是web服务器,Jboss就是EJB应用服务器。
应用服务器:Weblogic、Tomcat、Jboss
WEB SERVER:IIS、 Apache
在B/S体系结构中,Web   server是Application   Server的前提和基础。Web   Server接受来自Browse(http)的request。为了扩展Web的应用(如与后台DataBase打交道)早期如一些DLL可以来完成,后来各家公司有了Application   server丰富了这方面的性能。使用户跟后台的数据库有了更好的接口。如:WebSphere   Weblogic等等
web服务器只提供web服务功能,比喻说解释jsp,servlet等,而应用服务器提供整个企业级解决方案,比如说:应用服务器提供EJB包容器,可以提供用户控制,事务等居多功能,web服务器是应用服务器的一个子集
Web服务器与(Java)应用服务器是平行的概念,二者不存在相互包容关系。好像J2EE体系结构就是这么画的:客户端《——》Web服务器《——》应用服务器《——》数据库服务器  
如果你访问的网页只有象HTML这种页面的,用WEB服务器就够了,但是如果是JSP,也就是含JAVA代码的HTML,则就需要JAVA应用服务器了,因为只有JAVA应用服务器才能解析JSP里的JAVA代码,并将解析结果以HTML的格式返回给你。

应用服务器:能实现动态网页技术的服务器叫做应用服务器。(硬件的概念)

WEB服务器:称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务。(软件的概念)

  (1)应用层使用HTTP协议。

  (2)HTML文档格式。

  (3)浏览器统一资源定位器(URL)。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zenith_hu/archive/2009/08/27/4491155.aspx

posted @ 2009-10-30 16:14 赵永亮 阅读(167) | 评论 (0)编辑 收藏

今天程序中涉及到这个问题,我查了下。有些人说的很笼统理解不了,下面是一个朋友的解释,我copy如下,并说出自己的理解:

1.如果没有符合条件的纪录,get返回一个null,load会抛出一个ObjectNotFountdException

2.load返回实体的代理类实例(先查看缓存和二级缓存是不是别人用过,如果别人用过了就会留下句柄,那么它就返回这个句柄,如果没有的话就抛出一个null了。),get方法永远直接返回实体类(先找一把,毕竟hibernate是持久化对像的。如果没有的话它就通过ID去数据库中检索并构造一个对象并返回,如果库中查不到的话就抛出异常:ObjectNotFountdException并告诉你   No row with the given identifier exists: load的类)

3.load方法充分利用内部缓存和二级缓存,get方法只使用内部缓存,没有就直接查询!!!

所以,如果要利用二级缓存的时候,要用load读取数据。

----------------------只要能很好的处理他们返回的异常信息就大胆的用load吧。毕竟hibernate就是持久化对象的,它存了那么多咱们为啥不用呢?呵呵。

posted @ 2009-10-27 10:34 赵永亮 阅读(155) | 评论 (0)编辑 收藏

Spring Hibernate在AOP方面的配置冲突
Spring2.0 Hibernate3.1.x/Hibernate3.2

在使用Spring的AOP编程时,会用到这几个lib:
asm-2.2.2.jar
asm-commons-2.2.2.jar
asm-util-2.2.2.jar

Hibernate如果使用lib:
asm.jar
asm-attrs.jar

其中asm-2.2.2.jar与asm.jar存在类上的冲突!!!
使用其中之一或两者都使用,可能会出现如下错误:
java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor
java.lang.NoClassDefFoundError: org/objectweb/asm/commons/EmptyVisitor
java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit。。。。。。

解决办法是:
1).去掉类路径上的关于Hibernate的3个lib
asm.jar
asm-attrs.jar
cglib-2.1.3.jar
2).加入Spring中的以下4个lib
asm-2.2.2.jar
asm-commons-2.2.2.jar
asm-util-2.2.2.jar
cglib-nodep-2.1_3.jar

如果再不行,都试试删删看。


java.lang.SecurityException: class "javax.xml.bind.JAXBContext"'s signer information does not match signer information of other classes in the same package
这个错误是因为载入的包里面有两个相同路径的类,就是在一个包里面有两个同名的类
有可能是将相同的包载入两次或者把包解开后,先将jar文件载入了,后又将解开的类载入了


Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
试试自己去下一个spring的包,把包里的spring.jar加到项目里去。eclipse生成的时候可能会有些包没有放进去。


Error creating bean with name 'datasource' defined in file
Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool
试试将commons-dbcp.jar,commons-pool.jar和commons- collections.jar加入CLASSPATH中


hibernate 3.1 中的hibernateTemplate ,class应该为org.springframework.orm.hibernate3.HibernateTemplate,而非org.springframework.orm.hibernate.HibernateTemplate,因为某些原因我现在还用3.1,早前在玩springside的时候感觉hibernate 3.2 的Hibernate Annotations方便多了。

找不到action或报错的另一少有原因,一些版本hibernate版本会有些冲突方面的问题,可换一版本的hibernate试试,个人感觉hibernate的版本对应用会比较敏感


org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in resource [/WEB-INF/dataAccessContext-hibernate.xml] of ServletContext: Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: javax/transaction/TransactionManager
java.lang.NoClassDefFoundError: javax/transaction/TransactionManager


原因:缺少jta.jar 或者是找不到hbm.xml文件导致sessionfactory出错,检查hbm文件路径是否正确,文件是否存在
<property name="mappingResources">
  <list>
  <value>com/yourcompany/model/Login.hbm.xml
  </value>
  </list>
  </property>

另外,此出错也有可能是HBM文件里的错误引起,比如当初设计表的时候建立好了表间的约束关系,所以当生成其中一些持久化类,而另外一些有关联的表没有生成持久化类的时候。hbm文件里也会有生成相关的一对多多对一等的关联,而另外的表没有生成持久化类。所以运行时就会报这个错误。将HBM文件里暂时没有使用到的配置删除就可以了。


2007-06-26 18:38:13,671 ERROR [com.yourcompany.model.dao.LoginDAO] - <save failed>
org.springframework.jdbc.BadSqlGrammarException: Hibernate operation: could not insert: [com.yourcompany.model.Login]; bad SQL grammar [insert into mysql__login (name, password) values (?, ?)]; nested exception is java.sql.SQLException: Table 'mysql.mysql__login' doesn't exist
java.sql.SQLException: Table 'mysql.mysql__login' doesn't exist

把hbm文件里面的catalog="'mysql"去掉即可!
另注意的一点是eclipse生成的DAO文件应该是:
    public void save(Login transientInstance) {
        log.debug("saving Login instance");
        try {
            getHibernateTemplate().save(transientInstance);
            log.debug("save successful");
        } catch (RuntimeException re) {
            log.error("save failed", re);
            throw re;
        }
    }
而不是原来的    public void save(LoginDAO transientInstance)

只要在applicationContext.xml中加上
<property name="mappingResources">
<list>
<value>com/yourcompany/hibernate/Users.hbm.xml</value>
</list>
</property>
加这段代码就会找不到action
换一个版本的hibernate应该就ok


Invalid path /addcustomer was requested
输入的路径不正确,检查spring中注册的action的路径和输入的路径是否一致,留意大小写是否一致

2007-08-08 15:36:17,406 ERROR [org.hibernate.proxy.BasicLazyInitializer] - CGLIB Enhancement failed: dao.User
java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
 at net.sf.cglib.core.ClassEmitter.begin_class(ClassEmitter.java:77)

Spring 和 Hibernate 共用的一些 jar 文件发生了版本冲突, 删除 WEB-INF/lib/asm-2.2.3.jar 然后重启 Tomcat.

asm-2.2.3.jar
       asm.jar
       asm-attrs.jar
      asm-commons-2.2.3.jar
      asm-util-2.2.3.jar

 

另外,如果报以下错:

Caused by: java.lang.SecurityException: class "org.objectweb.asm.CodeVisitor"'s signer information does not match signer information of other classes in the same package

也是由于上一个原因,即Spring 和 Hibernate 共用的一些 jar 文件发生了版本冲突,需要删除asm-2.2.3.jar


Resources cannot be null
关于这个异常除了大家说的之外,如果在struts-config.xml的配置中不加载验证插件,也是会报上述错误的,请在配置文件中加上
 <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"/> 
    <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
 <set-property property="pathnames"  value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>


hibernate java.lang.NullPointerException

检查一下配置文件。
比如struts-config里,action的名称和路径是否一致,是否和spring里注册的名字一致。特别留意大小写。hbm文件配置是否有错,大小写。。。

 

-----------------------------------------------------------------------------------------------

 

 

   %%%%Error Creating SessionFactory %%%%  java.lang.SecurityException: class"org.apache.commons.collections.SequencedHashMap"'s signer informationdoes not match signer information of other classes in the same package 
        因为我用的6.0.1,所以怎么也没出现这个异常。后来Google搜到很多人遇到了这个故障,猜测是commons-collections.jar的问题,可能和MyEclipse 6.0.0自带的包有问题导致。例如下面的是一个解决方案:http://ttitfly.javaeye.com/blog/131955
        
        解决方案:
        1)下载 MyEclipse 6.0.1 来开发;
        2)或者去http://commons.apache.org/collections/ 下载一个新的包,把原来的commons-collections-xxx.jar给删了,然后用新的包替换。注意:一定要到应用的发布目录去做这个工作,而且替换后不能重新发布应用,然后立即重启Tomcat再测试。

--------------------------------------------------------------------------------------------------------

 

1、java.lang.NoSuchMethodError: org.springframework.util.ObjectUtils.nullSafeToString(Ljava/lang/Object;)Ljava/lang/String;
spring的jar包冲突错误:
我的是用的spring2.0的jar包,应为要用工作调度所以加了一个1.2版本的spring.jar做支持,项目跑在容器下跑没事,单元测试就会出现以上错误。
参考资料:http://www.javaeye.com/post/365364
2、
support.DisposableBeanAdapter (DisposableBeanAdapter.java:148)     - Couldn't invoke destroy method of bean with name 'sessionFactory'
java.lang.IllegalStateException: Shutdown in progress
查了以下资料,也有人遇到过,找了一类似http://www.blogjava.net/allen-zhe/archive/2007/03/20/104880.html,我的解决方式,就在数据源配置那加了一个destroy-method="close"配置就可以了。
解决方法是看了http://forum.springframework.org/archive/index.php/t-19665.html这片文章想出来的。
3、org.hibernate.HibernateException: CGLIB Enhancement failed:
原因是myeclipse6.0的cglib-2.1.3.jar有bug,改为cglib-2.1.jar就可以了
4、[这个是在服务器运行时才报的,有点跑题了]还有一种比较隐蔽的错误,只要log4j属性文件设置为debug时才会报的错误代码如下:
DEBUG [main] xml.DefaultNamespaceHandlerResolver (DefaultNamespaceHandlerResolver.java:128)     - Ignoring namespace handler [org.springframework.scripting.config.LangNamespaceHandler]: handler class not found
java.lang.ClassNotFoundException: org.springframework.scripting.config.LangNamespaceHandler
找不到类的提示,在google上搜了一段时间没找到这个类在那个包里,最后一想肯定myeclipse自带的包肯定有,果然找到了,是少加载了spring-support.jar包。在myeclipse的Spring2.0 Misc Libraires库里
posted @ 2009-09-28 09:47 赵永亮 阅读(589) | 评论 (1)编辑 收藏


 
 
在实际进行java Web项目实施的时候,我们可以采用的商业java Web服务器有Ibm WebSphere,Bea Web Logic。这两种服务器功能齐全而强大,支持所有的java 服务容器标准,适合成品商业java Web应用的发布。但是这两种服务器是商业服务器,价格昂贵,而且对系统资源要求极高。特别是Websphere 配置复杂,如果不配合采用ibm Websphere Studio Application非常不适合开发。而且他们不同的版本对servlet.jar等javax组件和jdk的要求不同。如Websphere 3.5所要求的servlet.jar 支持的是旧版本的javax.servlet.http.HttpSession 操作,不支持session.setAttribute() session.getAttribute()。 在开发或者学习过程中,有许多免费的轻型的Java Web服务器可以供我们选用,如Tomcat,Resin,Orion等等。他们使用都很方便,占用资源也很少,适合开发中不断的调试;还可以和Jbuilder这样的集成开发工具集成使 用。根据实际开发中的情况来看,Jakata Tomcat 和Sun Java结合的最好,和其他应用服务器配合使用可支持 完整的j2ee标准,应用也很广泛。但是从Java 普遍存在的编码问题来看,还是Resin 解决的最好。还有从使用的角度讲,个人认为Resin比Tomcat方便,而且Resin也可以结合Jbuilder6等ide使用。Resin强调使用Xml技 术,从Resin自己的HomePage使用xtp就可以看出来。

二、Resin的安装和配置

Resin 可以在 http://www.caucho.com/download/index.xtp 免费下载和使用。使用Resin开发或者学习是免费的,但是如果把Resin作为收费产品发布是需要付费的。目前的版本是2.10。

下载Resin 时选择Archive Versions 中的 windows.zip的普通安装包resin-2.1.0.zip。把该zip包解压到任何目录下面,如d: esin。以下介绍都假设Resin安装在d: esin下。进入d: esinin,键入httpd,可以在命令行控制台下运行Resin服务器。此时弹出一个有start 和stop两个Radio按纽和一close

按纽的对话框。在这里可以看到Resin的运行信息。这些信息同时Resin可以在d: esinlog目录下面的stdout.log 日志文件中察看到。如:

Resin 2.0.4 (built Thu Nov 15 17:56:24 PST 2001)
Copyright(c) 1998-2001 Caucho Technology. All rights reserved.
Starting Resin on Wed, 23 Jan 2002 14:41:47 +0800 (CST)

http listening to *:80
srun listening to haitaiserver:6802

点选stop,可以停止当前的Resin服务器进程;再点选start,又可以开启新的Resin服务器进程。关闭该对话框,则回到Command 控制台的盘符提示状态下。如果在nt4或者win2k环境下,需要把Resin当成服务,只需要 在Command控制台的该目录下,键入 httpd ?install,就可以在管理工具的服务下面看到新增了一条Resin Web Server的自动的服务。以后只要进入nt 4或者win2k,就可以启动Resin服务。该服务也可以像其他服务一 样设置成手动或者禁用状态。注意有的时候在安装完服务后,启动Resin,并不能看到自己写的Resin例程可以被解析,浏览器显示服务器找不到错误。只要重新启动win2k或者nt,就能解决该问题。

下面简要介绍一下Resin服务器的配置。Resin服务器和大多数Java Web服务器一样,通过一个Xml文件配置。

进入d: esinconf目录,打开resin.conf,这是一个xml格式的文本。这里面有很多标记,先查找到:<http-server>。在<http-server></http-server>标记对中的配置和resin的 Java Web 服务器有关。找到<app-dir>,在<app-dir></app-dir>标记对中的表示resin的根,相当于Apache的 htdocs 或者 IIS 的wwwroot。Resin自带http服务器,但是也可以不使用它,采用Apache 或者 IIS做http服务器。这个在下面段落中会提到。

再查找<http port=′8080′/>标记,它可以这样配置<http host=′localhost′ port=′80′/>。host参数指定的是服务器,port指定的是http端口,默认是localhost和8080。还有<srun host=′localhost′ port=′6802′/>标记。这个是jsp和java Servlet的引擎配置。一般默认就可以了,除非6802端口已经被别的程序占用了。然 后,配置jdk。这个需要在classpath中设置。右键点击我的电脑,在系统特性的高级标签中,点击环境变量,在系统变量中新建一个环境变量,变量名为classpath,值为jdk所在的目录;再新建另外一个环境变量,变量 名为path,值为javac.exe和java.exe所在的目录(在jdk所在的目录下面的bin目录下)。一般这样子配置以后,Resin就可以使用了。在d: esindoc中(假设你的<appdir></appdir>对中的名称是doc,也就是根是d:/resin/doc,而且你的<http host=′localhost′ port=′80′/>如左配置),随便写一个jsp文件,如可以写 个test.jsp文件,内容为<%=1+2+3%>。然后,在浏览器中,键入http://localhost/test.jsp。如果你可以看到浏览器显示6,则表示Resin服务器已经可以正常运行了。注意,修改配置后,一般重新启动resin才能看到变化。

三、Resin使用简介

使用Resin开发Java Web项目时,需要建立自己的WebApp。这里不介绍Resin Cmp/Ejb的开发和使用,只介绍用Resin开发普通的jspjava servlet项目。在这里还要谈到resin.conf的配置。Resin中的应用可以有2种方式

发布:一是在Resin的目录下发布;二是打包成War发布。

1、在Resin的目录下发布

在resin.conf中查找<web-app>标签,该标签表示一个web应用。标签中,id属性表示该应用的Web路径。如<web-app id=′/test′>,表示该应用在Web上访问的时候应该用http://hostname/test/来访问。app-dir属性表示该应用的实际路径。如 <app-dir>d: esindoc est</app-dir>表示该应用在d: esindoc est目录下面。默认值为根下面的和id 同名的目录。Resin可以配置3种error-page:404错误也就是文件找不到错误页;Exception违例页;不能连接java引擎页。他们分别可以这样子设置。

404文件找不到页

<web-app id=′/app1′>
<error-page error-code=′404′ location=′/file_not_found.jsp′/>
</web-app>

Exception 违例页

<web-app id=′/foo′>
<error-page exception-type=′java.lang.NullPointerException′
location=′/nullpointer.jsp′/>
</web-app>

不能连接到srun Servlet引擎错误页

该页设置和应用无关,属于服务器的设置。

<http-server>
<error-page exception-type=′connection′
location=′/missing_file.html′/>
</http-server>

classpath的设置

参见下面的语句:

<classpath id=′WEB-INF/classes′ source=′WEB-INF/src′ compile=′true′/>

id参数的值表示classpath中编译后的class的存放路径;source参数的值表示classpath中java源代码的存放 路径;compile中的值可能是true或者false,表示是否由Resin的srun自动编译java源代码。Classpath的设置 一般和javaBean或者Servlet的使用有关。id的值表示javaBean的编译好的包存放的根,source的值表示 javaBean的java源代码存放的根。Servlet相同。

Servlet的设置

参见下面的语句:

<servlet-mapping url-pattern=′*.xtp′ servlet-name=′xtp′/>
<servlet-mapping url-pattern=′*.jsp′ servlet-name=′jsp′/>
<servlet-mapping url-pattern=′/servlet/*′ servlet-name=′invoker′/>

一般就是指定那些需要通过srun的解析。比如在这里,把*.jsp改成*.jss,其他不变,那么只要在访问时遇到*.jss的文件就和原来遇到*.jsp一样处理。通过这个可以指定解析的引擎,如以下的配置:

<servlet-mapping url-pattern=′*.xtp′ servlet-name=′com.caucho.jsp.XtpServlet′/>

在Servlet中,也可以指定servlet。如

<servlet servlet-name=′hello′ servlet-class=′test.HelloWorld′/>
<servlet-mapping url-pattern=′/hello.html′ servlet-name=′hello′/>

在servlet-mapping中有个重要的参数case-sensitive 如果在windows上,最好配置成false,忽略大小写,从而和windows的约定一致。

Session的配置

参见如下的配置语句:

<session-config>
<session-max>4096</session-max>
<session-timeout>30</session-timeout>
<enable-cookies>true</enable-cookies>
<enable-url-rewriting>true</enable-url-rewriting>
<file-store>WEB-INF/sessions</file-store>
</session-config>

session-max :最大 session数量
session-timeout :session过期时间,以分钟为单位。

是否允许cookie :指session是否采用cookies。如果采用cookies,浏览器必须支持session才能使用,发布

时建议改成false。enable-url-rewriting和enable-cookies一般配合使用。如果enable-cookies是false,

enable-url-rewriting应该设成true比较合适。

file-store :该配置指示服务器是否把session作为文件存放在服务器上。如果把该项注释掉,则在你的

web-app目录下的WEB-Inf/sessions目录不保存序列化后的session对象。Session还有jdbc-store配置,对应

着把session通过jdbc永久保存在数据库中。其实也就是会话变量的序列化后的保存和重新载入的物理实现。
在这里session还支持了多服务器的设置问题,

通过tcp-store参数设置。由于涉及到负载平衡的问题,在这里不详细叙述,只简单写一个例子:

<http-server>

<http id=′a′ port=′80′/>
<srun id=′a′ host=′host-a′ port=′6802′/>

<http id=′b′ port=′80′/>
<srun id=′b′ host=′host-b′ port=′6802′/>

<host id=′′>
<web-app id=′′>

<session-config>
<tcp-store/>
<always-load-session/>
</session-config>
</web-app>
</host>

</http-server>

这个例子表示session是按照tcp ring的方式传递。

temp-dir 的设置

temp-dir指的是应用的临时目录。也就是在javax.servlet.context.tempdir中用到的目录。模认是应用目录

下的WEB-INF mp目录。

以上的设置都可以在<web-app>标签对中设置,控制某个web应用的设置。

2、打包成War发布

以下是介绍对如何在resin下使用已经打包成War的java Web应用进行发布。

其实这个是最简单也是最清晰的良好方法。在j2ee中,所有的项目都打包成ear发布。其中,Web应用打包成

war,ejb应用打包成jar。在resin中,这些都可以直接部署。这里我只对打包成war的Web应用的部署做介绍。

在resin.conf中,查找这个:<war-dir id=′webapps′/>。他表示war文件应该被拷贝的路径。这里指的是相对

于resin的安装路径,如以上的设置表示d: esinwebapps。只要重新启动Resin就可以了。Resin会把该war自

动解包到webapps目录下。你可以在command控制台或者stdout.log中看到类似于

[2002-04-27 09:56:21.680] initializing application http://haitaiserver:8080/rwtest 的语句。这个

表示该Web应用是自动安装的。只要这个应用是符合j2ee标准的Web应用,应该不会有问题。通过如上显示的路

径就可以访问到这个应用。如果你到d: esinwebapps wtest中浏览,你会看到Resin已经为你生成了rwtest

目录,下面是META-INF和WEB-INF还有你自己的JSPservlet 文件和目录。是完全符合j2ee的结构的。你可以

在rwtest目录下建立新的jspservlet,一样可以被编译和解析并运行的。在实际操作中,可以使用Jbuilder

或者 WebSphere等Ide工具进行集成调试和打包,非常的方便。

四、使用Resin进行java Web项目的开发和调试

这里篇幅有限,不可能讲太多,我只对实际中最有用的部分做介绍。

Resin中如果定义了错误页,则出错后最常见的一大串Exception不会被看到,直接跳转到错误页。所以建议开

发中先不设置错误页。jsp错误中最常见的就是Nullpoint Exception,其次是名称的拼写错误。错误也可以在

Resin安装目录下的log目录下的stderr.log中找到。通过对该log文件的分析可以看到很多有用的错误信息。

在调试jsp的时候,如果定义了compile为true,jsp先被翻译成Servlet的java文件,再被编译成class文件。

可以在你自己的work目录中找到该文件。java的名称在Resin中是这样子定义的:原先的jsp文件名前加下划线

,再加上_jsp这个字样。所以在java 应用中的命名不要以_jsp结尾,也不要出现中文名称等字符;其实名称

以_jsp为开头也是不合法的。

关于java对多国语言的支持问题,在Resin中得到了很好的解决。以jsp为例,参考Resin自动生成的java

Servlet文件。只要在任何的jsp文件的最开始处增加:

<% @page contentType="text/html;charset=gb2312" %>

中文问题就解决了。察看生成的Servlet源文件片断:

response.setContentType("text/html;charset=gb2312");
request.setCharacterEncoding("GB2312");

以上为设置字符集

private static byte[] _jsp_string26;
private static byte[] _jsp_string27;

_jsp_string26 = " </table> <table class="type"> <tr> <td>".getBytes("GB2312");
_jsp_string27 = " </td><td> </tr> <!-- <tr> <td> ".getBytes("GB2312");

以上是对页面的显示的编码。其中,getBytes("gb2312")是静态编码,这是Resin为了解决某些环境下还是不

能正常显示而设置的。在Resin的配置文件(/conf/resin.conf)中,可以通过设置<jsp precompile=′true′

static-encoding=′false′ recompile-on-error=′true′/>中的static-encoding属性为true或者false,来控

制是否静态编码。其实在Resin容器的内部,所有的字符都是按照iso-8859-1来处理的。iso-8859-1是一个大

字符集,虽然中文的gb2312和8859在字的定义上有不同,但是编码是包容了gb2312的。按照解决多国语言的方

法,在纯英文平台上用iso-8859-1处理内部编码,而把字符的显示推向客户端的机器。所以这样只要编码是正

确的,在页面上显示中文就不存在问题。Tomcat3.2不方便的地方是Tomcat对数据库的操作中文支持不好,需

要手动在java Bean或者Servlet中硬编码。通过测试,在Resin中完全没有这个问题。Tomcat4.0解决了这个问

题。不过个人习惯来讲还是觉得resin在配置方面方便一些。

在Resin中可以自动解决引入的jar。这个在使用特殊的类或者第三方提供的开发包非常有用。方法非常简单:

只要把该jar或者是zip拷贝到Resin安装目录下的lib目录下面,重新启动Resin,就可以了。如db2用到的

db2java.zip文件,只要轻松拷贝到d: esinlib中就可以了。

Resin提供了对Jbuilder的集成调试。可以到:

http://www.caucho.com/projects/jbuilder/resin-jbuilder.jar免费下载到resin的jbuilder的ide扩展包。

然后,把该包该名成:resin-jbuilder.jar,拷贝到jbuilder6libext目录下。然后,把Resin2.1解包安装

在jbuilder6 esin-2.1目录下,就可以了。打开任何的War项目,在project上点右键,选择properties,选

择Servers标签。在原来的选择框上,就可以看到多了一项Resin2.1。这样子就可以象原来用tomcat一样调试

jspservlet了,而且比Tomcat更方便。调试方法和用Tomcat调试一样。

五、其他问题

使用Resin可以和apache结合使用。也就是利用apache做http服务器,而Resin做srun服务器。可以参考

resinconfsamples目录下的apache.conf。主要就是把 app-dir 设成 /usr/local/apache/htdocs(也就是

apache的root)。同时在apache 中的http.conf也做了相应的设置。Resin还提供了对该过程的自动安装程式

,运行resininsetup,你可以在弹处的对话框中选择apache,这样子就可以了。只要你曾经安装过apache

,resin可以自己找到httpd.conf文件所在的路径。

使用命令行方式启动Resin,如果改动了Resin.conf,Resin会自己重新启动适应新的配置。这个很适合初期安

装时使用。

Resin对数据库缓冲池的支持很好。在这里,它提供了DBPool对缓冲池做了封装。实际使用时,只要在

resin.conf这样配置:

<dbpool.sql>

  <id>ORCL</id>
  <driver>oracle.jdbc.driver.OracleDriver</driver>
  <url>jdbc:oracle:thin:@localhost:1521:SMTH</url>

  <!-- <url>jdbc:oracle:oci8:@SMTH</url> -->

  <user>scott</user>
  <password>tiger</password>

  <max-connections>5</max-connections>

</dbpool.sql>

然后,在你的jsp或者servlet中就可以这样子使用了:

先导入 com.caucho.sql.*包,然后如下直接得到连接:

Connection conn = DBPool.getPool("ORCL").getConnection();

个人建议不要如上使用连接池,还是按照ejb的方法用从Context中直接找到的DataSource对象中得到连接通用

性比较好。代码也很简单:

Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup(“jdbc/EmployeeDB”);
Connection conn = ds.getConnection();

在Resin中如下配置jdbc就可以了:

<resource-ref>
<res-ref-name>jdbc/EmployeeDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<init-param driver-name="com.caucho.jdbc.mysql.Driver"/>
<init-param url="jdbc:mysql_caucho://localhost:3306/test"/>
<init-param user="name"/>
<init-param password="password"/>
<init-param max-connections="20"/>
<init-param max-idle-time="30"/>
</resource-ref>

用Resin Web Server开发还是比较愉快的。只是没有像Weblogic 或者WebSphere那样子提供现成的管理控制台而已。但是从稳定性和方便性来讲,Resin个人认为比Tomcat要好很多。况且Resin还有提供了resin-cmp 和 resin-ejb,功能更强大。  
 

posted @ 2009-09-26 18:02 赵永亮 阅读(407) | 评论 (0)编辑 收藏
SQL front 4.1、4.2均可使用
 jn638qePxzcLZ6ce2zK5FpZTomx4nloQ
CWS6gW2wPkU+IbBwq6h3csPV0UyKDm8M
FA6E1KvN9mjrXxP2RmYbIgjHJX1G+qSe
+O0pqk2O7kNye772PaZAOpYHiwZbRgJ5
224v/1+vK9sn3lJ9HH4Scjck4o1+GGJC
tgQ7aGJwQzhapPLuYUuvmIn6FWOLZjtD
F/GI8UmOzMcdDi9id2xfNkbBrOG+c4xM
65zfuIsY/FoepoxgRWAVQKeJ/9bWaSMm
N/IpOMF0xCT0JAlTkUoOCg==
posted @ 2009-09-20 09:24 赵永亮 阅读(1337) | 评论 (1)编辑 收藏
仅列出标题  

<2025年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

留言簿

文章档案

搜索

  •  

最新评论