设计模式大概分为三种:1)创建型2)结构型3)行为型.
创建型模式:(如何创建对象)
1.工厂模式(FACTORY METHOD PATTERN)提供了一个简单的决策类,他根据提供的数据返回一个抽象基类的多个子类中的一个.
2.抽象工厂模式(ABSTRACT FACTORY PATTERN)提供了一个创建并返回一系列相关对象的接口.他的主要目的是隔离要生成的具体类,这些类的实际类名隐藏才工厂类,客户端根本不需要知道.
3.单件模式(SINGLETON PATTERN)是指某个类只能有一个实例,他提供了一个访问该实例的全局访问点.
4.生成器模式(BUILDER PATTERN)将一个复杂对象的构建与他的表示分开,这样就能根据程序的需要创建不同的表现形式.他有点类似抽象工厂模式,两者都返回由许多方法和对象组成的类,差别在于,生成器是根据提供给他的数据一步一步地创建一个复杂对象.
5.原型模式(PROTOTYPE PATTERN)是先实例化一个类,然后拷贝或克隆该类来创建新的实例,可以用公有方法进一步修改.他能根据需要克隆类,在运行时添加或删除类,问题在于如果类早就存在,则不能改变他们来增加需要的克隆方法,另外,间接引用其他类的类也不能被真正克隆.

结构型模式:(如何组合对象)
1.适配器模式(ADAPTER PATTERN)可以使一个类的接口匹配另外一个接口.
2.组合模式(COMPOSITE PATTERN)对象的组合,他允许你构建一棵由各种相关类组成的树,其中任何一个对象既可以是一个组合,也可以是一个叶子.
3.代理模式(PROXY PATTERN)通常是一个简单对象,他代替一个比较复杂的稍后会调用的对象,而且实例化该对象代价比较高.
4.享元模式(FLYWEIGHT PATTERN)用于共享对象,其中的每一个实例都不包含自己的状态,而是将状态存储在外部.把一部分的类数据移到类外部,在执行方法时将数据传递进来.
5.外观模式(FACADE PATTERN)对客户屏蔽了复杂的子系统组件,并为一般用户提供了一个简单的程序接口,但他并没有限制高级用户在需要时使用深层的复杂的类.
6.桥接模式(BRIDGE PATTERN)将对象的接口和他的实现分离,这样就可以独立的改变他们.
7.装饰模式(DECORATOR PATTERN)他可以动态地给对象添加功能.他和外观模式的区别在于外观模式是将复杂系统隐藏在一个简单接口,而装饰模式通过包装一个类来增加功能.

行为型模式:(如何在对象之间通信)
1.职责链模式(CHAIN OF RESPONSIBILITY PATTERN)把请求从链中的一个对象传递到下一个对象,直到请求被响应.链中的每个对象都是"自治"的,他对其他对象一无所知,只判断他本身能不能满足请求,不能的话就转到下一个,但你必须知道链中的最后一个对象是哪一个.
2.命令模式(COMMAND PATTERN)用简单的对象表示软件命令的执行.他把一个申请特定操作的请求封装到一个对象,并给这个对象一个众所周知的接口.
3.解释器模式(INTERPRETER PATTERN)提供一种如何把语言元素包含在程序中的定义.
4.迭代器模式(ITERATOR PATTERN)提供一种顺序访问一个类中的一系列数据的方式,他允许使用一个标准接口顺序访问一个数据列表或集合,而又不需知道数据内部表示细节.
5.中介者模式(MEDIATOR PATTERN)定义了如何用一个对象简化对象之间的通信,使对象之间不必互相了解.
6.备忘录(MEMENTO PATTERN)定义了如何保存一个类实例的内容以便以后能恢复他
7.观察者模式(OBSERVER PATTERN)定义了一种把改动通知给多个对象的方式.
8.状态模式(STATE PATTERN)允许一个对象在其内部状态改变时修改他的行为.
9.策略模式(STRATEGY PATTERN)将算法封装到类里.
10.模板方法模式(TEMPLATE METHOD PATTERN)提供了算法的一个抽象定义.
11.访问者模式(VISITOR PATTERN)在不改变类的前提下,为类添加多种操作.

posted @ 2006-07-14 17:08 edsonjava 阅读(214) | 评论 (0)编辑 收藏
 

【摘 要】Axis本质上就是一个SOAP引擎,提供创建服务器端、客户端和网关SOAP操作的基本框架。Axis目前版本是为Java编写的,不过为C++的版本正在开发中。

 什么是SOAP?

  SOAP是一个基于XML的用于应用程序之间通信数据编码的传输协议。最初由微软和Userland Software提出,随着不断地完善和改进,SOAP很快被业界广泛应用。

  什么是Axis?

  Axis本质上就是一个SOAP引擎,提供创建服务器端、客户端和网关SOAP操作的基本框架。Axis目前版本是为Java编写的,不过为C++的版本正在开发中。

  配置webservice具体步骤:

  1.安装weblogic。

  2.配置一个web应用,如“\\lijunjie\e$\software\bea\user_projects\domains\lijjdomain\applications\ cntapws “。

  3.从apache网站上下载axis-bin-1_2_1.tar.gz,解压后copy到cntapws下面。

  4.打开“http://localhost:7001/console“,配置cntapws 的web应用。

  5.axis1.2和weblogic8.1有冲突,原因是weblogic 本身携带的webservice.jar使用的旧的javax.xml.soap.*,而不是像axis使用J2EE1.4新的版本。解决方案是在WEB -INF/weblogic.xml文件中如下的配置:

<weblogic-web-app>
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>
</weblogic-web-app>

  6.按 http://localhost:8080/axis/happyaxis.jsp地址,可以显示你发布的webservice是否配置成功,如果显示必须的包缺失,则你的webservice不能正常运行。

  开发webservice流程

  1.写普通的java类,该类中有你要发布到webservice上的有关方法。

  2.配置server-comfig.xml, 把你要发布的方法写入该文件。具体内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

<globalConfiguration>

<parameter name="adminPassword" value="admin"/>

<parameter name="attachments.Directory" value="C:\eclipse\workspace\bookstore\WEB-INF\attachments"/>

<parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl"/>

<parameter name="sendXsiTypes" value="true"/>

<parameter name="sendMultiRefs" value="true"/>

<parameter name="sendXMLDeclaration" value="true"/>

