posts - 32, comments - 153, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2006年11月29日

  1. 在创建Human Task的UI项目时,请注意保证每个Project的package名都不相同,否则在BPM Workspace中会出现DataControl的NullPointerException。最简单的方法就是不要设置Application的package prefix,然后让每个项目都使用auto-generate的package名。
  2. 在Human Task中可以动态指定审批人,具体做法是在Assign标签页中,选择Single类型(当然也完全可以是别的类型),然后选择User,By Expression,后面的表达式是一个字符串,比如'weblogic,wfaulk,jstein',注意要使用单引号,也可以从payload中读取。不过这种方式有时会出错,出错原因不明,不过在Organization中添加一个用户,deploy,然后再把这个用户删除就解决了,不得不说非常汗。
  3. 如果需要对某个Human Task定时做一些操作,可以使用Catch Timer Event,注意这里指向End1,说明Timer触发以后直接走Update Database & Send Email这条分支,然后结束,并不是主流程结束。


posted @ 2011-04-07 10:35 Zou Ang 阅读(1210) | 评论 (0)编辑 收藏

     摘要: JAVA相关基础知识 1、面向对象的特征有哪些方面   1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承: 继 承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法...  阅读全文

posted @ 2007-12-25 07:14 Zou Ang 阅读(467) | 评论 (0)编辑 收藏

     摘要: 使用Hessian开发C/S模式的小系统
之所以叫小系统,主要是因为Hessian不支持Hibernate的延迟加载,所以需要在DAO层使用Hibernate的同学请注意了。

Hessian其实是一种RMI技术,已经被集成在Spring Framework中,这样就很方便了。

首先看客户端

第一步:
先定义Client与Server交互的接口。  阅读全文

posted @ 2007-07-28 10:48 Zou Ang 阅读(3769) | 评论 (4)编辑 收藏

Another Quiz : " Which Programming Language Are You?"

http://www.bbspot.com/News/2006/08/language_quiz.php

You are Java.  You are very strong and sturdy, but this makes you a bit sluggish.

posted @ 2007-05-07 12:09 Zou Ang 阅读(453) | 评论 (0)编辑 收藏

测到最后我才发现原来我是一个内向的人啊~~真是,搞得我一直都不知道呢
大家有空也去玩玩
http://www.psytopic.com/mag/post/820.html

Psytopic分析:您的性格类型是“ISTJ”(内向+实感+思维+判断)

沉静,认真;贯彻始终、得人信赖而取得成功。讲求实际,注重事实和有责任感。能够合情合理地去决定应做的事情,而且坚定不移地把它完成,不会因外界事物而分散精神。以做事有次序、有条理为乐---不论在工作上, 家庭上或者生活上。重视传统和忠诚。

ISTJ型的人是严肃的、有责任心的和通情达理的社会坚定分子。他们值得信赖,他们重视承诺,对他们来说,言语就是庄严的宣誓。 ISTJ型的人工作缜密,讲求实际,很有头脑也很现实。他们具有很强的集中力、条理性和 准确性。无论他们做什么,都相当有条理和可靠。他们具有坚定不移、深思熟虑的思想,一旦他们着手自己相信是最好的行动方法时,就很难转变或变得沮丧。ISTJ型的人特别安静和勤奋,对于细节有很强的记忆和判断。 他们能够引证准确的事实支持自己的观点,把过去的经历运用到现在的决策中。他们重视和利用符合逻辑、客观的分析,以坚持不懈的态度准时地完成工作,并且总是安排有序,很有条理。他们重视必要的理论体系和传统 惯例,对于那些不是如此做事的人则很不耐烦。ISTJ型的人总是很传统、谨小甚微。他们聆听和喜欢确实、清晰地陈述事物。ISTJ型的人天生不喜欢显露,即使危机之时,也显得很平静。他们总是显得责无旁贷、坚定不变 、但是在他们冷静的外表之下,也许有强烈却很少表露的反应。

您适合的领域有:工商业领域、政府机构 金融银行业、政府机构、技术领域、医务领域

您适合的职业有:

· 审计师
· 会计
· 财务经理
· 办公室行政管理
· 后勤和供应管理
· 中层经理
· 公务(法律、税务)执行人员
· 银行信贷员
· 预算分析师
· 保险精算师
· 税务经纪人
· 税务检查员
· 机械、电气工程师
· 计算机程序员
· 数据库管理员
· 地质、气象学家
· 法律研究者
· 律师
· 外科医生
· 药剂师
· 实验室技术人员
· 牙科医生
· 医学研究员
· 信息总监
· 电脑编程员
· 证券经纪人
· 会计
· 文字处理专业人士

posted @ 2007-05-06 08:09 Zou Ang 阅读(1404) | 评论 (2)编辑 收藏

基于求函数f(x,y,z)=xyz*sin(xyz)最大值问题的演示程序:


截图:








 

压缩包:
genetic_algorithm.part1.rar
genetic_algorithm.part2.rar
genetic_algorithm.part3.rar
genetic_algorithm.part4.rar

运行方法:
解压后在命令行输入:java -jar genetic_algorithm.jar

posted @ 2007-04-29 12:11 Zou Ang 阅读(6098) | 评论 (75)编辑 收藏

     摘要: 最近学习遗传算法,写了这么一个小程序来计算函数 f(x,y,z) = xyz*sin(xyz)的最大值,这段程序经过小小改变就可以适应其他的函数最大值求解问题首先介绍一下遗传算法,遗传算法就是模拟自然界中物竞天择,适者生存的法则,通过对解空间进行进化从而求得最优方案的方法,遗传算法的好处在于,即使算法中的某些参数不起作用了,整个算法还是可以正常地工作,也就是说,整体种群的走向是越来越好的遗传算法的...  阅读全文

posted @ 2007-04-26 21:41 Zou Ang 阅读(6832) | 评论 (14)编辑 收藏

     摘要: 用Java从控制台输入密码

