PHP: Autoloading Objects - Manual

[不指定 2009/03/02 11:40 | by ipaddr ]

http://www.php.net/autoload

Autoloading Objects

Many developers writing object-oriented applications create one PHP source file per-class definition. One of the biggest annoyances is having to write a long list of needed includes at the beginning of each script (one for each class).

In PHP 5, this is no longer necessary. You may define an __autoload function which is automatically called in case you are trying to use a class/interface which hasn't been defined yet. By calling this function the scripting engine is given a last chance to load the class before PHP fails with an error.


<?php
function __autoload($class_name
) {
    require_once 
$class_name '.php'
;
}

$obj  = new MyClass1
();
$obj2 = new MyClass2
(); 
?>

修复phpExcelReader的一个小Bug

[不指定 2009/02/26 16:11 | by ipaddr ]
最近开发一个小项目,有一个基本功能就是:上传一个Excel文件到服务端,再读取Excel里面的内容写入到数据库。

在网上搜索了一下,最终确定使用phpExcelReader来读取Excel文件。

但在使用过程中,发现一些莫名的错误,有些Excel根本无法读出,尤其是文件比较大的情况下。

经过仔细阅读Excel的文件格式说明和调试phpExcelReader,发现确实是一个小Bug,在读取SST数据时,如果有多段SST数据就会出错。

本人(鱼漂)已修复了此问题,有需要的可以从此处下载。

[file]attachment/200902/phpexcelreaderfixed.rar[/file]

Spreadsheet_Excel_Writer and UTF8

[不指定 2009/02/26 15:49 | by ipaddr ]

After recently working on an application to generate Microsoft Excel documents using a PHP script, I ran into trouble with the PEAR package "Spreadsheet Excel Writer" which didn't correctly display UTF-8 characters . Here is a fix!

You just need to replace the Workbook.php file in the Spreadsheet Excel Writer package with this patched version of the file. For more information on the problem and the patch check out the comments on the bug report page (most of the good stuff is right near the bottom).

Then your spreadsheet generation code would look something like:


$workbook = new Spreadsheet_Excel_Writer();
$workbook->send("file.xls");
$workbook->setVersion(8);
$worksheet =& $workbook->addWorksheet("My worksheet");
$worksheet->setInputEncoding("UTF-8");

// .. add content to spreadsheet here
$workbook->close();




This worked for me with version 0.9.0 of the package and it should also work with 0.9.1. I’d expect the fix to be included in upcoming releases of the package, but until then the above patch works great.

[file]attachment/200902/workbook.rar[/file]

Pinyin4j

[不指定 2008/12/11 16:22 | by ipaddr ]


Source: http://pinyin4j.sourceforge.net/

Pinyin4j is a Java library supporting convertion between Chinese characters and most popular Pinyin systems. Moreover, the output format of pinyin could be customized.


Features

  1. Convert Chinese (both Simplified and Tranditional) to most popular pinyin systems. Supporting pinyin system are listed below.
  2. Support multiple pronounciations of a single Chinese character. For example, taking the Chinese character '和' as input, you will get eight Hanyu Pinyin results (hé hè huó huò huo hāi he hú), depeding on different contexts.
  3. Multiple options for output format (details can be found here)
    • All uppercase or lowercase
    • Can output Unicode ü or v or u:
    • With tone numbers (lü3) or tone marks (lǚ) or without tone (lü)

当项目完成后接下来的就是打包发行了,应用程序(Application)项目和Eclipse插件项目(Plugin)的打包是不同的,本章将分别介绍两者的打包方法,并给出实际的打包例子。

7.1 应用程序项目的打包与发行

7.1.1 简介

Java应用程序项目完成后是可以脱离Eclipse运行的,要运行程序先要打它打成一个JAR包,它打包的大部份方法和标准Java的AWT/SWING的打包方法一样,主要有以下几个要点

l MANIFEST.MF - 打包清单。它是打包的关键性文件,主要是设置执行入口类和支持库的路径,在运行Java应用程序时是要根据此文件中给出的信息来查找入口类和支持库。

l 支持包 -如果Java应用程序用到了一些Eclipse包,那么就必须将这些包也复制到程序运行目录,否则程序将无法运行。如swt组件支持包swt.jar,jface组件支持包jface.jar。这些包都要在MANIFEST.MF文件中设置好。