<parameter name="axis.sendMinimizedElements" value="true"/>

<requestFlow>

<handler type="java:org.apache.axis.handlers.JWSHandler">

<parameter name="scope" value="session"/>

</handler>

<handler type="java:org.apache.axis.handlers.JWSHandler">

<parameter name="scope" value="request"/>

<parameter name="extension" value=".jwr"/>

</handler>

</requestFlow>

</globalConfiguration>

<handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/>

<handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>

<handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>

<service name="Version" provider="java:RPC">

<parameter name="allowedMethods" value="getVersion"/>

<parameter name="className" value="org.apache.axis.Version"/>

</service>

<!--要配置的内容start,注意每一个要发布成webservice的类都要配置成一个service如下à

<service name="webserviceproxy" provider="java:RPC">

<parameter name="className" value="com.copia.webservice.server.proxy.WebServiceProxy"/>

<parameter name="allowedMethods" value="*"/>

<!—具体某个方法说明-->

<operation name="login" returnType="ns:LoginOutServiceBean">

<parameter name="branchNo" type="xsd:string"/>

<parameter name="userId" type="xsd:string"/>

<parameter name="password" type="xsd:string"/>

<parameter name="certificateNo" type="xsd:string"/>

</operation>

<!—如果该方法的参数有基本类型和对象类型,则不要声明,webservice能够找到相关的类及方法-->

<!—声明涉及到的所有类及其父类,引用类,还有它们的相关类,类似与对象树遍历,某个类声明缺失也会导致运行失败-->

<typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

qname="ns:LoginOutServiceBean"

serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

type="java:com.copia.core.module.security.login.LoginOutServiceBean" xmlns:ns="webserviceproxy"/>

<typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

qname="ns:User"

serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

type="java:com.copia.core.client.User" xmlns:ns="webserviceproxy"/>

<typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

qname="ns:GetBatchListInServiceBean"

serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

type="java:com.copia.core.module.batch.service.GetBatchListInServiceBean" xmlns:ns="webserviceproxy"/>

<typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

qname="ns:GetBatchListOutServiceBean"

serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

type="java:com.copia.core.module.batch.service.GetBatchListOutServiceBean" xmlns:ns="webserviceproxy"/>

<typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

qname="ns:BatchJobDefBean"

serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

type="java:com.copia.core.module.batch.service.BatchJobDefBean" xmlns:ns="webserviceproxy"/>

<typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

qname="ns:ValueObjectPage"

serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

type="java:com.copia.core.voa.ValueObjectPage" xmlns:ns="webserviceproxy"/>

<typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

qname="ns:ValueObjectColInfo"

serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

type="java:com.copia.core.voa.ValueObjectColInfo" xmlns:ns="webserviceproxy"/>

<typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

qname="ns:ValueObjectList"

serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

type="java:com.copia.core.voa.ValueObjectList" xmlns:ns="webserviceproxy"/>

<typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

qname="ns:PageInfo"

serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

type="java:com.copia.core.voa.PageInfo" xmlns:ns="webserviceproxy"/>

<typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

qname="ns:ValueObjectMetaData"

serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

type="java:com.copia.core.voa.ValueObjectMetaData" xmlns:ns="webserviceproxy"/>

</service>

<!--要配置的内容endà

<service name="AdminService" provider="java:MSG">

<parameter name="allowedMethods" value="AdminService"/>

<parameter name="enableRemoteAdmin" value="false"/>

<parameter name="className" value="org.apache.axis.utils.Admin"/>

<namespace>http://xml.apache.org/axis/wsdd/</namespace>

</service>

<transport name="local">

<responseFlow>

<handler type="LocalResponder"/>

</responseFlow>

</transport>

<transport name="http">

<requestFlow>

<handler type="URLMapper"/>

<handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>

</requestFlow>

</transport>

</deployment>

  3.在地址栏输入http://localhost:7001/cntapws/services/webserviceproxy?wsdl,如没有什么错误,则表示你的webservice发布成功了。

  Java webservice客户端编程

  1.启动你配置好的weblobic。

  2.进入dos界面,在你的临时目录(任意目录)下根据wsdl产生客户文件,如下指令:

E:\kk>java -Djava.ext.dirs=E:\software\bea\user_projects\domains\lijjdomain\appl

ications\axis\WEB-INF\axislib org.apache.axis.wsdl.WSDL2Java http://localhost:7001/cntapws/services/webserviceproxy?wsdl即可在kk目录下产生有关文件。

  3.把产生的文件copy到你的工程中,再写一个webservice调用测试类,如下:

public class TestWs {

public static void main(String[] args) {

WebServiceProxyService service = new WebServiceProxyServiceLocator();

try {

WebServiceProxy serviceProxy = service.getwebserviceproxy();

User user = new User();

user.setBranchNo("000001");

user.setClerkNo("1004");

GetBatchListInServiceBean in = new GetBatchListInServiceBean();

in.setCurPageNo(1);

String serviceName = "GetBatchListService";

GetBatchListOutServiceBean out = (GetBatchListOutServiceBean)serviceProxy.getBatchListService(user, in, serviceName);

BatchJobDefBean[] defBeans = out.getBatchJobDefBeans();

for(int i = 0 ; i < defBeans.length ; i++){

System.out.println(defBeans[i].getBatchName());

}

}catch(Exception ex){

ex.printStackTrace();

}

}

}