本来以为是很简单的问题,查了一下发现Java居然没提供这样一个方法。目前实现的方式有2个,一个是利用JNI来调用C/C++方法,另一个是使用多线程。
本文使用JNI调用C/C++的方法实现  阅读全文

posted @ 2007-02-24 22:06 Zou Ang 阅读(3572) | 评论 (6)编辑 收藏

     摘要: JDK6.0发布有段时间了,新的JDK也有不少新的特性,我去网上搜集了一下,列在下面和大家一起学习.1.Desktop和SystemTray. 在JDK6中 ,AWT新增加了两个类:Desktop和SystemTray,前者可以用来打开系统默认浏览器浏览指定的URL,打开系统默认邮件客户端给指定的邮箱发邮件,用默认应用程序打开或编辑文件(比如,用记事本打开以txt为后缀名的文件),用系统默认的打印...  阅读全文

posted @ 2007-02-09 12:00 Zou Ang 阅读(2364) | 评论 (3)编辑 收藏

这几天突然遇到了一个问题:Tomcat跑不起来了!提示错误信息:
Error Listener Start
org.springframework.web.context.ContextLoaderListener
Error Listener Start
....
就这么2行,让人一头雾水。昨天检查了一个下午也没发现问题。今天突然在查看错误日志时发现:
Context initialization failed

org.springframework.beans.factory.BeanDefinitionStoreException: Line 14 in XML document from ServletContext resource [/WEB-INF/springctx-datareport.xml] is invalid; nested exception is org.xml.sax.SAXParseException: Element type "bean" must be followed by either attribute specifications, ">" or "/>".

仔细查看了一下配置文件,原来是同组的组员在写配置文件的时候在class="...."后面多了一个引号!
这个Listener Start的问题太隐蔽,如果没有做错误日志估计一直很难发现了
不过这次有了教训,以后也有方向了

posted @ 2007-02-03 09:33 Zou Ang 阅读(3571) | 评论 (1)编辑 收藏

     摘要: 根据Ajax in Action书进行调整,修改了原书上的错误,调试通过。
可重用的Ajax输入提示类,功能类似Google的输入提示  阅读全文

posted @ 2007-02-01 22:39 Zou Ang 阅读(3869) | 评论 (7)编辑 收藏

     摘要: JSP与Tomcat乱码解决方法  阅读全文

posted @ 2007-01-23 21:12 Zou Ang 阅读(4296) | 评论 (6)编辑 收藏

经常开各种各样的会议,要达成共识很不容易,尤其技术会议更是容易吵架。旧年最后一天,写点关于“开会”的想法。

首先,要注意听别人发言。尽量不要打断别人的发言,抓住对方的主要思想和依据。不要带着偏见听,有时候可能觉得对方不如你,但是不代表他现在说的就不对。把口头禅从“不,……”改成“对,……”,即使有时候你不同意他的观点,但是先肯定一下,可以缓和很多气氛。

然后,尽量先把自己的理论基础表达清楚,有时候争了半天,发现两个人想法是一样的,不过是换了种表达方式……

最后,不要长篇大论,给别人一个插口的机会。有些人讲话,喜欢停顿一下,然后在别人马上要开口讲话的时候接着讲。我很反感这种人,耍猴呢啊?给别人一个提出意见和疑问的机会。尽量把自己放到讨论的主导地位上来,就是说,要慢慢地让大家围绕着你的观点提问题,然后你再来进行解答。但是千万不要不让别人说话,有时候给别人机会说话对自己理清思路也非常有好处。

最近看一本叫《人件集-人性化的软件开发》的书,里面第一篇文章就讲如何作出决策和达成一致意见。一致意见应该做到综合各方的优点,而不应该是各方意见的“折衷”。书里有一个稍显极端的例子:假如你的团队正在开发一个图形用户界面的项目,一部分人强烈建议直接将控制按钮放在屏幕底部,而另一部分人建议在屏幕左侧放置一个控制窗口。两种意见中,一个是水平放置,一个是垂直放置,形成了两个极端。那么一个最具代表意义的折衷方案就是,将控制按钮沿着对角线放置在屏幕的中央。在很多时候,由折衷所产生的解决方案比任何一个原始方案都差劲,但是“技术性一致意见”就恰恰相反,它所产生的解决方案要比任何一个原有的方案都好。书上给的“一致意见”解决方法是给控制按钮窗体加上选项,让用户来决定是水平放置还是垂直放置。

在团队中的表现是很重要的,通过一个团队来改变团队中的个体,要比单独改变一个个体容易得多。所以在团队中发挥影响,比单独对每一个人发挥影响要有用得多。

有人说软件工程更像是“社会学”,而不是“工程学”,我也越来越有这种感觉了。

posted @ 2006-12-31 15:22 Zou Ang 阅读(1382) | 评论 (3)编辑 收藏

圣诞到了,祝所有的朋友圣诞快乐!!

posted @ 2006-12-24 14:05 Zou Ang 阅读(277) | 评论 (0)编辑 收藏

原贴地址:
http://news.csdn.net/n/20061221/99748.html