l 本地化文件 - 如果用到了SWT组件,则还需要将SWT的本地化文件swt-win32-3063.dll(3063是版本号)复制到程序运行目录,否则程序将无法运行。

7.1.2 打包的具体操作步骤

本节将用前几章开发的SWT/JFace项目"myswt"的打包为例,来介绍打包应用程序项目的方法。

1、编辑清单MANIFEST.MF

(1)Eclipse提供了用于打包项目的"导出"向导,但本例运行此向导之前先需要创建一个MANIFEST.MF清单文件,其内容如下:

Manifest-Version: 1.0

Main-Class: book.chapter_4.wizard_dialog.WizardDialog1

Class-Path: ./lib/swt.jar ./lib/jface.jar ./lib/runtime.jar

说明:

l Manifest-Version - 指定清单文件的版本号

l Main-Class - 指定程序运行的入口类。本例设为运行4.5.2节开发的向导式对话框。注意:类名后不要加class扩展名

l Class-Path - 指定支持库的路径。"."指程序运行目录,即导出的JAR包所在目录。程序运行时依据Class-Path项的设置路径来查找支持库。每一个支持库之间用空格隔开。在这里jface.jar需要用到runtime.jar包,所以runtime.jar包也要加入到Class-Path中。

l 除了入口类的包名和类名之外,其他设置项都不分大小写,比如:Class-Path写成class-path或CLASS-PATH也可以,swt.jar写成SWT.JAR也行。

(2)将清单文件保存下来,建议放在myswt项目的根目录下。它的文件名可以任意取,本例取名为manifes.txt,Eclipse向导在打包时会自动的将manifes.txt的内容复制到JAR包的META-INF目录下的MANIFEST.MF文件中。

2、使用Eclipse"导出"向导来打包项目

(1)右键单击myswt项目的项目名,在弹出菜单中选择"导出"。在弹出的如下图7.1所示的对话框中,选择"JAR文件",单击"下一步"。

图7.1 导出对话框

(2)如下图7.2所示,将右边不需要的文件都取消勾选。在"选择导出目标"项文本框中设置JAR包的输出路径和包名(可以任意取名)为"D:\myswt_application\myswt.jar"。接受其他的默认设置不变,单击"下一步"。

附注:左边虽然选择了src目录,但源文件并不会导出到包中,除非勾选了"导出Java源代码文件和资源"项。

图7.2 选择导入文件

(3)如下图7.3所示,接受默认设置不变,单击"下一步"。

图7.3 导出类的选项

(4)这一步较关键。如下图7.4所示,选择"从工作空间中使用现有清单"项,将创建的清单文件输入,也可以通过旁边的"浏览"按钮来选择清单文件。输入清单文件后,单击"完成",Eclipse开始将项目打包。

图7.4 清单文件设置

经过以上四步后,在"D:\myswt_application"路径下生成了一个名为"myswt.jar"的文件。myswt.jar是一个ZIP格式的压缩文件,可以用WinRAR或WinZip软件打开,也就是说用这两个软件也可以替代Eclipse向导来打包文件。如果用WinRAR来打包文件,则压缩格式要选择ZIP格式而非RAR格式,压缩率倒可以任意选。

用WinRAR打开myswt.jar文件后其内部的目录结构如下图7.5所示:

图7.5 myswt.jar文件的内部目录结构

在myswt.jar文件的内部目录META-INF中仅一个文件:MANIFEST.MF,它和以前创建的清单文件manifest.txt的内容是一样的,如下:

Manifest-Version: 1.0

Class-Path: ./lib/swt.jar ./lib/jface.jar ./lib/runtime.jar

Main-Class: book.chapter_4.wizard_dialog.WizardDialog1

3、复制Java应用程序的支持包及本地化文件

在MANIFEST.MF文件中的Class-Path项设置了三个包,从Eclipse的plugins目录中将此三个支持包复制到D:\myswt_application\lib目录,本地化文件swt-win32-3063.dll复制到D:\myswt_application目录中。此三个文件在Eclipse中的路径为:

plugins\org.eclipse.swt.win32_3.0.1\ws\win32\swt.jar

plugins\org.eclipse.jface_3.0.0\jface.jar

plugins\org.eclipse.core.runtime_3.0.1\runtime.jar

plugins\org.eclipse.swt.win32_3.0.1\os\win32\x86\swt-win32-3063.dll

复制完成后的目录结构如下图7.6所示:

图7.6 目录结构图