posted @ 2006-07-14 10:41 edsonjava 阅读(932) | 评论 (1)编辑 收藏
 
  Eclipse IDE 变得如此热门,以至于出现在许多工作简历中。但是,也正因为它的功能繁多,使得难于入手了。在这篇文章中, Sam Brodkin 分享了他最常用的一些Eclipse功能。他也提到了那些会让你的手指动的飞快的热键组合。在工作的时候,人们会怀疑你是在打电玩。

  Eclipse最妙的地方是它的功能是如此的丰富。如果你找不到某项功能,要么是你没有好好的去找,要么有一个插件可以实现它。Eclipse最糟的地方也是它的功能如此的丰富。拥挤的工具条,臃肿的菜单,以及配置对话框都让我想起了拉比林特斯迷宫(译者注:Minotau’s labyrinth,希腊神户中的人身牛头怪,住在Labyrinth迷宫中,吃人们供奉的童男童女,最后被Theseus杀死)(尽管配置对话框在Eclipse3.1中已经好了很多)。甚至是有经验的Eclipse程序员也是慢吞吞,笨手笨脚的。我观察过无数的同事,当试图在Eclipse的navigation面板里找一个类的时候,不假思索的按下“Ctrl + Shift + T”(打开型别(open type))。其实,只要有意识的投入一点点时间,你也会不在笨手笨脚的,而成为热键高手。

  精通Eclipse不单提高了你的效率,(我知道,按小时赚钱的签约人更喜欢文本编辑器),对你的求职简历也有好处。既然Eclipse已经越来越多的出现在Java工作说明上,那么在你的求职简历上也绝对是个好词。我把它放在我的个人简历上,就在POJO(简单初始Java对象)和POJI(简单初始Java接口)的中间。越来越多的公司转向Eclipse,因为它免费,而且为大多数程序员所接受。(除了那些少有的IntelliJ和Emacs的崇拜者)

  因此,你的简历上并不都是帮助你提高编程效率的大话,在本文中,我将给你几条Eclipse高效的建议。

  Eclipse的快捷键组合功能

  使用Eclipse的快捷键组合功能,让你看起来像是在打电玩。特别是让人想起《真人快打》(Mortal Combat)的感觉。要成为《真人快打》的高手,你必须记住大量的按键顺序。比如,要使出Sub-Zero Skeleton Rip,你必须依次按下和X键。这里的控制杆就是Ctrl,Alt,Shift,字母键,数字键和功能键的组合。

  让我们按照使用频率来看看我最爱用的一些热键组合。(注:以下内容在Eclipse3.02及一上版本通过测试)

  1. Control-Shift-T: 打开类型(Open type)。如果你不是有意磨洋工,还是忘记通过源码树(source tree)打开的方式吧。

  2. Control-Shift-R: 打开资源(不只是用来寻找Java文件)。小提示:利用Navigator视图的黄色双向箭头按钮让你的编辑窗口和导航器相关联。这会让你打开的文件对应显示在导航器的层级结构中,这样便于组织信息。如果这影响了速度,就关掉它。

  3. F3: 打开申明(Open declaration)。或者,利用Declaration Tab(在Java视图模式下,选择Windows --> Show View -- > Declaration)。当你选中代码中的一个方法,然后按这个按键,它会把整个方法在申明方框里显示出来。

  4. Alt-left arrow: 在导航历史记录(Navigation History)中后退。就像Web浏览器的后退按钮一样,在利用F3跳转之后,特别有用。(用来返回原先编译的地方)

  5. Alt-right arrow: 导航历史记录中向前。

  6. Control-Q: 回到最后依次编辑的地方。这个快捷键也是当你在代码中跳转后用的。特别是当你钻的过深,忘记你最初在做什么的时候。

  7. Control-Shift-G: 在workspace中搜索引用(reference)。这是重构的前提。对于方法,这个热键的作用和F3恰好相反。它使你在方法的栈中,向上找出一个方法的所有调用者。一个与此相关的功能是开启“标记”功能(occurrence marking) 。选择Windows->Preferences->Java-> Editor-> Mark Occurrences,勾选选项。这时,当你单击一个元素的时候,代码中所有该元素存在的地方都会被高亮显示。我个人只使用“标记本地变量”(Mark Local Variables)。注意:太多的高亮显示会拖慢Eclipse。

  8. Control-Shift-F: 根据代码风格设定重新格式化代码。我们的团队有统一的代码格式,我们把它放在我们的wiki上。要这么做,我们打开Eclipse,选择WindowPreferencesJavaCode Style,然后设置Code Formatter,Code Style和Organize Imports。利用导出(Export)功能来生成配置文件。我们把这些配置文件放在wiki上,然后团队里的每个人都导入到自己的Eclipse中。

  9. Control-O: 快速概要(quick outline)。通过这个快捷键,你可以迅速的跳到一个方法或者属性,只需要输入名字的头几个字母。

  10. Control-/: 对一行注释或取消注释。对于多行也同样适用。

  11. Control-Alt-down arrow: 复制高亮显示的一行或多行。

  12. Alt-down arrow: 将一行或多行向下移动。Alt-up arrow会向上移动。

  其他的热键在菜单里有。你可以通过按下Control-Shift-L(从3.1版本开始),看到所有快捷键的列表。按下Control-Shift-L两次,会显示热键对话框(Keys Preferences dialog),你可以在这里自己设置热键。我欢迎你在Talkback部分发表你的Eclipse提示。
他的Eclipse窍门

  我总结了几个相关的小窍门:

  锁定命令行窗口:在命令行视图中(Window Show View Other Basic Console),试试看用滚动锁定按钮来锁定控制台输出不要滚屏。

  使用Ant视图:在我的Java或Debug模式下,我喜欢显示出Ant视图,这样我就可以迅速的运行Ant任务。通过Window  Show View  Other  Ant可以找到该视图。把Ant视图放在屏幕的一角, 通过“添加编译文件(Add Buildfiles)”按钮来添加build.xml文件。在3.1版本中,甚至支持Ant调试脚本语言。

  自动遍历一个集合:for + Control-Space: 如果你还不知道,那么你应该记住Control-Space是自动完成功能。在Eclipse中,你还可以自动完成结构。在一个数组或集合范围内,试试看输入“for”然后按下Control-Space键。Eclipse会问你你想要遍历哪一个集合然后自动完成循环代码。

  使用分级布局:在包浏览视图(Package Explorer view)中默认的布局(扁平式)方式让我困惑,它把包的全名显示在导航树(navigation tree)中。我更喜欢我源码的包和文件系统视图,在Eclipse中叫做分级布局(Hierarchical Layout)。要切换到这种模式,点击包浏览视图中向下的按钮,选择布局(Layout),然后选择分级(Hierarchial)。

  一次显示多个文件:你可以一次浏览多个文件。把不在激活状态的编辑窗口拖到激活窗口的底部或侧边的滚动条上,就可以打开该编辑窗口。这是我能描述该窍门的最好方式了。

  同时打开两个Eclipse:要将改动从一个CVS分支上合并到另外一个上,我喜欢通过同时打开两个工作目录(Workspace)不同Eclipse来实现。这样我可以通过比较CVS上的最新版本看到所有的变化(右键单击工程,然后选择Compare with  Lastest from HEAD)然后把每一个变化都合并到另外一个CVS分支上。启动多个Eclipse的最简单的方法是利用Eclipse Launcher。

  Implementors插件:安装一个能够跳到一个接口的实现的插件。如果你是个dependency injection 粉丝,或者正在基于编写优良的接口工作,那么你需要一个这样的插件来加速代码导航。 你可以在SourceForge找到这个插件。

  就像Modest Mouse乐队的歌曲“Out of Gas”唱的,“意见就像小猫,我已经送给别人”。这些是我的Eclipse小猫,希望你能给它找一个温暖的家。