从根本上说,面向服务的架构能够使企业内部动态数据服务的创建变得更加方便,同时,还能够使企业开发人员创建影响这些服务的复合应用程序。Web2.0提供了一个丰富的Web体验,用户能够以高效的、充满希望的、有益的方式参与合作。

  如果我们把这两个现象结合起来,那么,通过企业社团成员之间的互相交流,以及成员与不断变化的企业数据之间的交互,我们就能够实现这一关键的提高效率的新方法。

  协作型企业相互融合,下一代的Web应用程序也已露端倪,但是,开发团体的推测是,为了实现明显的利益,企业所采用的各种技术之间存在着根本性 的差异。标准必须朝哪个方向发展才能够满足SOA与Web2.0概念的结合,为了更好的理解这个问题,我们将致力于检验Java表示技术的状态。

  Ajax化JavaServer Faces

  标准奠定了SOA的基本结构,但是,在Web2.0的世界中却不存在着标准。为了支持Web2.0的功能,市场上出现了太多的方法,其中大多数 在JavaScript的实现(影响Ajax的技术)上却非常繁杂。在Java EE的规范中,JavaServer Faces提供了表示层,但是,相比起Ajax技术和Web2.0概念的流行,它目前的修订版出现的更早。

  事实证明,在组件层,JSF中的可扩展组件架构非常适合与Ajax技术协同使用,但是,组件层Ajax技术存在的问题是,它们是存在于狭小的规 避JSF生命周期的交互空间内。解决这一问题所需要的是,一种更加全面的方式,以实现在JSF生命周期内的Ajax交互。具体来说,有以下两点需要着重阐 述。

  1.改进的用户交互模型: 在JSF中,目前的用户交互模型是基于表格的,它过于粗略而无法传输丰富的Web2.0特性。组件层的Ajax交互粒度,以及JSF目前依赖的基于表格的子任务模型,这两者之间存在着显著的差异。交互类型应当包含以下几种形式:

  •   纯粹的本地客户端JavaScript交互,没有服务器通信、不需要执行JSF生命周期。这种类型的例子可以是,在日期选择组件中通过日历来进行导航。目前,通过组件层JavaScript实现能够支持这个模型。
  •   组件层的Ajax交互,不需要执行JSF生命周期。这种类型的例子可以是,基于当前用户在文本框中的输入,从而形成一个列表。这里的关键是,用户与组件的交互仅仅影响到该组件的表示。同样,目前,通过组件层JavaScript实现能够支持这个模型。
  •   组件层的提交,引发JSF生命周期的执行。生命周期的执行结果将成为新的表示,该表示可能会影响到页面中的多种组件。这这种类型的例子可以是,在日期选择组件中完成日期的选择,结果是引发显示不同的日期安排信息。目前在JSF中,还无法支持这种形式的交互。

  2. 增量表示更新: 为了使用Ajaxian 方式(不是页面刷新)实现第三种交互模型,JSF需要一个增量更新机制,仅仅是把页面中应用到的表示层所做的必要修改从一个表现处理传向下一个表现处理。 下面这个图示表明了这个概念。它需要一个Ajax桥,在服务器端把表示的改变组合起来,在客户端的DOM把那些变化重组。

JSF Push模式

  Ajaxified JSF实现和多数其它的Ajax方式从遗留的Web应用程序模型中继承了一个共同的特征,该模型是一个客户端发起的交互模型。这意味着,客户端的表示层只需要针对用户与表示层的交互进行相应变化。

  与使用遗留应用程序相比,使用Ajax技术,这个交互是细粒度的,但是,它仍然是客户发起的。现在,当你检验支持应用程序的SOA数据模型的动 态特性、了解众多同步用户采用这一动态数据所进行的协调互操作时,你就能够意识到,在客户端推动动态表示变化的机制是非常重要的,这一点越来越清晰。它是 达到Web2.0模型所需要的真正的动态特性的唯一途径。

在产业中已经证明,对于JSF规范与一个表示push模型的协作来说,Ajax push技术,也指Comet,是十分必要的。前文已经描述的这个增量更新特性,提供了在实现JSF Push模式时所需要的基于Ajax的更新机制。除此之外,当应用程序逻辑发现出现了一些将会影响客户端表示层状态的变化时,延长JSF的生命周期来允许 一个强制的表现处理是很有必要的。

虽然,JSF push模型相对而言实现起来更加容易,但是,生产经验表明,为使得开发人员能够有效继承,仅仅暴露JSF API中底层强制的表示机制是远远不够的。关于基本的push机制,JSF规范很有必要对表现API进行介绍,从而呈现给开发人员一个清晰有效的机制,用 于请求强制表示。API尤其需要提供以下几个方面:

  1.触发的表现:应用程序开发人员应当能够在发出表示处理请求的业务逻辑中定义触发点。

  2. 群组表现: 一个触发点能够影响一个单一客户端、多个客户端,或者是所有连接到该应用程序上的客户端。因此,为触发表现提供群组管理结构,这是很有必要的。

  3. 预定的表现:有许多合适的计划机制应当被支持,包括,按需表现、推迟表现,以及内部表现。预定的表现架构应当具备可扩展性,以支持其他用户预先设定的需 求。很重要的一点是,触发表现机制应当能够更加有效的传输。由于存在着大量的触发,它们潜在地以各种方式影响着客户端,因此,管理表现的处理这一任务不能 仅仅落在开发人员身上。触发表现的实现,必须有效地合并表现处理请求、处理必要的同步,而且,这些操作都是以一种线程有效的方式。

  多视图支持

  现存的为JSF定义的阶段和需求范围,根本不足以支持满足Ajax的JSF应用程序——用户能够在同一应用程序上获得多个活动视图。阶段范围能 够维护所有视图共同的状态,但是,它不足以处理视图之间不同的状态。由于多个同步请求都必须是活动状态,所以,需求范围也不充分。因此,需要一个新的范 围,来管理满足Ajax 的JSF应用程序的会话方面。JBoss的Seam 方案提出了会话范围,它主要提供JSF中所需要的额外范围。除了支持多视图之外,会话范围还能够带来其他优势,例如,在应用程序中,通过会话中对一系列用 户交互的明确描述,就能够有效地支持书签和返回按钮特性。

  长期存在的HTTP请求

  回到前面所提到的push模型,你可能注意到,机制需要一个特殊的HTTP请求,它能够异步地响应从应用程序中发出的触发表现出理请求。依据更 新的频率,这个特殊HTTP请求能够长期存在。由于在响应之前,每一个请求都占用其线程,所以,在处理这个长期存在的请求时,现存的Servlet模型无 法很好的响应。因此,为了支持push模型,必须对Servlet模型进行改变,使它能够以线程有效的方式来处理长期存在的请求。再强调一次,有很多生产 方案与异步Servlets和HTTP服务器相关,Java EE规范能够在此基础上定义一个解决方案。

  结论

  人们仍然有些质疑:SOA与Web2.0世界将会发生抵触,新一代的协作型企业应用程序已露端倪。也存在着这样的质疑,现存的Java EE规范无法完全处理Web2.0提出的请求,以及JSR处理必须开始在直接项中考虑这些请求。然而,产业中的重大进步,已经能够处理出现的请求,并且能 够实现扩展现存Java EE基础结构的商业化的可行方案。即将使用JSR 172来生成JSF2.0规范,非常重要的是,包含Ajax特性,以及产业参与者贡献相关技术,来确保能够及时做出基于标准的解决方案。