4、编写运行myswt.jar包的批处理程序"run.bat"

在myswt_application目录下创建一个批处理程序run.bat(名字任取,扩展名必须是bat),其内容仅一句语句,如下:

javaw -jar myswt.jar

说明:

l javaw对应c:\jdk\jre\bin\javaw.exe文件,如果windows提示命令未发现,则需要将c:\jdk\jre\bin路径加入到windows环境变量path中。

l 在运行程序的时候有一个讨厌的黑色命令行窗口,要去掉它,可以将run.bat内容更改如下:"start javaw -jar myswt.jar",start是指调用了windows的"运行"命令。

l 如果想将swt-win32-3063.dll也放在单独的目录中,如"D:\myswt_application\native"目录,则需将run.bat内容更改为:

start javaw -Djava.library.path=./native/ -jar myswt.jar

5、运行程序

双击run.bat文件,得到如下图7.7所示的程序界面。

图7.7 程序运行效果图

6、注意事项

本例只需要三个支持包,但你的程序也许会需要更多的支持包才能运行。如果你想一次到位,则可以将"Java构建路径"的"库"选项卡中所有引用的包都复制到lib目录中。如果你喜欢用到什么包才加入什么包,希望维持打包文件的简洁,则需要自己一步步的去试:如果缺少某支持包,运行程序时会输出的未找到类的错误信息,从信息中的包名可得知程序缺少哪一个支持包。比如"Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/jface/wizard/IWizard",从错误信息中很明显的就能知道程序缺少jface包

7.1.3 其他得到JAR包的方式

要得到JAR包除了以上所说的用Eclipse"导出"向导、用WinZip和WinRAR,另外还能用Java自带的命令行式打包软件jar.exe(位于c:\jdk\bin目录),其打包命令为:

c:\jdk\bin\jar cvfm myswt.jar C:\eclipse3.0.1\eclipse\workspace\myswt\manifest.txt -C C:\eclipse3.0.1\eclipse\workspace\myswt\bin .

说明:

l c:\jdk\bin\jar - 由于本书没有把c:\jdk\bin加入到windows环境变量path中,所以手工指定jar.exe的路径

l cvfm - jar.exe的参数,"c"创建新的jar包;"v"将调试信息打印在屏幕上;"f"指定生成的jar文件名;"m"使用清单文件。注意它们都是小写

l myswt.jar - 打包后的JAR包名

l 在前面是把清单文件manifest.txt放在C:\eclipse3.0.1\eclipse\workspace\myswt\目录下。如果将它和批处理文件放在一个目录就不必指定长长的路径了。

l "-C 路径 . "指将路径下(包括子目录)的所有文件打包,由于class文件是输出在项目的bin目录下,所以路径指定到项目的bin目录,注意三者之间是用空格隔开,并且最后一个字符是小数点。

这种方式的优点是没有Eclipse导出向导的操作那么麻烦,适合经常需要导出JAR包的情况。

7.1.4 使用第三方插件对项目打包