posted @ 2006-07-14 10:35 edsonjava 阅读(368) | 评论 (1)编辑 收藏
 
Web Service是最近几年比较火的一个东西,它带来了一大堆的新名词,所以显得比较炫。看透其华而不实的表面,它也就不再神奇。下面的讨论均以Java为参考。

1 访问一个Web Service实际上可以看作调用一个函数,唯一不同的就是这个函数是远程的,这么一说,它和RMI就没有什么本质的区别了。
既然是一个函数,当然要有函数的声明了,完成这个工作的就是WSDL,它详细的定义函数的原型,包括函数名、入口参数、出口参数,这就是WSDL中opertion完成的工作。
既然是一个远程的函数,还要涉及与远程地址的一个绑定,这是WSDL中service的任务。
Axis是一个可以通过WSDL生成相应访问代码的开发包,JBuilder中将它集成了进去,通过Wizard的方式简化了原本需要在命令行中手工完成的操作。

2 既然是远程访问,就一定要有一个访问协议,Web Service的访问协议就是SOAP,SOAP建立在XML之上,不同的就是对XML原本没有限制的格式加上了一些限制,需要有envelope,在envelope中,还要分header和body。
如果利用SOAP开发Web Service的程序,那就需要根据WSDL的定义来自行组装SOAP包,这显然要比利用WSDL直接面向Web Service开发要复杂一些。
JAXM是一个利用SOAP进行通信的开发包,它简化了SOAP消息的打包过程。

3 SOAP是建立在XML之上的,那么显然XML的开发包同样适合于SOAP。
在这个层次上开发Web Service,除了要完成上一层的工作外,还要自行按照SOAP的格式组装SOAP消息,这显然又增加了工作量。
XML的开发工具就比较多了,从最简单的SAX和DOM到DOM4J、JDOM,还有不少XML到对象绑定的工具,如JAXB、Castor等等。
其实,不考虑Web Service,完全用XML做通信协议的情况也并不少见。知晓XML-RPC的存在,就不难理解了XML做通信的含义了。

截至到这里所讨论的内容,Sun提供了JWSDP(Java Web Service Developer Pack),其中包含从XML解析到WSDL生成的全套解决方案。

4 上面讨论的所有东西实际上都还停留在传递消息的内容上,并未涉及通信的过程。不要一看到Web Service的Web就想当然认为它只能通过HTTP来传输。前面的讨论可以看出,所有的消息内容与传输并无直接关系,所以,无论是以HTTP传输,还是SMTP或是自定义的协议都没有问题。
在这个层次上开发Web Service,前面的种种险阻之外,还要完成对XML的手工解析工作。
这里还是以最常见的HTTP方式来讨论。
HTTP的开发就将Server和Client区别对待,Server的实现通常的选择是Servlet,让Web Server替我们完成HTTP协议的解析可以省去我们很多的作。Client的实现可以选择JDK自带的Http Client,Apache的Jakarta项目下的Commons子项目也提供了一个HttpClient。

5 无论是HTTP还是SMTP,抑或是自定义协议,归根结底都是应用级的协议,底层的实现都是由Socket完成。到了这个层次基本就是原始时代了,什么都没有,一切都要手工完成。
在这个层次上开发Web Service,所有前面的困难都要一一经历,此外,还有协议的开发等待着不幸至此的人们。
到了这里,也不需要其它的工具了,JDK自带的Socket可以保打天下。

6 还想往下吗?再往下就是操作系统的实现了,Java的平台无关就失去了意义,也超出了我目前所了解的范围,到此打住吧!

前面所提及应该算是Web Service的一个基本知识结构,这里并没有讨论UDDI等等的内容,一来我对它并不了解,二来那应该属于应用,不应该算Web Service实现中。

虽然我们可能不会从最下层开发Web Service,但遇到底层的问题的情况却在所难免。
我就曾经在开发一个Web Service应用的时候,被人抓住HTTP头中的SOAPAction大小写与某个所谓的规范不同,我查了半天HTTP规范和SOAP规范,知道了HTTP是区分大小,而SOAPAction就是应该这么写,据理力争,指出所谓规范的错误。

经过前面的讨论,我们可以看出,Web Service并没有什么神秘可言,所有的东西都是建立在已有东西的基础之上。技术的发展不会是无中生有,只会是一个更好的解决方案而已,在追新求变之前,一个比较牢固的基础才是最重要

posted @ 2006-07-12 21:19 edsonjava 阅读(181) | 评论 (0)编辑 收藏
 
Jboss自带均衡器的配置

将文件夹%jboss%\docs\examples\varia\loadbalancer\loadbalancer.sar拷贝到%jboss%\ server\all\deploy下,并且修改loadbalancer.sar\loadbalancer.sar\META-INF\jboss- service.xml,在<host>标签中类出所有节点,在<sticky-session>标签中指定是否使用粘性 session。配置完成。

该均衡器的缺点是负载能力相对不高,配置参数太少,比如无法指定不同节点的负载加权,所以后面都以mod_jk为例,不再讲解jboss自带的负载均衡器的内容。


负载均衡的配置基本完成,启动jboss,其中过程中会列出DefaultPatition中所有的节点:

run.bat -c all
2、session sticky配置

apache 应该会以粘性session的方式分发请求。部署一个应用测试一下,你会发现粘性session没有起作用。因为我们还没有给jboss配置jvm路由 ( jvmRoute),apache就无法知道究竟哪些session是属于哪个节点的。我们继续往下:

修改server1机器上的jboss的配置文件:%jboss%\server\all\deploy\jbossweb-tomcat55.sar\ META-INF\ jboss-service.xml