posted @ 2006-12-23 17:39 Zou Ang 阅读(552) | 评论 (0)编辑 收藏

原帖地址:
http://www.blogjava.net/errorfun/archive/2006/12/09/86584.html
乱码问题好像跟我们中国程序员特别有缘,一直困扰着我们,从开始的JSP乱码问题,STRUTS乱码问题,到现在的AJAX乱码问题,无一不是搞得许多程序员焦头烂额的,整天骂XXX产品对中文支持不了,UTF-8无法使用中文啊什么的,其实这里面被骂的产品中其实99%以上是对中文支持非常好的,而出现乱码的原因只是因为自身对国际化支持以及文件编码等信息的认识不知造成的。要知道一个产品那么流行,怎么可能对中文支持不了呢,下面就开始一一帮大家解决这些问题。


1
、编码
      --
想要解决好中文问题,对编码肯定是不能一概不懂了,编码是解决中文乱码问题的根本。
      
编码比较常用的有: UTF-8 GBK GB2312 ISO-8859-1 ,除了 iso-8859-1 之外的其它三个编码都能很好的支持中文,但它们都兼容 ISO-8859-1 的编码(就是说无论编码怎么改变,只要是 ISO-8859-1 中的字符,永远不会出现乱码)。
     
这四种编码中, GB2312 是中国规定的汉字编码,也可以说是简体中文的字符集编码 ; GBK GB2312 的扩展 , 除了兼容 GB2312 外,它还能显示繁体中文,还有日文的假名 ; UTF-8 虽然也支持中文,但却 GB 码不兼容(编码值不同) UTF-8 使用的是可变长的 UNICODE 编码,编码可能是 1 16 进制(即 ISO-8859-1 中的字符,其编码也是相同的)也有可能是 2 位或 3 位的 16 进制。 UTF-8 的优点是: 1 CPU 字节顺序无关 , 可以在不同平台之间交流。 2 、容错能力高 , 任何一个字节损坏后 , 最多只会导致一个编码码位损失 , 不会链锁错误 ( GB 码错一个字节就会整行乱码 ) ,所以在国际化处理中基本都是建议使用 UTF-8 作为编码。

2、文件的编码
      --虽然说只要设置了正确的编码就可以使字符正确显示了,但如果忽略了文件保存时的编码的话,那可是会让你走进迷雾中的。
      文件编码最常使用的有两种:ANSI和UTF-8,光看名字估计你都可以猜到了,ANSI就是我们保存文件时使用的默认编码,而UTF-8则需自己设置。对于编码的改变,我使用的工具是NOTEPAD和ECLIPSE,NOTEPAD使用最简单,只要打开文件后在另存为中选择相应的编码就行了,而且它对编码的支持非常好;而在ECLIPSE中,只要稍微设置一下就行了,打开首选项,然后选择:常规->内容类型(ContentType),在右边选中你想改变保存编码的文件类型,然后在下方的缺省编码中改变其值,最后点击更新(UPDATE)按钮即可。



而在其它的编辑器中,默认保存的内容都是GB2312或者GBK(NOTEPAD中对应ANSI).而根据前面所说的UTF-8和GBK,GB2312等的编码值是不同的这一点,可以知道,如果文件使用了UTF-8,那么字符编码就必须使用UTF-8,否则编码值的不同就可能造成乱码。而这也就是为什么那么多的人使用了UTF-8编码后还会产生乱码的根本原因。(JS和JSP都是这个道理)

3、JSP,STRUTS等的中文乱码解决方案
     其实解决的方法只有一个:

 request.setCharacterEncoding(encoding);

   方法只有一种,但处理方式就多种多样了,初学者会在JSP页面上直接使用,而有经验的程序员会使用过滤器。而现在所要说的方法也是过滤器。这里以统一使用UTF-8作为编码作为例子说明。具体过程就不多说了,网上有很多教程。偷懒一点的,到TOMCAT中复制就行了。在TOMCAT的目录下的\webapps\jsp-examples\WEB-INF\classes\filters\找到SetCharacterEncodingFilter.java 这个类,放到你的程序中并配置好映射路径。配置好后基本上你的乱码问题就解决了。但要映射路径中需要注意的就是不能使用 '*'

   < filter-mapping >
    
< filter-name > Set Character Encoding </ filter-name >
    
< servlet-name > * </ servlet-name >
  
</ filter-mapping >

像上面这样配置的话(可能也是网上大多教程的做法,想当年也是害苦了我),可能你只有JSP的乱码解决了,要解决STRUTS的乱码需要映射 *.do 或者 servletActionName。然后在初始化参数中设置encoding的值就行了。

< init-param >
      
< param-name > encoding </ param-name >
      
< param-value > UTF-8 </ param-value >
</ init-param >

当然,最重要的是要记得根据前面所说的方法,改变你所使用的编辑器保存文件的编码要与使用的字符编码一致。
而在JSP内容中,还是使用如网上教程所说的那种技俩,在所有页面的页首加入:

<% @ page language = "java" contentType = " text / html; charset = UTF - 8 "
    pageEncoding
= "UTF - 8 " %>

至此,相信JSP,ACTION都不太可能出现乱码了。

4、资源文件的乱码解决方案
      资源文件谁都知道是国际化支持不可或缺的一部分,如果资源文件都出现乱码了那还了得?其实资源文件的乱码是很好解决的,其原因也是因为使用了UTF-8做为JSP编码后,没有相应地改变资源文件的文件编码造成的,所以只要对资源文件保存的编码进行更正后,乱码问题也就解决了。当然,你的中文要使用 native2ascii 命令进行正确的转换。