开源组织(http://sourceforge.net/)中有一款可将Eclipse支持包和项目编译文件一起打到一个包中的插件,叫"Fat Jar",它的下载地址是"http://fjep.sourceforge.net/",具体下载不再说明,安装步骤参阅第1章SWT Designer的安装。

Fat Jar的使用步骤如下:

(1)右键单击myswt项目的项目名,可见菜单中多了一项"Build Fat Jar",如下图7.8所示,选择"Build Fat Jar"项。

图7.8 右键菜单

(2)在下图7.9所示的对话框中,"Jar-Name"项填入JAR包的输出路径。文件清单"Manifest"项不用填,默认会自动创建一个。"Main-Class"项填入程序的入口类。其他都接受默认值,单击"下一步"。

图7.9 输出配置

(3)如下图7.10所示,窗口中将myswt项目所用到的支持包都列了出来。我们仅勾选图中runtime.jar、swt.jar、jface.jar这三项即可,当然全选也并尝不可,只是最后得到的JAR包会更大一些,因为Fat Jar会将所有支持包合并在一个JAR包中。

图7.10 选择要打包的文件

单击图7.10的"完成"按钮后, JAR包myswt.jar将输出到D:\myswt_applicationh目录中。和以前一样,要运行此JAR包需要一个批处理文件以及本地化文件swt-win32-3063.dll,唯一不同的是不再需要Eclipse支持包,其目录结构如下图7.11所示:

图7.11 目录结构

为什么不需要Eclipse支持包了呢?那是因为支持包已经在myswt.jar文件中了,从下图7.12可以看到swt.jar等都被拆散成目录,并包含在myswt.jar包中。

图7.12 myswt.jar的内部目录结构

其中META-INF目录的MANIFEST.MF文件内容如下,可以发现和以前不同的地方是:Class-Path项没有了。

Manifest-Version: 1.0

Created-By: Fat Jar Eclipse Plug-In

Main-Class: book.chapter_4.wizard_dialog.WizardDialog1

7.1.4 让用户电脑不必安装JRE环境

通常运行Java程序有个前提条件:用户电脑必须先安装JRE环境。虽然安装JRE环境非常简单,但毕竟多了一步,算是有一点点的瑕疵。这里给出一个不必让用户安装JRE环境的方法,其实现步骤如下:

(1)将原JDK中的"jre"目录复制到"D:\myswt_application\java1.4.2"目录下(java1.4.2也可换成其他名称)。

(2)将JDK和JRE从本机卸载掉,这样表示本机没有安装JAVA运行环境。

(3)修改批处理文件run.bat中的命令为"start java1.4.2\jre\bin\javaw -jar myswt.jar",仅仅是在javaw前加上了一个相对应路径。

双击run.bat即可在不安装JRE环境的电脑运行此Java应用程序。

7.1.5 更进一步的完善

1、抛弃批处理文件(*.bat)

用批处理文件运行程序似乎不够专业,虽然它足以完成运行任务。但习惯就象一种毒药一旦染上就很难摆脱它的影响,Windows统治下的人们早已经习惯运行扩展名是EXE的程序,用*.bat他们就会感觉别扭。

我们可以用一个叫JavaLauncher的免费小程序来代替批处理文件去运行Java程序。JavaLauncher的下载网址是:

http://www.rolemaker.dk/nonRoleMaker/javalauncher/marner_java_launcher.htm

下载下来的文件是一个名JavaLauncher.zip的压缩包,解压后的目录结构如下图7.13所示:

图7.13 JavaLauncher.zip目录结构

在上图的目录中

l source目录包含了JavaLauncher的源程序,是用C语言写的

l changes.txt是新版的修改说明

l launch.exe是主程序

l launcher.cfg是配置文件

l readme.txt是一些说明和示例

我们只需要launch.exe、launcher.cfg两个文件,将这两个文件复制到打包文件所在的目录。launcher.cfg是一个仅三行内容的文本文件,将它修改如下:

.

.\java1.4.2\jre\bin\javaw.exe

-jar myswt.jar

l 第一行设置指向JAR包myswt.jar的目录,由于launch.exe和myswt.jar同在一个目录,所以用"."即当前目录。

l 第二行设置指向jre\bin\javaw.exe的路径。在上一小节(7.1.4节)已将jre目录复制到了java1.4.2子目录中

配置好launcher.cfg后,双击launch.exe即可运行java应用程序。

如果仔佃研究eclipse的启动方式,发现eclipse和JavaLauncher的原理一样:eclipse.exe相当于launch.exe,startup.jar相当于myswt.jar。只不过eclipse.exe不象launch.exe要具有通用性,所以它没有*.cfg这样的配置文件,而是将启动信息固化在eclipse.exe中。

2、美化图标

launch.exe文件的图标太单调了,让我们给它换个好看点的。换程序的图标需要用到一个免费的软件:Resource Hacker,它有中文版,下载网址是:

http://www.users.on.net/johnson/resourcehacker/

用Resource Hacker来替换launch.exe的图标的步骤如下:

(1)运行Resource Hacker,得到如下图7.14所示的窗口。

图7.14 Resource Hacker的主界面

(2)单击主菜单"文件→打开",将launch.exe载入到程序中,结果如下图7.15所示。

图7.15 载入Lanunch.exe之后的界面

(3)如上图,选择左边的"图标→1→1030",然后右键单击"1030"项,选择"替换资源..."。如下图7.16所示,在弹出窗口中单击"打开新图标文件",选择一个满意的图标,然后单击"替换"按钮。

附注:图标文件可以是exe、dll、res、ico,该软件可以从exe、dll、res抽取出图标,本例选择的是java的一个图标文件JavaCup.ico。

图7.16 选择图标文件

(4)如下图7.17所示,选择"文件→另存为",取名myswt.exe。

附注:按理说选择"保存"也是可以的,这时Resource Hacker会将老的launch.exe备份成launch_original.exe。但也许是刷新上有问题,用"保存"方式有时launch.exe无法显示出新图标,但有时又可以。

图7.17 保存修改

(5)最后的目录如下图7.18所示,可见myswt.exe(也就是launch.exe改了个名称)的图标换成了Java的图标。双击myswt.exe即可运行Java应用程序。

图7.18 最后的效果

3、最后的打包

发送给用户之前,通常要用WinZip或WinRAR将所有的文件全部打成一个压缩包,然后用户得到这个压缩包后,将其解压缩后即可运行程序,Eclipse软件就是这种方式。

另一种方式是用InstallShield、InstallAnyWhere这样的安装程序制作软件来创建一个单一的setup.exe文件,它具有向导式的安装界面,而且还可以往windows的程序栏插入菜单项,关于这些安装程序制作软件的具体使用请参阅相关书籍

--------------------------------------
以上内容来自互联网,上面的几个软件,可以本博客下载:
[file]attachment/200812/fatjar.rar[/file]
[file]attachment/200812/reshack.zip[/file]
[file]attachment/200812/javalauncher.rar[/file]

两个免费的Flash Chart

[不指定 2008/10/30 00:12 | by ipaddr ]
这段时间一直在弄flash的报表,在网上找到两个免费的Flash chart,功能比较强,能够直接在项目中使用。

1.amchart
  官方地址:http://www.amcharts.com/

2.open flash chart
  官方地址:http://teethgrinder.co.uk/open-flash-chart/

MediaWiki的Fedora皮肤

[不指定 2008/09/09 00:10 | by ipaddr ]

Fedora的官方网站,使用的也是MediaWiki,皮肤看上去很漂亮,应该是Fedora自己定制的,网上搜索了一下,还真提供下载:

http://git.fedorahosted.org/git/fedora-web.git?p=fedora-web.git;a=tree;f=fedoraproject.org/mediawiki;hb=HEAD

(来源:http://www.eit.name)马上下载试试看 。

可以直接在WEB上面下载,也可以使用Git下载:
$ git clone git://git.fedoraproject.org/git/fedora-web.git

[转]分布式缓存问题解决

[不指定 2008/08/11 23:30 | by ipaddr ]
缓存产品目标锁定在支持分布式应用的3种开源产品身上:JbossCache、OSCache和SwarmCache,JbossCache采用数据复制策略,OSCache又大又全,重点在页面缓存上,SwarmCache虽然很小巧,但分布式是核心,采用的是失效机制。最终采用SwarmCache实现。全面了解一种开源产品,首要的是看它的文档了,随后的日志我会贴出他的Tutorial。

Hibernate3对各种缓存的提供了很好的支持,细看它的文档才发现它支持的额外3种缓存产品正好是上面列出的,EHCache是Hibernate自身的缓存实现,不支持分布式应用。这下子倒免去了写CacheProvider的工作。下载swarmcache-1.0RC2a二进制和源码,将jgroups-all.jar和swarmcache-1.0RC2.jar拷贝至 \WEB-INF\lib\下,

配置Hibernate.cfg.xml将provider_class换为指定的Provider
<property name="hibernate.cache.provider_class">net.sf.hibernate.cache.SwarmCacheProvider</property>

打开查询缓存的支持
<property name="hibernate.cache.use_query_cache">true</property>

配置

<class-cache class="com.foo.YourCacheEntity" usage="nonstrict-read-write" region="cache.region"/>
关于最后一行配置的说明,因为SwarmCache不支持严格的读写缓存,所以要配置成nonstrict-read-write,各个缓存之间需要用名字隔离,如cache.region。

重新启动Tomcat后,SwarmCache中的组播服务启动:

-------------------------------------------------------
GMS: address is pysh:1967
-------------------------------------------------------

如果另外一个也作了同样配置的web启动,他们之间通过组播消息可以相互通知:

2006-09-19 17:49:06 INFO JavaGroupsCommunicator:76 - A host has joined the cache notification bus: pysh:1967

测试应用:

在机器A上,通过Hibernate对Entity做了修改,机器B得知缓存Entity已经无效,机器B会remove此缓存,重新从数据库里加载。

如何使用Java Singleton模式

[不指定 2008/08/02 16:14 | by ipaddr ]

Java Singleton模式属于管理实例化过程的设计模式家族。Singleton是一个无法实例化的对象。这种设计模式暗示,在任何时候,只能由JVM创建一个Singleton(对象)实例。
如果实例不存在,你通过创建类的新实例的方法建立一个类来执行这个模式;如果存在类的一个实例,就只会返回那个对象的一个引用。

Singleton模式的运行机制

以下是Singleton模式的一个典型例子:

public class Singleton {

        private final static Singleton INSTANCE = new Singleton(); 

    // Private constructor suppresses generation of

    // a (public) default constructor

    private Singleton() {} 

    public static Singleton getInstance() {

      return INSTANCE;

    }

 }

标准的Singleton模式并不使用直接静态变量实例化进行声明——它实例化构造器中的一个静态实例变量,而不查看它是否已经存在:

public class ClassicSingleton {

    private static ClassicSingleton INSTANCE = null;

    private ClassicSingleton() {

       // Exists only to defeat instantiation.

    }

    public static ClassicSingleton getInstance() {

       if(INSTANCE == null) {

          INSTANCE = new ClassicSingleton();

       }

       return INSTANCE;

    }

 }

Singleton类的默认构造器被设为私有,这样做可防止其它类使用new关键字直接将对象实例化。对返回Singleton对象的实例方法应用一个静态修饰符,这使得它成为一个类级方法,不创建对象即可进行访问。

何时需要使用Singleton

当你只需要一个类实例时,Singleton才真正有用;如果类拥有几个实例,使用Singleton就不再适用。

设计系统时,你通常希望控制对象的用法,防止用户(包括你自己)复制对象或建立新实例。例如,你可以使用它创建一个连接池。每次程序需要往数据库中写入内容时才创建一个新连接的做法并不明智;相反,一个或一组已经在池中的连接就可以使用Singleton模式实例化。

Singleton模式常常和工厂方法模式一同使用,创建一个系统级资源,使用这个资源的代码并不知道它的特殊类型。抽象窗口工具包(AWT)就是组合使用这两个模式的典型例子。在GUI应用程序中,对每个应用程序实例,你一般只需要一个图形元素的实例,如打印(Print)对话框或OK按钮。

注意潜在的问题

虽然Singleton设计模式是最简单的设计模式之一,但它也存在一些缺陷。

多线程应用程序中的构造问题

在多线程应用程序中,你必须仔细构造Singleton模式。当Singleton不存在时,如果两个线程即将同时执行创建方法,这两个线程必须检查Singleton实例,但只有一个线程应当创建新对象。这个问题的典型解决办法就是对类使用相互排斥,指出对象正在被实例化。这是Singleton的一个线程安全的版本:

public class Singleton

 {

   // Private constructor suppresses generation

   //  of a (public) default constructor

   private Singleton() {} 

   private static class SingletonHolder

   {

     private final static Singleton INSTANCE = new Singleton();

   } 

   public static Singleton getInstance()

   {

     return SingletonHolder.INSTANCE;

   }

 }

另一个解决办法是在getInstance()方法声明中添加synchronized关键字:

  public static synchronized Singleton getInstance()

提前考虑克隆预防

你仍然可以使用对象的clone()方法克隆对象,建立一个Singleton对象。要禁用这一功能,你需要禁用对象的克隆方法,这产生一个CloneNotSupportedException例外。

      public Object clone() throws

CloneNotSupportedException {

         throw new CloneNotSupportedException();

}

考虑使singleton类位于最后

你可能希望将Singleton类放在最后,以避免Singleton的子类造成其它问题。

不要忘记垃圾收集

根据不同的执行,你的Singleton类和它的所有数据可能被当作垃圾收集。因此,在应用程序运行时,你必须保证存在一个Singleton类的实时引用。

结论

Singleton模块得到广泛地使用,并证实可用于软件设计。虽然这个模式并非Java专有,但它已成为Java编程的一个典型应用。尽管这个模式相当简单,但还是要记住我在本文中描述的Singleton模式的限制。

 在使用url进行参数传递时,经常会传递一些中文名的参数或URL地址,在后台处理时会发生转换错误。在有些传递页面使用GB2312,而在接收页面使用UTF8,这样接收到的参数就可能会与原来发生不一致。使用服务器端的urlEncode函数编码的URL,与使用客户端javascript的encodeURI函数编码的URL,结果就不一样。
分页: 6/13 第一页 上页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]