在110行有:<attribute name="UseJK">false</attribute>,将它改为true。值得注意的是在这行标签上面有一段注释,要求你在server.xml中必须有:
Engine name="jboss.web" jmvRoute="Node1" defaultHost="localhost"

请注意这里有一个气死人不偿命的小bug,jboss的官方文档把 jvmRoute写成了jmvRoute,就是v和m两个字母的颠倒让我郁闷了三天,翻遍了jboss.com和theserverside.com。都是直接拷贝的错,吐血吐到脱水啊。

下面需要修改server1上的%jboss%\server\all\deploy\jbossweb-tomcat55.sar\ server.xml,在32行左右有:


<Engine name="jboss.web" defaultHost="localhost">

给它增加一个jvmRoute属性:


<Engine jvmRoute="server1" name="jboss.web" defaultHost="localhost">

请注意,jvmRoute的值必须和mod_jk中的节点名字正确对应,否则无法正确路由。Cluster中的所有节点都应该做相应的配置。

Jboss的配置完成了,下面需要在你的web应用中修改配置文件,让它支持集群。

在WEB-INF\web.xml中加入属性: <distributable/>

Ok,基于用户的cluster完成了,每个用户会绑定都某个节点上进行交互。这种绑定是如何完成的呢?原来apache把客户分发到节点后,该节点会在用户的session id后面加上此节点的路由名称,变成这个样子:

Efdfxxd98daja87daj76da2dka**,server1

有了这个标志,就能分辨该session属于哪个节点。

3、session replication配置

下面要做的是基于request的cluster,也就让各个节点之间互相复制session状态。有两种复制模式,同步与异步。使用同步的方式, jboss会把session复制的操作和对request的响应放到一个应用事务(application transaction),session 复制完成后才去处理request。异步复制则发送session复制的消息后马上处理request,session复制则会稍有延迟。但是在多框架的 web页面中,这样的集群方式会有问题。由于frame在同一时间发出多个request,会造成一些混乱,这也是采用基于用户的集群方式的原因之一。

JBoss 4.0.2 中采用了Jboss cache来实现session复制,实际上就是一个分布式缓存,由于session id中包含了jvm route,所以能够分辨session属于哪个节点。Session的更新类似于hibernate中的乐观锁,有了更新之后就让session的版本号增加,其他节点通过对比版本号来决定是否同步session状态。

配置session replication首先需要编辑
%jboss% server\all\deploy\jbossweb-tomcat55.sar\META-INF\ jboss-service.xml,88行左右有:


<attribute name="SnapshotMode">instant</attribute>

这就是刚才提到的复制模式,instant为立即复制,如果设为interval 那么系统会在延迟一段时间再进行复制,时间长度在< attribute name="SnapshotInterval">2000</attribute>中指定,单位是毫秒。

单独配置这一个地方还不够,在%jboss% server\all\deploy\ tc5-cluster-service.xml中有:


<attribute name="CacheMode">REPL_ASYNC</attribute>

这里才真正决定复制是同步的还是异步的,可以指定为REPL_ASYNC(异步)或者REPL_SYNC(同步)。

在这个文件下面一点,还有一个config标签,里面指定了各个节点在进行session复制的时候如何通信,有udp和tcp两种可选,如果使用udp方式,那么应该将udp的lookback属性指定为true,因为windows上有一个叫做media sense的东西会影响 udp multicast。注意如果你不了解multi address的ip规则,请不要随便修改mcast_addr的值。如果采用tcp方式的话,应该指定bind_addr的值为本机ip,并且在TCPPING标签的initial_hosts属性中列出所有节点,格式是”机器名[端口号]”,比如在我们的例子中,就应该这样配置tcp(以其中一个节点为例):


<config><TCP bind_addr="172.16.0.116" start_port="7810" loopback="true"/><TCPPING initial_hosts="172.16.0.116[7810],172.16.32.88[7810]" port_range="3" timeout="3500"num_initial_members="3" up_thread="true" down_thread="true"/><MERGE2 min_interval="5000" max_interval="10000"/><FD shun="true" timeout="2500" max_tries="5" up_thread="true" down_thread="true" /><VERIFY_SUSPECT timeout="1500" down_thread="false" up_thread="false" />   <pbcast.NAKACK down_thread="true" up_thread="true" gc_lag="100"       retransmit_timeout="3000"/>   <pbcast.STABLE desired_avg_gossip="20000" down_thread="false" up_thread="false" />   <pbcast.GMS join_timeout="5000" join_retry_timeout="2000" shun="false"print_local_addr="true" down_thread="true" up_thread="true"/><pbcast.STATE_TRANSFER up_thread="true" down_thread="true"/></config>

JBoss的clustering版主建议尽量使用udp。不过在Sobey内部,建议使用tcp方式,经测试可能有不明物体在影响udp通信,导致Timeout异常。

在%jboss%\ server\all\deploy\ cluster-service.xml中也有关于udp和tcp的配置信息,在4.0以前版本的jboss中,会以这个文件为主配置,4.0以后都以tc5-cluster-service.xml为主配置。

Jboss的配置完成了,最后需要在web应用中增加配置信息,控制session复制的粒度。在WEB-INF\ jboss-web.xml中增加以下内容:


<replication-config>   <replication-trigger>SET_AND_NON_PRIMITIVE_GET</replication-trigger>   <replication-granularity>SESSION</replication-granularity> </replication-config>

其中replication-trigger是指定哪些操作引发session的版本更新,它的取值有:


SET_AND_GET     SET_AND_NON_PRIMITIVE_GETSET

replication-granularity是复制粒度,可以取session或attribute。如果取为attribute有可能导致复制失败,这是目前版本的jboss cache的一个bug,等待修正。

部署项目,测试,如果配置没有问题,可以在%jboss%\0server\all\log\server.log中发现类似于这样的信息:


DEBUG [org.jboss.web.tomcat.tc5.session.JBossCacheManager] check to see if needs to store and replicate session with id Im9-qpuaXppMS+xXwE3M+Q**.server1 DEBUG [org.jboss.web.tomcat.tc5.session.ClusteredSession] processSessionRepl(): session is dirty. Will increment version from: 20 and replicate.

Session replication配置的成功率比较低,情况也很复杂,请仔细操作。
posted @ 2006-07-12 14:53 edsonjava 阅读(453) | 评论 (0)编辑 收藏
 
     摘要: 在Oracle中存取BLOB对象实现文件的上传和下载 最近做一个 J2EE 项目,需要在 JSP 页面实现对文...  阅读全文