5、调用JS时,JS内容乱码的解决方案。
     其实JS的乱码还是跟文件的编码有关系的,如果JS中有中文的话,那JS文件保存的编码就必须跟调用此JS的页面编码相同,否则,你的所有中文都要从JSP页面传给JS才会显示正常。可以看出对于调用JS出现的乱码是最容易解决的(也是建立在前面的辛苦之下的)。

6、AJAX提交数据乱码,返回数据乱码的解决方案
     随着AJAX的流行,乱码问题也开始困扰着许多刚开始使用它的程序员,幸好我之前对JSP乱码有过一点研究,在遇到AJAX后,并没有给我带来多大的困扰,在此将我的一些心得共享给大家。
     万变不离其宗,AJAX的乱码问题自然跟编码有关了,其实很多人跟我一样想到了对文件编码进行设置,并且在接数据时设置了requet的编码,在返回的数据时设置了response的编码一切都以为会很顺利,可是这一切都是徒劳无功的,讨厌的乱码再一次出现在你眼前。在你试了N多种方法,包括JS自身的escape,unescape方法后,你发现乱码仍然猖狂地出现在屏幕上。
    其实在试过这N多方法后,很多人都没发现,解决的方法其实很简单,而且其答案就在我们之前处理的JSP乱码之中。让我们先看一下AJAX的经典请求代码

xmlhttp.open( "post", url, async );
xmlhttp.setRequestHeader( 
"Content-Type""text/html"
 );
xmlhttp.send( params );

通过前面的说明,不知道你现在看出端倪了没有。不知道是受了网上教程的影响还是其它方面影响,setRequestHeader并是万年不变的,也没人想过去改它,而问题就正好出在这个地方。回想一个JSP页面内容的编码设置,其中有这么一节:
contentType="text/html; charset=UTF-8"

现在知道问题了吧,所以我们要把第二句代码改为:
xmlhttp.setRequestHeader( "Content-Type""text/html;charset=UTF-8" );

最后别忘了在返回数据时也设置上:
response.setContentType( "text/xml" );
response.setCharacterEncoding( 
"UTF-8" );

是不是很简单,一点都不麻烦呢?
如果要问为什么的话,其实我们可以把xmlhttp看成是一个临时页面,它由浏览器动态生成,主要作用是在后台获得请求的数据(可以看成是一个高级的iframe)。所以对于普通页面设置的编码,对它也要同样设置。而在servlet中返回数据为什么要设置contentType和encoding其道理也是一样的。众所周知,jsp的最后形态就是servlet,而jsp页首设置的那个内容其实也就是让生成的servlet中生成这么两句话:
response.setContentType( "text/html" );
response.setCharacterEncoding( 
"UTF-8" );

而pageEncoding则是跟jvm说明了这个页面的内容要使用什么编码保存(这跟之后生成的CLASS有关系)。所以在servlet设置response的编码也是理所当然的了。

一口气把自己一年以来遇到的乱码问题和解决的方案写出来了,希望对你有所帮助。

posted @ 2006-12-11 11:04 Zou Ang 阅读(3255) | 评论 (11)编辑 收藏

好象转眼间,大三也要过去一半了..毕业的日子也隐隐可见了,到底要怎么走呢..本来一心打算出国,但是考虑到需要6个月左右的时间来准备GRE,就觉得不太值得了.用6个月学习英语,而且还不是说GRE考好了就能去好学校,那有必要么?头脑中一团乱麻...

posted @ 2006-12-09 09:27 Zou Ang 阅读(306) | 评论 (1)编辑 收藏

今天去聼了MS的軟件過程技術的課,講的是軟件設計。其實這兩天聼下來的感覺,就是以客戶為中心,已滿足客戶作爲第一要求,永遠要優先考慮“Money and Time"。然後到了工程的方面,也就是面向“技術”的方面,那就是做設計不要只做一個,至少要有一個alternative的design。先盡量將問題“量化”,盡可能細緻地描述要做的東西,也就是要把requirement變成specification,這種規格的粒度需要自己控制,最好能做到設計做完以後,拿給SDE的時候,他會有一種強烈的開始寫代碼的衝動。

其實,工科,我覺得永遠都要考慮到實際的環境。畢竟現實世界不是理想囯,我們能做到的,就是在有限的條件下,綜合考慮所有的因素,然後給出性價比最高的方案。

ps.今天沒拿到U盤,很遺憾

posted @ 2006-12-06 22:42 Zou Ang 阅读(259) | 评论 (0)编辑 收藏

今天在学习Web Service的时候得知Amazon提供了一个搜索的Web Service,于是考虑写一个方法访问一下看看..
Amazon Web Service 的WSDL: http://soap.amazon.com/schemas2/AmazonWebServices.wsdl
得到了WSDL以后,在命令行执行:
java org.apache.axis.wsdl.WSDL2Java http://soap.amazon.com/schemas2/AmazonWebServices.wsdl
就会在%AXIS_HOME%目录下生成一个包结构:com.amazon.soap.*;里面有很多包,不过如果看了上面那个wsdl的话应该知道主要的类是
AmazonSearchService和AmazonSearchPort,前面是服务,后面是调用方法的对象..

AmazonSearchService:
public interface AmazonSearchService extends javax.xml.rpc.Service {
    
public java.lang.String getAmazonSearchPortAddress();

    
public com.amazon.soap.AmazonSearchPort getAmazonSearchPort() throws javax.xml.rpc.ServiceException;

    
public com.amazon.soap.AmazonSearchPort getAmazonSearchPort(java.net.URL portAddress) throws javax.xml.rpc.ServiceException;
}

AmazonSearchPort:
package com.amazon.soap;