posted @ 2006-07-03 17:59 edsonjava 阅读(209) | 评论 (0)编辑 收藏
 
     摘要: 在Oracle中存取BLOB对象实现文件的上传和下载 最近做一个 J2EE 项目,需要在 JSP 页面实现对文...  阅读全文
posted @ 2006-07-03 17:59 edsonjava 阅读(1423) | 评论 (0)编辑 收藏
 
DB2的DRIVER分為四種
以下文章有介紹
http://www-128.ibm.com/developerworks/cn/db2/library/techarticles/0402chenjunwei/0402chenjunwei.html

不建議使用db2java.zip裡的COM.ibm.db2.jdbc.app.DB2Driver這個驅動
原因在於使用此驅動時,必須要先行安裝DB2 Administrator Client,然後才有能力去Catalog DB進來,所以連結的URL就如下
jdbc:db2:資料庫名稱

建議使用db2jcc.jar裡的com.ibm.db2.jcc.DB2Driver這個驅動
不需要另外安裝DB2 Client即可進行資料庫連線,連結URL如下
jdbc:db2://DB2主機HOST:50000/資料庫名稱

實際測試上也證實db2jcc.jar的驅動比較OK
但是使用db2jcc.jar有一點必須十分注意
就是class path裡必須要多一個JAR
這個JAR的檔名為db2jcc_license_cu.jar
主要是用於辯識DB2的授權,沒有它也是無法驅動的

說到這裡...似乎還沒有提到DB2的DRIVER要去那裡下載
其實它不用下載,就在安裝DB2的INSTANCE底下
例如: DB2安裝在C:\IBM\SQLLIB
這個目錄下有個名為java的目錄
相信它有您需要的所有JAR檔

舉UNIX的例子來說
/home/db2inst1/sqllib/java/下就是放這些JAR檔的路徑
posted @ 2006-06-23 09:26 edsonjava 阅读(443) | 评论 (0)编辑 收藏
 

jscript.encode这个是一个流传已经很久的加密方式,下面的html页面,不解密的话你可以看懂么?

提供一个在线解密加密的页面:

http://www.aspxuexi.com/forfun/functions/jsencode.htm

如下就是原文件了。如果在线无法进行加密解密的话,可以将下面的html文件另存为html文件后执行。

参考javascript加密和解密:http://www.aspxuexi.com/script/2006-5-20/javascript_encode.htm

<HTML><HEAD><TITLE>JScript.Encode在线加密解密|asp学习网提供</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=gb2312">
<script language="JScript.Encode">
#@~^khQAAA==@!eOR@#@&6Ex1YbGx,/^Dx^G9+`kSV*@#@&PnUm{xh~b^Ob\n(}8LmOcr?m.raYrxT Ax^KNDJ*i@#@&DY;D PnU1R2 ^W9+?1.rwDsbVn`E r_s~kS!BVQE1Dk2Or#I@#@&N@#@&@#@&@#@&\lMPUPb:2mZ}nem&1n`PP{PFZT@#@&7lMPjK)PA{]2z9SA1~x,F!q@#@&\CD,j:bPA{G2Z}fA~',FT @#@&-CMP?:)KA{jg3jZznAPxPqT2@#@&@#@&-lMP2r13{nU1W[k L,'~ +SPbMDmz`@#@&q~, S~Z~P8SPy~PZS~ BPZ~~!S~y~~!B~ BPqS,!~~+BPT~@#@&8~~Z~, ~,!B~FBPq~, S~Z~PZSPy~P8S~!BPy~~!S~Z~~ B@#@&8~~qBP!S~y~~!B~y~~Z~,F~,!B~FBPq~, S~Z~P8SPZ~PyS@#@&8~,!SP+S,!SP8SP8~~+BP!S~Z~~FB~8~~y~,!~,FB~!BP+@#@&#@#@&@#@&\m.PMlhGCOl,',xnh~)MDCXv@#@&Z6*B!6f{B!avOS,!al!B!6F2BT6yZSPZ6++B!6l)~Z6vlS~!Xcz~T6*XB!aGyS@#@&!a8~!afz~T6l$BPTX*A~!XGOS!Xv~,!aXG~!XX,B!6FXSPZ6lAS!a+F~T6W/~@#@&TaW ~TaFvS!X*l~~Z6+!~Z6+f~Z6{vBPTay&~Zavy~!X+)~,!XvX~TaWfS!X*&B@#@&TX*sSTX*q~Za2&S,!XG2B!XX&B!acy~~TXcsBT6l ~Za+!BPZ6X STX T~Zav2~@#@&Z6G)SZ6+vBTXc)BPZ6 8~Za*W~T6lbS~Z6c+S!XGFBTa&R~,!a TSZ6+ABT6F,S@#@&!6+B!av+SZ6fy~,!6+&BT6ybS!X*{S,!6y)~Z6*RST6+ZBPT6{B!aGwS!X $S@#@&!a*F~T6F$B!aWvBP!X lS!X&T~Z6X+BP!X+ZB!62qS!Xcw~~!a+O~T6+/~Z6f9B@#@&Ta+,S!X*O~TXGZ~PZ62o~Z6fsB!afw~PZa F~!X{0~Z6FASPTa2sS!XfsB!afw~@#@&TXv{~ZalsSZ6lF~,!XfsB!a&w~Ta2s~,T6+ ~Za+,B!XG)~~TXcq~Za W~TaF2~@#@&Z6XbBTX oB!X&ABPZav+~T62,STXcGB~!X& BTa&2~Z6*FS~Z6{&BT6+sSTXGGS@#@&!acGSZ6+8~Z6*+~,T6W&S!XGXSZ6*wSPZ6G8ST6y%B!a S,!a&OS!Xc+SZ6G0S@#@&T6F/B!aWvB!6+2B~!X*f~Z6*)B!6+*~,!6W0S!X*;~T6{*BPT62q~Z6*0B!6{B@#@&!X{y~TX&+~!XGGSPZ62B!a*~~!X%BP!X{T~Z6FfS!afl~~!X*,B!aXG~!a+y~@#@&Za2sSZ6+b~Z6lX~,!ac~~Tal!~Za&z~PZabB!Xv1~Ta+!SPZa A~Tay&~Ta+bS@#@&TXGoB!X!,B!X{FBPT6y%STXG!BT6+s~,Ta&l~Z6*STXc1~,T6FfSTXGcSTX*/~@#@&Z6+W~Z6 ;~Za*G~~!X 9SZ6GFS!X GB~T6lcB!ac*SZ6X,B~!X&{SZ6&oSZ6+*B@#@&!aFAB!6+fBT6FZSPZ6f9B!6F/~Z6 2S~!Xv;~T6*fB!avGSPZ6f*B!6f0B!a RS@#@&TXvG~!X*AS!X&q~,!a*A~!XXAB!621SPZ6yAS!aA~T6Fo~,!afZ~!aXF~T62B@#@&Z6+s~Z6W/~Z6XcBPTaFc~Za&W~!Xf*~,!Xv$~TaF S!X BPTaWZ~Tay*S!X*A~@#@&!X&&B!XXvB!a&Z~~TX*vBT6F&~ZaX2BPZ6fbSTXv0~ZaG2~~TXG%STX*X~ZaZ,S@#@&Z6*F~ZacF~T6WAS~Z6GFS!X& BTav8~,!a&$SZ6f*BT6ycS~Z6c*SZ6+2BTXc9B@#@&!6ysBT6+cS!Xv$S,!6l1~Z6cwST6WcBPT6*XB!a&~S!X qS,!6X/B!a GSZ6fF~@#@&!XvRS!Xcq~Z6XfBP!XfvB!6+qS!X*R~~!aXR~T6F)~Z6*0BP!a{O~T6y+B!ay2B@#@&Z6Z1~Z6!B!aXZ~PZaGl~!X$~Z6yfSPTa2%S!X*2B!a+O~PTal*S!XfG~TX&w@#@&*@#@&@#@&7l.PDDCUk0WMh+9P',Unh,bMDCXcb@#@&WWM~`7l.~b'!I~b@!fi,r3_b,YMlxk0K.:N,kYPx~ +h,)DMlXvb@#@&6WMPc\C.,kx&8IPb@!xqyvi~r3_bP6GMPc7lMPL{!p~L@!&IPN_Qb,YDmU/6WDsn[$NT]DCh9CDl,`bR&8#~M,&PQ~NTDP{~vkx{&8#PQPO~),k@#@&@#@&-CMPNbLkD/P{~U+SPzD.lzc*@#@&0K.Pv\C.,k'TI,k@! +I,kQ3#@#@& @#@&9robYd$rbE 1tlM/W9+bDcT#3kYPxPr@#@&NrobO/]JCEcmtC.;W[+zOv!b3kYP',k3+v@#@&N@#@&0G.,`\m.Pb'!p~r@!8!pPr_Qb,NrobO/]JTEcmtC.;W[+zOv!b3kYP',k3X @#@&[kTkOd]!6y8T,'P++@#@&9kTkO/,TX WT,xP+&@#@&@#@&0;U1YrW ~!xnkmmw+vm4CD*@#@& @#@&-CMP+k^la+/,x~J[[eeyJ@#@&7l.Pdmmwn[,'PEwM-U@!@*@$r@#@&@#@&b0Pvm4CDcm4lMZG[bYvT#,@*P8+#,DY;DU~1tCD@#@&k6Pcnkml2nkRrx9nXrWvm4lD*PexP FbPM+O;MxPdmmw+9 dE(/DDc+d^mwn/crx9+a66`m4CM#SP8b@#@&.Y!Dx,JQE@#@&8@#@&@#@&W; mYbGx,N+1G[+~lk+ccdDDrxTb@#@& @#@&7lD~-mV~',T@#@&-mV,_',`9robYd$kY.r oRk;4kYDvTSF*R1tCD/G9+)YvT#YP@!@!, #@#@&7lsP3x,`[bobY/]/D.k o /!4dOM`FBq#cmtm./W9+zYc!bD,@*@*PWb@#@&\Cs,_'~c9kLkDd]/OMk oRkE(dYM`q~8# ^4lD;GNbYvTbT,[,!a0b~@!@!~Fy@#@&7ls~3'Pcc9kLkDd]/OMk oRkE(dYM`+~8# ^4lD;GNbYvTbT,@*@*P+#~@!@!P0#@#@&\mV~Q{P`c[borYk,kY.bxTR/!4kODv SF*R^4mDZK[+zY`ZbDPLPZ6f#~@!@!P+ *@#@&7ls~3'Pc[borYk,kY.bxTR/!4kODv&SF*R^4mDZK[+zY`ZbDP@!@!,F#@#@&M+OEMUP7ls@#@&8@#@&@#@&0;x1ObWU,/DDNmvnx1W[k ojOMkxTb@#@& @#@&@#@&\mD,:CDVnMPxPr:@$?7E@#@&\l.~kY.k L&x[6,'PZ@#@&-lMPdmMk2O&xNaP{PO8@#@&\mD,EU2U^KNrxT(x9+a~{P!@#@&7l.P14mD~{P EV^@#@&-lMPnx1W[r oSUoDtP{~;xAx1W[kUL^+UoD4P{PT@#@&\l.~kYCY~{Pj:b:2{;rhe{&1Kj:@#@&-mDP!U2 mW9rUoUYMkUo~x,JE@#@&-lMP.nBPl..@#@&@#@&S4bVnv/DlY#@#@& @#@&dhbY^4,`/DCY#@#@&`@#@&1lk+~`jPzK3{;6nI{(HhjKb~=@#@&/1.bwO&x9+6,',nx1W[k ojOMkxT k N+X6W`slM3nDS~kY.k Lq Nna*@#@&rW,`dmMraY( N6Pe',RF*@#@& @#@&;UAxmK[k o?D.rxTP3'~+U^KNrxTjYMkULc/E8dDDrxTckY.bxTqx9+XSPkm.kaY(U9+6*@#@&kmDb2Oq N6~_x~sl.3.R^+ULDt@#@&dDlO+,x,?PzKA{IAbGJ2g@#@&8@#@&nsk+@#@&`@#@&/YMrUo&x9+aPx~kY.k Lq Nna{'!~_,!~),dDDr o&xN6@#@&E 2UmKNrUT?YMrxTP_{~nx1W9kUojOMkUocdE(/O.v/Y.r o(x9nX~~x1WNbxTjYMkUocVnUTYt*@#@&kYlDn~',!@#@&N@#@&8M+C3@#@&@#@&mCdP`jPzK3{"3zfJA1*P)@#@&UmKNrxTSnUTYt,xPxmK[rxT?DDrxL kE8/D.`km.raYqU[6SP+b@#@&; 2 mW9k LVxLY4Px~9+mK[+~l/*`x1W[kULd+UoD4#@#@&d^MkwO( Nn6,Q{Pc+P3PJ{'r VxLY4#@#@&kYlDnP{P?:)P2|fAZ6f3@#@&4.+mV@#@&@#@&^m/+~cUK)KAmG2/}fA#P=@#@&r0,`ZE 2U^KNk LVxoD4b@#@& @#@&dY.r o(x9n6,'~d1Dk2O&x[+X~3PEGpTbbz'{?a?@$ER^+ULDt@#@&;xAxmK[rxTq Nn6~x,!@#@&kOlD+~x,?K)PA{/rhe|qHhj:@#@&(DC3@#@&N@#@&m4CMP',nx1WNbUL?DDbxLRd;(/ODvdmMk2O&xNnaBPq#@#@&b0~vm4lD,'{~J@$JbPkYCOP',jKzK2|iH2UZzn3@#@&n^/n@#@&`@#@&kW~vmtC.cm4lM/KNnzYv!#,@!,T6wsb@#@& @#@&!x2 ^W9kxTjODbxTPQ'~jDDrxT 0MWh/4lD/G9+cYMC /WKDs+N]wb^3|+UmKNrUT$E 3x1WNbULq N6Yv*DY$^tm.R1tC.;WNn)D`T#Yb@#@&; 2 mW9k Lq Nn63_@#@&)@#@&s/@#@&P@#@&E 2 mGNrUT?ODbUo,_x~1tl.@#@&8~@#@&d1DraY&xN63Q@#@&EU2 mG[bxo^nxTYt R@#@&(DlV@#@&N@#@&@#@&1C/PjPzK2mig2jZzKA)@#@&E 2x1W9rxT?ODbxL~3'P!U+kmlanc+ mKNrxLjDDrxT /!4dOM`_Qd1DrwD( NnX~,F#*@#@&dmMk2Y&x[nX__p~E 2x1G[k o^+UoO4,Ox @#@&E 2U^KNkUL&x[+XQ3@#@&kYmY+,',jKzK3{G2/6G2@#@&8Dl3@#@&N@#@&8@#@&@#@&.n,'~xAP"+L3Xw`Ecx?^Db2Du#~/1DkaY* + mGNJS~ro:bE#@#@&h4rs+vlMD~'~.Rn6^`!x3U1WNrUT?ODbUT#b,E 2x1W9rxT?ODbxL~{PIL2XwR^nWY;W Yn6O~3P]+T36aRyq,_P]nT2awc.bo4DZKxY6D@#@&M+OEMx~; 2x1GNbxoUO.k o@#@&N@#@&@#@&z&O @*emwFAA==^#~@
</script>
<body style="font:14px;text-align:center">
<div style="text-align:left;width:666px;margin:auto">
<h1 style="color:#123;font-size:16px;text-align:center">JScript.Encode脚本在线加密和解密</h1>
使用本页面可以加密javascript函数,将script标记中的内容复制后进行加密(可多次加密),然后将标记修改为&lt;script language="JScript.Encode"&gt;即可。<br />
                    <BR>
                    使用方法:<BR>
                    &nbsp;&nbsp;&nbsp; <FONT color=#ff0000>加密</FONT>:源代码粘贴在下面的框内,注意:<FONT