public interface AmazonSearchPort extends java.rmi.Remote {
    
public com.amazon.soap.ProductInfo keywordSearchRequest(com.amazon.soap.KeywordRequest keywordSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ProductInfo powerSearchRequest(com.amazon.soap.PowerRequest powerSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ProductInfo browseNodeSearchRequest(com.amazon.soap.BrowseNodeRequest browseNodeSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ProductInfo asinSearchRequest(com.amazon.soap.AsinRequest asinSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ProductLine[] blendedSearchRequest(com.amazon.soap.BlendedRequest blendedSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ProductInfo upcSearchRequest(com.amazon.soap.UpcRequest upcSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ProductInfo authorSearchRequest(com.amazon.soap.AuthorRequest authorSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ProductInfo artistSearchRequest(com.amazon.soap.ArtistRequest artistSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ProductInfo actorSearchRequest(com.amazon.soap.ActorRequest actorSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ProductInfo manufacturerSearchRequest(com.amazon.soap.ManufacturerRequest manufacturerSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ProductInfo directorSearchRequest(com.amazon.soap.DirectorRequest directorSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ProductInfo listManiaSearchRequest(com.amazon.soap.ListManiaRequest listManiaSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ProductInfo wishlistSearchRequest(com.amazon.soap.WishlistRequest wishlistSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ListingProductDetails exchangeSearchRequest(com.amazon.soap.ExchangeRequest exchangeSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.MarketplaceSearch marketplaceSearchRequest(com.amazon.soap.MarketplaceRequest marketplaceSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.SellerProfile sellerProfileSearchRequest(com.amazon.soap.SellerProfileRequest sellerProfileSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.SellerSearch sellerSearchRequest(com.amazon.soap.SellerRequest sellerSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ProductInfo similaritySearchRequest(com.amazon.soap.SimilarityRequest similaritySearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ShoppingCart getShoppingCartRequest(com.amazon.soap.GetShoppingCartRequest getShoppingCartRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ShoppingCart clearShoppingCartRequest(com.amazon.soap.ClearShoppingCartRequest clearShoppingCartRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ShoppingCart addShoppingCartItemsRequest(com.amazon.soap.AddShoppingCartItemsRequest addShoppingCartItemsRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ShoppingCart removeShoppingCartItemsRequest(com.amazon.soap.RemoveShoppingCartItemsRequest removeShoppingCartItemsRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ShoppingCart modifyShoppingCartItemsRequest(com.amazon.soap.ModifyShoppingCartItemsRequest modifyShoppingCartItemsRequest) throws java.rmi.RemoteException;
}


我打算调用keywordSearchRequest这个方法,这个方法有一个keywordRequest参数,返回一个ProductInfo对象
public com.amazon.soap.ProductInfo keywordSearchRequest(com.amazon.soap.KeywordRequest keywordSearchRequest) throws java.rmi.RemoteException;
下面是调用Web Service的类:
/**
 * org.zsu.zouang
 * 2006-11-30
 
*/

package org.zsu.zouang;

import java.rmi.RemoteException;

import javax.xml.rpc.ServiceException;

import com.amazon.soap.AmazonSearchPort;
import com.amazon.soap.AmazonSearchServiceLocator;
import com.amazon.soap.Details;
import com.amazon.soap.KeywordRequest;
import com.amazon.soap.ProductInfo;

/**
 * 2006-11-30
 * 
@author Zou Ang
 * Contact <a href ="mailto:richardeee@gmail.com">Zou Ang</a>
 
*/

public class MyAmazonClient {

    
/**
     * 
@param args
     
*/

    
public static void main(String[] args) {
        KeywordRequest keyword 
= new KeywordRequest();
        keyword.setKeyword(
"Java");
        keyword.setMode(
"books");
        keyword.setTag(
"D3HW0PG66IPLAM");
        keyword.setDevtag(
"D3HW0PG66IPLAM");
        keyword.setPage(
"1");
        keyword.setType(
"heavy");
        keyword.setSort(
null);
        keyword.setVariations(
null);
        keyword.setLocale(
null);
        
// TODO Auto-generated method stub
        try {
            AmazonSearchPort port 
= new AmazonSearchServiceLocator().getAmazonSearchPort();
            ProductInfo info 
= port.keywordSearchRequest(keyword);
            System.out.println(
"Number of Results :" + info.getTotalResults());
            Details[] details 
= info.getDetails();
            
for(Details d : details){
                System.out.println(
"ISBN :" + d.getIsbn() + " Name:" + d.getProductName());
            }

        }
 catch (RemoteException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }
 catch (ServiceException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}
返回的结果:
- Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart). Attachment support is disabled.
Number of Results :
5161
ISBN :
0072253606 Name:SCJP Sun Certified Programmer for Java 5 Study Guide (Exam 310-055) (Certification Press Study Guides)
ISBN :
0596007124 Name:Head First Design Patterns (Head First)
ISBN :
0553803905 Name:Ship of Ghosts: The Story of the USS Houston, FDR's Legendary Lost Cruiser, and the Epic Saga of Her Survivors
ISBN :0596009410 Name:Mac OS X Tiger: Missing Manual
ISBN :
0596101996 Name:JavaScript: The Definitive Guide
ISBN :
0131483986 Name:Java How to Program (6th Edition) (How to Program (Deitel))
ISBN :
0596009208 Name:Head First Java, 2nd Edition
ISBN :
1591968097 Name:What is WebSphere? Java, J2EE, Portal and Beyond! (Demystifying IBM's Middle Tier Technology, Vol. 1)
ISBN :0596005407 Name:Head First Servlets and JSP: Passing the Sun Certified Web Component Developer Exam (SCWCD)
ISBN :
1932394613 Name:Ajax in Action

下一步可能打算写个GUI的Amazon搜索客户端

posted @ 2006-11-30 23:32 Zou Ang 阅读(739) | 评论 (1)编辑 收藏

昨天把Web服务架好了,那今天自然要想怎么来远程调用了.
于是写了如下代码:
/**
 * org.zsu.zouang
 * 2006-11-29
 
*/

package org.zsu.zouang;

import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;

import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;

/**
 * 2006-11-29
 * 
@author Zou Ang
 * Contact <a href ="mailto:richardeee@gmail.com">Zou Ang</a>
 
*/

public class MyBookServiceClient {
    
private static final String endPoint = "http://localhost:8080/axis/org/zsu/zouang/BookTitleService.jws?wsdl";
    
public static void main(String args[]){
        Service service 
= new Service();
        
try {
            Call call 
= (Call)service.createCall();
            call.setTargetEndpointAddress(
new URL(endPoint));
            call.setOperationName(
new QName("getBookTitle"));
            String result 
= (String)call.invoke(new Object[]{"0130895601"});
            System.out.println(result);
        }
 catch (ServiceException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }
 catch (MalformedURLException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }
catch(RemoteException e){
            e.printStackTrace();
        }

    }

}

控制台输出:
- Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart). Attachment support is disabled.
Advanced Java 
2 Platform How to Program
成功啦!
在代码中加上这一句:
System.out.println(call.getResponseMessage().getSOAPPartAsString());
会看到控制台输出:
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    
<soapenv:Body>
    
<getBookTitleResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
        
<getBookTitleReturn xsi:type="xsd:string">
            Advanced Java 2 Platform How to Program
        
</getBookTitleReturn>
    
</getBookTitleResponse>
    
</soapenv:Body>
</soapenv:Envelope>

改进了一下,使用Swing建立一个图形化界面:
/**
 * 2006-11-29
 * 
@author Zou Ang
 * Contact <a href ="mailto:richardeee@gmail.com">Zou Ang</a>
 
*/

public class MyBookClient extends JFrame {

    
private final static int FRAME_WIDTH = 500;
    
private final static int FRAME_HEIGHT = 100;
    
    
public MyBookClient(String title) {
        
super(title);
        getContentPane().setLayout(
new GridLayout(2 , 2));
        
final String endPoint = "http://localhost:8080/axis/org/zsu/zouang/BookTitleService.jws?wsdl";
        
final JLabel resultLabel = new JLabel();
        
final JComboBox bookISDNBox = new JComboBox();
        bookISDNBox.addItem(
"0130895601");
        bookISDNBox.addItem(
"0430895717");
        bookISDNBox.addItem(
"0430293636");
        bookISDNBox.addItem(
"0130923613");
        
        
this.setSize(FRAME_WIDTH, FRAME_HEIGHT);
        JButton serviceButton 
= new JButton("Get Book Title");
        serviceButton.addActionListener(
new ActionListener(){

            
public void actionPerformed(ActionEvent e) {
                
// TODO Auto-generated method stub
                try {
                    Service service 
= new Service();
                    Call call 
= (Call)service.createCall();
                    call.setTargetEndpointAddress(
new URL(endPoint));
                    call.setOperationName(
new QName("getBookTitle"));
                    String result 
= (String)call.invoke(bookISDNBox.getSelectedObjects());
                    resultLabel.setText(result);
                }
 catch (AxisFault e1) {
                    
// TODO Auto-generated catch block
                    e1.printStackTrace();
                }
 catch (MalformedURLException e1) {
                    
// TODO Auto-generated catch block
                    e1.printStackTrace();
                }
 catch (RemoteException e1) {
                    
// TODO Auto-generated catch block
                    e1.printStackTrace();
                }
 catch (ServiceException e1) {
                    
// TODO Auto-generated catch block
                    e1.printStackTrace();
                }

            }

        }
);
        
        getContentPane().add(
new JLabel("Please ISDN number"));
        getContentPane().add(bookISDNBox);
        getContentPane().add(resultLabel);
        getContentPane().add(serviceButton);
    }

    
    
public static void main(String args[]){
        MyBookClient client 
= new MyBookClient("Book Title Service");
        client.setDefaultCloseOperation(EXIT_ON_CLOSE);
        client.setVisible(
true);
    }

}

posted @ 2006-11-29 22:15 Zou Ang 阅读(786) | 评论 (4)编辑 收藏

Java基础知识,打好基础才能更好地学习!
原帖地址:http://www.linuxmine.com/44702.html
对象引用应用程序设计接口是JDKTM1.2中新定义的。该应用程序设计接口允许应用程序以对象引用的方式与JVM的内存管理器进行交互。当应用程序需管理大量内存对象或者在新的Java对象创建之前需删除原有对象时,Java对象引用应用程序设计接口具有相当大的用途,例如:
  
  ● 基于Web的应用程序常常要求显示大量图片,当用户离开某一Web页时,往往不能确定是否能够顺利的返回。在这种程序中,应用Java对象引用API可以创建这样一个环境,即当堆内存以最小程度运行时,内存管理器创建对象。当用户返回时,应用程序就会重新载入已经创建的图片。
  
  ● 应用对象引用队列可以创建这样一个环境,当通过对象引用获得某一对象时,应用程序得到通知。然后,应用程序就可以对相关对象进行清除操作,同时使这些对象在内存管理器中合法化。
  
  内存管理器的工作机制
  
  下面将首先介绍未嵌入引用对象时内存管理器的工作机制,然后讨论引用对象加入之后Java堆发生的变化。
  
  内存管理器的作用就是识别程序中不再使用的对象,并且回收其内存。
  
  一个Java应用程序由一系列线程组成,每个线程执行一系列方法,而每个方法通过参数或局部变量来引用对象。这些引用属于引用集合中的一部分,直接进入应用程序。另外,引用集合中还包括类库中定义的静态引用变量,以及通过Java本地接口(JNI)API获得的引用。引用集合中的所有引用对象都可以被当前应用程序获取,而不必被回收。同样地,这些对象可能包含对其它对象的引用,也可以被应用程序获取,依此类推。Java堆中的其它对象视为不可获取的,而所有这些不可获取的对象在内存管理中也是合法的。如果一个不可获取的对象使用finalize()方法,任务就交给了对象所调用的收尾器(finalizer)。在内存回收期间,不具有收尾器的不可获取对象和已经调用收尾器的对象被简单回收。
  
  内存回收的算法是不断变化的,共性的方面是从引用集合中识别可获取的对象以及回收被其它对象占据的内存空间。
  
  加入引用对象之后的引用与常规引用的区别在于,引用对象中的引用专门由内存管理器来处理。引用对象封装了其它一些对象的引用,我们称之为指示对象。在引用对象创建的同时,也就定义了该引用对象的指示对象。
  
  Java对象引用
  
  图1所示为对象引用应用程序设计接口中定义的类层次。其中SoftReference类、WeakReference类和PhantomReference类中分别定义了三种引用对象以及相应的三种获取对象的能力。因此按照由强到弱,对象可获取程度可划分为如下五种类型:强获取(strongly reachable)、次获取(softly reachable)、弱获取(weakly reachable)、虚获取(phantomly reachable)和不可获取(unreachable)。
   
  图1 对象应用类层次
  
  根据应用程序要求,对象可以是强引用(strong references)、次引用(soft references)、弱引用(weak references)、虚引用(phantom references)的任意组合。为了确定对象的可获取程度,JVM内存管理器从引用集合出发遍寻堆中所有到对象的路径。当到达某对象的任意路径都不含有引用对象时,则称该对象具有强获取能力;当路径中含有一个或几个引用对象时,根据内存管理器所查询的引用对象的类型分别归为次获取、弱获取、虚获取。
  
  另外,对象引用API中还定义了引用对象队列(java.lang.ref.ReferenceQueue),这是内存管理器对引用对象进行管理的一种简单数据结构。值得注意的是,在进行引用对象定义时,要求phantom reference对象必须产生于一个引用对象队列,而soft reference和weak reference对象则无此限制,如:
  
  

ReferenceQueue queue  =   new  ReferenceQueue();
  PhantomReference pr 
=   new  PhantomReference(object, queue);

  Soft References 应用实例
  
  下面以在基于web的应用程序中使用soft references为例,来说明Java对象引用与JVM的内存管理器进行交互的原理。
  
  当用户打开某一web页时,applet代码获得图片并且得到显示。如果在代码中同时创建了该图片对象的soft references,那么当用户离开该web页时,内存管理器对图片所分配的内存是否回收做出选择。当用户返回该web页时,在applet代码中使用SoftReference.get方法就会得到图片才内存中是否仍存在的消息。如果在内存管理器中未创建该图片,在web页上会很快得到显示;否则,applet代码就会重新获取。
  
  下面是Example.java的完整源代码。
  
  

import  java.awt.Graphics;
  
import  java.awt.Image;
  
import  java.applet.Applet;
  
import  java.lang.ref.SoftReference;
  
public   class  Example  extends  Applet  {
    SoftReference sr 
=   null ;
    
public   void  init()  {
      System.out.println(
" Initializing " );
    }

    
public   void  paint(Graphics g)  {
      Image im 
=  (sr  ==   null ?   null  : (Image)(sr.get());
      
if  (im  ==   null {
        System.out.println(
" Fetching image " );
        im 
=  getImage(getCodeBase(), " yundong.gif " );
        sr 
=   new  SoftReference(im);
      }

      System.out.println(
" Painting " );
      g.drawImage(im, 
25 25 this );
      g.drawString(
" 运动之美 " , 20 , 20 ); 
     im 
=   null ; 
    
/*  Clear the strong reference to the image  */
    }

  
    
public   void  start()  {
      System.out.println(
" Starting " );
    }

  
    
public   void  stop()  {
      System.out.println(
" Stopping " );
    }

  }


  
  在上面的代码中,对象image是一个图片对象,传递给一个SoftReference对象sr。其中image对象是sr的指示对象,sr中的引用域是从次引用(soft reference)到 image。
  
  Weak References分析
  
  对于一个稳定的对象,比如说线程类对象,当需要获取外部数据时,在程序中应用weak references是非常理想的。如果利用引用队列创建了某一线程的weak reference,那么当线程不再具有强获取能力时,应用程序得到通知,根据此通知,应用程序才能执行相关数据对象的清除工作。
  
  当内存管理器未发现strong references 和 soft references 时,我们称对象具有弱获取能力,即在到达该对象的路径中至少包含一个weak reference。程序中weak references被清除一段时间后,弱获取对象被收尾器收集。由此也可以看出,soft reference和weak reference之间的区别在于,应用soft reference时,内存管理器利用算法决定是否创建弱获取对象,而应用weak reference时,内存管理器必须创建次获取对象。
  
  引用对象链
  
  当到达某一对象的路径中含有多个引用对象时,就构成了引用对象链。内存管理器按照由强到弱的顺序处理引用对象,具体处理步骤包括:Soft references、 Weak references、Finalization、Phantom references和创建对象五个部分。
  
  当内存管理器未发现前三种对象引用时,我们称对象具有虚获取能力,即在到达该对象的路径中至少包含一个phantom reference。虚引用对象直接被收尾器收集,而不被重新创建。当内存管理器发现只有phantom references时,对象就将处于等候phantom reference状态,应用程序向引用队列发出通知,然后对虚引用对象调用clear()方法,将其引用域设置为null,最后对不可获取对象执行收集清除处理任务。
  
  通常,对象所具有的获取能力与引用对象集合直接路径中的最弱连接者相同。据此可以看出:
  
  图2(a)中,虚引用对象具有强获取能力,其它对象均具虚获取能力;
  
  (b)中虚引用对象和弱引用对象均具强获取能力,故次引用对象和对象集合具有若获取能力;
  
  (c)中虚引用对象、弱引用对象和次引用对象均具强获取能力,那么对象集合则具次获取能力。
   
  图2 引用对象链
  小结
  ● 引用对象API是Java2平台中的特色之一。
  
  ● 在程序中使用引用对象API不但可以在一定程度上控制内存管理器,实现内存自动管理,还可以提高程序的稳定性和安全性。
  
  ● 引用对象链中各个对象的获取能力与整个链相关。

posted @ 2006-11-29 14:08 Zou Ang 阅读(416) | 评论 (0)编辑 收藏