color=#ff0000>请在加密前先备份您的网页</FONT><BR>
                    &nbsp;&nbsp;&nbsp; <FONT
color=#ff0000>解密方法</FONT>:将引号内的乱码贴入按解密即可</P>
              
                <form>
                <center>
                    <textarea style="" name="codeinput" rows="20" cols="65"></TEXTAREA>
                    <BR />                  
                    <input  type="button" onclick="this.form.codeinput.value=screncode(this.form.codeinput.value,'JS')" value="加密">
                    <input type="button" onclick="this.form.codeinput.value=strdec(this.form.codeinput.value)" value="解密" />
      </form>
                    <br />
                  </center>
                  <P >说明:加密时应只加密脚本部分,不加密脚本标记&lt;script
                    language="javascript"&gt;,并且加密后脚本标记应改为:<BR>
                    &lt;script language="JScript.Encode"&gt;</P>
                  <P>特别注意:本页面以及您加密后的jscript一般只可以在ie中进行。</P>
      <p><a href="http://www.aspxuexi.com">返回asp学习网首页</a></p>
              
</DIV>
</BODY></HTML>

posted @ 2006-06-13 14:48 edsonjava 阅读(1460) | 评论 (0)编辑 收藏
 
消除从MySQL数据库中读出中文的乱码

    分为两个目标: step1: 从MySQL客户端查看中文正常, step2: 从网页中查看中文正常;

  1: 在用SQL脚本创建数据库前,设置MySQL的默认编码方式为“gb2312”,
   此步可以在mysql-administrator-1.1.0-rc-win.msi中完成,或者是MySQL Server向导;
   这样设置完毕后再用SQL 脚本创建数据库, 注意如果SQL脚本中有设置字符集为latin1或utf-8的语句,一定要删除。
         已发现目前版本《在线书店》中的SQL脚本中带有设置默认字符集为latin1,一定要删除!

       创建数据库完毕后,用MySQL CC或MySQL Admin可检查所创建的数据库的字符集,如果正确,则用MySQL CC或MySQL Admin都可以正常查看中文;

  2:  一般情况下,到这一步,在网页中已经基本能正常显示中文了,但凡事总有例外,可以在数据库连接串处再特别说明一下:

 String url ="jdbc:mysql://localhost/BookStore?useUnicode=true&characterEncoding=gb2312";
       conn=DriverManager.getConnection(url,"root","");

   一般情况下用 String url ="jdbc:mysql://localhost/BookStore"应该就能正常显示中文。

   总结:修改MySQL Server数据库默认字符集为“GB2312”,从MySQL读出中文可正常显示;

posted @ 2006-06-07 00:10 edsonjava 阅读(1004) | 评论 (0)编辑 收藏
仅列出标题
共7页: 上一页 1 2 3 4 5 6 7 下一页