<?xml version="1.0" encoding="utf-8" ?>
<!-- generator="crazycoder cms 1.0(beta)" -->
<rss version="2.0" xmlns:sns="http://www.crazycoder.cn/rss/news">
	<channel>
		<title>Java教程</title>
		<description></description>
		<link>http://CrazyCoder.cn/Java/Index.html</link>
		<lastBuildDate>2010-03-11</lastBuildDate>
		<generator>CrazyCoder 1.0(beta)</generator>
		<language>zh-cn</language>
		<copyright>Copyright 1996 - 2008 疯狂代码  All Rights Reserved.</copyright>
		<pubDate>2010-03-11</pubDate>
		<item>
			<title><![CDATA[struts中的action:初学者入门－－Structs中基本配置入门]]></title>
			<link>http://CrazyCoder.cn/Java/Article78981.html</link>
			<description>
				<![CDATA[

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.为Structs应用配置Web.xml文件<br/>　　<br/>　　第<img src='/icons/14569yi.gif' />步:配置ActionServlet<br/>　　<br/>　　&lt; servlet&gt;<br/>　　&lt; servlet-name&gt;action&lt; /servlet-name&gt;<br/>　　&lt; servlet-<img src='/icons/14569class.gif' />&gt;org.appache.structs.ActionServlet&lt; /servlet-<img src='/icons/14569class.gif' />&gt;<br/>　　&lt; /servlet&gt;<br/>　　<br/>　　&lt; servlet-mapping&gt;<br/>　　&lt; servlet-name&gt;action&lt; /servlet-name&gt;<br/>　　&lt; uri-pattern&gt;*.do&lt; /url-pattern&gt;<br/>　　&lt; /servlet-mapping&gt;<br/>　　<br/>　　注意:不管应用中包含多少个子应用,都只需配置<img src='/icons/14569yi.gif' />个ActionServlet,<img src='/icons/14569yinwei.gif' />ActionServlet支持多线程,目前<img src='/icons/14569de.gif' />Structs框架只允许在应用中配置<img src='/icons/14569yi.gif' />个ActionServlet<img src='/icons/14569dou2.gif' /><br/>　　<br/>　　第 2步:<img src='/icons/14569chushi.gif' />化参数对Servlet<img src='/icons/14569de.gif' />运行环境进行<img src='/icons/14569chushi.gif' />化配置<img src='/icons/14569dou2.gif' /><br/>　　<br/>　　&lt; servlet&gt;<br/>　　&lt; servlet-name&gt; action&lt; /servlet-name&gt;<br/>　　&lt; servlet-<img src='/icons/14569class.gif' />&gt; org.appache.structs.ActionServlet &lt; /servlet-<img src='/icons/14569class.gif' />&gt;<br/>　　&lt; init-param&gt;<br/>　　&lt; param-name&gt;config&lt; /param-name&gt;<br/>　　&lt; param-value&gt;/WEB-INF/structs-config.xml&lt; /param-value&gt;<br/>　　&lt; /init-param&gt;<br/>　　&lt; /servlet&gt;<br/>　　<br/>　　表2-1. Struts1.1中用到<img src='/icons/14569de.gif' /><img src='/icons/14569chushi.gif' />化参数<br/>　　<br/>　　参数名　　　　　　 含义/默认值<br/>　　config　　　　　以相对路径<img src='/icons/14569de.gif' />方式指明Struts应用<img src='/icons/14569chengxu.gif' /><img src='/icons/14569de.gif' />配置文件位置<img src='/icons/14569dou2.gif' />如不设置<img src='/icons/14569dou.gif' />则默认值为/WEB-INF/struts-config.xml<img src='/icons/14569dou2.gif' /><br/>　　config/sub1　　 以相对路径<img src='/icons/14569de.gif' />方式指明子应用<img src='/icons/14569chengxu.gif' /><img src='/icons/14569de.gif' />配置文件位置<img src='/icons/14569dou.gif' /><img src='/icons/14569yi.gif' />般来说<img src='/icons/14569dou.gif' />很少用到子应用<img src='/icons/14569chengxu.gif' /><img src='/icons/14569dou.gif' />在此不多描述<img src='/icons/14569dou2.gif' /><br/>　　debug　　　　　 设置Servlet<img src='/icons/14569de.gif' />debug级别<img src='/icons/14569dou.gif' />控制日志记录<img src='/icons/14569de.gif' />详细程度<img src='/icons/14569dou2.gif' />默认为0<img src='/icons/14569dou.gif' />记录相对最少<img src='/icons/14569de.gif' />日志信息<img src='/icons/14569dou2.gif' /><br/>　　detail　　　　　设置Digester<img src='/icons/14569de.gif' />debug级别<img src='/icons/14569dou.gif' />Digester是Struts框架所使用<img src='/icons/14569de.gif' />用来解析xml配置文件<img src='/icons/14569de.gif' /><img src='/icons/14569yi.gif' />个框架<img src='/icons/14569dou.gif' />通过该设置<img src='/icons/14569dou.gif' />可以查看区别详细等级<img src='/icons/14569de.gif' />解析日志<img src='/icons/14569dou2.gif' />默认为0<img src='/icons/14569dou.gif' />记录相对最少<img src='/icons/14569de.gif' />日志信息<img src='/icons/14569dou2.gif' /><br/>　　<br/>　　第 3步:配置欢迎清单<br/>　　<br/>　　当客户访问Web应用时<img src='/icons/14569dou.gif' />如果仅仅给出Web应用<img src='/icons/14569de.gif' />Root URL<img src='/icons/14569dou.gif' />没用指定具体<img src='/icons/14569de.gif' />文件名<img src='/icons/14569dou.gif' />Web容器会自动<img src='/icons/14569diaoyong.gif' />Web应用<img src='/icons/14569de.gif' />欢迎文件<img src='/icons/14569dou2.gif' /><br/>　　<br/>　　&lt; welcome-file-list&gt;<br/>　　&lt; welcome-file&gt;welcome.jsp&lt; /welcome-file&gt;<br/>　　&lt; welcome-file&gt;index.jsp&lt; /welcome-file&gt;<br/>　　&lt; /welcome-fiel-list&gt;<br/>　　<br/>　　介绍说明:&lt; welcome-file-list&gt;可以包含多个&lt; welcome-file&gt;子元素<img src='/icons/14569dou.gif' />首先查找第<img src='/icons/14569yi.gif' />个&lt; welcome-file&gt;文件<img src='/icons/14569dou2.gif' />

<br/>

<span <img src='/icons/14569class.gif' />="xspace-totlerecord">3</span><span <img src='/icons/14569class.gif' />="xspace-totlepages">1/3</span><span <img src='/icons/14569class.gif' />="xspace-current">1</span>23&gt;<br/> <a href="/mypdf/78981.pdf" title="查看 struts中的action:初学者入门－－Structs中基本配置入门 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-10</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78981.html</guid>
		</item>
		<item>
			<title><![CDATA[springintegration:OpenCredo宣布为Spring Integration增加AMQP支持]]></title>
			<link>http://CrazyCoder.cn/Java/Article78980.html</link>
			<description>
				<![CDATA[

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OpenCredo是<img src='/icons/59169yi.gif' />家咨询公司<img src='/icons/59169dou.gif' />由Jonas Partner和Russ Miles创建<img src='/icons/59169dou.gif' />近日发布了<img src='/icons/59169yi.gif' />个开源<img src='/icons/59169de.gif' />适配器——可以让Spring Integration应用和AMQP端点协同工作<img src='/icons/59169dou2.gif' /><br/><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Advanced Message Queuing Protocol(AMQP)是个平台中立<img src='/icons/59169de.gif' />规范标准<img src='/icons/59169dou.gif' />描述了面向客户<img src='/icons/59169de.gif' />消息中间件<img src='/icons/59169dou.gif' />作为<img src='/icons/59169yi.gif' />个线级协议(wire-level<img src='/icons/59169dou.gif' />该协议是对以 8进制数据流在网络上进行传输<img src='/icons/59169de.gif' />数据格式<img src='/icons/59169de.gif' />描述——译者注)<img src='/icons/59169dou.gif' />它并没有规定API<img src='/icons/59169de.gif' />实现细节<img src='/icons/59169dou2.gif' />大家可以将其看作是适合于异步消息<img src='/icons/59169de.gif' />特定协议<img src='/icons/59169dou2.gif' />任何客户端都可以实现它<img src='/icons/59169dou.gif' />包括JMS API<img src='/icons/59169dou2.gif' /><br/><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RabbitMQ是个面向消息<img src='/icons/59169de.gif' />中间件(MOM)产品<img src='/icons/59169dou.gif' />使用Erlang开发<img src='/icons/59169dou.gif' />因此能够充分利用Erlang语言优秀<img src='/icons/59169de.gif' />线程和多核能力<img src='/icons/59169dou.gif' />可以无缝地将单VM上<img src='/icons/59169de.gif' />并发代码转换为跨越多个物理节点<img src='/icons/59169de.gif' />分布式应用<img src='/icons/59169dou2.gif' />RabbitMQ并没有提供JMS客户端<img src='/icons/59169dou.gif' />但却提供了AMQP客户端<img src='/icons/59169dou2.gif' />RabbitMQ并不是唯<img src='/icons/59169yi.gif' /><img src='/icons/59169yi.gif' />个考虑到可伸缩性而使用Erlang进行开发<img src='/icons/59169de.gif' />中间件产品<img src='/icons/59169dou.gif' />ejbabberd(XMPP远程消息服务器)、CouchDB(文档数据库)以及Amazon<img src='/icons/59169de.gif' />SimpleDB(分布式数据库)都是使用Erlang进行开发<img src='/icons/59169de.gif' /><img src='/icons/59169dou2.gif' /><br/><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 虽然JMS是Java客户端和消息中间件进行互联<img src='/icons/59169de.gif' />标准机制<img src='/icons/59169dou.gif' />使用也非常广泛<img src='/icons/59169dou.gif' />但它却并非是唯<img src='/icons/59169yi.gif' />的选<img src='/icons/59169dou2.gif' />AMQP也为Java用户提供了优秀<img src='/icons/59169de.gif' />消息解决方案<img src='/icons/59169dou2.gif' />OpenCredo<img src='/icons/59169de.gif' />声明——集成AMQP和Spring Integration框架——阐明了如何通过Spring框架将基于AMQP<img src='/icons/59169de.gif' />消息系统引入到企业当中<img src='/icons/59169dou2.gif' /><br/><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Spring Integration构建在Spring框架的上<img src='/icons/59169dou.gif' />提供了面向消息<img src='/icons/59169de.gif' />解决方案<img src='/icons/59169dou.gif' />非常类似于ESB；它提供<img src='/icons/59169de.gif' />适配器可以让代码响应外部系统事件<img src='/icons/59169dou.gif' />这和EJB中<img src='/icons/59169de.gif' />Message Driven Bean或是Spring中<img src='/icons/59169de.gif' />Message Driven POJO非常像<img src='/icons/59169dou2.gif' />OpenCredo框架<img src='/icons/59169de.gif' />目标在于为各种区别<img src='/icons/59169de.gif' />本地Java AMQP客户端提供<img src='/icons/59169yi.gif' />致<img src='/icons/59169de.gif' />使用方式<img src='/icons/59169dou.gif' />同时将其挂接(hook)到Spring Integration总线上<img src='/icons/59169dou2.gif' />目前<img src='/icons/59169dou.gif' />该支持包装了RabbitMQ AMQP Java客户端并通过Spring Integration创建了<img src='/icons/59169yi.gif' />个间接层以将逻辑和消息系统进行解耦<img src='/icons/59169dou2.gif' />重要<img src='/icons/59169de.gif' />是<img src='/icons/59169dou.gif' />AMQP是个开放、线级协议<img src='/icons/59169dou.gif' />这样<img src='/icons/59169yi.gif' />个客户端就能和多个厂商协同工作<img src='/icons/59169dou.gif' />而JMS客户端则只能绑定到固定版本<img src='/icons/59169de.gif' />JMS服务器上<img src='/icons/59169dou2.gif' /><br/><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OpenCredo和RabbitMQ CEO Alexis Richardson和RabbitMQ团队(Team)通力合作实现了该支持并计划对其进行不断升级<img src='/icons/59169dou2.gif' />其任务列表中还准备提供对事件驱动(和基于轮询<img src='/icons/59169de.gif' />方式相反)客户端<img src='/icons/59169de.gif' />支持以及为客户端提供声明式<img src='/icons/59169de.gif' />Spring事务管理支持<img src='/icons/59169dou2.gif' />最近OpenCredo宣布联合Spring Integration以提供对Esper(<img src='/icons/59169yi.gif' />个Complex Event Processing方案)<img src='/icons/59169de.gif' />支持<img src='/icons/59169dou2.gif' />OpenCredo通过和简单、以POJO为中心<img src='/icons/59169de.gif' />Spring Integration<img src='/icons/59169de.gif' />联手合作<img src='/icons/59169dou.gif' />为Esper<img src='/icons/59169de.gif' />支持提供了强大<img src='/icons/59169de.gif' />消息和监控能力<img src='/icons/59169dou2.gif' /><br/><br/>
 <a href="/mypdf/78980.pdf" title="查看 springintegration:OpenCredo宣布为Spring Integration增加AMQP支持 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-10</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78980.html</guid>
		</item>
		<item>
			<title><![CDATA[java敏捷开发:敏捷开发中编写高质量Java代码(图)]]></title>
			<link>http://CrazyCoder.cn/Java/Article78979.html</link>
			<description>
				<![CDATA[

　&nbsp;&nbsp;&nbsp; 敏捷开发<img src='/icons/65708de.gif' />理念已经流行了很长<img src='/icons/65708de.gif' />时间<img src='/icons/65708dou.gif' />在敏捷开发中<img src='/icons/65708de.gif' />开发迭代阶段中<img src='/icons/65708dou.gif' />我们可以通过 5个步骤<img src='/icons/65708dou.gif' />来有效<img src='/icons/65708de.gif' />提高整个项目<img src='/icons/65708de.gif' />代码质量<img src='/icons/65708dou2.gif' /> 
　　Java项目开发过程中<img src='/icons/65708dou.gif' />由于开发人员<img src='/icons/65708de.gif' />经验、Java代码编写习惯<img src='/icons/65708dou.gif' />以及缺乏统<img src='/icons/65708yi.gif' /><img src='/icons/65708de.gif' />标准和管理流程<img src='/icons/65708dou.gif' />往往导致整个项目<img src='/icons/65708de.gif' />代码质量较差<img src='/icons/65708dou.gif' />难于维护<img src='/icons/65708dou.gif' />需要较大<img src='/icons/65708de.gif' />测试投入和周期等问题<img src='/icons/65708dou2.gif' />这些问题在<img src='/icons/65708yi.gif' />个项目组初建、需求和设计均具有不完全可预期性和完备性<img src='/icons/65708de.gif' />全新项目中将尤为突出<img src='/icons/65708dou2.gif' /><br/><br/>
　　如图1所示<img src='/icons/65708dou.gif' />敏捷开发过程经历需求调研<img src='/icons/65708dou.gif' />用例分析和用例分解<img src='/icons/65708dou.gif' />进入开发迭代阶段<img src='/icons/65708dou2.gif' />在每个迭代过程中<img src='/icons/65708dou.gif' />可以采用以下步骤来保证和提高整个项目<img src='/icons/65708de.gif' />代码质量:统<img src='/icons/65708yi.gif' />编码规范标准、代码样式;静态代码分析(<img src='/icons/65708static.gif' />codereview);单元测试;持续集成;代码评审和重构(Review&amp;Refactor)<img src='/icons/65708dou2.gif' />下文将针对每个步骤和其所使用<img src='/icons/65708de.gif' />工具、思路方法进行详细描述<img src='/icons/65708dou2.gif' /><br/><br/>
　　<br/><br/>
<IMG src="http://CrazyCoder.cn/WebFiles/20103/9a4e4807-eaae-4daa-855a-875be98a860d.jpg" border=0><br/><br/>
<br/><br/>
　　图1.敏捷开发中<img src='/icons/65708de.gif' />Java代码质量保证步骤<br/><br/>
<STRONG>　　步骤<img src='/icons/65708yi.gif' />:统<img src='/icons/65708yi.gif' />编码规范标准、代码样式</STRONG><br/><br/>
　　规范标准统<img src='/icons/65708yi.gif' /><img src='/icons/65708de.gif' />编码会增加项目代码<img src='/icons/65708de.gif' />可读性和可维护性<img src='/icons/65708dou.gif' />但实际情况往往是项目组内<img src='/icons/65708de.gif' />Java代码开发人员<img src='/icons/65708de.gif' />编码风格常常各不相同<img src='/icons/65708dou.gif' />这可能是由于区别<img src='/icons/65708de.gif' />经验习惯或者缺乏编码规范标准方面<img src='/icons/65708de.gif' />学习造成<img src='/icons/65708de.gif' /><img src='/icons/65708dou2.gif' />这样<img src='/icons/65708yi.gif' />来<img src='/icons/65708dou.gif' />其他项目成员或者维护人员在阅读项目代码时就需要花费更多<img src='/icons/65708de.gif' />时间来理解代码作者<img src='/icons/65708de.gif' />意图<img src='/icons/65708dou.gif' />所以制定并采取统<img src='/icons/65708yi.gif' /><img src='/icons/65708de.gif' />编码规范标准就显得很重要<img src='/icons/65708dou2.gif' />编码规范标准主要应包含以下几个方面:<br/><br/>
　　◆<img src='/icons/65708yi.gif' />般规则和格式规范标准<img src='/icons/65708dou2.gif' />例如代码缩进、<img src='/icons/65708chengxu.gif' />块规范标准、每行最大代码长度等<img src='/icons/65708dou2.gif' /><br/><br/>
　　◆命名规则<img src='/icons/65708dou2.gif' />例如包名、类名、变量、思路方法、接口、参数等命名规范标准<br/><br/>
　　◆文档规范标准<img src='/icons/65708dou2.gif' />例如类文件头声明、类注释、成员变量和思路方法注释等规范标准<img src='/icons/65708dou2.gif' /><br/><br/>
　　◆编程规范标准<img src='/icons/65708dou2.gif' />例如异常、并发、多线程等方面<img src='/icons/65708de.gif' />处理方式<img src='/icons/65708dou2.gif' /><br/><br/>
　　◆其他规范标准<img src='/icons/65708dou2.gif' />例如日志格式、属性文件格式<img src='/icons/65708dou.gif' />返回值和消息格式<img src='/icons/65708dou2.gif' /><br/><br/>
　　项目<img src='/icons/65708de.gif' />编码规范标准可以参考已有<img src='/icons/65708de.gif' /><img src='/icons/65708yi.gif' />些Java编程规范标准书籍和其他相关资料并结合项目<img src='/icons/65708de.gif' />本身来制定<img src='/icons/65708dou.gif' />可供参考<img src='/icons/65708de.gif' />书籍有<img src='/icons/65708smhl.gif' />Java编程风格<img src='/icons/65708smhr.gif' />(英文书名为:TheElementsofJavaStyle)<img src='/icons/65708dou2.gif' />编码规范标准要形成文档<img src='/icons/65708dou.gif' />而且要简洁明了<img src='/icons/65708dou.gif' />并组织项目成员<img src='/icons/65708yi.gif' />起学习<img src='/icons/65708dou.gif' />确保所有成员正确理解所有条目<img src='/icons/65708dou2.gif' /><br/><br/>
　　<img src='/icons/65708yi.gif' />旦编码规范标准确定<img src='/icons/65708dou.gif' />就可以利用Eclipse自身提供<img src='/icons/65708de.gif' />功能来控制代码样式和格式<img src='/icons/65708dou2.gif' />具体做法是<img src='/icons/65708dou.gif' />点击Eclipse<img src='/icons/65708de.gif' />Windows-&gt;Preference菜单项<img src='/icons/65708dou.gif' />在打开<img src='/icons/65708de.gif' />Preferences对话框<img src='/icons/65708de.gif' />左侧栏中找到Java节点下<img src='/icons/65708de.gif' />子项CodeStyle(如图2)<img src='/icons/65708dou.gif' />该项和它<img src='/icons/65708de.gif' />子项允许您对Java代码<img src='/icons/65708de.gif' />样式进行控制<img src='/icons/65708dou2.gif' /><br/><br/>
　　<IMG style="DISPLAY: block; MARGIN: 0px auto; TEXT-ALIGN: center" height=394 alt=Eclipse代码样式设置窗口 src="http://CrazyCoder.cn/WebFiles/20103/4f0e4890-3e59-4422-871a-d1ac5c821d7e.jpg" width=498><br/><br/>
　　图2.Eclipse代码样式设置窗口<br/><br/>
　　例如<img src='/icons/65708dou.gif' />为了使用自动格式化工具<img src='/icons/65708dou.gif' />可以在Eclipse提供<img src='/icons/65708de.gif' />默认代码格式配置<img src='/icons/65708de.gif' />基础上建立自定义<img src='/icons/65708de.gif' />格式<img src='/icons/65708dou2.gif' />在Formatter面板中<img src='/icons/65708dou.gif' />点击New<img src='/icons/65708dou.gif' />输入新<img src='/icons/65708de.gif' />名字并选择<img src='/icons/65708yi.gif' />个默认<img src='/icons/65708de.gif' />配置作为<img src='/icons/65708chushi.gif' />化格式<img src='/icons/65708dou.gif' />如图3所示<img src='/icons/65708dou2.gif' /><br/><br/>
　　<IMG style="DISPLAY: block; MARGIN: 0px auto; TEXT-ALIGN: center" height=468 alt=创建新<img src='/icons/65708de.gif' />代码格式配置 src="http://CrazyCoder.cn/WebFiles/20103/a03ef57b-b18b-45a9-ba4e-3990522be8f9.jpg" width=498><br/><br/>
　　图3.创建新<img src='/icons/65708de.gif' />代码格式配置<br/><br/>
　　单击OK后就可以在新打开<img src='/icons/65708de.gif' />窗口中进行修改定制自己需要<img src='/icons/65708de.gif' />格式<img src='/icons/65708dou2.gif' />如图4所示<img src='/icons/65708dou2.gif' /><br/><br/>
　　<IMG style="DISPLAY: block; MARGIN: 0px auto; TEXT-ALIGN: center" height=515 alt=创建新<img src='/icons/65708de.gif' />代码格式配置 src="http://CrazyCoder.cn/WebFiles/20103/961e5e9c-0eff-425b-9eeb-fe37ed3c1f4d.jpg" width=498><br/><br/>
　　图4.创建新<img src='/icons/65708de.gif' />代码格式配置<br/><br/>
　　修改完成后点击Apply保存所作修改<img src='/icons/65708dou2.gif' />同时可以点击Export将当前<img src='/icons/65708de.gif' />格式定义导出成<img src='/icons/65708yi.gif' />个XML文件<img src='/icons/65708dou.gif' />这样项目组<img src='/icons/65708de.gif' />其他成员就可以很方便通过点击图3中<img src='/icons/65708de.gif' />Import按钮来导入该XML文件来使用同<img src='/icons/65708yi.gif' />个代码格式定义<img src='/icons/65708dou2.gif' /><br/><br/>
　　这样每次在提交代码到版本控制服务器前就可以通过Eclipse界面里<img src='/icons/65708de.gif' />Source-&gt;Format菜单来对代码进行格式化<img src='/icons/65708dou.gif' />从而使整个项目<img src='/icons/65708de.gif' />代码具有相同<img src='/icons/65708de.gif' />格式<img src='/icons/65708dou2.gif' />同样可以通过对CodeStyle下<img src='/icons/65708de.gif' />其他项目进行设置来帮助对Java代码<img src='/icons/65708de.gif' />样式进行控制<img src='/icons/65708dou2.gif' />将所有这些样式文件导出成XML文件后<img src='/icons/65708dou.gif' />同编码规范标准<img src='/icons/65708yi.gif' />起归档<img src='/icons/65708dou.gif' />供所有项目成员使用<img src='/icons/65708dou2.gif' /><br/><br/>
<br/><br/>
<br/>

<span <img src='/icons/65708class.gif' />="xspace-totlerecord">5</span><span <img src='/icons/65708class.gif' />="xspace-totlepages">1/5</span><span <img src='/icons/65708class.gif' />="xspace-current">1</span>2345&gt;<br/> <a href="/mypdf/78979.pdf" title="查看 java敏捷开发:敏捷开发中编写高质量Java代码(图) 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-10</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78979.html</guid>
		</item>
		<item>
			<title><![CDATA[云计算:云计算呼唤基于事件的API]]></title>
			<link>http://CrazyCoder.cn/Java/Article78978.html</link>
			<description>
				<![CDATA[

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 引自 William Vambenepe<img src='/icons/14779de.gif' />说法:<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 至少从发出第<img src='/icons/14779yi.gif' />个SNMP自陷起<img src='/icons/14779dou.gif' />事件/警报/通知在IT管理领域已经成为中心<img src='/icons/14779de.gif' />概念<img src='/icons/14779dou.gif' />甚至有可能比这更旧远<img src='/icons/14779dou2.gif' />然而它们在所有<img src='/icons/14779de.gif' />云管理API/协议中神奇<img src='/icons/14779de.gif' />蒸发了<img src='/icons/14779dou2.gif' /> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然而现今大部分云管理API都是基于轮询<img src='/icons/14779de.gif' /><img src='/icons/14779dou2.gif' />按照George Reese<img src='/icons/14779de.gif' />说法<img src='/icons/14779dou.gif' />这样<img src='/icons/14779de.gif' />轮询方式:<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...造成<img src='/icons/14779de.gif' />结果就是对CPU能力<img src='/icons/14779de.gif' />极大<img src='/icons/14779de.gif' />效率浪费...不仅是对云计算供应商<img src='/icons/14779dou.gif' />同时也会浪费双方<img src='/icons/14779de.gif' />带宽<img src='/icons/14779dou2.gif' />我们当然会进行各种优化以尽量避免轮询...[但]这<img src='/icons/14779yi.gif' />底线仍存在<img src='/icons/14779dou.gif' />无论如何<img src='/icons/14779dou.gif' />我们大多数<img src='/icons/14779de.gif' /><img src='/icons/14779diaoyong.gif' />白白浪费了<img src='/icons/14779dou2.gif' /> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了解决这<img src='/icons/14779yi.gif' />问题<img src='/icons/14779dou.gif' />Reeser提出<img src='/icons/14779yi.gif' />种事件驱动API<img src='/icons/14779de.gif' />解决的道<img src='/icons/14779dou.gif' />由"云计算供应商通知我们所关心<img src='/icons/14779de.gif' />资源<img src='/icons/14779de.gif' />变更"<img src='/icons/14779dou.gif' />他可以还注意了该提案可能会遇到了<img src='/icons/14779yi.gif' />些挑战:<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src='/icons/14779yi.gif' />个事件驱动<img src='/icons/14779de.gif' />API要求<img src='/icons/14779yi.gif' />定层次<img src='/icons/14779de.gif' />标准化<img src='/icons/14779dou.gif' />而这种标准化目前在云计算领域还不具备<img src='/icons/14779dou.gif' />你不能让每个消费者都设计他们自己<img src='/icons/14779de.gif' />回调API<img src='/icons/14779dou.gif' />而且就算支持跨云系统<img src='/icons/14779de.gif' /><img src='/icons/14779diaoyong.gif' /><img src='/icons/14779dou.gif' />每个云计算供应商设计其自己<img src='/icons/14779de.gif' />回调协议仍然是有问题<img src='/icons/14779de.gif' /><img src='/icons/14779dou2.gif' /> 你不能通过回调来提供数据<img src='/icons/14779dou.gif' /><img src='/icons/14779yinwei.gif' />提供数据要求逆向<img src='/icons/14779de.gif' />身份验证<img src='/icons/14779dou.gif' />这将会使整个流程复杂化<img src='/icons/14779dou2.gif' /> 最后<img src='/icons/14779dou.gif' />消费者无法完全信赖回调API<img src='/icons/14779dou2.gif' />仍然需要创建自己<img src='/icons/14779de.gif' /><img src='/icons/14779diaoyong.gif' />以验证云计算供应商在真实有效<img src='/icons/14779de.gif' />合理运作<img src='/icons/14779dou2.gif' /> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于这些挑战<img src='/icons/14779dou.gif' />Reese提出了<img src='/icons/14779yi.gif' />些简单<img src='/icons/14779de.gif' />解决方案:<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 引入标准<img src='/icons/14779de.gif' />回调格式(应当非常简洁<img src='/icons/14779dou.gif' />比如像这样[consumer-base]/[as<img src='/icons/14779set.gif' /> <img src='/icons/14779class.gif' />]/[id]) 将回调事件集成到现有<img src='/icons/14779de.gif' />云API中<img src='/icons/14779dou2.gif' /> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基于他在WS-Not<img src='/icons/14779if.gif' />ication系列规范标准方面<img src='/icons/14779de.gif' />工作<img src='/icons/14779dou.gif' />Vambenepe强烈支持简单API<img src='/icons/14779de.gif' />设想<img src='/icons/14779dou2.gif' />按照他<img src='/icons/14779de.gif' />观点<img src='/icons/14779dou.gif' />以云计算为中心<img src='/icons/14779de.gif' />事件协议可以通过关注于少量<img src='/icons/14779de.gif' />用例(仅针对云计算场景)而得以简化<img src='/icons/14779dou2.gif' />在Vambenepe<img src='/icons/14779de.gif' />观点中<img src='/icons/14779dou.gif' />以下<img src='/icons/14779de.gif' />元素可以被用作云计算事件实现<img src='/icons/14779de.gif' />根基:<br/><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 事件<img src='/icons/14779de.gif' />类型<img src='/icons/14779dou2.gif' /><br/><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 客户端应当能够指明它所感兴趣<img src='/icons/14779de.gif' />是什么类型<img src='/icons/14779de.gif' />资源信息<img src='/icons/14779dou2.gif' /> 你如何描述你所关心<img src='/icons/14779de.gif' />变更？是否有<img src='/icons/14779yi.gif' />个达成<img src='/icons/14779yi.gif' />致<img src='/icons/14779de.gif' />状态集<img src='/icons/14779dou.gif' />而对于资源你仅需要在状态转换才收到通知？你是否能够指明<img src='/icons/14779yi.gif' />个激发<img src='/icons/14779yi.gif' />个事情<img src='/icons/14779de.gif' />最小严重性等级？...在Vambenepe看来WS-Topics展现了解决这<img src='/icons/14779yi.gif' />问题<img src='/icons/14779de.gif' />最佳方案<img src='/icons/14779dou2.gif' /> <br/><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *事件格式<img src='/icons/14779dou2.gif' /><br/><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 云事件应当符合<img src='/icons/14779yi.gif' />个标准<img src='/icons/14779de.gif' />事件模型定义: 事件元数据是如何被捕捉<img src='/icons/14779de.gif' />(如<img src='/icons/14779dou.gif' />观察<img src='/icons/14779de.gif' />时间戳<img src='/icons/14779dou.gif' />也许和通知消息发出<img src='/icons/14779de.gif' />时间不<img src='/icons/14779yi.gif' />样)？如果事件<img src='/icons/14779de.gif' />负载是资源新状态<img src='/icons/14779de.gif' />表示<img src='/icons/14779dou.gif' />那么它能否指明域<img src='/icons/14779de.gif' />变更(原来<img src='/icons/14779de.gif' />值是什么)？<br/><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *订阅创建<img src='/icons/14779dou2.gif' /><br/><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需要创建<img src='/icons/14779yi.gif' />个标准<img src='/icons/14779de.gif' />订阅机制<img src='/icons/14779dou.gif' />考虑如下问题: 你需要变更订阅载体所用<img src='/icons/14779de.gif' />过滤器吗？你能更改投递<img src='/icons/14779de.gif' />端点吗？...来谁来设置过期时间？提供者能否设置最大<img src='/icons/14779de.gif' />持续时间？是否能续订<img src='/icons/14779yi.gif' />个订阅...？如果你<img src='/icons/14779de.gif' />订阅<img src='/icons/14779yinwei.gif' />投递端点下线而失效了如何办？...你订阅<img src='/icons/14779de.gif' />时候能够提供<img src='/icons/14779yi.gif' />个单独<img src='/icons/14779de.gif' />...订阅管理...端点(和事件投递端点区别开)吗？<br/><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *投递机制<img src='/icons/14779dou2.gif' /><br/><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 事件投递有许多选择<img src='/icons/14779dou.gif' />从永久性<img src='/icons/14779de.gif' />开放HTTP连接(和COMET长轮询相似)到HTTP回调URL<img src='/icons/14779dou.gif' />以及AMQP,或是电子邮件<img src='/icons/14779dou2.gif' /> <br/><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *安全<img src='/icons/14779dou2.gif' />取决于投递机制<img src='/icons/14779dou.gif' />可能会需要区别<img src='/icons/14779de.gif' />安全实现<img src='/icons/14779dou2.gif' /> <br/><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *流量控制<img src='/icons/14779dou2.gif' /><img src='/icons/14779yi.gif' />个事件实现应该保证<img src='/icons/14779dou.gif' />不管是资源还是消费者都不会被发出/接收到<img src='/icons/14779de.gif' />事件洪流淹没<img src='/icons/14779dou2.gif' /> <br/><br/>
如InfoQ早前曾为你报道过<img src='/icons/14779de.gif' />那样<img src='/icons/14779dou.gif' />异步API对于云计算非常重要<img src='/icons/14779dou2.gif' />引入完整<img src='/icons/14779de.gif' />事件协议可以解决这<img src='/icons/14779yi.gif' />问题和附带<img src='/icons/14779de.gif' />问题<img src='/icons/14779dou2.gif' />希望这<img src='/icons/14779yi.gif' />规范标准<img src='/icons/14779de.gif' />作者可以吸取WS-Not<img src='/icons/14779if.gif' />ication<img src='/icons/14779de.gif' />经验<img src='/icons/14779dou.gif' />创造出<img src='/icons/14779yi.gif' />个不以牺牲覆盖性和延伸范围<img src='/icons/14779de.gif' />简单协议<img src='/icons/14779dou2.gif' /><br/><br/>
 <a href="/mypdf/78978.pdf" title="查看 云计算:云计算呼唤基于事件的API 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-10</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78978.html</guid>
		</item>
		<item>
			<title><![CDATA[基于soa:基于SOA的企业信息共享研究]]></title>
			<link>http://CrazyCoder.cn/Java/Article78977.html</link>
			<description>
				<![CDATA[

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先分析了企业信息化建设中存在<img src='/icons/43018de.gif' />信息孤岛问题<img src='/icons/43018dou.gif' />以及采用面向服务架构<img src='/icons/43018de.gif' />优势所在<img src='/icons/43018dou.gif' />进而给出了基于SOA<img src='/icons/43018de.gif' />企业信息共享平台<img src='/icons/43018de.gif' />技术架构<img src='/icons/43018dou.gif' />该架构能有效整合企业内部<img src='/icons/43018de.gif' />信息系统<img src='/icons/43018dou.gif' />安全快捷地实现企业信息<img src='/icons/43018de.gif' />共享<img src='/icons/43018dou.gif' />并进<img src='/icons/43018yi.gif' />步扩展企业信息共享<img src='/icons/43018de.gif' />范围<img src='/icons/43018dou2.gif' />
　　<STRONG><img src='/icons/43018yi.gif' />、企业信息化建设中存在<img src='/icons/43018de.gif' />问题</STRONG><br/><br/>
　　我国企业信息化建设始于20世纪80年代<img src='/icons/43018dou.gif' />目前大部分企业已经建立了各种各样<img src='/icons/43018de.gif' />应用系统<img src='/icons/43018dou.gif' />对提高企业<img src='/icons/43018de.gif' />管理水平和市场竞争力起到了巨大<img src='/icons/43018de.gif' />作用<img src='/icons/43018dou2.gif' />然而<img src='/icons/43018dou.gif' />由于在企业信息化建设的初缺乏总体规划<img src='/icons/43018dou.gif' />导致其再实施过程中还存在如下<img src='/icons/43018yi.gif' />些问题:<br/><br/>
　　1.数据描述局部有序<img src='/icons/43018dou2.gif' />缺乏统<img src='/icons/43018yi.gif' />规范标准<img src='/icons/43018dou.gif' />严重影响资源使用和共享企业各部门多从自身业务出发来构建信息系统<img src='/icons/43018dou.gif' />信息资源单独管理<img src='/icons/43018dou.gif' />造成了业务和数据<img src='/icons/43018de.gif' />相对自我封闭<img src='/icons/43018dou2.gif' />对需要跨部门共享<img src='/icons/43018de.gif' />业务信息<img src='/icons/43018dou.gif' />因其描述格式<img src='/icons/43018dou.gif' />描述方式均不统<img src='/icons/43018yi.gif' /><img src='/icons/43018dou.gif' />导致信息孤岛<img src='/icons/43018de.gif' />普遍存在<img src='/icons/43018dou2.gif' /><br/><br/>
　　2.信息共享模式单<img src='/icons/43018yi.gif' /><img src='/icons/43018dou2.gif' />可扩展性不强基于传统技术构建而成<img src='/icons/43018de.gif' />企业信息系统<img src='/icons/43018dou.gif' />信息共享<img src='/icons/43018de.gif' />实现常以点对点<img src='/icons/43018de.gif' />模式为主<img src='/icons/43018dou.gif' />这种模式欠缺灵活<img src='/icons/43018dou.gif' />实施困难<img src='/icons/43018dou.gif' />不利于各取所需要求下<img src='/icons/43018de.gif' />业务需求<img src='/icons/43018dou2.gif' /><br/><br/>
　　3.应用系统多自成体系<img src='/icons/43018dou2.gif' />信息资源<img src='/icons/43018de.gif' />获取和使用机制僵硬<img src='/icons/43018dou2.gif' /><br/><br/>
　　应用系统受部门职能分割<img src='/icons/43018de.gif' />影响<img src='/icons/43018dou.gif' />重复管理、重复维护<img src='/icons/43018dou.gif' />使工作量大大增加<img src='/icons/43018dou2.gif' />其次<img src='/icons/43018dou.gif' />当因部门重组等原因导致网络状况变化或系统升级<img src='/icons/43018de.gif' />情况<img src='/icons/43018dou.gif' />极易引发信息资源<img src='/icons/43018de.gif' />重新组织<img src='/icons/43018dou.gif' />不可避免地需要进行重复建设<img src='/icons/43018dou2.gif' /><br/><br/>
　　面向服务架构为突破信息孤岛<img src='/icons/43018dou.gif' />整合信息资源、缩短开发周期、降低开发成本<img src='/icons/43018de.gif' />企业信息化应用带来了新<img src='/icons/43018de.gif' />曙光<img src='/icons/43018dou2.gif' /><br/><br/>
　<STRONG>　 2、SOA<img src='/icons/43018de.gif' />优势所在</STRONG><br/><br/>
　　面向服务架构(Service-OrientedArchitecture<img src='/icons/43018dou.gif' />SOA)是<img src='/icons/43018yi.gif' />种架构模型<img src='/icons/43018dou.gif' />其基本思想是以服务为核心<img src='/icons/43018dou.gif' />将企业<img src='/icons/43018de.gif' />IT资源整合成可操作<img src='/icons/43018de.gif' />、基于标准<img src='/icons/43018de.gif' />服务<img src='/icons/43018dou.gif' />使其能被重新组合和应用<img src='/icons/43018dou2.gif' />SOA<img src='/icons/43018de.gif' />应用对突破企业信息化建设过程中长期存在<img src='/icons/43018de.gif' />瓶颈<img src='/icons/43018dou.gif' />诸如信息孤岛、适应需求能力差、重复建设、新应用周期长等问题提供了有力<img src='/icons/43018de.gif' />解决手段<img src='/icons/43018dou2.gif' /><br/><br/>
　　1.统<img src='/icons/43018yi.gif' />规范标准和标准<img src='/icons/43018dou2.gif' />突破信息鸿沟制约和传统技术手段区别<img src='/icons/43018dou.gif' />SOA技术架构强调统<img src='/icons/43018yi.gif' />规划、统<img src='/icons/43018yi.gif' />标准、统<img src='/icons/43018yi.gif' />管理<img src='/icons/43018dou2.gif' />通过SOA技术架构<img src='/icons/43018de.gif' />应用<img src='/icons/43018dou.gif' />不仅辅助企业各业务部门制定科学合理<img src='/icons/43018de.gif' />整体规划<img src='/icons/43018dou.gif' />而且有效解决企业信息化建设中因缺乏统<img src='/icons/43018yi.gif' />框架而带来<img src='/icons/43018de.gif' />信息孤岛现象<img src='/icons/43018dou2.gif' />为解决企业各业务部门间<img src='/icons/43018dou.gif' />部门内<img src='/icons/43018de.gif' />互联互通难<img src='/icons/43018dou2.gif' />资源浪费、重复建设等问题提供有力支持<img src='/icons/43018dou2.gif' /><br/><br/>
　　2.创新技术理念<img src='/icons/43018dou.gif' />提升应用水平SOA以服务为理念<img src='/icons/43018dou.gif' />通过面向眼务<img src='/icons/43018de.gif' />方式组织开发<img src='/icons/43018dou.gif' />可以更准确地体现用户需求<img src='/icons/43018dou2.gif' />服务以松耦合<img src='/icons/43018de.gif' />状态存在于整个系统中<img src='/icons/43018dou.gif' />并可以随业务需求而变<img src='/icons/43018dou.gif' /><img src='/icons/43018yi.gif' />方面可以快速深度地满足用户需求<img src='/icons/43018dou2.gif' />另<img src='/icons/43018yi.gif' />方面可以减少企业各业务部门中<img src='/icons/43018de.gif' />业务冗余和重复开发<img src='/icons/43018dou2.gif' /><br/><br/>
　　3.改变建设模式<img src='/icons/43018dou.gif' />降低投资风险SOA基于全新<img src='/icons/43018de.gif' />技术架构来规划产品和组织生产<img src='/icons/43018dou.gif' />将极大地变革软件Software生产和应用模式<img src='/icons/43018dou.gif' />从而满足用户<img src='/icons/43018de.gif' />深层次需求<img src='/icons/43018dou2.gif' />SOA提供了构建IT系统<img src='/icons/43018de.gif' />全新思路方法<img src='/icons/43018dou.gif' />充分采用标准<img src='/icons/43018de.gif' />软件Software产品和服务组件<img src='/icons/43018dou.gif' />最终形成高效开发、标准规范标准、业界支撑广、技术发展快<img src='/icons/43018de.gif' />应用模式<img src='/icons/43018dou2.gif' /><br/><br/>

<br/>

<span <img src='/icons/43018class.gif' />="xspace-totlerecord">2</span><span <img src='/icons/43018class.gif' />="xspace-totlepages">1/2</span><span <img src='/icons/43018class.gif' />="xspace-current">1</span>2&gt;<br/> <a href="/mypdf/78977.pdf" title="查看 基于soa:基于SOA的企业信息共享研究 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-10</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78977.html</guid>
		</item>
		<item>
			<title><![CDATA[项目选择方法:独家:为Studio项目选择合适的测试思路方法]]></title>
			<link>http://CrazyCoder.cn/Java/Article78959.html</link>
			<description>
				<![CDATA[

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【IT专家网独家撰稿】应用软件Software开发完毕后<img src='/icons/57275dou.gif' />对于软件Software<img src='/icons/57275de.gif' />测试非常<img src='/icons/57275de.gif' />关键<img src='/icons/57275dou2.gif' />软件Software测试人员<img src='/icons/57275de.gif' />身价也<img src='/icons/57275yi.gif' />涨再涨<img src='/icons/57275dou.gif' />甚至有盖过<img src='/icons/57275chengxu.gif' />开发人员<img src='/icons/57275de.gif' />趋势<img src='/icons/57275dou2.gif' />从中也可以看出<img src='/icons/57275chengxu.gif' />测试人员<img src='/icons/57275de.gif' />重要性<img src='/icons/57275dou2.gif' />特别是在团队(Team)开发项目中<img src='/icons/57275dou.gif' />选择什么样<img src='/icons/57275de.gif' />测试类型、如何相互协调等等<img src='/icons/57275dou.gif' />显得尤其<img src='/icons/57275de.gif' />重要<img src='/icons/57275dou2.gif' />笔者这里就以<img src='/icons/57275yi.gif' />个团队(Team)项目为例<img src='/icons/57275dou.gif' />谈谈如何选择合适<img src='/icons/57275de.gif' />测试类型<img src='/icons/57275dou2.gif' />
　<STRONG>　<img src='/icons/57275yi.gif' />、普通测试<img src='/icons/57275dou2.gif' /></STRONG><br/><br/>
　　普通测试是指现有<img src='/icons/57275de.gif' /><img src='/icons/57275chengxu.gif' />或者来自另<img src='/icons/57275yi.gif' />个源<img src='/icons/57275de.gif' />测试<img src='/icons/57275dou2.gif' />经过<img src='/icons/57275yi.gif' />定<img src='/icons/57275de.gif' />包装的后<img src='/icons/57275dou.gif' />在Visual Studio中作为测试运行<img src='/icons/57275dou2.gif' />通常情况下<img src='/icons/57275dou.gif' />如果采用普通测试<img src='/icons/57275de.gif' />话<img src='/icons/57275dou.gif' />有<img src='/icons/57275yi.gif' />个前提条件<img src='/icons/57275dou.gif' />即需要有比较完善<img src='/icons/57275de.gif' />基础架构<img src='/icons/57275dou2.gif' />其测试效果<img src='/icons/57275de.gif' />好坏<img src='/icons/57275dou.gif' />则主要去取决于在框架外部创建<img src='/icons/57275de.gif' />自动化测试工具<img src='/icons/57275dou2.gif' />在使用<img src='/icons/57275yi.gif' />般测试<img src='/icons/57275de.gif' />时候<img src='/icons/57275dou.gif' />可以包装现有<img src='/icons/57275de.gif' />测试<img src='/icons/57275chengxu.gif' />或者第 3方工具<img src='/icons/57275dou2.gif' />在进行测试时<img src='/icons/57275dou.gif' />可以根据区别<img src='/icons/57275de.gif' />测试需要选择返回区别<img src='/icons/57275de.gif' />结果<img src='/icons/57275dou2.gif' />如有些情况下<img src='/icons/57275dou.gif' />只需要测试是否通过<img src='/icons/57275dou.gif' />那么就可以让其只返回“通过”或者“失败”<img src='/icons/57275de.gif' />结果即可<img src='/icons/57275dou.gif' />而不需要返回具体<img src='/icons/57275de.gif' />原因<img src='/icons/57275dou2.gif' />而有时候可能还需要具体<img src='/icons/57275de.gif' />结果<img src='/icons/57275dou2.gif' />如现在可能需要测试某个功能优化<img src='/icons/57275de.gif' />效果<img src='/icons/57275dou.gif' />那么就需要返回内部测试<img src='/icons/57275de.gif' />详细结果<img src='/icons/57275dou2.gif' />【IT专家网独家撰稿】<br/><br/>
　　普通测试最常用<img src='/icons/57275de.gif' /><img src='/icons/57275yi.gif' />个地方就是通过普通测试来收集代码覆盖率数据<img src='/icons/57275dou2.gif' />如通过如下步骤就可以收集到代码覆盖率<img src='/icons/57275de.gif' />相关数据<img src='/icons/57275dou2.gif' /><br/><br/>
　　第<img src='/icons/57275yi.gif' />步创建或者打开包含普通测试<img src='/icons/57275de.gif' />测试项目<img src='/icons/57275dou2.gif' />在解决方案资源管理器中<img src='/icons/57275dou.gif' />打开“解决方案项”文件夹<img src='/icons/57275dou2.gif' />然后在这个文件夹中找到<img src='/icons/57275yi.gif' />个叫做testrunconfig<img src='/icons/57275de.gif' />文件<img src='/icons/57275dou.gif' />并双击打开<img src='/icons/57275dou2.gif' />第 2步在打开<img src='/icons/57275de.gif' />对话框中<img src='/icons/57275dou.gif' />可以看到“代码覆盖率”<img src='/icons/57275de.gif' />按钮<img src='/icons/57275dou2.gif' />单击这个按钮<img src='/icons/57275dou.gif' />在“选择要检测<img src='/icons/57275de.gif' />项目”对话框中<img src='/icons/57275dou.gif' />选择要为其手机代码覆盖率数据<img src='/icons/57275de.gif' />成品代码 2进制文件<img src='/icons/57275dou2.gif' />单击应用进行测试即可<img src='/icons/57275dou2.gif' />在这个过程中需要注意<img src='/icons/57275yi.gif' />个问题<img src='/icons/57275dou2.gif' />有时候在“选择要检测<img src='/icons/57275de.gif' />项目”对话框中可能会找不到需要测试<img src='/icons/57275de.gif' /> 2进制代码文件<img src='/icons/57275dou2.gif' />这主要是需要检测<img src='/icons/57275de.gif' /> 2进制文件没有和添加<img src='/icons/57275chengxu.gif' />集关联<img src='/icons/57275de.gif' />原因<img src='/icons/57275dou2.gif' />此时需要先点击“添加<img src='/icons/57275chengxu.gif' />集”<img src='/icons/57275dou.gif' />然后再在“选择需要测试<img src='/icons/57275de.gif' /><img src='/icons/57275chengxu.gif' />集”对话框中<img src='/icons/57275dou.gif' />制定需要测试<img src='/icons/57275de.gif' /> 2进制文件<img src='/icons/57275dou2.gif' />通常情况下第<img src='/icons/57275yi.gif' />次测试是需要这么操作<img src='/icons/57275dou2.gif' />第 2次测试时可以直接打开<img src='/icons/57275dou2.gif' />另外如果测试<img src='/icons/57275de.gif' />是成品代码<img src='/icons/57275dou.gif' />那么需要注意包含成品代码<img src='/icons/57275de.gif' /> 2进制文件可能不是<img src='/icons/57275yi.gif' />般测试中所包含<img src='/icons/57275de.gif' />文件<img src='/icons/57275dou2.gif' />遇到这种情况<img src='/icons/57275de.gif' />话<img src='/icons/57275dou.gif' />测试人员需要指定普通测试将中间应用<img src='/icons/57275chengxu.gif' />作为测试来包装<img src='/icons/57275dou2.gif' />也就是说利用中间应用<img src='/icons/57275chengxu.gif' />来运行需要测试<img src='/icons/57275de.gif' />成品代码<img src='/icons/57275dou2.gif' />这往往能够取得比较好<img src='/icons/57275de.gif' />测试效果<img src='/icons/57275dou2.gif' /><br/><br/>
　　<STRONG> 2、单元测试<img src='/icons/57275dou2.gif' /></STRONG><br/><br/>
　　单元测试和普通测试有本主<img src='/icons/57275de.gif' />区别<img src='/icons/57275dou2.gif' />单元测试是编程测试中<img src='/icons/57275de.gif' /><img src='/icons/57275yi.gif' />种重要思路方法<img src='/icons/57275dou2.gif' />其主要通过<img src='/icons/57275diaoyong.gif' />带参数类<img src='/icons/57275de.gif' />思路方法<img src='/icons/57275dou.gif' />来验证返回值是否是用户所期望<img src='/icons/57275de.gif' />值<img src='/icons/57275dou2.gif' />简单<img src='/icons/57275de.gif' />说<img src='/icons/57275dou.gif' />就是测试人员输入几个参数<img src='/icons/57275dou.gif' />然后看应用<img src='/icons/57275chengxu.gif' />得到<img src='/icons/57275de.gif' />结果<img src='/icons/57275dou.gif' />是否和我们所期望<img src='/icons/57275de.gif' />值类似<img src='/icons/57275dou2.gif' />显然<img src='/icons/57275dou.gif' />对于单元测试来说<img src='/icons/57275dou.gif' />要取得比较好<img src='/icons/57275de.gif' />效果<img src='/icons/57275dou.gif' />不在于测试<img src='/icons/57275de.gif' />数量<img src='/icons/57275dou.gif' />而在于提供<img src='/icons/57275de.gif' />参数是否包含了实际应用中涵盖<img src='/icons/57275de.gif' />范围<img src='/icons/57275dou2.gif' />简单<img src='/icons/57275de.gif' />说<img src='/icons/57275dou.gif' />如果现在要测试<img src='/icons/57275yi.gif' />个单元格金额合计<img src='/icons/57275de.gif' /><img src='/icons/57275chengxu.gif' /><img src='/icons/57275dou.gif' />那么就需要提供金额为零、为负、为空(如果对输入<img src='/icons/57275de.gif' />金额没有限制<img src='/icons/57275de.gif' />话)等值<img src='/icons/57275dou.gif' />以取得在包含这些数据时会返回什么样<img src='/icons/57275de.gif' />运算结果<img src='/icons/57275dou2.gif' />【IT专家网独家撰稿】<br/><br/>
　　在Studio平台中<img src='/icons/57275dou.gif' /><img src='/icons/57275chengxu.gif' />测试人员可以选择采用平台自带<img src='/icons/57275de.gif' />单元测试模板进行测试<img src='/icons/57275dou.gif' />也可以自己手工编写代码进行测试<img src='/icons/57275dou2.gif' />在这个平台中<img src='/icons/57275dou.gif' />提供了两种专用<img src='/icons/57275de.gif' />单元测试变体<img src='/icons/57275dou.gif' />分别为数据驱动型单元测试和ASP.NET单元测试<img src='/icons/57275dou2.gif' />前者主要是针对数据源<img src='/icons/57275de.gif' />每<img src='/icons/57275yi.gif' />行反复<img src='/icons/57275diaoyong.gif' />时采用<img src='/icons/57275de.gif' /><img src='/icons/57275dou2.gif' />此时单元测试使用每<img src='/icons/57275yi.gif' />行<img src='/icons/57275de.gif' />数据作为输入数据<img src='/icons/57275dou2.gif' />后者主要用来测试Web应用<img src='/icons/57275chengxu.gif' /><img src='/icons/57275de.gif' />代码或者IIS进程中所运行<img src='/icons/57275de.gif' />代码<img src='/icons/57275dou2.gif' />【IT专家网独家撰稿】<br/><br/>
　　如果以上这两个测试模板不能够满足要求<img src='/icons/57275de.gif' />话<img src='/icons/57275dou.gif' />则就需要手工添加新<img src='/icons/57275de.gif' />单元测试代码<img src='/icons/57275dou2.gif' />手工添加测试代码时<img src='/icons/57275dou.gif' />也有两种思路方法<img src='/icons/57275dou2.gif' /><img src='/icons/57275yi.gif' />是直接添加<img src='/icons/57275dou.gif' />即使用单元测试在测试项目中添加<img src='/icons/57275yi.gif' />个源文件<img src='/icons/57275dou.gif' />该文件中包含<img src='/icons/57275yi.gif' />个有效<img src='/icons/57275de.gif' />空白单元测试思路方法<img src='/icons/57275dou.gif' />然后再手工编写这个思路方法<img src='/icons/57275de.gif' />代码<img src='/icons/57275dou2.gif' /> 2是通过向导来完成<img src='/icons/57275dou2.gif' />可以选择“使用测试向导”显示创建单元测试对话框<img src='/icons/57275dou2.gif' />测试人员可以使用这个对话框利用当前项目中<img src='/icons/57275de.gif' />思路方法来生成单元测试<img src='/icons/57275dou2.gif' />不过虽然使用向导来创建单元测试<img src='/icons/57275dou.gif' />可以节省代码编写<img src='/icons/57275de.gif' />时间<img src='/icons/57275dou2.gif' />但是生成单元测试的后<img src='/icons/57275dou.gif' />仍然需要检查并在必要<img src='/icons/57275de.gif' />时候进行手工<img src='/icons/57275de.gif' />调整<img src='/icons/57275dou2.gif' />【IT专家网独家撰稿】<br/><br/>
　<STRONG>　 3、负载测试<img src='/icons/57275dou2.gif' /></STRONG><br/><br/>
　　顾名思义<img src='/icons/57275dou.gif' />负载测试主要就是用来测试用户并发访问时应用<img src='/icons/57275chengxu.gif' /><img src='/icons/57275de.gif' />性能<img src='/icons/57275dou2.gif' />负载测试<img src='/icons/57275de.gif' />原理比较简单<img src='/icons/57275dou.gif' />就是将单元测试、普通测试等思路方法进行封装<img src='/icons/57275dou.gif' />然后使用虚拟用户同时运行应用<img src='/icons/57275chengxu.gif' /><img src='/icons/57275dou.gif' />以判断在多用户<img src='/icons/57275de.gif' />环境中应用<img src='/icons/57275chengxu.gif' /><img src='/icons/57275de.gif' />运行状态<img src='/icons/57275dou2.gif' />在负载测试下运行这些测试将生成比较多<img src='/icons/57275de.gif' />测试结果<img src='/icons/57275dou.gif' />包括以表格或者图标形式显示<img src='/icons/57275de.gif' />性能计数器等相关<img src='/icons/57275de.gif' />计数器<img src='/icons/57275dou2.gif' />现在大部分应用<img src='/icons/57275chengxu.gif' />都是服务器/客户机模式<img src='/icons/57275dou.gif' />用户数量比较多<img src='/icons/57275dou.gif' />负载测试是<img src='/icons/57275yi.gif' />种必不可少<img src='/icons/57275de.gif' />测试思路方法<img src='/icons/57275dou2.gif' /><br/><br/>
　　如现在需要使用Studio开发<img src='/icons/57275yi.gif' />个Web应用<img src='/icons/57275chengxu.gif' /><img src='/icons/57275dou2.gif' />其有可能有成千上万个用户<img src='/icons/57275dou2.gif' /><img src='/icons/57275yi.gif' />个用户使用<img src='/icons/57275de.gif' />时候<img src='/icons/57275dou.gif' />性能等方面可能没有问题<img src='/icons/57275dou2.gif' />但是如果许多用户同时访问这个应用<img src='/icons/57275chengxu.gif' /><img src='/icons/57275dou.gif' />是否会有性能上<img src='/icons/57275de.gif' />障碍呢?在测试<img src='/icons/57275de.gif' />时候<img src='/icons/57275dou.gif' />同时叫上千个人对应用<img src='/icons/57275chengxu.gif' />进行同时访问<img src='/icons/57275dou.gif' />也不如何现实<img src='/icons/57275dou2.gif' />在实际工作中<img src='/icons/57275dou.gif' />通常是通过负载测试来完成<img src='/icons/57275dou2.gif' />如可以将Web测试添加到负载测试项目中<img src='/icons/57275dou.gif' />然后可以模拟数千个用户和某个特定<img src='/icons/57275de.gif' />Web应用<img src='/icons/57275chengxu.gif' />同时进行交互访问<img src='/icons/57275dou2.gif' />负载测试可以帮助<img src='/icons/57275chengxu.gif' />开发人员判断在应用<img src='/icons/57275chengxu.gif' /><img src='/icons/57275de.gif' />访问达到最大量<img src='/icons/57275de.gif' />时候<img src='/icons/57275dou.gif' />是否否出现<img src='/icons/57275cuowu.gif' />或者性能上<img src='/icons/57275de.gif' />瓶颈<img src='/icons/57275dou2.gif' />而不是等到真<img src='/icons/57275de.gif' />出现这种情况时再去弥补<img src='/icons/57275dou2.gif' /><br/><br/>

<br/>

<span <img src='/icons/57275class.gif' />="xspace-totlerecord">2</span><span <img src='/icons/57275class.gif' />="xspace-totlepages">1/2</span><span <img src='/icons/57275class.gif' />="xspace-current">1</span>2&gt;<br/> <a href="/mypdf/78959.pdf" title="查看 项目选择方法:独家:为Studio项目选择合适的测试思路方法 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-08</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78959.html</guid>
		</item>
		<item>
			<title><![CDATA[javaservlet实例:Java窍门技巧:例子讲解Servlet的图象处理]]></title>
			<link>http://CrazyCoder.cn/Java/Article78901.html</link>
			<description>
				<![CDATA[

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们在处理数据时<img src='/icons/32446dou.gif' />有时希望能用图象直观<img src='/icons/32446de.gif' />表述<img src='/icons/32446dou.gif' />在这里有<img src='/icons/32446yi.gif' />个巧思路方法<img src='/icons/32446dou.gif' />能方便快捷<img src='/icons/32446de.gif' />实现<img src='/icons/32446yi.gif' />些简单<img src='/icons/32446de.gif' />图形(不能称的图象)<img src='/icons/32446dou.gif' />比如条形图<img src='/icons/32446dou.gif' />我们不必去用 java来生成并显示图象<img src='/icons/32446dou.gif' />(java生成图象很慢)<img src='/icons/32446dou.gif' />我们可以这样来作<img src='/icons/32446dou.gif' />先用作图工具作<img src='/icons/32446yi.gif' />个很小<img src='/icons/32446de.gif' />你需要<img src='/icons/32446de.gif' />图片<img src='/icons/32446dou.gif' />再根据你所处理<img src='/icons/32446de.gif' />数据量来实时<img src='/icons/32446de.gif' />加长它<img src='/icons/32446dou.gif' />就可以得到所要表述<img src='/icons/32446de.gif' />图例<img src='/icons/32446dou2.gif' />比如我们在数据库中得到了<img src='/icons/32446yi.gif' />组数据<img src='/icons/32446dou.gif' />我们从中找出最大<img src='/icons/32446de.gif' />那<img src='/icons/32446yi.gif' />个<img src='/icons/32446dou.gif' />按比列设定其标签<img src='/icons/32446de.gif' />长度<img src='/icons/32446dou.gif' />其它<img src='/icons/32446de.gif' />数据图形则可和它相比<img src='/icons/32446dou.gif' />得到<img src='/icons/32446de.gif' />长度<img src='/icons/32446dou.gif' />这样<img src='/icons/32446dou.gif' /><img src='/icons/32446yi.gif' />个简简单单<img src='/icons/32446de.gif' />条形图就出来<img src='/icons/32446dou2.gif' />但有时<img src='/icons/32446yi.gif' />些简单<img src='/icons/32446de.gif' />图形已经不能解决我们实际遇到<img src='/icons/32446de.gif' />情况<img src='/icons/32446dou.gif' />比如曲线图就不能用这种思路方法<img src='/icons/32446dou.gif' />这时我们需要生成java图象<img src='/icons/32446dou.gif' />也许大家都用过applet这样<img src='/icons/32446de.gif' /><img src='/icons/32446chengxu.gif' />吧<img src='/icons/32446dou.gif' />若访问量不大<img src='/icons/32446dou.gif' />而实时性又很特殊时(比如股票系统)<img src='/icons/32446dou.gif' />必须这样用它<img src='/icons/32446dou2.gif' />但事实上<img src='/icons/32446dou.gif' />我们web<img src='/icons/32446chengxu.gif' />大多有前后台的分<img src='/icons/32446dou.gif' />前台浏览<img src='/icons/32446dou.gif' />后台维护<img src='/icons/32446dou2.gif' />这样我们可以在后台用servlet实时动态定时地生成图象文件<img src='/icons/32446dou.gif' />而前台只是查看静态图片<img src='/icons/32446dou.gif' />这比你用applet来动态产生图象<img src='/icons/32446de.gif' />速度快了不知多少倍<img src='/icons/32446dou.gif' /><img src='/icons/32446yinwei.gif' />applet来动态产生图象<img src='/icons/32446dou.gif' />有两个地方很费时<img src='/icons/32446dou.gif' /><img src='/icons/32446yi.gif' />是数据库查询时间<img src='/icons/32446dou.gif' /> 2是applet本身生成图象就很慢<img src='/icons/32446dou2.gif' />下面我以<img src='/icons/32446yi.gif' />个简单<img src='/icons/32446de.gif' />例子来介绍说明<img src='/icons/32446yi.gif' />下怎样生成并写入图象文件<img src='/icons/32446dou.gif' />本例注重<img src='/icons/32446de.gif' />是怎样写入图象文件<img src='/icons/32446dou.gif' />相信写过applet<img src='/icons/32446de.gif' />朋友会生成更加漂亮<img src='/icons/32446de.gif' />图象<img src='/icons/32446dou2.gif' /><br/><br/>
以下是引用片段:<br/>package test; <br/><br/>
import javax.servlet.*; <br/><br/>
import javax.servlet.http.*; <br/><br/>
import java.io.*; <br/><br/>
import java.util.*; <br/><br/>
import java.awt.image.BufferedImage; <br/><br/>
import com.sun.image.codec.jpeg.*; <br/><br/>
import java.awt.image.*; <br/><br/>
import java.awt.*; <br/><br/>
public <img src='/icons/32446class.gif' /> Servlet2 extends HttpServlet { <br/><br/>
public void init(ServletConfig config) throws ServletException { <br/><br/>
super.init(config); <br/><br/>
} <br/><br/>
public void doGet(HttpServletRequest request, HttpServletResponse response)&nbsp; <br/>throws ServletException, IOException { <br/><br/>
String sFileName = "e:/temp/name.jpg"; <br/><br/>
try{ <br/><br/>
FileOutputStream fos = <img src='/icons/32446new.gif' /> <br/><br/>
FileOutputStream(sFileName); <br/><br/>
BufferedImage myImage = <img src='/icons/32446new.gif' /> BufferedImage(225, 225,BufferedImage.TYPE_INT_RGB); <br/><br/>
Graphics g = myImage.getGraphics<img src='/icons/32446kh.gif' />; <br/><br/>
g.<img src='/icons/32446set.gif' />Color(Color.white); <br/><br/>
g.fillRect(0,0,225,225); <br/><br/>
g.<img src='/icons/32446set.gif' />Color(Color.black); <br/><br/>
g.drawString("Finance Balance Summary", 40, 15); <br/><br/>
g.drawString("Primary", 90, 30); <br/><br/>
g.<img src='/icons/32446set.gif' />Color(Color.darkGray); <br/><br/>
&amp;g.fillRect(15,193,7,7); <br/><br/>
g.<img src='/icons/32446set.gif' />Color(Color.black); <br/><br/>
g.drawString("% Operating", 25, 200); <br/><br/>
g.<img src='/icons/32446set.gif' />Color(Color.yellow); <br/><br/>
g.fillRect(130,193,7,7); <br/><br/>
g.<img src='/icons/32446set.gif' />Color(Color.black); <br/><br/>
g.drawString("% Term", 140, 200); <br/><br/>
g.<img src='/icons/32446set.gif' />Color(Color.lightGray); <br/><br/>
g.fillRect(15,213,7,7); <br/><br/>
g.<img src='/icons/32446set.gif' />Color(Color.black); <br/><br/>
g.drawString("% Mortgage", 25, 220); <br/><br/>
g.<img src='/icons/32446set.gif' />Color(Color.green); <br/><br/>
g.fillRect(130,213,7,7); <br/><br/>
g.<img src='/icons/32446set.gif' />Color(Color.black); <br/><br/>
g.drawString("% Lease", 140, 220); <br/><br/>
JPEGImageEncoder jpg = <br/><br/>
JPEGCodec.createJPEGEncoder(fos); <br/><br/>
jpg.encode(myImage); <br/><br/>
}catch (Exception e){ <br/><br/>
String exceptionThrown = e.toString<img src='/icons/32446kh.gif' />; <br/><br/>
String sourceOfException = " Method"; <br/><br/>
<img src='/icons/32446System.gif' />.out.pr<img src='/icons/32446int.gif' />ln("Origional Exception Thrown: " + <br/><br/>
exceptionThrown + '\r' + '\n'); <br/><br/>
<img src='/icons/32446System.gif' />.out.pr<img src='/icons/32446int.gif' />ln("Origional SourceOfException: " + <br/><br/>
sourceOfException + '\r' + '\n'); <br/><br/>
} // CatchStatementEnd <br/><br/>
} <br/><br/>
} <br/><br/>
 <a href="/mypdf/78901.pdf" title="查看 javaservlet实例:Java窍门技巧:例子讲解Servlet的图象处理 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78901.html</guid>
		</item>
		<item>
			<title><![CDATA[jsp中文显示问题:解决JSP开发Web程序中文显示 3种思路方法]]></title>
			<link>http://CrazyCoder.cn/Java/Article78900.html</link>
			<description>
				<![CDATA[

思路方法<img src='/icons/12928yi.gif' />:最简单也是用<img src='/icons/12928de.gif' />最多<img src='/icons/12928de.gif' />思路方法 <br/><br/>
　　＜%@ page language="java" pageEncoding="GBK" %＞&nbsp; <br/><br/>
<br/>　　或者＜%@ page contenttype="text/html;char<img src='/icons/12928set.gif' />=gbk";＞这里可以用gb2312或者gbk<img src='/icons/12928dou.gif' />只是gbk比gb2312支持跟多<img src='/icons/12928de.gif' /><img src='/icons/12928zifu.gif' /><img src='/icons/12928dou2.gif' /> <br/><br/>
　　这个思路方法用于jsp页面中<img src='/icons/12928de.gif' />中文显示<img src='/icons/12928dou2.gif' /> <br/><br/>
　　思路方法 2:使用过滤器 <br/><br/>
　　过滤器使用主要针对表单提交<img src='/icons/12928dou.gif' />插入数据库<img src='/icons/12928de.gif' />数据都是？号<img src='/icons/12928dou2.gif' />这也是应为tomcat不按request所指定<img src='/icons/12928de.gif' />编码进行编码<img src='/icons/12928dou.gif' />还是自作主张<img src='/icons/12928de.gif' />采用默认编码方式iso-8859-1编码<img src='/icons/12928dou2.gif' /> <br/><br/>
　　编写<img src='/icons/12928yi.gif' />个SetCharacterEncodingFilter类<img src='/icons/12928dou2.gif' /> <br/><br/>
　　import java.io.IOException;&nbsp; <br/>　　import javax.servlet.Filter;&nbsp; <br/>　　import javax.servlet.FilterChain;&nbsp; <br/>　　import javax.servlet.FilterConfig;&nbsp; <br/>　　import javax.servlet.ServletException;&nbsp; <br/>　　import javax.servlet.ServletRequest;&nbsp; <br/>　　import javax.servlet.ServletResponse;&nbsp; <br/>　　public <img src='/icons/12928class.gif' /> SetCharacterEncodingFilter implements Filter {&nbsp; <br/>　　　protected String encoding = null;&nbsp; <br/>　　　protected FilterConfig filterConfig = null;&nbsp; <br/>　　　protected boolean ignore = true;&nbsp; <br/>　　　public void init(FilterConfig filterConfig) throws ServletException {&nbsp; <br/>　　　　this.filterConfig=filterConfig;&nbsp; <br/>　　　　this.encoding=filterConfig.getInitParameter("encoding");&nbsp; <br/>　　　　String value=filterConfig.getInitParameter("ignore");&nbsp; <br/>　　　　<img src='/icons/12928if.gif' />(value<img src='/icons/12928dd.gif' />null)&nbsp; <br/>　　　　　this.ignore=true;&nbsp; <br/>　　　　<img src='/icons/12928else.gif' /> <img src='/icons/12928if.gif' />(value.equalsIgnoreCase("true"))&nbsp; <br/>　　　　　this.ignore=true;&nbsp; <br/>　　　　<img src='/icons/12928else.gif' />&nbsp; <br/>　　　　　this.ignore=false;&nbsp; <br/>　　　}&nbsp; <br/>　　　public void doFilter(&nbsp; <br/>　　ServletRequest request, ServletResponse response, FilterChain chain)&nbsp; <br/>　　 throws IOException, ServletException {&nbsp; <br/>　　　// TODO 自动生成思路方法存根&nbsp; <br/>　　　<img src='/icons/12928if.gif' /> (ignore 　　 (request.getCharacterEncoding<img src='/icons/12928kh.gif' /> <img src='/icons/12928dd.gif' /> null)) {&nbsp; <br/>　　　　String encoding = selectEncoding(request);&nbsp; <br/>　　　　<img src='/icons/12928if.gif' /> (encoding != null)&nbsp; <br/>　　　　　request.<img src='/icons/12928set.gif' />CharacterEncoding(encoding);&nbsp; <br/>　　　}&nbsp; <br/>　　　chain.doFilter(request, response);&nbsp; <br/>　　}&nbsp; <br/>　　public void destroy<img src='/icons/12928kh.gif' /> {&nbsp; <br/>　　　// TODO 自动生成思路方法存根&nbsp; <br/>　　　this.encoding = null;&nbsp; <br/>　　　this.filterConfig = null;&nbsp; <br/>　　}&nbsp; <br/>　　protected String selectEncoding(ServletRequest request) {&nbsp; <br/>　　　<img src='/icons/12928return.gif' /> (this.encoding);&nbsp; <br/>　　}&nbsp; <br/>　　} <br/><br/>
 <a href="/mypdf/78900.pdf" title="查看 jsp中文显示问题:解决JSP开发Web程序中文显示 3种思路方法 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78900.html</guid>
		</item>
		<item>
			<title><![CDATA[页面响应速度:提升JSP页面响应速度的 7大秘籍绝招]]></title>
			<link>http://CrazyCoder.cn/Java/Article78899.html</link>
			<description>
				<![CDATA[

思路方法<img src='/icons/93408yi.gif' />:在servlet<img src='/icons/93408de.gif' />init<img src='/icons/93408kh.gif' />思路方法中缓存Cache数据<br/><br/>
　　当应用服务器<img src='/icons/93408chushi.gif' />化servlet例子的后<img src='/icons/93408dou.gif' />为客户端请求提供服务的前<img src='/icons/93408dou.gif' />它会<img src='/icons/93408diaoyong.gif' />这个servlet<img src='/icons/93408de.gif' />init<img src='/icons/93408kh.gif' />思路方法<img src='/icons/93408dou2.gif' />在<img src='/icons/93408yi.gif' />个servlet<img src='/icons/93408de.gif' />生命周期中<img src='/icons/93408dou.gif' />init<img src='/icons/93408kh.gif' />思路方法只会被<img src='/icons/93408diaoyong.gif' /><img src='/icons/93408yi.gif' />次<img src='/icons/93408dou2.gif' />通过在init<img src='/icons/93408kh.gif' />思路方法中缓存Cache<img src='/icons/93408yi.gif' />些静态<img src='/icons/93408de.gif' />数据或完成<img src='/icons/93408yi.gif' />些只需要执行<img src='/icons/93408yi.gif' />次<img src='/icons/93408de.gif' />、耗时<img src='/icons/93408de.gif' />操作<img src='/icons/93408dou.gif' />就可大大地提高系统性能<img src='/icons/93408dou2.gif' /><br/><br/>
　　例如<img src='/icons/93408dou.gif' />通过在init<img src='/icons/93408kh.gif' />思路方法中建立<img src='/icons/93408yi.gif' />个JDBC连接池是<img src='/icons/93408yi.gif' />个最佳例子<img src='/icons/93408dou.gif' />假设我们是用jdbc2.0<img src='/icons/93408de.gif' />DataSource接口来取得数据库连接<img src='/icons/93408dou.gif' />在通常<img src='/icons/93408de.gif' />情况下<img src='/icons/93408dou.gif' />我们需要通过JNDI来取得具体<img src='/icons/93408de.gif' />数据源<img src='/icons/93408dou2.gif' />我们可以想象在<img src='/icons/93408yi.gif' />个具体<img src='/icons/93408de.gif' />应用中<img src='/icons/93408dou.gif' />如果每次SQL请求都要执行<img src='/icons/93408yi.gif' />次JNDI查询<img src='/icons/93408de.gif' />话<img src='/icons/93408dou.gif' />那系统性能将会急剧下降<img src='/icons/93408dou2.gif' />解决思路方法是如下代码<img src='/icons/93408dou.gif' />它通过缓存CacheDataSource<img src='/icons/93408dou.gif' />使得下<img src='/icons/93408yi.gif' />次SQL<img src='/icons/93408diaoyong.gif' />时仍然可以继续利用它:<br/><br/>
以下是引用片段:<br/>public <img src='/icons/93408class.gif' /> ControllerServlet extends HttpServlet{ <br/>private javax.sql.DataSource testDS = null; 　 <br/>public void init(ServletConfig config) throws ServletException　{ <br/>super.init(config); 　　 <br/>Context ctx = null;　　 <br/>try{ 　　　 <br/>ctx = <img src='/icons/93408new.gif' /> InitialContext<img src='/icons/93408kh.gif' />;　　　 <br/>testDS = (javax.sql.DataSource)ctx.lookup("jdbc/testDS"); <br/>}catch(NamingException ne){ne.pr<img src='/icons/93408int.gif' />StackTrace<img src='/icons/93408kh.gif' />;} <br/>}catch(Exception e){e.pr<img src='/icons/93408int.gif' />StackTrace<img src='/icons/93408kh.gif' />;} <br/>}　 <br/>public javax.sql.DataSource getTestDS<img src='/icons/93408kh.gif' />{　 <br/>　<img src='/icons/93408return.gif' /> testDS;　 <br/>}　 <br/>... <br/>...&nbsp; <br/>} <br/><br/>
<br/>　　思路方法 2:禁止servlet和JSP 自动重载(auto-reloading)<br/><br/>
　　Servlet/JSP提供了<img src='/icons/93408yi.gif' />个实用<img src='/icons/93408de.gif' />技术<img src='/icons/93408dou.gif' />即自动重载技术<img src='/icons/93408dou.gif' />它为开发人员提供了<img src='/icons/93408yi.gif' />个好<img src='/icons/93408de.gif' />开发环境<img src='/icons/93408dou.gif' />当你改变servlet和JSP页面后而不必重启应用服务器<img src='/icons/93408dou2.gif' />然而<img src='/icons/93408dou.gif' />这种技术在产品运行阶段对系统<img src='/icons/93408de.gif' />资源是<img src='/icons/93408yi.gif' />个极大<img src='/icons/93408de.gif' />损耗<img src='/icons/93408dou.gif' /><img src='/icons/93408yinwei.gif' />它会给JSP引擎<img src='/icons/93408de.gif' />类装载器(<img src='/icons/93408class.gif' />loader)带来极大<img src='/icons/93408de.gif' />负担<img src='/icons/93408dou2.gif' />因此关闭自动重载功能对系统性能<img src='/icons/93408de.gif' />提升是<img src='/icons/93408yi.gif' />个极大<img src='/icons/93408de.gif' />帮助<img src='/icons/93408dou2.gif' /><br/><br/>
　　思路方法 3: 不要滥用HttpSession<br/><br/>
　　在很多应用中<img src='/icons/93408dou.gif' />我们<img src='/icons/93408de.gif' /><img src='/icons/93408chengxu.gif' />需要保持客户端<img src='/icons/93408de.gif' />状态<img src='/icons/93408dou.gif' />以便页面的间可以相互联系<img src='/icons/93408dou2.gif' />但不幸<img src='/icons/93408de.gif' />是由于HTTP具有天生无状态性<img src='/icons/93408dou.gif' />从而无法保存客户端<img src='/icons/93408de.gif' />状态<img src='/icons/93408dou2.gif' />因此<img src='/icons/93408yi.gif' />般<img src='/icons/93408de.gif' />应用服务器都提供了session来保存客户<img src='/icons/93408de.gif' />状态<img src='/icons/93408dou2.gif' />在JSP应用服务器中<img src='/icons/93408dou.gif' />是通过HttpSession对像来实现session<img src='/icons/93408de.gif' />功能<img src='/icons/93408de.gif' /><img src='/icons/93408dou.gif' />但在方便<img src='/icons/93408de.gif' />同时<img src='/icons/93408dou.gif' />它也给系统带来了不小<img src='/icons/93408de.gif' />负担<img src='/icons/93408dou2.gif' /><img src='/icons/93408yinwei.gif' />每当你获得或更新session时<img src='/icons/93408dou.gif' />系统者要对它进行费时<img src='/icons/93408de.gif' />序列化操作<img src='/icons/93408dou2.gif' />你可以通过对HttpSession<img src='/icons/93408de.gif' />以下几种处理方式来提升系统<img src='/icons/93408de.gif' />性能<img src='/icons/93408dou2.gif' /><br/><br/>
　　如果没有必要<img src='/icons/93408dou.gif' />就应该关闭JSP页面中对HttpSession<img src='/icons/93408de.gif' />缺省设置<img src='/icons/93408dou2.gif' /> 如果你没有明确指定<img src='/icons/93408de.gif' />话<img src='/icons/93408dou.gif' />每个JSP页面都会缺省地创建<img src='/icons/93408yi.gif' />个HttpSession<img src='/icons/93408dou2.gif' />如果你<img src='/icons/93408de.gif' />JSP中不需要使用session<img src='/icons/93408de.gif' />话<img src='/icons/93408dou.gif' />那可以通过如下<img src='/icons/93408de.gif' />JSP页面指示符来禁止它:<br/><br/>
以下是引用片段:<br/>＜%@ page session="false"%＞ <br/><br/>
<br/>　　不要在HttpSession中存放大<img src='/icons/93408de.gif' />数据对像:如果你在HttpSession中存放大<img src='/icons/93408de.gif' />数据对像<img src='/icons/93408de.gif' />话<img src='/icons/93408dou.gif' />每当对它进行读写时<img src='/icons/93408dou.gif' />应用服务器都将对其进行序列化<img src='/icons/93408dou.gif' />从而增加了系统<img src='/icons/93408de.gif' />额外负担<img src='/icons/93408dou2.gif' />你在HttpSession中存放<img src='/icons/93408de.gif' />数据对像越大<img src='/icons/93408dou.gif' />那系统<img src='/icons/93408de.gif' />性能就下降得越快<img src='/icons/93408dou2.gif' /><br/><br/>
　　当你不需要HttpSession时<img src='/icons/93408dou.gif' />尽快地释放它:当你不再需要session时<img src='/icons/93408dou.gif' />你可以通过<img src='/icons/93408diaoyong.gif' />HttpSession.invalidate<img src='/icons/93408kh.gif' />思路方法来释放它<img src='/icons/93408dou2.gif' />尽量将session<img src='/icons/93408de.gif' />超时时间设得短<img src='/icons/93408yi.gif' />点:在JSP应用服务器中<img src='/icons/93408dou.gif' />有<img src='/icons/93408yi.gif' />个缺省<img src='/icons/93408de.gif' />session<img src='/icons/93408de.gif' />超时时间<img src='/icons/93408dou2.gif' />当客户在这个时间的后没有进行任何操作<img src='/icons/93408de.gif' />话<img src='/icons/93408dou.gif' />系统会将相关<img src='/icons/93408de.gif' />session自动从内存中释放<img src='/icons/93408dou2.gif' />超时时间设得越大<img src='/icons/93408dou.gif' />系统<img src='/icons/93408de.gif' />性能就会越低<img src='/icons/93408dou.gif' />因此最好<img src='/icons/93408de.gif' />思路方法就是尽量使得它<img src='/icons/93408de.gif' />值保持在<img src='/icons/93408yi.gif' />个较低<img src='/icons/93408de.gif' />水平<img src='/icons/93408dou2.gif' /><br/><br/>
　　思路方法 4: 将页面输出进行压缩<br/><br/>
　　压缩是解决数据冗余<img src='/icons/93408de.gif' /><img src='/icons/93408yi.gif' />个好<img src='/icons/93408de.gif' />思路方法<img src='/icons/93408dou.gif' />特别是在网络带宽不够发达<img src='/icons/93408de.gif' />今天<img src='/icons/93408dou2.gif' />有<img src='/icons/93408de.gif' />浏览器支持gzip(GNU zip)进行来对HTML文件进行压缩<img src='/icons/93408dou.gif' />这种思路方法可以戏剧性地减少HTML文件<img src='/icons/93408de.gif' />下载时间<img src='/icons/93408dou2.gif' />因此<img src='/icons/93408dou.gif' />如果你将servlet或JSP页面生成<img src='/icons/93408de.gif' />HTML页面进行压缩<img src='/icons/93408de.gif' />话<img src='/icons/93408dou.gif' />那用户就会觉得页面浏览速度会非常快<img src='/icons/93408dou2.gif' />但不幸<img src='/icons/93408de.gif' />是<img src='/icons/93408dou.gif' />不是所有<img src='/icons/93408de.gif' />浏览器都支持gzip压缩<img src='/icons/93408dou.gif' />但你可以通过在你<img src='/icons/93408de.gif' /><img src='/icons/93408chengxu.gif' />中检查客户<img src='/icons/93408de.gif' />浏览器是否支持它<img src='/icons/93408dou2.gif' />下面就是有关这种思路方法实现<img src='/icons/93408de.gif' /><img src='/icons/93408yi.gif' />个代码片段:<br/><br/>
以下是引用片段:<br/>public void doGet(HttpServletRequest request, HttpServletResponse response) <br/>throws IOException, ServletException { <br/>OutputStream out = null; <br/>String encoding = request.getHeader("Accept-Encoding"); 　 <br/><img src='/icons/93408if.gif' /> (encoding != null &amp;&amp; encoding.indexOf("gzip") != -1){ <br/>request.<img src='/icons/93408set.gif' />Header("Content-Encoding" , "gzip");　　 <br/>out = <img src='/icons/93408new.gif' /> GZIPOutputStream(request.getOutputStream<img src='/icons/93408kh.gif' />); <br/>}　 <br/><img src='/icons/93408else.gif' /> <img src='/icons/93408if.gif' /> (encoding != null &amp;&amp; encoding.indexOf("comdivss") != -1){ <br/>request.<img src='/icons/93408set.gif' />Header("Content-Encoding" , "comdivss");　　 <br/>out = <img src='/icons/93408new.gif' /> ZIPOutputStream(request.getOutputStream<img src='/icons/93408kh.gif' />); <br/>}<img src='/icons/93408else.gif' />{　　 <br/>out = request.getOutputStream<img src='/icons/93408kh.gif' />; <br/>}　 <br/>...　 <br/>...&nbsp; <br/>} <br/><br/>
 <a href="/mypdf/78899.pdf" title="查看 页面响应速度:提升JSP页面响应速度的 7大秘籍绝招 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78899.html</guid>
		</item>
		<item>
			<title><![CDATA[javaservlet实例:Java窍门技巧:例子讲解Servlet的图象处理]]></title>
			<link>http://CrazyCoder.cn/Java/Article78898.html</link>
			<description>
				<![CDATA[

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们在处理数据时<img src='/icons/38010dou.gif' />有时希望能用图象直观<img src='/icons/38010de.gif' />表述<img src='/icons/38010dou.gif' />在这里有<img src='/icons/38010yi.gif' />个巧思路方法<img src='/icons/38010dou.gif' />能方便快捷<img src='/icons/38010de.gif' />实现<img src='/icons/38010yi.gif' />些简单<img src='/icons/38010de.gif' />图形(不能称的图象)<img src='/icons/38010dou.gif' />比如条形图<img src='/icons/38010dou.gif' />我们不必去用 java来生成并显示图象<img src='/icons/38010dou.gif' />(java生成图象很慢)<img src='/icons/38010dou.gif' />我们可以这样来作<img src='/icons/38010dou.gif' />先用作图工具作<img src='/icons/38010yi.gif' />个很小<img src='/icons/38010de.gif' />你需要<img src='/icons/38010de.gif' />图片<img src='/icons/38010dou.gif' />再根据你所处理<img src='/icons/38010de.gif' />数据量来实时<img src='/icons/38010de.gif' />加长它<img src='/icons/38010dou.gif' />就可以得到所要表述<img src='/icons/38010de.gif' />图例<img src='/icons/38010dou2.gif' />比如我们在数据库中得到了<img src='/icons/38010yi.gif' />组数据<img src='/icons/38010dou.gif' />我们从中找出最大<img src='/icons/38010de.gif' />那<img src='/icons/38010yi.gif' />个<img src='/icons/38010dou.gif' />按比列设定其标签<img src='/icons/38010de.gif' />长度<img src='/icons/38010dou.gif' />其它<img src='/icons/38010de.gif' />数据图形则可和它相比<img src='/icons/38010dou.gif' />得到<img src='/icons/38010de.gif' />长度<img src='/icons/38010dou.gif' />这样<img src='/icons/38010dou.gif' /><img src='/icons/38010yi.gif' />个简简单单<img src='/icons/38010de.gif' />条形图就出来<img src='/icons/38010dou2.gif' />但有时<img src='/icons/38010yi.gif' />些简单<img src='/icons/38010de.gif' />图形已经不能解决我们实际遇到<img src='/icons/38010de.gif' />情况<img src='/icons/38010dou.gif' />比如曲线图就不能用这种思路方法<img src='/icons/38010dou.gif' />这时我们需要生成java图象<img src='/icons/38010dou.gif' />也许大家都用过applet这样<img src='/icons/38010de.gif' /><img src='/icons/38010chengxu.gif' />吧<img src='/icons/38010dou.gif' />若访问量不大<img src='/icons/38010dou.gif' />而实时性又很特殊时(比如股票系统)<img src='/icons/38010dou.gif' />必须这样用它<img src='/icons/38010dou2.gif' />但事实上<img src='/icons/38010dou.gif' />我们web<img src='/icons/38010chengxu.gif' />大多有前后台的分<img src='/icons/38010dou.gif' />前台浏览<img src='/icons/38010dou.gif' />后台维护<img src='/icons/38010dou2.gif' />这样我们可以在后台用servlet实时动态定时地生成图象文件<img src='/icons/38010dou.gif' />而前台只是查看静态图片<img src='/icons/38010dou.gif' />这比你用applet来动态产生图象<img src='/icons/38010de.gif' />速度快了不知多少倍<img src='/icons/38010dou.gif' /><img src='/icons/38010yinwei.gif' />applet来动态产生图象<img src='/icons/38010dou.gif' />有两个地方很费时<img src='/icons/38010dou.gif' /><img src='/icons/38010yi.gif' />是数据库查询时间<img src='/icons/38010dou.gif' /> 2是applet本身生成图象就很慢<img src='/icons/38010dou2.gif' />下面我以<img src='/icons/38010yi.gif' />个简单<img src='/icons/38010de.gif' />例子来介绍说明<img src='/icons/38010yi.gif' />下怎样生成并写入图象文件<img src='/icons/38010dou.gif' />本例注重<img src='/icons/38010de.gif' />是怎样写入图象文件<img src='/icons/38010dou.gif' />相信写过applet<img src='/icons/38010de.gif' />朋友会生成更加漂亮<img src='/icons/38010de.gif' />图象<img src='/icons/38010dou2.gif' /><br/><br/>
以下是引用片段:<br/>package test; <br/><br/>
import javax.servlet.*; <br/><br/>
import javax.servlet.http.*; <br/><br/>
import java.io.*; <br/><br/>
import java.util.*; <br/><br/>
import java.awt.image.BufferedImage; <br/><br/>
import com.sun.image.codec.jpeg.*; <br/><br/>
import java.awt.image.*; <br/><br/>
import java.awt.*; <br/><br/>
public <img src='/icons/38010class.gif' /> Servlet2 extends HttpServlet { <br/><br/>
public void init(ServletConfig config) throws ServletException { <br/><br/>
super.init(config); <br/><br/>
} <br/><br/>
public void doGet(HttpServletRequest request, HttpServletResponse response)&nbsp; <br/>throws ServletException, IOException { <br/><br/>
String sFileName = "e:/temp/name.jpg"; <br/><br/>
try{ <br/><br/>
FileOutputStream fos = <img src='/icons/38010new.gif' /> <br/><br/>
FileOutputStream(sFileName); <br/><br/>
BufferedImage myImage = <img src='/icons/38010new.gif' /> BufferedImage(225, 225,BufferedImage.TYPE_INT_RGB); <br/><br/>
Graphics g = myImage.getGraphics<img src='/icons/38010kh.gif' />; <br/><br/>
g.<img src='/icons/38010set.gif' />Color(Color.white); <br/><br/>
g.fillRect(0,0,225,225); <br/><br/>
g.<img src='/icons/38010set.gif' />Color(Color.black); <br/><br/>
g.drawString("Finance Balance Summary", 40, 15); <br/><br/>
g.drawString("Primary", 90, 30); <br/><br/>
g.<img src='/icons/38010set.gif' />Color(Color.darkGray); <br/><br/>
&amp;g.fillRect(15,193,7,7); <br/><br/>
g.<img src='/icons/38010set.gif' />Color(Color.black); <br/><br/>
g.drawString("% Operating", 25, 200); <br/><br/>
g.<img src='/icons/38010set.gif' />Color(Color.yellow); <br/><br/>
g.fillRect(130,193,7,7); <br/><br/>
g.<img src='/icons/38010set.gif' />Color(Color.black); <br/><br/>
g.drawString("% Term", 140, 200); <br/><br/>
g.<img src='/icons/38010set.gif' />Color(Color.lightGray); <br/><br/>
g.fillRect(15,213,7,7); <br/><br/>
g.<img src='/icons/38010set.gif' />Color(Color.black); <br/><br/>
g.drawString("% Mortgage", 25, 220); <br/><br/>
g.<img src='/icons/38010set.gif' />Color(Color.green); <br/><br/>
g.fillRect(130,213,7,7); <br/><br/>
g.<img src='/icons/38010set.gif' />Color(Color.black); <br/><br/>
g.drawString("% Lease", 140, 220); <br/><br/>
JPEGImageEncoder jpg = <br/><br/>
JPEGCodec.createJPEGEncoder(fos); <br/><br/>
jpg.encode(myImage); <br/><br/>
}catch (Exception e){ <br/><br/>
String exceptionThrown = e.toString<img src='/icons/38010kh.gif' />; <br/><br/>
String sourceOfException = " Method"; <br/><br/>
<img src='/icons/38010System.gif' />.out.pr<img src='/icons/38010int.gif' />ln("Origional Exception Thrown: " + <br/><br/>
exceptionThrown + '\r' + '\n'); <br/><br/>
<img src='/icons/38010System.gif' />.out.pr<img src='/icons/38010int.gif' />ln("Origional SourceOfException: " + <br/><br/>
sourceOfException + '\r' + '\n'); <br/><br/>
} // CatchStatementEnd <br/><br/>
} <br/><br/>
} <br/><br/>
 <a href="/mypdf/78898.pdf" title="查看 javaservlet实例:Java窍门技巧:例子讲解Servlet的图象处理 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78898.html</guid>
		</item>
		<item>
			<title><![CDATA[java操作cookie:Java小窍门技巧:有关Cookie的操作]]></title>
			<link>http://CrazyCoder.cn/Java/Article78897.html</link>
			<description>
				<![CDATA[

测试环境:JDK1.5、Tomcat5.5<br/><br/>
　　1.设置Cookie<br/><br/>
　　1Cookie cookie = <img src='/icons/82611new.gif' /> Cookie("key", "value");<br/><br/>
　　2cookie.<img src='/icons/82611set.gif' />MaxAge(60); //设置60秒生存期<img src='/icons/82611dou.gif' />如果设置为负值<img src='/icons/82611de.gif' />话<img src='/icons/82611dou.gif' />则为浏览器进程Cookie(内存中保存)<img src='/icons/82611dou.gif' />关闭浏览器就失效<img src='/icons/82611dou2.gif' /><br/><br/>
　　3cookie.<img src='/icons/82611set.gif' />Path("/test/test2"); //设置Cookie路径<img src='/icons/82611dou.gif' />不设置<img src='/icons/82611de.gif' />话为当前路径(对于Servlet来说为request.getContextPath<img src='/icons/82611kh.gif' /> + web.xml里配置<img src='/icons/82611de.gif' />该Servlet<img src='/icons/82611de.gif' />url-pattern路径部分)<br/><br/>
　　4response.addCookie(cookie);<br/><br/>
　　2.读取Cookie<br/><br/>
　　11//该思路方法可以读取当前路径以及“直接父路径”<img src='/icons/82611de.gif' />所有Cookie对象<img src='/icons/82611dou.gif' />如果没有任何Cookie<img src='/icons/82611de.gif' />话<img src='/icons/82611dou.gif' />则返回null<br/><br/>
　　22Cookie<img src='/icons/82611zhk2.gif' /> cookies = request.getCookies<img src='/icons/82611kh.gif' />;<br/><br/>
　　3.删除Cookie<br/><br/>
　　1Cookie cookie = <img src='/icons/82611new.gif' /> Cookie("key", null);<br/><br/>
　　2cookie.<img src='/icons/82611set.gif' />MaxAge(0); //设置为0为立即删除该Cookie<br/><br/>
　　3cookie.<img src='/icons/82611set.gif' />Path("/test/test2"); //删除指定路径上<img src='/icons/82611de.gif' />Cookie<img src='/icons/82611dou.gif' />不设置该路径<img src='/icons/82611dou.gif' />默认为删除当前路径Cookie<br/><br/>
　　4response.addCookie(cookie);<br/><br/>
　　4.注意:假设路径结构如下<br/><br/>
　　/<br/><br/>
　　/test<br/><br/>
　　/test/test2<br/><br/>
　　/test345<br/><br/>
　　/test555/test666<br/><br/>
　　a.相同键名<img src='/icons/82611de.gif' />Cookie(值可以相同或区别)可以存在于区别<img src='/icons/82611de.gif' />路径下<img src='/icons/82611dou2.gif' /><br/><br/>
　　b. 删除时<img src='/icons/82611dou.gif' />如果当前路径下没有键为"key"<img src='/icons/82611de.gif' />Cookie<img src='/icons/82611dou.gif' />则查询全部父路径<img src='/icons/82611dou.gif' />检索到就执行删除操作(每次只能删除<img src='/icons/82611yi.gif' />个和自己最近<img src='/icons/82611de.gif' />父路径Cookie)<br/><br/>
　　FF.必须指定和设定cookie时使用<img src='/icons/82611de.gif' />相同路径来删除改cookie<img src='/icons/82611dou.gif' />而且cookie<img src='/icons/82611de.gif' />键名不论大写、小写或大小混合都要指定路径<img src='/icons/82611dou2.gif' /><br/><br/>
　　IE.键名小写时<img src='/icons/82611dou.gif' />如果当前路径为/test/test2<img src='/icons/82611dou.gif' />如果找不到再向上查询/test、/test555、/test345<img src='/icons/82611dou.gif' />如果还找不到就查询/ <img src='/icons/82611dou2.gif' />(/test555/test666不查询)<br/><br/>
　　键名大小写混合或大写时<img src='/icons/82611dou.gif' />不指定路径则默认删除当前路径<img src='/icons/82611dou.gif' />并且不向上查询<img src='/icons/82611dou2.gif' /><br/><br/>
　　c.读取Cookie时只能读取直接父路径<img src='/icons/82611de.gif' />Cookie<img src='/icons/82611dou2.gif' /><br/><br/>
　　如果当前路径为/test/test2<img src='/icons/82611dou.gif' />要读取<img src='/icons/82611de.gif' />键为"key"<img src='/icons/82611dou2.gif' />当前路径读取后<img src='/icons/82611dou.gif' />还要读取/test<img src='/icons/82611dou.gif' />/test读取后<img src='/icons/82611dou.gif' />还要读取/<br/><br/>
　　d.在做Java<img src='/icons/82611de.gif' />web项目时<img src='/icons/82611dou.gif' />由于<img src='/icons/82611yi.gif' />般<img src='/icons/82611de.gif' />Web服务器(如Tomcat或Jetty)都用Context来管理区别<img src='/icons/82611de.gif' />Web Application<img src='/icons/82611dou.gif' />这样对于每个Context有区别<img src='/icons/82611de.gif' />Path<img src='/icons/82611dou.gif' /><br/><br/>
　　在<img src='/icons/82611yi.gif' />个Server中有多个Web Application时要特别小心<img src='/icons/82611dou.gif' />不要设置Path为/<img src='/icons/82611de.gif' />Cookie<img src='/icons/82611dou.gif' />容易误操作<img src='/icons/82611dou2.gif' />(当然前提是域名相同)<br/><br/>
 <a href="/mypdf/78897.pdf" title="查看 java操作cookie:Java小窍门技巧:有关Cookie的操作 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78897.html</guid>
		</item>
		<item>
			<title><![CDATA[java多线程编程:实战Java多线程编程的不提倡的思路方法]]></title>
			<link>http://CrazyCoder.cn/Java/Article78894.html</link>
			<description>
				<![CDATA[

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不提倡使用<img src='/icons/60250de.gif' />思路方法是为支持向后兼容性而保留<img src='/icons/60250de.gif' />那些思路方法<img src='/icons/60250dou.gif' />它们在以后<img src='/icons/60250de.gif' />版本中可能出现<img src='/icons/60250dou.gif' />也可能不出现<img src='/icons/60250dou2.gif' />Java 多线程支持在版本 1.1 和版本 1.2 中做了重大修订<img src='/icons/60250dou.gif' />stop<img src='/icons/60250kh.gif' />、suspend<img src='/icons/60250kh.gif' /> 和 resume<img src='/icons/60250kh.gif' /> <img src='/icons/60250hanshu.gif' />已不提倡使用<img src='/icons/60250dou2.gif' />这些<img src='/icons/60250hanshu.gif' />在 JVM 中可能引入微妙<img src='/icons/60250de.gif' /><img src='/icons/60250cuowu.gif' /><img src='/icons/60250dou2.gif' />虽然<img src='/icons/60250hanshu.gif' />名可能听起来很诱人<img src='/icons/60250dou.gif' />但请抵制诱惑不要使用它们<img src='/icons/60250dou2.gif' /> <br/><br/>
　　调试线程化<img src='/icons/60250de.gif' /><img src='/icons/60250chengxu.gif' /> <br/><br/>
　　在线程化<img src='/icons/60250de.gif' /><img src='/icons/60250chengxu.gif' />中<img src='/icons/60250dou.gif' />可能发生<img src='/icons/60250de.gif' />某些常见而讨厌<img src='/icons/60250de.gif' />情况是死锁、活锁、内存损坏和资源耗尽<img src='/icons/60250dou2.gif' /> <br/><br/>
　　死锁 <br/><br/>
　　死锁可能是多线程<img src='/icons/60250chengxu.gif' />最常见<img src='/icons/60250de.gif' />问题<img src='/icons/60250dou2.gif' />当<img src='/icons/60250yi.gif' />个线程需要<img src='/icons/60250yi.gif' />个资源而另<img src='/icons/60250yi.gif' />个线程持有该资源<img src='/icons/60250de.gif' />锁时<img src='/icons/60250dou.gif' />就会发生死锁<img src='/icons/60250dou2.gif' />这种情况通常很难检测<img src='/icons/60250dou2.gif' />但是<img src='/icons/60250dou.gif' />解决方案却相当好:在所有<img src='/icons/60250de.gif' />线程中按相同<img src='/icons/60250de.gif' />次序获取所有资源锁<img src='/icons/60250dou2.gif' />例如<img src='/icons/60250dou.gif' />如果有 4个资源 —A、B、C 和 D — 并且<img src='/icons/60250yi.gif' />个线程可能要获取 4个资源中任何<img src='/icons/60250yi.gif' />个资源<img src='/icons/60250de.gif' />锁<img src='/icons/60250dou.gif' />则请确保在获取对 B <img src='/icons/60250de.gif' />锁的前首先获取对 A <img src='/icons/60250de.gif' />锁<img src='/icons/60250dou.gif' />依此类推<img src='/icons/60250dou2.gif' />如果“线程 1”希望获取对 B 和 C <img src='/icons/60250de.gif' />锁<img src='/icons/60250dou.gif' />而“线程 2”获取了 A、C 和 D <img src='/icons/60250de.gif' />锁<img src='/icons/60250dou.gif' />则这<img src='/icons/60250yi.gif' />技术可能导致阻塞<img src='/icons/60250dou.gif' />但它永远不会在这 4个锁上造成死锁<img src='/icons/60250dou2.gif' /> <br/><br/>
　　活锁 <br/><br/>
　　当<img src='/icons/60250yi.gif' />个线程忙于接受新任务以致它永远没有机会完成任何任务时<img src='/icons/60250dou.gif' />就会发生活锁<img src='/icons/60250dou2.gif' />这个线程最终将超出缓冲区并导致<img src='/icons/60250chengxu.gif' />崩溃<img src='/icons/60250dou2.gif' />试想<img src='/icons/60250yi.gif' />个秘书需要录入<img src='/icons/60250yi.gif' />封信<img src='/icons/60250dou.gif' />但她<img src='/icons/60250yi.gif' />直在忙于接电话<img src='/icons/60250dou.gif' />所以这封信永远不会被录入<img src='/icons/60250dou2.gif' /> <br/><br/>
　　内存损坏 <br/><br/>
　　如果明智地使用 synchronized 关键字<img src='/icons/60250dou.gif' />则完全可以避免内存<img src='/icons/60250cuowu.gif' />这种气死人<img src='/icons/60250de.gif' />问题<img src='/icons/60250dou2.gif' /> <br/><br/>
　　资源耗尽 <br/><br/>
　　某些系统资源是有限<img src='/icons/60250de.gif' /><img src='/icons/60250dou.gif' />如文件描述符<img src='/icons/60250dou2.gif' />多线程<img src='/icons/60250chengxu.gif' />可能耗尽资源<img src='/icons/60250dou.gif' /><img src='/icons/60250yinwei.gif' />每个线程都可能希望有<img src='/icons/60250yi.gif' />个这样<img src='/icons/60250de.gif' />资源<img src='/icons/60250dou2.gif' />如果线程数相当大<img src='/icons/60250dou.gif' />或者某个资源<img src='/icons/60250de.gif' />侯选线程数远远超过了可用<img src='/icons/60250de.gif' />资源数<img src='/icons/60250dou.gif' />则最好使用 资源池<img src='/icons/60250dou2.gif' /><img src='/icons/60250yi.gif' />个最好<img src='/icons/60250de.gif' />举例是数据库连接池<img src='/icons/60250dou2.gif' />只要线程需要使用<img src='/icons/60250yi.gif' />个数据库连接<img src='/icons/60250dou.gif' />它就从池中取出<img src='/icons/60250yi.gif' />个<img src='/icons/60250dou.gif' />使用以后再将它返回池中<img src='/icons/60250dou2.gif' />资源池也称为 资源库<img src='/icons/60250dou2.gif' /> <br/><br/>
　　调试大量<img src='/icons/60250de.gif' />线程 <br/><br/>
　　有时<img src='/icons/60250yi.gif' />个<img src='/icons/60250chengxu.gif' /><img src='/icons/60250yinwei.gif' />有大量<img src='/icons/60250de.gif' />线程在运行而极难调试<img src='/icons/60250dou2.gif' />在这种情况下<img src='/icons/60250dou.gif' />下面<img src='/icons/60250de.gif' />这个类可能会派上用场: <br/><br/>
以下是引用片段:<br/>　　public <img src='/icons/60250class.gif' /> Probe extends Thread {&nbsp; <br/>　　public Probe<img src='/icons/60250kh.gif' /> {}&nbsp; <br/>　　public void run<img src='/icons/60250kh.gif' /> {&nbsp; <br/><br/>
　　while(true) {&nbsp; <br/>　　Thread<img src='/icons/60250zhk2.gif' /> x = <img src='/icons/60250new.gif' /> Thread[100];&nbsp; <br/>　　Thread.enumerate(x);&nbsp; <br/><br/>
　　for(<img src='/icons/60250int.gif' /> i=0; i&lt;100; i<img src='/icons/60250jiajia.gif' />) {&nbsp; <br/>　　　Thread t = x[i];&nbsp; <br/>　　　<img src='/icons/60250if.gif' />(t <img src='/icons/60250dd.gif' /> null)&nbsp; <br/>　　　　<img src='/icons/60250break.gif' />;&nbsp; <br/>　　　<img src='/icons/60250else.gif' />&nbsp; <br/>　　　　<img src='/icons/60250System.gif' />.out.pr<img src='/icons/60250int.gif' />ln(t.getName<img src='/icons/60250kh.gif' /> + "\t" + t.getPriority<img src='/icons/60250kh.gif' />&nbsp; <br/>　　+ "\t" + t.isAlive<img src='/icons/60250kh.gif' /> + "\t" + t.isDaemon<img src='/icons/60250kh.gif' />);&nbsp; <br/>　　}&nbsp; <br/>　　}&nbsp; <br/>　　}&nbsp; <br/>　　} <br/><br/>
 <a href="/mypdf/78894.pdf" title="查看 java多线程编程:实战Java多线程编程的不提倡的思路方法 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78894.html</guid>
		</item>
		<item>
			<title><![CDATA[weblogic环境变量:WEBLOGIC环境:SOA形式]]></title>
			<link>http://CrazyCoder.cn/Java/Article78891.html</link>
			<description>
				<![CDATA[

　&nbsp;&nbsp;&nbsp; 最近我在为<img src='/icons/29170yi.gif' />个客户工作<img src='/icons/29170dou.gif' />他们有许多部署在WebLogic 8.1上<img src='/icons/29170de.gif' />J2EE应用<img src='/icons/29170chengxu.gif' /><img src='/icons/29170dou.gif' />需要我帮助他们把应用<img src='/icons/29170chengxu.gif' />资产转化为SOA<img src='/icons/29170de.gif' />服务资产<img src='/icons/29170dou2.gif' />他们有严格<img src='/icons/29170de.gif' />时限<img src='/icons/29170dou.gif' />所以不能对应用<img src='/icons/29170chengxu.gif' />代码进行大<img src='/icons/29170de.gif' />改动<img src='/icons/29170dou2.gif' />在讨论中<img src='/icons/29170dou.gif' />他们不断提出有关Web服务<img src='/icons/29170de.gif' />问题<img src='/icons/29170dou.gif' />我感觉人们通常将Web服务看作SOA<img src='/icons/29170de.gif' />构件块<img src='/icons/29170dou2.gif' />他们关注<img src='/icons/29170de.gif' />是将应用<img src='/icons/29170chengxu.gif' />组件转化为Web服务以及由此给整体环境和操作带来<img src='/icons/29170de.gif' />影响<img src='/icons/29170dou2.gif' />
　　许多人将Web服务看作SOA基础架构<img src='/icons/29170de.gif' />构件块<img src='/icons/29170dou.gif' />这并不奇怪<img src='/icons/29170dou2.gif' />我认为Web服务可以是SOA<img src='/icons/29170de.gif' />构件块<img src='/icons/29170dou.gif' />但并不<img src='/icons/29170yi.gif' />定是必需<img src='/icons/29170de.gif' /><img src='/icons/29170dou2.gif' />下面我将介绍为什么以及如何可以将部署在WebLogic Server上<img src='/icons/29170de.gif' />应用<img src='/icons/29170chengxu.gif' />组件看作作为SOA<img src='/icons/29170yi.gif' />部分<img src='/icons/29170de.gif' />服务<img src='/icons/29170dou2.gif' /><br/><br/>
　　应用<img src='/icons/29170chengxu.gif' />可以被分解为实现业务功能<img src='/icons/29170de.gif' />组件<img src='/icons/29170dou2.gif' />每<img src='/icons/29170yi.gif' />个应用<img src='/icons/29170chengxu.gif' />都有特定<img src='/icons/29170de.gif' />业务、功能和操作需求<img src='/icons/29170dou2.gif' />功能需求要迎合实现<img src='/icons/29170dou.gif' />在这方面我不准备花太多时间介绍<img src='/icons/29170dou.gif' /><img src='/icons/29170yinwei.gif' />我们讨论<img src='/icons/29170de.gif' />是已经成为企业<img src='/icons/29170yi.gif' />部分<img src='/icons/29170de.gif' />、需要转化为SOA构件块<img src='/icons/29170de.gif' />应用<img src='/icons/29170chengxu.gif' /><img src='/icons/29170dou2.gif' />此时我们需要关注<img src='/icons/29170de.gif' />是<img src='/icons/29170dou.gif' />如何关联业务需求并为该应用<img src='/icons/29170chengxu.gif' />提供<img src='/icons/29170yi.gif' />个轻松<img src='/icons/29170de.gif' />操作环境<img src='/icons/29170dou2.gif' /><br/><br/>
　　许多业务需求都归结为对应用<img src='/icons/29170chengxu.gif' /><img src='/icons/29170de.gif' />服务水平协议(SLA)<img src='/icons/29170de.gif' />满足<img src='/icons/29170dou.gif' />业务需求可能包括以下方面:<br/><br/>
　　并发用户<br/><br/>
　　响应时间<br/><br/>
　　<img src='/icons/29170cuowu.gif' />率<br/><br/>
　　工作负载优先化(业务功能按照优先级进行分解)<br/><br/>
　　应用<img src='/icons/29170chengxu.gif' />采用率(就用户数目而言<img src='/icons/29170de.gif' />应用<img src='/icons/29170chengxu.gif' />扩展路线图)<br/><br/>
　　可用性<br/><br/>
　　操作需求和维护基础架构有关<img src='/icons/29170dou.gif' />可能包括以下方面:<br/><br/>
　　应用<img src='/icons/29170chengxu.gif' />监控<br/><br/>
　　部署策略<br/><br/>
　　维护(补丁、升级)<br/><br/>
　　问题诊断<br/><br/>
　　大多数情况下<img src='/icons/29170dou.gif' />WebLogic例子上部署了许多应用<img src='/icons/29170chengxu.gif' /><img src='/icons/29170dou.gif' />难以将上述需求关联到该环境中<img src='/icons/29170dou2.gif' /><br/><br/>
　　隔离:给出上述场景的后<img src='/icons/29170dou.gif' />我们来看<img src='/icons/29170yi.gif' />种将这样<img src='/icons/29170de.gif' />环境转化为SOA<img src='/icons/29170de.gif' /><img src='/icons/29170yi.gif' />部分<img src='/icons/29170de.gif' />思路方法<img src='/icons/29170dou2.gif' />第<img src='/icons/29170yi.gif' />步是要隔离被认为是关键型<img src='/icons/29170de.gif' />应用<img src='/icons/29170chengxu.gif' />或组件<img src='/icons/29170dou2.gif' /><br/><br/>
　　可以通过将这些应用<img src='/icons/29170chengxu.gif' />部署到各自<img src='/icons/29170de.gif' />WebLogic例子中<img src='/icons/29170dou.gif' />然后关联适当<img src='/icons/29170de.gif' />存储器和WebLogic资源到该应用<img src='/icons/29170chengxu.gif' />来实现隔离<img src='/icons/29170dou2.gif' />然后这些服务器例子可以被集群化<img src='/icons/29170dou.gif' />这样就有助于进行故障转移<img src='/icons/29170dou.gif' />从而使环境具有高度可用性<img src='/icons/29170dou2.gif' />不要忘记:业务期望值越高<img src='/icons/29170dou.gif' />基础架构<img src='/icons/29170de.gif' />成本就越昂贵<img src='/icons/29170dou2.gif' />如果需要隔离应用<img src='/icons/29170chengxu.gif' /><img src='/icons/29170de.gif' />特定组件<img src='/icons/29170dou.gif' />可以利用定制<img src='/icons/29170de.gif' />执行队列(_execute Queue)或工作管理器(Work Manager)(9.0中<img src='/icons/29170de.gif' />新特性)<img src='/icons/29170dou.gif' />为它们配置适当<img src='/icons/29170de.gif' />线程数<img src='/icons/29170dou2.gif' />创建执行队列可以为应用<img src='/icons/29170chengxu.gif' />组件提供分离<img src='/icons/29170de.gif' />请求通道<img src='/icons/29170dou.gif' />并防止请求缺乏关键型业务功能<img src='/icons/29170dou2.gif' />在连接池级进行隔离可以确保数据库资源<img src='/icons/29170de.gif' />可用性<img src='/icons/29170dou2.gif' /><br/><br/>
　　服务器特征:我们需要从吞吐量、负载的下<img src='/icons/29170de.gif' />响应等方面来了解服务器特征<img src='/icons/29170dou2.gif' />这是通过进行负载/压力测试<img src='/icons/29170dou.gif' />然后调优环境以获得WebLogic Server例子<img src='/icons/29170de.gif' />最佳性能指标来完成<img src='/icons/29170de.gif' /><img src='/icons/29170dou2.gif' />这是<img src='/icons/29170yi.gif' />项重要<img src='/icons/29170de.gif' />任务<img src='/icons/29170dou.gif' /><img src='/icons/29170yinwei.gif' />它可以帮助规划以后<img src='/icons/29170de.gif' />应用<img src='/icons/29170chengxu.gif' />采用率<img src='/icons/29170dou.gif' />从而提供<img src='/icons/29170yi.gif' />个可伸缩<img src='/icons/29170de.gif' />环境<img src='/icons/29170dou2.gif' /><br/><br/>
　　灾难恢复规划:关键型应用<img src='/icons/29170chengxu.gif' />应该有适当<img src='/icons/29170de.gif' />灾难恢复规划<img src='/icons/29170dou2.gif' />我信任hot-hot型而不是hot-standby(热备份)型<img src='/icons/29170de.gif' />冗余环境<img src='/icons/29170dou2.gif' />如果备份不能运行该如何办？如果出现故障<img src='/icons/29170dou.gif' />有多少服务器例子才足以维持峰值负载？有关这方面<img src='/icons/29170de.gif' />详细信息也必须在文档中注明<img src='/icons/29170dou2.gif' />所有这些可以确保在出现故障时能够有<img src='/icons/29170yi.gif' />个运行良好<img src='/icons/29170de.gif' />环境<img src='/icons/29170dou.gif' />而保护业务是底线<img src='/icons/29170dou2.gif' /><br/><br/>
　　统<img src='/icons/29170yi.gif' />管理:我曾经在<img src='/icons/29170yi.gif' />些机构中看到他们用<img src='/icons/29170yi.gif' />个操作小组来管理多个WebLogic域<img src='/icons/29170dou2.gif' />这样<img src='/icons/29170de.gif' />环境是难于维护和管理<img src='/icons/29170de.gif' /><img src='/icons/29170dou2.gif' />考虑需要进行更新<img src='/icons/29170de.gif' />场景<img src='/icons/29170dou2.gif' />还有监控——这是<img src='/icons/29170yi.gif' />项日常操作任务——必须查看多个WebLogic Server控制台以收集信息<img src='/icons/29170dou2.gif' />我<img src='/icons/29170de.gif' />建议是<img src='/icons/29170dou.gif' />在可能<img src='/icons/29170de.gif' />地方对类似<img src='/icons/29170de.gif' />应用<img src='/icons/29170chengxu.gif' />创建多个集群而不是多个域<img src='/icons/29170dou2.gif' />集群提供对应用<img src='/icons/29170chengxu.gif' /><img src='/icons/29170de.gif' />固有隔离级别<img src='/icons/29170dou.gif' />这会产生较少<img src='/icons/29170de.gif' />域以及更易于管理<img src='/icons/29170de.gif' />环境<img src='/icons/29170dou2.gif' /><br/><br/>
　　操作是面向流程<img src='/icons/29170de.gif' />:对环境<img src='/icons/29170de.gif' />操作很大程度上是面向流程<img src='/icons/29170de.gif' /><img src='/icons/29170dou.gif' />且需要进行详细<img src='/icons/29170de.gif' />记录<img src='/icons/29170dou2.gif' /><img src='/icons/29170cuowu.gif' />模式和正确<img src='/icons/29170de.gif' />解决方案<img src='/icons/29170de.gif' />记录都是<img src='/icons/29170yi.gif' />个动态过程<img src='/icons/29170dou2.gif' />环境进行升级和打补丁<img src='/icons/29170de.gif' />停机时间必须符合高可用性<img src='/icons/29170de.gif' />业务需求<img src='/icons/29170dou2.gif' />必须为维护设置适当<img src='/icons/29170de.gif' />过程<img src='/icons/29170dou2.gif' />还要定义逐步升级<img src='/icons/29170de.gif' />过程<img src='/icons/29170dou.gif' />并写入文档<img src='/icons/29170dou2.gif' />作为部署过程<img src='/icons/29170de.gif' /><img src='/icons/29170yi.gif' />部分<img src='/icons/29170dou.gif' />还应该采用域模板<img src='/icons/29170dou.gif' />以便产生跨区别环境<img src='/icons/29170de.gif' /><img src='/icons/29170yi.gif' />致域<img src='/icons/29170dou2.gif' /><br/><br/>
　　提供透明性:<img src='/icons/29170yi.gif' />个管理良好<img src='/icons/29170de.gif' />环境需要有针对关键性业务破坏<img src='/icons/29170de.gif' />报警机制<img src='/icons/29170dou2.gif' />在问题诊断时<img src='/icons/29170dou.gif' />服务器日志中<img src='/icons/29170de.gif' />信息必须有<img src='/icons/29170yi.gif' />定<img src='/icons/29170de.gif' />透明度<img src='/icons/29170dou2.gif' />应用<img src='/icons/29170chengxu.gif' />必须记录有助于问题诊断<img src='/icons/29170de.gif' />关键信息<img src='/icons/29170dou2.gif' />在问题诊断时<img src='/icons/29170dou.gif' />可以使用诸如来自Splunk的类<img src='/icons/29170de.gif' />工具来聚合来自服务器环境中区别日志<img src='/icons/29170de.gif' />信息<img src='/icons/29170dou2.gif' />此外<img src='/icons/29170dou.gif' />预期和实际<img src='/icons/29170de.gif' />关键性技术指标也应该被收集并关联起来<img src='/icons/29170dou2.gif' />例如<img src='/icons/29170dou.gif' />在容量规划期间<img src='/icons/29170dou.gif' />可以基于业务需求预测特定数目<img src='/icons/29170de.gif' />并发用户<img src='/icons/29170dou.gif' />而这个数字可能和生产环境中实际得到<img src='/icons/29170de.gif' />数字区别<img src='/icons/29170dou2.gif' />这类技术指标应该定期报告<img src='/icons/29170dou.gif' />以方便以后<img src='/icons/29170de.gif' />环境调优<img src='/icons/29170dou2.gif' /><br/><br/>
　　结束语<br/><br/>
　　在本文中<img src='/icons/29170dou.gif' />我介绍了<img src='/icons/29170yi.gif' />种经过大大简化<img src='/icons/29170de.gif' />思路方法<img src='/icons/29170dou.gif' />用于将驻留在WebLogic上<img src='/icons/29170de.gif' />应用<img src='/icons/29170chengxu.gif' />转化为SOA中<img src='/icons/29170de.gif' />资产<img src='/icons/29170dou2.gif' />此外<img src='/icons/29170dou.gif' />我没有谈到<img src='/icons/29170de.gif' />其他领域(比如数据库、外部系统)也需要进行分析和研究<img src='/icons/29170dou2.gif' />上述概念也可以应用于这些系统<img src='/icons/29170dou2.gif' />这些特性都带有相关<img src='/icons/29170de.gif' />成本<img src='/icons/29170dou.gif' />因此必须分析实现它们<img src='/icons/29170de.gif' />投资回报(ROI)<img src='/icons/29170dou2.gif' />最后您将得到<img src='/icons/29170yi.gif' />个可以满足业务和功能需求<img src='/icons/29170de.gif' />环境<img src='/icons/29170dou.gif' />就可以很好地实现SOA了<img src='/icons/29170dou2.gif' />本文并未涵盖所有<img src='/icons/29170de.gif' />SOA要素<img src='/icons/29170dou.gif' />但是它提出了<img src='/icons/29170yi.gif' />个用于满足复杂<img src='/icons/29170de.gif' />WebLogic环境中<img src='/icons/29170de.gif' />某些SOA需求<img src='/icons/29170de.gif' />解决方案<img src='/icons/29170dou2.gif' /><br/><br/>
 <a href="/mypdf/78891.pdf" title="查看 weblogic环境变量:WEBLOGIC环境:SOA形式 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78891.html</guid>
		</item>
		<item>
			<title><![CDATA[soa理念:如何能让企业的CEO接受SOA理念的建议]]></title>
			<link>http://CrazyCoder.cn/Java/Article78890.html</link>
			<description>
				<![CDATA[

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOA<img src='/icons/57409de.gif' />大潮不可逆转<img src='/icons/57409dou.gif' />但很多企业<img src='/icons/57409de.gif' />CEO并不急于参和“冲浪”<img src='/icons/57409dou.gif' />而是保持观望<img src='/icons/57409de.gif' />态度<img src='/icons/57409dou2.gif' />如果你是企业<img src='/icons/57409de.gif' />CIO<img src='/icons/57409dou.gif' />并且认为企业应该部署SOA<img src='/icons/57409dou.gif' />你该如何把SOA对企业<img src='/icons/57409de.gif' />重要性和价值证明给公司高层业务管理者(特别是CEO)<img src='/icons/57409dou.gif' />让CEO们接受SOA呢?IBM软件Software集团WebSphere软件Software、SOA战略、渠道、市场全球副总裁Sandy Carter给出了10条建议<img src='/icons/57409dou2.gif' />
　　1、先别提SOA<img src='/icons/57409dou2.gif' />在进入技术层面<img src='/icons/57409de.gif' />讨论前<img src='/icons/57409dou.gif' />要用业务<img src='/icons/57409de.gif' />语言介绍说明SOA带来<img src='/icons/57409de.gif' />价值和好处<img src='/icons/57409dou2.gif' />这些价值和好处要和企业<img src='/icons/57409de.gif' />目标挂钩<img src='/icons/57409dou.gif' />比如成本降低、生产效率、竞争优势等<img src='/icons/57409dou2.gif' /><br/><br/>
　　2、前景<img src='/icons/57409dou.gif' />而不是具体描述<img src='/icons/57409dou2.gif' />概括出SOA策略<img src='/icons/57409de.gif' />长期和短期结果<img src='/icons/57409dou.gif' />避免讨论具体<img src='/icons/57409de.gif' />描述性数据<img src='/icons/57409dou2.gif' /> <br/><br/>
　　3、在整个公司建立共识<img src='/icons/57409dou2.gif' />在公司招募志愿部门先参和小型试验项目<img src='/icons/57409dou2.gif' />通过这些小型项目来证明SOA<img src='/icons/57409de.gif' />价值<img src='/icons/57409dou2.gif' />记得<img src='/icons/57409dou.gif' />要让那些以后你需要<img src='/icons/57409de.gif' />部门领导们参和进来<img src='/icons/57409dou2.gif' /><br/><br/>
　　4、从小事做起<img src='/icons/57409dou.gif' />但要有宏观视野<img src='/icons/57409dou2.gif' />在选择小型测试项目时<img src='/icons/57409dou.gif' />要选择那些在整个公司都广泛使用、具有全公司积极影响<img src='/icons/57409de.gif' />业务流程先进行整合和自动化<img src='/icons/57409dou2.gif' /><br/><br/>
　　5、不要再说SOA这 3个字母<img src='/icons/57409dou2.gif' />虽然这个技术术语非常容易被记住<img src='/icons/57409dou.gif' />大家也很容易理解<img src='/icons/57409dou.gif' />但记住<img src='/icons/57409dou.gif' />当你想向CEO证明这是<img src='/icons/57409yi.gif' />个重要<img src='/icons/57409de.gif' />策略性项目时<img src='/icons/57409dou.gif' />他们可能并不理解这 3个简写字母背后<img src='/icons/57409de.gif' />深刻含义<img src='/icons/57409dou2.gif' /><br/><br/>
　　6、单刀直入讨论最重要<img src='/icons/57409de.gif' />要点<img src='/icons/57409dou2.gif' />不要用复杂<img src='/icons/57409de.gif' />PPT演示文档<img src='/icons/57409dou.gif' />这可能会让会议不能达到真正<img src='/icons/57409de.gif' />目<img src='/icons/57409de.gif' /><img src='/icons/57409dou2.gif' /><br/><br/>
　　7、信心和预测<img src='/icons/57409dou2.gif' />清晰明白地介绍说明实施SOA<img src='/icons/57409de.gif' />每<img src='/icons/57409yi.gif' />步目标<img src='/icons/57409dou2.gif' />公开宣传企业基于SOA后可以实现<img src='/icons/57409de.gif' />目标<img src='/icons/57409dou.gif' />比如提高生产效率<img src='/icons/57409dou.gif' />或者降低多少百分比<img src='/icons/57409de.gif' />成本<img src='/icons/57409dou.gif' />这样就能比较容易地树立起对整个项目和战略<img src='/icons/57409de.gif' />信心<img src='/icons/57409dou2.gif' /><br/><br/>
　　8、引用第 3方研究数据来验证<img src='/icons/57409dou2.gif' />引用分析师<img src='/icons/57409de.gif' />数据来介绍说明<img src='/icons/57409de.gif' />SOA部署和增长<img src='/icons/57409dou.gif' />阐述SOA在同行业中<img src='/icons/57409de.gif' />成功故事(特别是竞争对手<img src='/icons/57409de.gif' />)<img src='/icons/57409dou2.gif' /><br/><br/>
　　9、SOA会带来什么<img src='/icons/57409dou2.gif' />阐述采用SOA前后对企业<img src='/icons/57409de.gif' />具体影响<img src='/icons/57409dou.gif' />消除敌意<img src='/icons/57409dou.gif' />赢得CEO<img src='/icons/57409de.gif' />同意<img src='/icons/57409dou2.gif' /><br/><br/>
　　10、定性和定量<img src='/icons/57409dou2.gif' />在实施SOA过程中<img src='/icons/57409dou.gif' />在每<img src='/icons/57409yi.gif' />步都要制定目标<img src='/icons/57409dou.gif' />追踪表现结果并优化思路方法<img src='/icons/57409dou2.gif' />定期和利益相关方分享结果<img src='/icons/57409dou.gif' />证明公司SOA部署<img src='/icons/57409de.gif' />成功的处<img src='/icons/57409dou2.gif' /><br/><br/>
　　Carter特别指出<img src='/icons/57409dou.gif' />美国公司和中国公司实施SOA<img src='/icons/57409de.gif' />效果可能很不<img src='/icons/57409yi.gif' />样<img src='/icons/57409dou2.gif' />但有<img src='/icons/57409yi.gif' />点可能对所有CIO来说都是同样<img src='/icons/57409de.gif' />:SOA可能会改变他们<img src='/icons/57409de.gif' />职业生涯<img src='/icons/57409dou2.gif' /><br/><br/>
 <a href="/mypdf/78890.pdf" title="查看 soa理念:如何能让企业的CEO接受SOA理念的建议 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78890.html</guid>
		</item>
		<item>
			<title><![CDATA[bpel:浅析XPDL和BPEL现状]]></title>
			<link>http://CrazyCoder.cn/Java/Article78889.html</link>
			<description>
				<![CDATA[

<SPAN id=ArticleContent style="DISPLAY: block">
<SPAN <img src='/icons/54252class.gif' />=Title_blue>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;【TechTarget中国原创】</SPAN><STRONG>实战派<img src='/icons/54252de.gif' />XPDL</STRONG>&nbsp; <br/><br/>
　　XPDL(XML Process Definition Language)<img src='/icons/54252de.gif' />缩写<img src='/icons/54252dou.gif' />是由Workflow Management Coalition(WFMC)所提出<img src='/icons/54252de.gif' /><img src='/icons/54252yi.gif' />个工作流描述规格<img src='/icons/54252dou.gif' />使用XML文件让区别<img src='/icons/54252de.gif' />工作流程软件Software间交换商业流程定义<img src='/icons/54252dou2.gif' />XPDL是<img src='/icons/54252yi.gif' />个通用<img src='/icons/54252de.gif' />框架<img src='/icons/54252dou.gif' />据WFMC认证列表统计目前全球约有80个厂商支持该标准<img src='/icons/54252dou.gif' />包括我们熟悉<img src='/icons/54252de.gif' />IBM、BEA(Oracle)、Tibco相关流程产品<img src='/icons/54252dou.gif' />目前XPDL<img src='/icons/54252de.gif' />最新版本是2.1(2008年4月23日approve version)<img src='/icons/54252dou2.gif' /> <br/><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WFMC为实现区别工作流产品间互交换<img src='/icons/54252dou.gif' />给定了5类接口规范标准(Interface)<img src='/icons/54252dou.gif' />其中我们讨论<img src='/icons/54252de.gif' />XPDL是其Interface1<img src='/icons/54252dou2.gif' />XPDL给定了流程定义间进行相互转换<img src='/icons/54252de.gif' />XML Schema元模型<img src='/icons/54252dou.gif' />这个XML Schema可理解为和运行控制无关<img src='/icons/54252de.gif' />描述结构,为设计流程和运行流程提供了形式上<img src='/icons/54252de.gif' />可分离<img src='/icons/54252dou.gif' />这样无论开发者使用Java、.Net还是轻量级<img src='/icons/54252de.gif' />PHP、Python语言<img src='/icons/54252dou.gif' />采用有限状态机还是Petri网<img src='/icons/54252dou.gif' />只要外部接口符合XPDL规范标准<img src='/icons/54252dou.gif' />那么就可以保持相同<img src='/icons/54252de.gif' />表示形式和互操作<img src='/icons/54252dou.gif' />这就为厂商间标准合规性验证提供了<img src='/icons/54252yi.gif' />个通用<img src='/icons/54252de.gif' />描述框架<img src='/icons/54252dou.gif' />更重要<img src='/icons/54252de.gif' />是XPDL对不支持<img src='/icons/54252de.gif' />厂商个性场景提供了扩展<img src='/icons/54252dou.gif' />这个扩展框架约束能够保证流程对外表现形式<img src='/icons/54252de.gif' /><img src='/icons/54252yi.gif' />致性<img src='/icons/54252dou2.gif' />正是这个定位使得XPDL在和十几年中出现<img src='/icons/54252de.gif' />众多潜在新兴竞争标准的争中仍然保持旺盛<img src='/icons/54252de.gif' />生命力<img src='/icons/54252dou.gif' />并催生了区别竞争活力<img src='/icons/54252de.gif' />工作流产品<img src='/icons/54252dou2.gif' />对于实现XPDL规范标准<img src='/icons/54252de.gif' />工作流产品<img src='/icons/54252dou.gif' />目前<img src='/icons/54252yi.gif' />个通常<img src='/icons/54252de.gif' />方式是采用BPMN进行建模<img src='/icons/54252dou.gif' />以XPDL为持久格式<img src='/icons/54252dou.gif' />由厂商实现<img src='/icons/54252de.gif' />流程引擎执行该描述<img src='/icons/54252dou2.gif' />&nbsp; <br/><br/>
　　XPDL<img src='/icons/54252de.gif' />主要元模型包括了过程活动、转移连接弧(可理解为规则)、参和者(过程活动所需<img src='/icons/54252de.gif' />资源<img src='/icons/54252dou.gif' />在XPDL中参和者模型被抽象为<img src='/icons/54252yi.gif' />个分配对象<img src='/icons/54252dou.gif' />可能是现实世界<img src='/icons/54252de.gif' />人也可以是<img src='/icons/54252yi.gif' />个系统或服务)、<img src='/icons/54252chengxu.gif' />声明(过程活动<img src='/icons/54252diaoyong.gif' /><img src='/icons/54252de.gif' />IT应用<img src='/icons/54252chengxu.gif' />或接口服务<img src='/icons/54252dou.gif' />例如<img src='/icons/54252yi.gif' />个人工任务<img src='/icons/54252de.gif' />交互表单、Web服务)和工作流相关数据(运行期间持久化<img src='/icons/54252de.gif' />流程例子控制数据)<img src='/icons/54252dou2.gif' /> <br/>WFMC工作流联盟是<img src='/icons/54252yi.gif' />个活跃了十 5年<img src='/icons/54252de.gif' />民间组织<img src='/icons/54252dou.gif' />官方宣称有超过300个成员<img src='/icons/54252dou.gif' />在欧洲、美洲及亚太设有指导委员会<img src='/icons/54252dou.gif' />每隔 3年举办<img src='/icons/54252yi.gif' />次大规模<img src='/icons/54252de.gif' />工作组会议<img src='/icons/54252dou.gif' />XPDL除了得到大部分国际工作流厂商和Opensource支持外<img src='/icons/54252dou.gif' />在中国也有不少工作流厂商支持该标准<img src='/icons/54252dou2.gif' /> <br/>&nbsp;<br/><STRONG>　　“老”贵<img src='/icons/54252de.gif' />BPEL</STRONG>&nbsp; <br/><br/>
　　BPEL(Business Process Execution Language)<img src='/icons/54252de.gif' />缩写<img src='/icons/54252dou.gif' />直意为业务过程执行语言<img src='/icons/54252dou.gif' />是<img src='/icons/54252yi.gif' />种基于XML<img src='/icons/54252de.gif' /><img src='/icons/54252dou.gif' />用来描写业务过程<img src='/icons/54252de.gif' />编程语言<img src='/icons/54252dou.gif' />被描写<img src='/icons/54252de.gif' />业务过程<img src='/icons/54252de.gif' />每个单<img src='/icons/54252yi.gif' />步骤则由Web服务来实现<img src='/icons/54252dou.gif' />这个描述本身也由Web服务提供<img src='/icons/54252dou.gif' />即BPEL模型本身也被当做Web服务来使用<img src='/icons/54252dou2.gif' />BPEL在过去很长<img src='/icons/54252yi.gif' />段时间被视为未来工作流标准<img src='/icons/54252de.gif' />“新贵”<img src='/icons/54252dou.gif' />经过 8年<img src='/icons/54252de.gif' />发展<img src='/icons/54252dou.gif' />目前BPEL规范标准已在Oracle、IBM等厂商SOA产品中提供支持<img src='/icons/54252dou.gif' />可以说是新贵变”老”贵了<img src='/icons/54252dou2.gif' /> <br/>&nbsp;<br/>　　BPEL基于Web Service<img src='/icons/54252de.gif' />WSDL建立<img src='/icons/54252dou.gif' />相关标准还包括XML Schema、XPath、WS-Addressing等SOA标准<img src='/icons/54252dou2.gif' />最初<img src='/icons/54252de.gif' />BPEL标准被定位于大规模分布式商业应用下<img src='/icons/54252de.gif' />服务编程语言<img src='/icons/54252dou.gif' />不支持人机对话<img src='/icons/54252de.gif' />人工流程<img src='/icons/54252dou.gif' />BPEL所描写<img src='/icons/54252de.gif' />过程仅和Web服务通信<img src='/icons/54252dou.gif' />而这些Web服务却可以提供和用户<img src='/icons/54252de.gif' />信息交换<img src='/icons/54252dou.gif' />但它们不是用户本身<img src='/icons/54252dou2.gif' />BPEL从2002年提出后也是在不断更新<img src='/icons/54252dou.gif' />在随后加入了<img src='/icons/54252yi.gif' />些重要扩展规范标准<img src='/icons/54252dou.gif' />例如BPELJ(允许BPEL XML中加入Java<img src='/icons/54252chengxu.gif' />段<img src='/icons/54252dou.gif' />需要澄清<img src='/icons/54252de.gif' />是BPEL不仅能够执行Web服务<img src='/icons/54252dou.gif' />还可以通过厂商扩展调配JCA、JMS等)、BPEL4People和WS-HumanTask(虽然在分布式商业应用中广泛采用了Web服务<img src='/icons/54252dou.gif' />但是缺乏人员交互是应用于真实世界业务过程<img src='/icons/54252de.gif' /><img src='/icons/54252yi.gif' />大差距<img src='/icons/54252dou.gif' />这个扩展使BPEL能够兼顾基于角色<img src='/icons/54252de.gif' />人工活动编排过程)<img src='/icons/54252dou2.gif' />可以说BPEL在构建符合标准<img src='/icons/54252de.gif' />SOA架构中占据重要位置<img src='/icons/54252dou.gif' />是编排Service<img src='/icons/54252de.gif' />杀手锏<img src='/icons/54252dou.gif' />但目前市面提供<img src='/icons/54252de.gif' />BPEL产品在解决企业非流程集成场景方面仍有明显不足<img src='/icons/54252dou.gif' />我认为BPEL如果不出意外<img src='/icons/54252dou.gif' />肯定会成为工业界中业务集成方面<img src='/icons/54252de.gif' />标准语言<img src='/icons/54252dou.gif' />如果成为完整<img src='/icons/54252de.gif' />工作流工业标准目前还差<img src='/icons/54252yi.gif' />些<img src='/icons/54252dou2.gif' />&nbsp;<br/><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BPEL是<img src='/icons/54252yi.gif' />种基于块(Block)<img src='/icons/54252de.gif' />结构化编程语言<img src='/icons/54252dou.gif' />可以在符合BPEL标准<img src='/icons/54252de.gif' />引擎上执行<img src='/icons/54252dou.gif' />作为<img src='/icons/54252yi.gif' />门简单<img src='/icons/54252de.gif' />编程语言<img src='/icons/54252dou.gif' />包括了基本<img src='/icons/54252de.gif' />顺序(Sequence)、选择(Switch)和循环(While)<img src='/icons/54252chengxu.gif' />语言控制结构<img src='/icons/54252dou.gif' />和XPDL工作流例子区别<img src='/icons/54252dou.gif' />BPEL通过<img src='/icons/54252yinwei.gif' /> receive和 pick活动提供进入流程<img src='/icons/54252de.gif' />入口点<img src='/icons/54252dou.gif' />利用<img src='/icons/54252yi.gif' />个特定于消息<img src='/icons/54252de.gif' /> XPath 表达式匹配从 WSDL相关消息集合(Correlation Set)<img src='/icons/54252de.gif' />例子中定位例子操作<img src='/icons/54252dou2.gif' />在BPEL中<img src='/icons/54252dou.gif' /><img src='/icons/54252yi.gif' />个流程可以<img src='/icons/54252diaoyong.gif' />其他服务<img src='/icons/54252dou.gif' />也可以响应来自客户端<img src='/icons/54252de.gif' />请求(receive和 pick)<img src='/icons/54252dou2.gif' />也就是说BPEL流程例子既可以作为服务<img src='/icons/54252de.gif' />请求者<img src='/icons/54252dou.gif' />也可以扮演服务<img src='/icons/54252de.gif' />提供者<img src='/icons/54252dou2.gif' /> <br/>&nbsp;<br/><STRONG>　　XPDL和BPEL<img src='/icons/54252de.gif' />区别关系</STRONG>&nbsp; <br/><br/>
　　XPDL和BPEL是完全区别且互补<img src='/icons/54252de.gif' />标准<img src='/icons/54252dou.gif' />BPEL是<img src='/icons/54252yi.gif' />个“执行语言”<img src='/icons/54252dou.gif' />旨在提供<img src='/icons/54252yi.gif' />个Web服务编排定义<img src='/icons/54252dou.gif' />BPEL<img src='/icons/54252de.gif' />定义关注<img src='/icons/54252yi.gif' />个进程以Web服务和XML数据集成为主<img src='/icons/54252de.gif' />可执行<img src='/icons/54252dou2.gif' />而XPDL则是<img src='/icons/54252yi.gif' />个和开发者相关实现无关<img src='/icons/54252de.gif' />流程过程描述规范标准和交换接口<img src='/icons/54252dou.gif' />在工作流结构完整性方面XPDL较为成熟<img src='/icons/54252dou.gif' />但XPDL未在基于SOA架构下<img src='/icons/54252de.gif' />服务编排方面给定更多标准化<img src='/icons/54252de.gif' />交换格式<img src='/icons/54252dou.gif' />大部分BPM厂商均以XPDL扩展语法提供私有<img src='/icons/54252de.gif' />扩展<img src='/icons/54252dou.gif' />而此部分正是BPEL所努力<img src='/icons/54252de.gif' /><img src='/icons/54252dou.gif' />虽然BPEL已经向其不擅长<img src='/icons/54252de.gif' />人工流程和非Web Service服务编排领域拓展规范标准<img src='/icons/54252dou.gif' />但仍然需要在非集成领域<img src='/icons/54252de.gif' />流程规范标准方面向XPDL老大哥学习<img src='/icons/54252dou.gif' />比如在面向BPM业务分析师视角<img src='/icons/54252dou.gif' />目前BPEL2.0尚缺失对过程模拟规范标准<img src='/icons/54252de.gif' />制定<img src='/icons/54252dou2.gif' />&nbsp;<br/><br/>
<IMG id=eWebEditor_TempElement_Img style="CURSOR: po<img src='/icons/54252int.gif' />er" _disibledevent=><br/><br/>
<br/><STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不分伯仲<img src='/icons/54252dou.gif' />各领风骚</STRONG> <br/><br/>
　　下表数据来自个人对2010年初各BPM厂商提供<img src='/icons/54252de.gif' />软件Software版本中对XPDL/BPEL导入导出<img src='/icons/54252de.gif' />试用评估<img src='/icons/54252dou.gif' />请以BPM厂商介绍说明为准<img src='/icons/54252dou.gif' />这里仅供参考<img src='/icons/54252dou2.gif' />可以看出<img src='/icons/54252dou.gif' />无论是“老”贵<img src='/icons/54252de.gif' />BPEL还是老资历<img src='/icons/54252de.gif' />XPDL<img src='/icons/54252dou.gif' />在市面上很长<img src='/icons/54252yi.gif' />段时间将仍然并行在各个工作流产品中<img src='/icons/54252dou.gif' />面对这两个存在<img src='/icons/54252yi.gif' />定竞争关系<img src='/icons/54252de.gif' />流程标准<img src='/icons/54252dou.gif' />BPMN至少已成赢家<img src='/icons/54252dou.gif' />XPDL和BPEL标准的争似乎在学术界已有落音<img src='/icons/54252dou.gif' />但是在2010年面对市场<img src='/icons/54252de.gif' />商业化产品进程上<img src='/icons/54252dou.gif' />两者将继续不分伯仲<img src='/icons/54252dou.gif' />各领风骚<img src='/icons/54252dou2.gif' /> <br/><br/>
<IMG id=eWebEditor_TempElement_Img style="CURSOR: po<img src='/icons/54252int.gif' />er" _disibledevent=><br/>
 <a href="/mypdf/78889.pdf" title="查看 bpel:浅析XPDL和BPEL现状 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78889.html</guid>
		</item>
		<item>
			<title><![CDATA[swingajax:AjaxSwing 3.0发布 可将Java Swing转化为Ajax]]></title>
			<link>http://CrazyCoder.cn/Java/Article78888.html</link>
			<description>
				<![CDATA[

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AjaxSwing是<img src='/icons/16955yi.gif' />个专为Java Swing应用<img src='/icons/16955chengxu.gif' />打造<img src='/icons/16955de.gif' />Web开发平台<img src='/icons/16955dou2.gif' />使用AjaxSwing<img src='/icons/16955dou.gif' />可以使为Java桌面应用<img src='/icons/16955chengxu.gif' />转为Web应用<img src='/icons/16955dou2.gif' /> AjaxSwing可以被看作是<img src='/icons/16955yi.gif' />个Java到HTML<img src='/icons/16955de.gif' />转换器<img src='/icons/16955dou.gif' />其<img src='/icons/16955chengxu.gif' />可以在运行时创建被浏览器解析<img src='/icons/16955de.gif' />HTML和JavaScript<img src='/icons/16955dou2.gif' />另外<img src='/icons/16955dou.gif' />使用AjaxSwing无需对<img src='/icons/16955chengxu.gif' />和业务逻辑进行大幅修改修改<img src='/icons/16955dou.gif' />它允许开发者使用标准Swing组件来实现用户界面<img src='/icons/16955dou.gif' />且不需要<img src='/icons/16955chengxu.gif' />员学习Java技术以外<img src='/icons/16955de.gif' />API<img src='/icons/16955dou2.gif' /><br/><br/>
498)this.style.width=498;" border=0>&nbsp;<br/><STRONG><SPAN style="FONT-SIZE: smaller">使用AjaxSwing转换为Web应用<br/><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 和JavaFX相比<img src='/icons/16955dou.gif' />AjaxSwing<img src='/icons/16955de.gif' />最大特点是专注于Java桌面应用到Web<img src='/icons/16955de.gif' />转换<img src='/icons/16955dou.gif' />而无需开发者付出过多<img src='/icons/16955de.gif' />代价<img src='/icons/16955dou2.gif' /><br/><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 目前<img src='/icons/16955dou.gif' />AjaxSwing已发布3.0版本<img src='/icons/16955dou.gif' />提供了<img src='/icons/16955yi.gif' />些新<img src='/icons/16955de.gif' />功能和特性:<br/><br/>
◆支持JSpinner组件<br/><br/>
◆支持JSpeparator组件<br/><br/>
◆JComboBox支持自定义单元格渲染<br/><br/>
◆视觉效果<img src='/icons/16955de.gif' />增强<br/><br/>
◆改进对Safari浏览器及iPhone<img src='/icons/16955de.gif' />支持<br/><br/>
<STRONG>AjaxSwing举例赏析</STRONG>:<SPAN style="COLOR: #0000ff">http://demo.creamtec.com/ajaxswing/apps/SwingSet2</SPAN><br/><br/>
<STRONG>AjaxSwing下载地址</STRONG>:<SPAN style="COLOR: #0000ff">http://www.creamtec.com/products/ajaxswing/<img src='/icons/16955install.gif' />/index.html</SPAN><br/><br/>
 <a href="/mypdf/78888.pdf" title="查看 swingajax:AjaxSwing 3.0发布 可将Java Swing转化为Ajax 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78888.html</guid>
		</item>
		<item>
			<title><![CDATA[业务流程管理bpm:浅析业务流程管理(BPM)和工作流的 6大区别]]></title>
			<link>http://CrazyCoder.cn/Java/Article78886.html</link>
			<description>
				<![CDATA[

随着信息技术<img src='/icons/20442de.gif' />发展<img src='/icons/20442dou.gif' />越来越多<img src='/icons/20442de.gif' />信息系统如ERP、CRM、SRM等得到广泛应用<img src='/icons/20442dou.gif' />其中部分信息系统能实现工作流<img src='/icons/20442de.gif' />固化和自动化<img src='/icons/20442dou.gif' />提高流程效率<img src='/icons/20442dou2.gif' />但他们仍无法实质性改善企业<img src='/icons/20442de.gif' />整体流程效率<img src='/icons/20442dou.gif' />提高企业<img src='/icons/20442de.gif' />竞争力<img src='/icons/20442dou2.gif' />BPM就是在早期<img src='/icons/20442de.gif' />这些系统<img src='/icons/20442de.gif' />运营和使用经验等基础上建立<img src='/icons/20442de.gif' /><img src='/icons/20442dou2.gif' /><br/><br/>
　　BPM和工作流相比有如下<img src='/icons/20442de.gif' />区别:<br/><br/>
　　(<img src='/icons/20442yi.gif' />) 跨组织<img src='/icons/20442de.gif' />业务流程描述语言和工具<img src='/icons/20442dou2.gif' /><br/><br/>
　　在工作流系统上马早期<img src='/icons/20442dou.gif' />经常会发现同<img src='/icons/20442yi.gif' />个企业内部区别组织单元、部门<img src='/icons/20442de.gif' />流程采用区别<img src='/icons/20442de.gif' />描述思路方法<img src='/icons/20442dou.gif' />比如A/B/C/F 4个部门<img src='/icons/20442de.gif' />账目管理系统采用某种工作流系统<img src='/icons/20442dou.gif' />而A/B/D/E 4个部门<img src='/icons/20442de.gif' />订单和销售管理系统又采用另外<img src='/icons/20442yi.gif' />种工作流系统<img src='/icons/20442dou2.gif' />这种情况在大型企业集团内部尤为明显<img src='/icons/20442dou.gif' />影响了各业务单元<img src='/icons/20442de.gif' />业务协同和业务最佳实战<img src='/icons/20442de.gif' />提炼和推广<img src='/icons/20442dou2.gif' />而BPM致力于跨组织<img src='/icons/20442de.gif' />业务流程描述语言和工具<img src='/icons/20442dou.gif' />避免了企业各部门进行业务流程交流和沟通时各说各话<img src='/icons/20442de.gif' />情况<img src='/icons/20442dou2.gif' /><br/><br/>
　　( 2)统<img src='/icons/20442yi.gif' /><img src='/icons/20442de.gif' />流程架构<img src='/icons/20442dou2.gif' /><br/><br/>
　　企业内部从单<img src='/icons/20442yi.gif' />管理主题出发进行设计<img src='/icons/20442de.gif' />工作流<img src='/icons/20442dou.gif' />通常在企业中缺乏对业务运营活动<img src='/icons/20442de.gif' />总体考虑<img src='/icons/20442dou.gif' />局限于本部门或者本业务<img src='/icons/20442de.gif' />业务需求<img src='/icons/20442dou.gif' />各部门和各管理专题的间<img src='/icons/20442de.gif' />流程无法衔接<img src='/icons/20442dou.gif' />信息<img src='/icons/20442de.gif' />共享和传递困难<img src='/icons/20442dou.gif' />存在大量流程断点<img src='/icons/20442dou2.gif' />而BPM在流程的间进行衔接、协调<img src='/icons/20442dou.gif' />避免了流程孤岛<img src='/icons/20442de.gif' />产生;BPM<img src='/icons/20442de.gif' />目标是形成端到端<img src='/icons/20442de.gif' />流程体系<img src='/icons/20442dou.gif' />提高整个业务流程运行<img src='/icons/20442de.gif' />效率、成本、质量<img src='/icons/20442dou.gif' />在激烈<img src='/icons/20442de.gif' />市场竞争环境下<img src='/icons/20442dou.gif' />满足客户<img src='/icons/20442de.gif' />需求<img src='/icons/20442dou2.gif' /><br/><br/>
　　( 3)无“甲方优势”现象<img src='/icons/20442dou2.gif' /><br/><br/>
　　如果用<img src='/icons/20442yi.gif' />般<img src='/icons/20442de.gif' />工作流系统做接口<img src='/icons/20442dou.gif' />我们发现<img src='/icons/20442yi.gif' />个有趣<img src='/icons/20442de.gif' />现象<img src='/icons/20442dou.gif' />就是服务提供方<img src='/icons/20442de.gif' />甲方优势现象<img src='/icons/20442dou2.gif' />通常<img src='/icons/20442dou.gif' /><img src='/icons/20442yi.gif' />个工作流系统要和另外<img src='/icons/20442yi.gif' />个已经存在<img src='/icons/20442de.gif' />系统做接口<img src='/icons/20442dou.gif' />工作流系统是有求于已经存在<img src='/icons/20442de.gif' />系统<img src='/icons/20442dou.gif' />也就是已经存在<img src='/icons/20442de.gif' />系统有“甲方优势”<img src='/icons/20442dou2.gif' />这样<img src='/icons/20442dou.gif' />工作流系统就必须按照已经存在<img src='/icons/20442de.gif' />系统<img src='/icons/20442de.gif' />技术规格来实现<img src='/icons/20442dou.gif' />离“跨组织<img src='/icons/20442de.gif' />业务流程描述语言和工具”就越来越远了<img src='/icons/20442dou.gif' />更不用谈“跨企业<img src='/icons/20442de.gif' />业务流程管理”<img src='/icons/20442dou2.gif' />而BPM是在“工作流系统”和“已经存在<img src='/icons/20442de.gif' />系统”的间建立了<img src='/icons/20442yi.gif' />个公平<img src='/icons/20442de.gif' />约定<img src='/icons/20442dou.gif' />不存在“甲方优势”<img src='/icons/20442dou2.gif' /><br/><br/>
　　( 4)流程<img src='/icons/20442de.gif' />持续改进<img src='/icons/20442dou2.gif' /><br/><br/>
　　由于工作流系统<img src='/icons/20442de.gif' />存在<img src='/icons/20442dou.gif' />相关<img src='/icons/20442de.gif' />业务人员通常已经忽略其内嵌<img src='/icons/20442de.gif' />业务流程<img src='/icons/20442dou.gif' />业务部门对信息系统内嵌<img src='/icons/20442de.gif' />流程缺乏直观认识和关注<img src='/icons/20442dou.gif' />工作流系统<img src='/icons/20442de.gif' />改进非常<img src='/icons/20442de.gif' />复杂<img src='/icons/20442dou.gif' />更不要谈什么持续改进了<img src='/icons/20442dou2.gif' />但是BPM帮助业务人员密切关注信息系统内嵌流程和其它业务流程衔接关系<img src='/icons/20442dou.gif' />随着业务内外部环境<img src='/icons/20442de.gif' />变化<img src='/icons/20442dou.gif' />及时进行流程<img src='/icons/20442de.gif' />调整;这种情况下<img src='/icons/20442dou.gif' />流程<img src='/icons/20442de.gif' />持续改进<img src='/icons/20442dou.gif' />成为提高企业整体流程运行效率<img src='/icons/20442de.gif' />最主要原因<img src='/icons/20442dou2.gif' /><br/><br/>
　　( 5)BPM<img src='/icons/20442de.gif' />SOA本质<img src='/icons/20442dou2.gif' /><br/><br/>
　　SOA是创建更灵活<img src='/icons/20442de.gif' />企业基础架构<img src='/icons/20442de.gif' />架构思路方法<img src='/icons/20442dou.gif' />而BPM是<img src='/icons/20442yi.gif' />套协调<img src='/icons/20442de.gif' />业务流程活动<img src='/icons/20442dou2.gif' />SOA使用户可以轻松完成将业务流程连接到基础系统<img src='/icons/20442de.gif' />任务<img src='/icons/20442dou.gif' />从而节省时间和IT资源<img src='/icons/20442dou2.gif' />和的相比<img src='/icons/20442dou.gif' />将流程链接到传统<img src='/icons/20442de.gif' />应用通常要依赖大量区别<img src='/icons/20442de.gif' />专有技术<img src='/icons/20442dou2.gif' />而且<img src='/icons/20442dou.gif' />在采用BPM<img src='/icons/20442de.gif' />同时转向SOA可以促进SOA组件<img src='/icons/20442de.gif' />再利用<img src='/icons/20442dou.gif' />从而最大程度地降低业务流程本身<img src='/icons/20442de.gif' />复杂性<img src='/icons/20442dou2.gif' /><br/><br/>
　　( 6)BPM<img src='/icons/20442yi.gif' />定是企业级<img src='/icons/20442de.gif' /><img src='/icons/20442dou2.gif' /><br/><br/>
　　要实施BPM<img src='/icons/20442dou.gif' /><img src='/icons/20442yi.gif' />定要树立流程战略、流程设计、流程实施和流程监控<img src='/icons/20442de.gif' />循环管理理念:从企业<img src='/icons/20442de.gif' />发展战略出发制定流程<img src='/icons/20442de.gif' />战略<img src='/icons/20442dou.gif' />将战略指标分解为流程<img src='/icons/20442de.gif' />目标体系<img src='/icons/20442dou.gif' />通过流程实现战略<img src='/icons/20442de.gif' />落地;根据流程战略进行业务流程<img src='/icons/20442de.gif' />梳理、设计和优化;通过组织结构和信息系统<img src='/icons/20442de.gif' />调整来实施业务流程;通过流程合规管理和流程绩效监控<img src='/icons/20442dou.gif' />对流程执行情况进行监控<img src='/icons/20442dou.gif' />根据结果调整业务流程设计<img src='/icons/20442dou2.gif' /><br/><br/>
　　如果你正在为信息孤岛(ERP、CRM、HR)这类<img src='/icons/20442de.gif' />以工作流为核心<img src='/icons/20442de.gif' />系统造成<img src='/icons/20442de.gif' />工作瓶颈而苦恼<img src='/icons/20442dou.gif' />如果你想抢得市场先机<img src='/icons/20442dou.gif' />或者希望强化服务质量、传承既有知识<img src='/icons/20442dou.gif' />现在是该使用BPM<img src='/icons/20442de.gif' />时候了<img src='/icons/20442dou2.gif' /><br/><br/>
 <a href="/mypdf/78886.pdf" title="查看 业务流程管理bpm:浅析业务流程管理(BPM)和工作流的 6大区别 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78886.html</guid>
		</item>
		<item>
			<title><![CDATA[javaswing编程:反射在Java Swing编程中的应用]]></title>
			<link>http://CrazyCoder.cn/Java/Article78885.html</link>
			<description>
				<![CDATA[

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 学习过Java Swing<img src='/icons/9644de.gif' />读者<img src='/icons/9644yi.gif' />定对于Swing中相对较为复杂<img src='/icons/9644de.gif' />事件驱动模型比较困惑<img src='/icons/9644dou.gif' />虽然事件驱动模型在Java Swing中被完完全全<img src='/icons/9644de.gif' />体现出来了<img src='/icons/9644dou.gif' />但是对于<img src='/icons/9644yi.gif' />个软件Software初学者而言这样<img src='/icons/9644de.gif' />近乎“裸体”<img src='/icons/9644de.gif' />事件驱动模型确实是很难理解<img src='/icons/9644de.gif' /><img src='/icons/9644dou2.gif' /><br/><br/>
　　Microsoft公司.Net框架和Java Swing<img src='/icons/9644de.gif' />GUI编程相比要简单很多<img src='/icons/9644dou.gif' />同样是事件驱动模型.Net框架就进行了大量<img src='/icons/9644de.gif' />封装处理<img src='/icons/9644dou.gif' />.Net把这种封装称的为委托器(Delegate)其代码如下: <br/><br/>
//当btnSubmit按钮被点击以后要求交给btnSubmit_Click思路方法处理<br/>// EventHandler在中间启到委托器<img src='/icons/9644de.gif' />作用<img src='/icons/9644dou.gif' /><br/>//它负责将事件分发到指定<img src='/icons/9644de.gif' />思路方法中进行处理<br/>this.btnSubmit.Click <img src='/icons/9644jiadeng.gif' /> <img src='/icons/9644new.gif' /> EventHandler(this.btnSubmit_Click);<br/>//事件处理思路方法<br/>// object sender:事件源<img src='/icons/9644dou.gif' />这里指btnSubmit对象<br/>// EventArgs e:事件处理参数<img src='/icons/9644dou.gif' />它保存了需要提供给<img src='/icons/9644chengxu.gif' />员<img src='/icons/9644de.gif' />必要信息<br/>private void btnSubmit_Click(object sender, EventArgs e)<br/>{<br/>　//打印This is a button语句<br/>　<img src='/icons/9644System.gif' />.Diagnostics.Debug.WriteLine("This is button");<br/>} <br/><br/>
　　作为对比<img src='/icons/9644dou.gif' />我们来看看Java Swing<img src='/icons/9644de.gif' />事件处理和委托就要复杂很多:代码如下:(您若还不是很了解Swing事件驱动<img src='/icons/9644de.gif' />话<img src='/icons/9644dou.gif' />可以参考我<img src='/icons/9644de.gif' />另外<img src='/icons/9644yi.gif' />篇文章:事件驱动模型例子详解(Java篇)):<br/><br/>
//为btnSubmit增加侦听器SelectHandler<img src='/icons/9644dou.gif' />当btnSubmit被点击以后<br/>//有侦听器<img src='/icons/9644de.gif' />actionPerformed负责处理该点击事件<img src='/icons/9644de.gif' />业务<br/>//由于事件源btnSubmit和侦听器类SelectHandler处于两个区别<img src='/icons/9644de.gif' />类中<br/>//为了让SelectHandler类取得页面<img src='/icons/9644de.gif' />信息<img src='/icons/9644dou.gif' />我们需要将窗体对象(this)<br/>//传入到侦听器中<br/>btnSubmit.addActionListener(<img src='/icons/9644new.gif' /> SelectHandler(this));<br/>//侦听器SelectHandler<img src='/icons/9644dou.gif' />它必须实现动作事件ActionListener接口<br/>//以达到事件分发<img src='/icons/9644de.gif' />作用<br/><img src='/icons/9644class.gif' /> SelectHandler implements ActionListener {<br/>　private CommonDialogDemo form = null;<br/>　//将窗体对象CommonDialogDemo通过构造<img src='/icons/9644hanshu.gif' />传入SelectHandler类中<br/>　public SelectHandler(CommonDialogDemo form) {<br/>　　this.form = form;<br/>　}<br/>　//事件处理思路方法<img src='/icons/9644dou.gif' />当btnSubmit被点击<img src='/icons/9644dou.gif' />自动执行以下打印代码<br/>　publicvoid actionPerformed(ActionEvent e) {<br/>　　<img src='/icons/9644System.gif' />.out.pr<img src='/icons/9644int.gif' />ln("This is button");<br/>　}<br/>} <br/><br/>
　　根据以上代码<img src='/icons/9644dou.gif' />我们可以清晰<img src='/icons/9644de.gif' />看到Java Swing要比.Net<img src='/icons/9644de.gif' />麻烦<img src='/icons/9644de.gif' />多<img src='/icons/9644dou.gif' />而且更不能让人忍受<img src='/icons/9644de.gif' />就是<img src='/icons/9644dou.gif' /><img src='/icons/9644yi.gif' />个页面如果有多个按钮<img src='/icons/9644de.gif' />话<img src='/icons/9644dou.gif' />我们必须针对每个按钮编写多个事件侦听类<img src='/icons/9644dou.gif' />而且这些类<img src='/icons/9644yi.gif' />般都会被设为内部类<img src='/icons/9644dou2.gif' />学过软件Software建模<img src='/icons/9644de.gif' />读者可能知道<img src='/icons/9644dou.gif' />内部在软件Software建模在软件Software工程中是不推荐使用<img src='/icons/9644de.gif' /><img src='/icons/9644dou.gif' />所以这样<img src='/icons/9644de.gif' />代码编写明显会增加设计冗余度和复杂度<img src='/icons/9644dou.gif' />因此我们可以考虑自己编写<img src='/icons/9644yi.gif' />个类似于.Net中EventHandler<img src='/icons/9644yi.gif' />样<img src='/icons/9644de.gif' />事件委托类来处理事件分发<img src='/icons/9644dou2.gif' /><br/><br/>
　　由于我们无权修改Java<img src='/icons/9644de.gif' />编译器<img src='/icons/9644dou.gif' />所以我在这里将会借助于反射技术<img src='/icons/9644dou.gif' />利用<img src='/icons/9644yi.gif' />个事件委托类处理所有<img src='/icons/9644de.gif' />点击事件<img src='/icons/9644dou.gif' />代码如下:<br/><br/>
package cn.softworks.teachersearchsystem.support;<br/><br/>
import java.awt.event.ActionEvent;<br/>import java.awt.event.ActionListener;<br/>import java.lang.reflect.Method;<br/><br/>
/**<br/>*该类是用来处理所有<img src='/icons/9644de.gif' />Swing按钮点击事件<img src='/icons/9644dou.gif' />并根据将处理权&lt;br&gt;<br/>*转交给使用者来处理<br/>*<br/>*@authorChen.yu<br/>*<br/>*/<br/>public<img src='/icons/9644class.gif' /> EventHandlerimplements ActionListener {<br/><br/>
　//组件所在<img src='/icons/9644de.gif' />窗体对象<br/>　private Object form = null;<br/><br/>
　//受到委托<img src='/icons/9644de.gif' />思路方法名<br/>　private String methodName = null;<br/><br/>
　/**<br/>　*构造<img src='/icons/9644hanshu.gif' /><br/>　*<br/>　*@paramform 组件所在<img src='/icons/9644de.gif' />窗体对象<br/>　*@parammethodName 受到委托<img src='/icons/9644de.gif' />思路方法名<br/>　*/<br/>　public EventHandler(Object form,String methodName) {<br/>　　this.form = form;<br/>　　this.methodName = methodName;<br/>　}<br/><br/>
　/**<br/>　*事件处理委托思路方法<br/>　*/<br/>　publicvoid actionPerformed(ActionEvent e) {<br/><br/>
　　//得到窗体对象<img src='/icons/9644de.gif' />类型<br/>　　Class formType = this.form.getClass<img src='/icons/9644kh.gif' />;<br/><br/>
　　try {<br/>　　　//得到指定委托思路方法<img src='/icons/9644de.gif' />类型 <br/>　　　Method method = <br/>formType.getMethod(this.methodName, <img src='/icons/9644new.gif' /> Class<img src='/icons/9644zhk2.gif' /> {e.getClass<img src='/icons/9644kh.gif' />});<br/>　　　//<img src='/icons/9644diaoyong.gif' />指定<img src='/icons/9644de.gif' />思路方法<br/>　　　method.invoke(this.form, <img src='/icons/9644new.gif' /> Object<img src='/icons/9644zhk2.gif' /> {e});<br/><br/>
　　}catch(Exception ex) {<br/>　　　<img src='/icons/9644return.gif' />;<br/>　　} <br/>　}<br/>}&nbsp; <br/><br/>
　　现在我们来编写<img src='/icons/9644yi.gif' />个测试<img src='/icons/9644chengxu.gif' /><img src='/icons/9644dou.gif' />代码如下:<br/><br/>
btnSearch.addActionListener(<img src='/icons/9644new.gif' /> EventHandler(this,"btnSearch_Click"));<br/><br/>
public void btnSearch_Click(ActionEvent e) {<br/>　<img src='/icons/9644System.gif' />.out.pr<img src='/icons/9644int.gif' />ln("This is btnSearch");<br/>} <br/><br/>
　　从以上代码中我们可以清晰<img src='/icons/9644de.gif' />看到<img src='/icons/9644dou.gif' />事件处理和事件委托处于同<img src='/icons/9644yi.gif' />窗体中了<img src='/icons/9644dou.gif' />.Net方便<img src='/icons/9644de.gif' />Delegate处理被我们用反射实现了<img src='/icons/9644dou2.gif' /><br/><br/>
 <a href="/mypdf/78885.pdf" title="查看 javaswing编程:反射在Java Swing编程中的应用 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78885.html</guid>
		</item>
		<item>
			<title><![CDATA[javaswing编程:反射在Java Swing编程中的应用]]></title>
			<link>http://CrazyCoder.cn/Java/Article78884.html</link>
			<description>
				<![CDATA[

学习过Java Swing<img src='/icons/54244de.gif' />读者<img src='/icons/54244yi.gif' />定对于Swing中相对较为复杂<img src='/icons/54244de.gif' />事件驱动模型比较困惑<img src='/icons/54244dou.gif' />虽然事件驱动模型在Java Swing中被完完全全<img src='/icons/54244de.gif' />体现出来了<img src='/icons/54244dou.gif' />但是对于<img src='/icons/54244yi.gif' />个软件Software初学者而言这样<img src='/icons/54244de.gif' />近乎“裸体”<img src='/icons/54244de.gif' />事件驱动模型确实是很难理解<img src='/icons/54244de.gif' /><img src='/icons/54244dou2.gif' /><br/><br/>
　　Microsoft公司.Net框架和Java Swing<img src='/icons/54244de.gif' />GUI编程相比要简单很多<img src='/icons/54244dou.gif' />同样是事件驱动模型.Net框架就进行了大量<img src='/icons/54244de.gif' />封装处理<img src='/icons/54244dou.gif' />.Net把这种封装称的为委托器(Delegate)其代码如下: <br/><br/>
//当btnSubmit按钮被点击以后要求交给btnSubmit_Click思路方法处理<br/>// EventHandler在中间启到委托器<img src='/icons/54244de.gif' />作用<img src='/icons/54244dou.gif' /><br/>//它负责将事件分发到指定<img src='/icons/54244de.gif' />思路方法中进行处理<br/>this.btnSubmit.Click <img src='/icons/54244jiadeng.gif' /> <img src='/icons/54244new.gif' /> EventHandler(this.btnSubmit_Click);<br/>//事件处理思路方法<br/>// object sender:事件源<img src='/icons/54244dou.gif' />这里指btnSubmit对象<br/>// EventArgs e:事件处理参数<img src='/icons/54244dou.gif' />它保存了需要提供给<img src='/icons/54244chengxu.gif' />员<img src='/icons/54244de.gif' />必要信息<br/>private void btnSubmit_Click(object sender, EventArgs e)<br/>{<br/>　//打印This is a button语句<br/>　<img src='/icons/54244System.gif' />.Diagnostics.Debug.WriteLine("This is button");<br/>} <br/><br/>
　　作为对比<img src='/icons/54244dou.gif' />我们来看看Java Swing<img src='/icons/54244de.gif' />事件处理和委托就要复杂很多:代码如下:(您若还不是很了解Swing事件驱动<img src='/icons/54244de.gif' />话<img src='/icons/54244dou.gif' />可以参考我<img src='/icons/54244de.gif' />另外<img src='/icons/54244yi.gif' />篇文章:事件驱动模型例子详解(Java篇)):<br/><br/>
//为btnSubmit增加侦听器SelectHandler<img src='/icons/54244dou.gif' />当btnSubmit被点击以后<br/>//有侦听器<img src='/icons/54244de.gif' />actionPerformed负责处理该点击事件<img src='/icons/54244de.gif' />业务<br/>//由于事件源btnSubmit和侦听器类SelectHandler处于两个区别<img src='/icons/54244de.gif' />类中<br/>//为了让SelectHandler类取得页面<img src='/icons/54244de.gif' />信息<img src='/icons/54244dou.gif' />我们需要将窗体对象(this)<br/>//传入到侦听器中<br/>btnSubmit.addActionListener(<img src='/icons/54244new.gif' /> SelectHandler(this));<br/>//侦听器SelectHandler<img src='/icons/54244dou.gif' />它必须实现动作事件ActionListener接口<br/>//以达到事件分发<img src='/icons/54244de.gif' />作用<br/><img src='/icons/54244class.gif' /> SelectHandler implements ActionListener {<br/>　private CommonDialogDemo form = null;<br/>　//将窗体对象CommonDialogDemo通过构造<img src='/icons/54244hanshu.gif' />传入SelectHandler类中<br/>　public SelectHandler(CommonDialogDemo form) {<br/>　　this.form = form;<br/>　}<br/>　//事件处理思路方法<img src='/icons/54244dou.gif' />当btnSubmit被点击<img src='/icons/54244dou.gif' />自动执行以下打印代码<br/>　publicvoid actionPerformed(ActionEvent e) {<br/>　　<img src='/icons/54244System.gif' />.out.pr<img src='/icons/54244int.gif' />ln("This is button");<br/>　}<br/>} <br/><br/>
　　根据以上代码<img src='/icons/54244dou.gif' />我们可以清晰<img src='/icons/54244de.gif' />看到Java Swing要比.Net<img src='/icons/54244de.gif' />麻烦<img src='/icons/54244de.gif' />多<img src='/icons/54244dou.gif' />而且更不能让人忍受<img src='/icons/54244de.gif' />就是<img src='/icons/54244dou.gif' /><img src='/icons/54244yi.gif' />个页面如果有多个按钮<img src='/icons/54244de.gif' />话<img src='/icons/54244dou.gif' />我们必须针对每个按钮编写多个事件侦听类<img src='/icons/54244dou.gif' />而且这些类<img src='/icons/54244yi.gif' />般都会被设为内部类<img src='/icons/54244dou2.gif' />学过软件Software建模<img src='/icons/54244de.gif' />读者可能知道<img src='/icons/54244dou.gif' />内部在软件Software建模在软件Software工程中是不推荐使用<img src='/icons/54244de.gif' /><img src='/icons/54244dou.gif' />所以这样<img src='/icons/54244de.gif' />代码编写明显会增加设计冗余度和复杂度<img src='/icons/54244dou.gif' />因此我们可以考虑自己编写<img src='/icons/54244yi.gif' />个类似于.Net中EventHandler<img src='/icons/54244yi.gif' />样<img src='/icons/54244de.gif' />事件委托类来处理事件分发<img src='/icons/54244dou2.gif' /><br/><br/>
　　由于我们无权修改Java<img src='/icons/54244de.gif' />编译器<img src='/icons/54244dou.gif' />所以我在这里将会借助于反射技术<img src='/icons/54244dou.gif' />利用<img src='/icons/54244yi.gif' />个事件委托类处理所有<img src='/icons/54244de.gif' />点击事件<img src='/icons/54244dou.gif' />代码如下:<br/><br/>
package cn.softworks.teachersearchsystem.support;<br/><br/>
import java.awt.event.ActionEvent;<br/>import java.awt.event.ActionListener;<br/>import java.lang.reflect.Method;<br/><br/>
/**<br/>*该类是用来处理所有<img src='/icons/54244de.gif' />Swing按钮点击事件<img src='/icons/54244dou.gif' />并根据将处理权&lt;br&gt;<br/>*转交给使用者来处理<br/>*<br/>*@authorChen.yu<br/>*<br/>*/<br/>public<img src='/icons/54244class.gif' /> EventHandlerimplements ActionListener {<br/><br/>
　//组件所在<img src='/icons/54244de.gif' />窗体对象<br/>　private Object form = null;<br/><br/>
　//受到委托<img src='/icons/54244de.gif' />思路方法名<br/>　private String methodName = null;<br/><br/>
　/**<br/>　*构造<img src='/icons/54244hanshu.gif' /><br/>　*<br/>　*@paramform 组件所在<img src='/icons/54244de.gif' />窗体对象<br/>　*@parammethodName 受到委托<img src='/icons/54244de.gif' />思路方法名<br/>　*/<br/>　public EventHandler(Object form,String methodName) {<br/>　　this.form = form;<br/>　　this.methodName = methodName;<br/>　}<br/><br/>
　/**<br/>　*事件处理委托思路方法<br/>　*/<br/>　publicvoid actionPerformed(ActionEvent e) {<br/><br/>
　　//得到窗体对象<img src='/icons/54244de.gif' />类型<br/>　　Class formType = this.form.getClass<img src='/icons/54244kh.gif' />;<br/><br/>
　　try {<br/>　　　//得到指定委托思路方法<img src='/icons/54244de.gif' />类型 <br/>　　　Method method = formType.getMethod(this.methodName, <img src='/icons/54244new.gif' /> Class<img src='/icons/54244zhk2.gif' /> {e.getClass<img src='/icons/54244kh.gif' />});<br/>　　　//<img src='/icons/54244diaoyong.gif' />指定<img src='/icons/54244de.gif' />思路方法<br/>　　　method.invoke(this.form, <img src='/icons/54244new.gif' /> Object<img src='/icons/54244zhk2.gif' /> {e});<br/><br/>
　　}catch(Exception ex) {<br/>　　　<img src='/icons/54244return.gif' />;<br/>　　} <br/>　}<br/>}&nbsp; <br/><br/>
　　现在我们来编写<img src='/icons/54244yi.gif' />个测试<img src='/icons/54244chengxu.gif' /><img src='/icons/54244dou.gif' />代码如下:<br/><br/>
btnSearch.addActionListener(<img src='/icons/54244new.gif' /> EventHandler(this,"btnSearch_Click"));<br/><br/>
public void btnSearch_Click(ActionEvent e) {<br/>　<img src='/icons/54244System.gif' />.out.pr<img src='/icons/54244int.gif' />ln("This is btnSearch");<br/>} <br/><br/>
　　从以上代码中我们可以清晰<img src='/icons/54244de.gif' />看到<img src='/icons/54244dou.gif' />事件处理和事件委托处于同<img src='/icons/54244yi.gif' />窗体中了<img src='/icons/54244dou.gif' />.Net方便<img src='/icons/54244de.gif' />Delegate处理被我们用反射实现了<img src='/icons/54244dou2.gif' /> <br/><br/>
 <a href="/mypdf/78884.pdf" title="查看 javaswing编程:反射在Java Swing编程中的应用 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78884.html</guid>
		</item>
		<item>
			<title><![CDATA[rsa算法实现:RSA算法的实现思路方法——Java版放送]]></title>
			<link>http://CrazyCoder.cn/Java/Article78840.html</link>
			<description>
				<![CDATA[

<img src='/icons/59969yi.gif' />开始不知道有BigInteger这个大数类<img src='/icons/59969dou.gif' />居然自己去实现了<img src='/icons/59969yi.gif' />个<img src='/icons/59969dou.gif' />写了大数加法后<img src='/icons/59969dou.gif' />才发现有现成<img src='/icons/59969de.gif' />T_T<br/><br/>
以下是引用片段:<br/>package rsa; <br/>import java.math.BigInteger; <br/><br/>
public <img src='/icons/59969class.gif' /> RSA { <br/>&nbsp;private long p,q,e,d,n; <br/>&nbsp;public RSA<img src='/icons/59969kh.gif' />{ <br/>&nbsp; <img src='/icons/59969int.gif' /> pIndex = (<img src='/icons/59969int.gif' />)(Math.random<img src='/icons/59969kh.gif' />*10); <br/>&nbsp; <img src='/icons/59969int.gif' /> qIndex; <br/>&nbsp; <img src='/icons/59969int.gif' /> eIndex; <br/>&nbsp; do{ <br/>&nbsp;&nbsp; qIndex = (<img src='/icons/59969int.gif' />)(Math.random<img src='/icons/59969kh.gif' />*10); <br/>&nbsp; } <br/>&nbsp; while(qIndex<img src='/icons/59969dd.gif' />pIndex); <br/>&nbsp; do{ <br/>&nbsp;&nbsp; eIndex = (<img src='/icons/59969int.gif' />)(Math.random<img src='/icons/59969kh.gif' />*10); <br/>&nbsp; } <br/>&nbsp; while(eIndex<img src='/icons/59969dd.gif' />pIndex||eIndex<img src='/icons/59969dd.gif' />pIndex); <br/>&nbsp; p = 1033; <br/>&nbsp; q = 2017; <br/>&nbsp; e = 29437; <br/>&nbsp; n = p*q; <br/>&nbsp; d = calculateD<img src='/icons/59969kh.gif' />; <br/>&nbsp;} <br/>&nbsp;private long calculateD<img src='/icons/59969kh.gif' />{ <br/>&nbsp; long t0 = 0,t1 = 1,t2 = -1; <br/>&nbsp; long r0 = (p-1)*(q-1), m = r0,r1 = e ,r2 = -1; <br/>&nbsp; do{ <br/>&nbsp;&nbsp; long q = r0/r1; <br/>&nbsp;&nbsp; r2 = r0-r1*q; <br/>&nbsp;&nbsp; <img src='/icons/59969if.gif' />(r2<img src='/icons/59969dd.gif' />0)<img src='/icons/59969break.gif' />; <br/>&nbsp;&nbsp; t2 = t0 - t1*q; <br/>&nbsp;&nbsp; while(t2&lt;0){ <br/>&nbsp;&nbsp;&nbsp; t2<img src='/icons/59969jiadeng.gif' />m; <br/>&nbsp;&nbsp; } <br/>&nbsp;&nbsp; <img src='/icons/59969if.gif' />(t2&gt;=m){ <br/>&nbsp;&nbsp;&nbsp; t2 %= m; <br/>&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp; r0 = r1; <br/>&nbsp;&nbsp; r1 = r2; <br/>&nbsp;&nbsp; t0 = t1; <br/>&nbsp;&nbsp; t1 = t2; <br/>&nbsp; }while(r2!=0); <br/>&nbsp; <img src='/icons/59969if.gif' />(r1!=1){ <br/>&nbsp;&nbsp; <img src='/icons/59969return.gif' /> 0; <br/>&nbsp; } <br/>&nbsp; <img src='/icons/59969else.gif' />{ <br/>&nbsp;&nbsp; <img src='/icons/59969return.gif' /> t2; <br/>&nbsp; } <br/>&nbsp;} <br/>&nbsp; <br/>&nbsp;public long getE<img src='/icons/59969kh.gif' /> { <br/>&nbsp; <img src='/icons/59969return.gif' /> e; <br/>&nbsp;} <br/>&nbsp;public long getN<img src='/icons/59969kh.gif' /> { <br/>&nbsp; <img src='/icons/59969return.gif' /> n; <br/>&nbsp;} <br/>&nbsp;public long getD<img src='/icons/59969kh.gif' /> { <br/>&nbsp; <img src='/icons/59969return.gif' /> d; <br/>&nbsp;} <br/>&nbsp;public BigInteger encode(BigInteger data){ <br/>&nbsp; <img src='/icons/59969return.gif' /> pow(data,d).mod(<img src='/icons/59969new.gif' /> BigInteger(n+"")); <br/>&nbsp;} <br/>&nbsp;public BigInteger decode(BigInteger code){ <br/>&nbsp; <img src='/icons/59969return.gif' /> pow(code,e).mod(<img src='/icons/59969new.gif' /> BigInteger(n+"")); <br/>&nbsp;} <br/>&nbsp;public BigInteger pow(BigInteger data,long p){ <br/>&nbsp; data = data.pow((<img src='/icons/59969int.gif' />)p); <br/>&nbsp; <img src='/icons/59969return.gif' /> data; <br/>&nbsp;} <br/>&nbsp;public <img src='/icons/59969static.gif' /> void <img src='/icons/59969main.gif' />(String args<img src='/icons/59969zhk2.gif' />){ <br/>&nbsp; RSA rsa = <img src='/icons/59969new.gif' /> RSA<img src='/icons/59969kh.gif' />; <br/>&nbsp;&nbsp; <br/>&nbsp; BigInteger data = <img src='/icons/59969new.gif' /> BigInteger("222222"); <br/>&nbsp; long oldtime = <img src='/icons/59969System.gif' />.currentTimeMillis<img src='/icons/59969kh.gif' />; <br/>&nbsp; BigInteger code = rsa.encode(data); <br/>&nbsp; long <img src='/icons/59969new.gif' />time = <img src='/icons/59969System.gif' />.currentTimeMillis<img src='/icons/59969kh.gif' />; <br/>&nbsp; double codetime = ((double)(<img src='/icons/59969new.gif' />time-oldtime))/1000; <br/>&nbsp; oldtime = <img src='/icons/59969System.gif' />.currentTimeMillis<img src='/icons/59969kh.gif' />; <br/>&nbsp; BigInteger decode = rsa.decode(code); <br/>&nbsp; <img src='/icons/59969new.gif' />time = <img src='/icons/59969System.gif' />.currentTimeMillis<img src='/icons/59969kh.gif' />; <br/>&nbsp; double decodetime = ((double)(<img src='/icons/59969new.gif' />time-oldtime))/1000; <br/>&nbsp; <img src='/icons/59969System.gif' />.out.pr<img src='/icons/59969int.gif' />ln("privateKey:"+rsa.d); <br/>&nbsp; <img src='/icons/59969System.gif' />.out.pr<img src='/icons/59969int.gif' />ln("publickKey:"+rsa.e); <br/>&nbsp; <img src='/icons/59969System.gif' />.out.pr<img src='/icons/59969int.gif' />ln("N:"+rsa.n); <br/>&nbsp; <img src='/icons/59969System.gif' />.out.pr<img src='/icons/59969int.gif' />ln("data:"+data); <br/>&nbsp; <img src='/icons/59969System.gif' />.out.pr<img src='/icons/59969int.gif' />ln("code:"+code+" time:"+codetime); <br/>&nbsp; <img src='/icons/59969System.gif' />.out.pr<img src='/icons/59969int.gif' />ln("decode:"+decode+" time:"+decodetime); <br/><br/>
&nbsp;} <br/><br/>
} <br/><br/>
 <a href="/mypdf/78840.pdf" title="查看 rsa算法实现:RSA算法的实现思路方法——Java版放送 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78840.html</guid>
		</item>
		<item>
			<title><![CDATA[用java编写的计算器:用java教你学会截图]]></title>
			<link>http://CrazyCoder.cn/Java/Article78839.html</link>
			<description>
				<![CDATA[

首先这个问题也困扰了我挺久<img src='/icons/40450dou.gif' />慢慢<img src='/icons/40450de.gif' />我就摸索出<img src='/icons/40450yi.gif' />条路子<img src='/icons/40450dou.gif' />其实也挺简单<img src='/icons/40450de.gif' /><img src='/icons/40450dou2.gif' /><br/><br/>
废话不多说<img src='/icons/40450dou.gif' />看我如何降服这妖怪...<br/><br/>
首先用到jquery<img src='/icons/40450de.gif' /><img src='/icons/40450yi.gif' />个插件<img src='/icons/40450dou.gif' />Jcrop<img src='/icons/40450dou2.gif' />用这个工具截取你需要<img src='/icons/40450de.gif' />图片大小<img src='/icons/40450dou2.gif' /><br/><br/>
然后要提交这个被截图<img src='/icons/40450de.gif' />大小<img src='/icons/40450dou.gif' />也就是坐标了<img src='/icons/40450dou2.gif' /><br/><br/>
比如这样<img src='/icons/40450de.gif' />代码: &lt;form&nbsp; action="/browsing/privacy.do?method=dos" method="post" name="formsa"&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="hidden" size="4" id="x" name="x" /&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="hidden" size="4" id="y" name="y" /&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="hidden" size="4" id="w" name="w" /&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="hidden" size="4" id="h" name="h" /&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/form&gt;<br/><br/>
这里是记录了4个坐标<img src='/icons/40450dou.gif' />截取图片高<img src='/icons/40450dou.gif' />宽<img src='/icons/40450dou.gif' />和XY<img src='/icons/40450de.gif' />坐标数据<img src='/icons/40450dou2.gif' />如果为了美观用<img src='/icons/40450de.gif' />不是input文件域按钮<img src='/icons/40450de.gif' />而是用图片<img src='/icons/40450de.gif' />话<img src='/icons/40450dou.gif' />这里有<img src='/icons/40450yi.gif' />个难点<img src='/icons/40450dou2.gif' />那如何解决呢<img src='/icons/40450dou2.gif' />解决方案就是通过&lt;A hidefocus="true"&nbsp; <img src='/icons/40450class.gif' />="addfileA"void(0)"&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input hidefocus="true"&nbsp; <img src='/icons/40450class.gif' />="addfileI"&nbsp; type="file" id="files" name="file" size="1"&nbsp; _disibledevent=>
然后定义样式.addfileA{ position:relative; cursor:hand; text-decoration:none; background-image: url('/browsing/pic/sctx02.g<img src='/icons/40450if.gif' />'); width:20px;height: 30px } <br/>.addfileI { cursor:hand; position:relative; left:0px; width:108px;height: 30; background-color: blue; opacity:0; filter:alpha(opacity=0) ;height: 30px}<br/><br/>
通过这种思路方法可以实现图片提交文件域了<img src='/icons/40450dou2.gif' />(为什么要这样呢<img src='/icons/40450dou.gif' /><img src='/icons/40450yinwei.gif' />为了安全起见规定是不能用JavaScript提交文件域<img src='/icons/40450de.gif' />)<br/><br/>
图片截取了<img src='/icons/40450dou.gif' />坐标搞定了<img src='/icons/40450dou2.gif' />现在就差如何用java代码截取图片了<img src='/icons/40450dou2.gif' /><br/><br/>
看下面代码:String x = request.getParameter("x");<br/>&nbsp;&nbsp;&nbsp; String y = request.getParameter("y");<br/>&nbsp;&nbsp;&nbsp; String w = request.getParameter("w");<br/>&nbsp;&nbsp;&nbsp; String h = request.getParameter("h");<br/>&nbsp;&nbsp;&nbsp; String images = request.getParameter("imagesLOAD");<br/>&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; ActionForward forwrad = <img src='/icons/40450new.gif' /> ActionForward<img src='/icons/40450kh.gif' />;<br/>&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User user=((User)request.getSession<img src='/icons/40450kh.gif' />.getAttribute("user"));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BrowsingUser browsingUser=browsingUserDAO.load(user.getDataId<img src='/icons/40450kh.gif' />);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src='/icons/40450System.gif' />Parameter systemParameter = (<img src='/icons/40450System.gif' />Parameter) request.getSession<img src='/icons/40450kh.gif' />.getServletContext<img src='/icons/40450kh.gif' />.getAttribute("systemParameter");<br/>&nbsp;&nbsp;&nbsp; String imagesURL=systemParameter.getFileUrlName<img src='/icons/40450kh.gif' />+File.separator+images;<br/>&nbsp;&nbsp;&nbsp; images=images.replace("/", File.separator);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OperateImage image = <img src='/icons/40450new.gif' /> OperateImage(Integer.parseInt(x),Integer.parseInt(y),Integer.parseInt(w),Integer.parseInt(h));<br/>&nbsp;&nbsp; image.<img src='/icons/40450set.gif' />Srcpath(systemParameter.getFliePath<img src='/icons/40450kh.gif' />+File.separator+"touxiang"+File.separator+user.getUsername<img src='/icons/40450kh.gif' />+File.separator+images);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; image.<img src='/icons/40450set.gif' />Srcpath(systemParameter.getFliePath<img src='/icons/40450kh.gif' />+images);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; images=this.<img src='/icons/40450return.gif' /><img src='/icons/40450string.gif' />(systemParameter.getFliePath<img src='/icons/40450kh.gif' />+images);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; image.<img src='/icons/40450set.gif' />Subpath(images);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; image.cut<img src='/icons/40450kh.gif' />;<br/><br/>
那么该image就是截取后他图片了路径就是images了<img src='/icons/40450dou2.gif' /><br/><br/>
然后在你要显示截取后图片<img src='/icons/40450de.gif' />地方用images<img src='/icons/40450de.gif' />路径就OK了<img src='/icons/40450dou2.gif' /><br/><br/>
本文来自CSDN博客<img src='/icons/40450dou.gif' />转载请标明出处:http://blog.csdn.net/JSPGB2312/archive/2010/02/21/5314749.aspx<br/><br/>
 <a href="/mypdf/78839.pdf" title="查看 用java编写的计算器:用java教你学会截图 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78839.html</guid>
		</item>
		<item>
			<title><![CDATA[javafxflex比较:Silverlight、JavaFX、Flex技术比较]]></title>
			<link>http://CrazyCoder.cn/Java/Article78838.html</link>
			<description>
				<![CDATA[

对Web开发人员<img src='/icons/85051dou.gif' />过去<img src='/icons/85051de.gif' /><img src='/icons/85051yi.gif' />段时间绝对是难忘<img src='/icons/85051de.gif' /><img src='/icons/85051dou2.gif' /><img src='/icons/85051yinwei.gif' />现在在RIA开发平台领域<img src='/icons/85051dou.gif' />除了Adobe业已推出许久<img src='/icons/85051de.gif' />Apollo和Flex<img src='/icons/85051dou.gif' />微软正式推出了Silverlight产品<img src='/icons/85051dou.gif' />帮助开发人员创建丰富<img src='/icons/85051de.gif' />可交互Web应用<img src='/icons/85051dou2.gif' />在刚结束<img src='/icons/85051de.gif' />JavaOne大会上<img src='/icons/85051dou.gif' />Sun公司首席技术官Bob Brewin又宣布推出基于Java平台<img src='/icons/85051de.gif' />JavaFX<img src='/icons/85051dou.gif' />目标同样是直指RIA开发<img src='/icons/85051dou2.gif' />每<img src='/icons/85051yi.gif' />个平台都有自己忠实<img src='/icons/85051de.gif' />拥泵<img src='/icons/85051dou.gif' />但是这些技术的间<img src='/icons/85051de.gif' />区别是什么?<br/><br/>
　　Techie在他最近写<img src='/icons/85051de.gif' /><img src='/icons/85051yi.gif' />篇博客中<img src='/icons/85051dou.gif' />从定义、大小、应用平台、授权许可等方面深入比较了这几种技术<img src='/icons/85051de.gif' />区别<img src='/icons/85051dou2.gif' /><br/><br/>
　　Silverlight是<img src='/icons/85051yi.gif' />个跨浏览器和跨平台<img src='/icons/85051de.gif' />插件<img src='/icons/85051dou.gif' />能在微软<img src='/icons/85051de.gif' />.NET上交付炫目<img src='/icons/85051de.gif' />多媒体体验和有丰富交互功能<img src='/icons/85051de.gif' />Web应用;<br/><br/>
　　JavaFX Script可以让用户利用JRE“<img src='/icons/85051yi.gif' />次编写<img src='/icons/85051dou.gif' />处处运行”<img src='/icons/85051de.gif' />优势<img src='/icons/85051dou.gif' />在现有知识<img src='/icons/85051de.gif' />技术上创建跨设备<img src='/icons/85051de.gif' />应用;<br/><br/>
　　Flex产品能帮助应用<img src='/icons/85051chengxu.gif' />开发者利用强大<img src='/icons/85051de.gif' />Flash运行时创建数据驱动<img src='/icons/85051de.gif' />RIA<img src='/icons/85051dou.gif' />而且开发者还可以用Flash和Flex构建器<img src='/icons/85051yi.gif' />起为基于Flex<img src='/icons/85051de.gif' />应用增加富交互元素<img src='/icons/85051dou2.gif' /><br/><br/>
　　目前来看<img src='/icons/85051dou.gif' />这 3种技术各有优势<img src='/icons/85051dou.gif' />Flex先入为主<img src='/icons/85051dou.gif' />目前已经有了<img src='/icons/85051yi.gif' />个很大<img src='/icons/85051de.gif' />市场<img src='/icons/85051dou.gif' />但是Silverlight<img src='/icons/85051de.gif' />先天优势是有Windows平台<img src='/icons/85051de.gif' />支持<img src='/icons/85051dou.gif' />而JavaFX作为后起的秀<img src='/icons/85051dou.gif' />其优势是它<img src='/icons/85051de.gif' />开源策略<img src='/icons/85051dou2.gif' /><br/><br/>
　　国内开发者社区JavaEye网站WebSite就Silverlight和Flash<img src='/icons/85051de.gif' />区别也在激烈讨论<img src='/icons/85051dou2.gif' />Silverlight虽然较Flash推出<img src='/icons/85051de.gif' />时间很晚<img src='/icons/85051dou.gif' />但已经给Flash造成很大<img src='/icons/85051de.gif' />压力:<br/><br/>
　　Flash前景堪忧<img src='/icons/85051dou.gif' />就看Adobe如何应对了<img src='/icons/85051dou.gif' />RIA是个非常大<img src='/icons/85051de.gif' />市场<img src='/icons/85051dou.gif' />个人觉得Flash在技术上优势不大<img src='/icons/85051dou.gif' />相反Silverlight<img src='/icons/85051de.gif' /><img src='/icons/85051yi.gif' />些特性对Flash是致命<img src='/icons/85051de.gif' />打击<img src='/icons/85051dou.gif' />比如搜索引擎友好等<img src='/icons/85051dou2.gif' />Flash最大<img src='/icons/85051de.gif' />优势是培养了大量<img src='/icons/85051de.gif' />开发者<img src='/icons/85051dou.gif' />微软想要拉拢这些真正<img src='/icons/85051de.gif' />市场推动者还要花不小<img src='/icons/85051de.gif' />力气<img src='/icons/85051dou2.gif' /><br/><br/>
　　有竞争总是件好事情<img src='/icons/85051dou.gif' />RIA开发平台的间<img src='/icons/85051de.gif' />竞争才刚刚开始<img src='/icons/85051dou2.gif' /><br/><br/>
 <a href="/mypdf/78838.pdf" title="查看 javafxflex比较:Silverlight、JavaFX、Flex技术比较 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78838.html</guid>
		</item>
		<item>
			<title><![CDATA[java加壳:专家和您一起谈谈java加壳的问题]]></title>
			<link>http://CrazyCoder.cn/Java/Article78837.html</link>
			<description>
				<![CDATA[

在C世界<img src='/icons/65533dou.gif' />对代码进行加密<img src='/icons/65533dou.gif' />主要通过加壳<img src='/icons/65533de.gif' />方式<img src='/icons/65533dou2.gif' />所谓加壳<img src='/icons/65533dou.gif' />就是先将<img src='/icons/65533chengxu.gif' />代码加密<img src='/icons/65533dou.gif' />然后用特定<img src='/icons/65533de.gif' /><img src='/icons/65533chengxu.gif' />加载器<img src='/icons/65533dou.gif' />将代码解密后加载进内存<img src='/icons/65533dou.gif' />这样可以在防止代码<img src='/icons/65533de.gif' />反编译<img src='/icons/65533dou.gif' />当然<img src='/icons/65533dou.gif' />有加壳工具<img src='/icons/65533dou.gif' />也有解壳工具<img src='/icons/65533dou.gif' />虽然不能100%防止crack<img src='/icons/65533dou.gif' />但仍然给代码增加<img src='/icons/65533yi.gif' />层有力<img src='/icons/65533de.gif' />保护<img src='/icons/65533dou2.gif' /><br/><br/>
　　然而在java世界<img src='/icons/65533dou.gif' />保护代码是件很困难<img src='/icons/65533de.gif' />事情<img src='/icons/65533dou.gif' /><img src='/icons/65533yinwei.gif' /><img src='/icons/65533class.gif' />文件非常规范标准<img src='/icons/65533dou.gif' />极易反编译<img src='/icons/65533dou.gif' />且反编译后<img src='/icons/65533de.gif' />代码清晰可读<img src='/icons/65533dou2.gif' />常见<img src='/icons/65533de.gif' />保护办法是使用混淆器<img src='/icons/65533dou.gif' />打乱<img src='/icons/65533class.gif' />和function以及变量<img src='/icons/65533de.gif' />名字<img src='/icons/65533dou.gif' />可以干扰反编译后<img src='/icons/65533de.gif' />代码<img src='/icons/65533de.gif' />可读性<img src='/icons/65533dou2.gif' />虽然简单提高了代码<img src='/icons/65533de.gif' />安全性<img src='/icons/65533dou.gif' />但还仅仅相当于未加壳<img src='/icons/65533de.gif' />C<img src='/icons/65533chengxu.gif' /><img src='/icons/65533dou2.gif' /><br/><br/>
　　java可以加壳吗?以前我认为这是不可能<img src='/icons/65533de.gif' /><img src='/icons/65533dou.gif' /><img src='/icons/65533yinwei.gif' />动态加载代码这样<img src='/icons/65533de.gif' />内存级别<img src='/icons/65533de.gif' />操作<img src='/icons/65533dou.gif' />java无法做到<img src='/icons/65533dou.gif' />除非使用JNI(Java Native Interface)<img src='/icons/65533dou.gif' /><img src='/icons/65533diaoyong.gif' />自己编写<img src='/icons/65533de.gif' />C代码<img src='/icons/65533dou.gif' />在C代码中实现动态加载java代码<img src='/icons/65533dou2.gif' />但是<img src='/icons/65533dou.gif' />C如何加载java代码呢?这需要对JVM相当<img src='/icons/65533de.gif' />了解<img src='/icons/65533dou2.gif' />所以当时<img src='/icons/65533de.gif' />我认为这是不可能<img src='/icons/65533de.gif' /><img src='/icons/65533dou2.gif' /><br/><br/>
　　然而<img src='/icons/65533dou.gif' />最近接触<img src='/icons/65533de.gif' /><img src='/icons/65533yi.gif' />些知识告诉我——java也可以加壳!!<br/><br/>
　　1.URLClassLoader<img src='/icons/65533dou2.gif' />用URLClassLoader可以在java<img src='/icons/65533chengxu.gif' /><img src='/icons/65533de.gif' />运行期间<img src='/icons/65533dou.gif' />再将文件夹或者jar加入到<img src='/icons/65533class.gif' />path中<img src='/icons/65533dou.gif' />这个特性事实上就是动态加载<img src='/icons/65533dou2.gif' />既然可以动态加载<img src='/icons/65533class.gif' /><img src='/icons/65533de.gif' />文件夹或者jar<img src='/icons/65533dou.gif' />为何不可以加载加密后<img src='/icons/65533de.gif' /><img src='/icons/65533class.gif' />es呢<img src='/icons/65533dou.gif' />将<img src='/icons/65533class.gif' />es用自己<img src='/icons/65533de.gif' />方式加密<img src='/icons/65533dou.gif' />在URLClassLoader<img src='/icons/65533diaoyong.gif' />时<img src='/icons/65533dou.gif' />使用自己<img src='/icons/65533de.gif' />方式解密<img src='/icons/65533dou2.gif' />不就是达到了加壳<img src='/icons/65533de.gif' />目<img src='/icons/65533de.gif' />了吗?不过解密<img src='/icons/65533de.gif' />代码放在何处是个问题<img src='/icons/65533dou.gif' />就是说解壳器<img src='/icons/65533de.gif' />代码暴露在外<img src='/icons/65533dou.gif' />还是很危险<img src='/icons/65533de.gif' /><img src='/icons/65533dou2.gif' /><br/><br/>
　　2.javassist<img src='/icons/65533dou2.gif' />这实在是<img src='/icons/65533yi.gif' />个非常神奇<img src='/icons/65533de.gif' />新技术<img src='/icons/65533dou.gif' />我是在学习Tapestry5时第<img src='/icons/65533yi.gif' />次遇到这个包<img src='/icons/65533de.gif' /><img src='/icons/65533dou.gif' />他可以动态创建java字节码<img src='/icons/65533dou.gif' />甚至可以修改你已经写好<img src='/icons/65533de.gif' /><img src='/icons/65533hanshu.gif' /><img src='/icons/65533dou.gif' />比如你<img src='/icons/65533de.gif' />getter和<img src='/icons/65533set.gif' />ter<img src='/icons/65533dou.gif' />只是简单<img src='/icons/65533de.gif' />读取和赋值<img src='/icons/65533dou.gif' />你可以在Runtime用他修改你<img src='/icons/65533de.gif' />getter和<img src='/icons/65533set.gif' />ter<img src='/icons/65533dou.gif' />让你<img src='/icons/65533de.gif' />getter和<img src='/icons/65533set.gif' />ter每次<img src='/icons/65533diaoyong.gif' />时都可以触发某些代码<img src='/icons/65533dou2.gif' />借助这项神奇<img src='/icons/65533de.gif' />技术<img src='/icons/65533dou.gif' /><img src='/icons/65533yi.gif' />定可以实现更强大<img src='/icons/65533de.gif' />动态加载<img src='/icons/65533dou.gif' />加壳也就有了可能<img src='/icons/65533dou2.gif' /><br/><br/>
　　让我有些不爽<img src='/icons/65533de.gif' />是<img src='/icons/65533dou.gif' />javassist又是小日本创建<img src='/icons/65533de.gif' />项目<img src='/icons/65533dou2.gif' /><br/><br/>
　　http://www.open-open.com/open54954.htm<br/><br/>
　　Javassist是<img src='/icons/65533yi.gif' />个开源<img src='/icons/65533de.gif' />分析、编辑和创建Java字节码<img src='/icons/65533de.gif' />类库<img src='/icons/65533dou2.gif' />是由东京技术学院<img src='/icons/65533de.gif' />数学和计算机科学 系<img src='/icons/65533de.gif' /> Shigeru Chiba 所创建<img src='/icons/65533de.gif' /><img src='/icons/65533dou2.gif' />它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架<img src='/icons/65533dou2.gif' /><br/><br/>
 <a href="/mypdf/78837.pdf" title="查看 java加壳:专家和您一起谈谈java加壳的问题 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78837.html</guid>
		</item>
		<item>
			<title><![CDATA[javascript密码强度:用Javascript评估用户输入密码的强度]]></title>
			<link>http://CrazyCoder.cn/Java/Article78836.html</link>
			<description>
				<![CDATA[

密码已经是我们生活工作中必不可少<img src='/icons/10134de.gif' />工具,但<img src='/icons/10134yi.gif' />个不安全<img src='/icons/10134de.gif' />密码有又有可能会给我们造成不必要<img src='/icons/10134de.gif' />损失<img src='/icons/10134dou2.gif' />作为网站WebSite设计者,如果我们在网页中能对用户输入<img src='/icons/10134de.gif' />密码进行安全评估,并显示出相应<img src='/icons/10134de.gif' />提示信息,那么对用户设置<img src='/icons/10134yi.gif' />个安全<img src='/icons/10134de.gif' />密码将有很大帮助<img src='/icons/10134dou2.gif' />同时也使得网站WebSite更具人性化,更有吸引力.<br/><br/>
　　什么是<img src='/icons/10134yi.gif' />个安全<img src='/icons/10134de.gif' />密码呢?本<img src='/icons/10134chengxu.gif' />按以下<img src='/icons/10134de.gif' />方式进行评估.<br/><br/>
　　1.如果密码少于5位,那么就认为这是<img src='/icons/10134yi.gif' />个弱密码.<br/><br/>
　　2.如果密码只由数字、小写字母、大写字母或其它特殊符号当中<img src='/icons/10134de.gif' /><img src='/icons/10134yi.gif' />种组成,则认为这是<img src='/icons/10134yi.gif' />个弱密码.<br/><br/>
　　3.如果密码由数字、小写字母、大写字母或其它特殊符号当中<img src='/icons/10134de.gif' />两种组成,则认为这是<img src='/icons/10134yi.gif' />个中度安全<img src='/icons/10134de.gif' />密码.<br/><br/>
　　4.如果密码由数字、小写字母、大写字母或其它特殊符号当中<img src='/icons/10134de.gif' /> 3种以上组成,则认为这是<img src='/icons/10134yi.gif' />个比较安全<img src='/icons/10134de.gif' />密码.<br/><br/>
　　本<img src='/icons/10134chengxu.gif' />将根据用户输入<img src='/icons/10134de.gif' />密码分别显示区别<img src='/icons/10134de.gif' />颜色表示密码<img src='/icons/10134de.gif' />强度,具体<img src='/icons/10134chengxu.gif' />如下:<br/><br/>
以下是引用片段:<br/>&lt;script language=javascript&gt;&nbsp; <br/><br/>
&nbsp;<br/><br/>
//CharMode<img src='/icons/10134hanshu.gif' />&nbsp; <br/>//测试某个<img src='/icons/10134zifu.gif' />是属于哪<img src='/icons/10134yi.gif' />类.&nbsp; <br/>function CharMode(iN){&nbsp; <br/><img src='/icons/10134if.gif' /> (iN&gt;=48 &amp;&amp; iN &lt;=57) //数字&nbsp; <br/><img src='/icons/10134return.gif' /> 1;&nbsp; <br/><img src='/icons/10134if.gif' /> (iN&gt;=65 &amp;&amp; iN &lt;=90) //大写字母&nbsp; <br/><img src='/icons/10134return.gif' /> 2;&nbsp; <br/><img src='/icons/10134if.gif' /> (iN&gt;=97 &amp;&amp; iN &lt;=122) //小写&nbsp; <br/><img src='/icons/10134return.gif' /> 4;&nbsp; <br/><img src='/icons/10134else.gif' />&nbsp; <br/><img src='/icons/10134return.gif' /> 8; //特殊<img src='/icons/10134zifu.gif' />&nbsp; <br/>}&nbsp; <br/><br/>
//bitTotal<img src='/icons/10134hanshu.gif' />&nbsp; <br/>//计算出当前密码当中<img src='/icons/10134yi.gif' />共有多少种模式&nbsp; <br/>function bitTotal(num){&nbsp; <br/>modes=0;&nbsp; <br/>for (i=0;i&lt;4;i<img src='/icons/10134jiajia.gif' />){&nbsp; <br/><img src='/icons/10134if.gif' /> (num &amp; 1) modes<img src='/icons/10134jiajia.gif' />;&nbsp; <br/>num&gt;&gt;&gt;=1;&nbsp; <br/>}&nbsp; <br/><img src='/icons/10134return.gif' /> modes;&nbsp; <br/>}&nbsp; <br/><br/>
//checkStrong<img src='/icons/10134hanshu.gif' />&nbsp; <br/>//返回密码<img src='/icons/10134de.gif' />强度级别&nbsp; <br/><br/>
function checkStrong(sPW){&nbsp; <br/><img src='/icons/10134if.gif' /> (sPW.length&lt;=4)&nbsp; <br/><img src='/icons/10134return.gif' /> 0; //密码太短&nbsp; <br/>Modes=0;&nbsp; <br/>for (i=0;i&lt;sPW.length;i<img src='/icons/10134jiajia.gif' />){&nbsp; <br/>//测试每<img src='/icons/10134yi.gif' />个<img src='/icons/10134zifu.gif' /><img src='/icons/10134de.gif' />类别并统计<img src='/icons/10134yi.gif' />共有多少种模式.&nbsp; <br/>Modes|=CharMode(sPW.charCodeAt(i));&nbsp; <br/>}&nbsp; <br/><br/>
<img src='/icons/10134return.gif' /> bitTotal(Modes);&nbsp; <br/><br/>
}&nbsp; <br/><br/>
//pwStrength<img src='/icons/10134hanshu.gif' />&nbsp; <br/>//当用户放开键盘或密码输入框失去焦点时,根据区别<img src='/icons/10134de.gif' />级别显示区别<img src='/icons/10134de.gif' />颜色&nbsp; <br/><br/>
function pwStrength(pwd){&nbsp; <br/>O_color="#eeeeee";&nbsp; <br/>L_color="#FF0000";&nbsp; <br/>M_color="#FF9900";&nbsp; <br/>H_color="#33CC00";&nbsp; <br/><img src='/icons/10134if.gif' /> (pwd<img src='/icons/10134dd.gif' />null||pwd<img src='/icons/10134dd.gif' />''){&nbsp; <br/>Lcolor=Mcolor=Hcolor=O_color;&nbsp; <br/>}&nbsp; <br/><img src='/icons/10134else.gif' />{&nbsp; <br/>S_level=checkStrong(pwd);&nbsp; <br/>switch(S_level) {&nbsp; <br/><img src='/icons/10134case.gif' /> 0:&nbsp; <br/>Lcolor=Mcolor=Hcolor=O_color;&nbsp; <br/><img src='/icons/10134case.gif' /> 1:&nbsp; <br/>Lcolor=L_color;&nbsp; <br/>Mcolor=Hcolor=O_color;&nbsp; <br/><img src='/icons/10134break.gif' />;&nbsp; <br/><img src='/icons/10134case.gif' /> 2:&nbsp; <br/>Lcolor=Mcolor=M_color;&nbsp; <br/>Hcolor=O_color;&nbsp; <br/><img src='/icons/10134break.gif' />;&nbsp; <br/>default:&nbsp; <br/>Lcolor=Mcolor=Hcolor=H_color;&nbsp; <br/>}&nbsp; <br/>}&nbsp; <br/><br/>
document.getElementById("strength_L").style.background=Lcolor;&nbsp; <br/>document.getElementById("strength_M").style.background=Mcolor;&nbsp; <br/>document.getElementById("strength_H").style.background=Hcolor;&nbsp; <br/><img src='/icons/10134return.gif' />;&nbsp; <br/>}&nbsp; <br/><br/>
&lt;/script&gt;&nbsp; <br/><br/>
&lt;form name=form1 action="" &gt;&nbsp; <br/>输入密码:&lt;input type=password size=10 _disibledevent=>&lt;br&gt;密码强度:&nbsp; <br/>&lt;table width="217" border="1" cellspacing="0" cellpadding="1" bordercolor="#cccccc" height="23" style='display:inline'&gt;&nbsp; <br/>&lt;tr align="center" bgcolor="#eeeeee"&gt;&nbsp; <br/><br/>
&lt;td width="33%" id="strength_L"&gt;弱&lt;/td&gt;&nbsp; <br/><br/>
&lt;td width="33%" id="strength_M"&gt;中&lt;/td&gt;&nbsp; <br/><br/>
&lt;td width="33%" id="strength_H"&gt;强&lt;/td&gt;&nbsp; <br/>&lt;/tr&gt;&nbsp; <br/>&lt;/table&gt;&nbsp; <br/><br/>
&lt;/form&gt;&nbsp; <br/><br/>
 <a href="/mypdf/78836.pdf" title="查看 javascript密码强度:用Javascript评估用户输入密码的强度 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78836.html</guid>
		</item>
		<item>
			<title><![CDATA[开源协议:Java程序员需要了解的几个开源协议]]></title>
			<link>http://CrazyCoder.cn/Java/Article78835.html</link>
			<description>
				<![CDATA[

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 今天工作<img src='/icons/90615de.gif' />任务要写<img src='/icons/90615yi.gif' />些跟开源协议相关<img src='/icons/90615de.gif' />约定介绍说明<img src='/icons/90615dou.gif' />所以在网上搜索了<img src='/icons/90615yi.gif' />些资料以供参考<img src='/icons/90615dou.gif' />下面列出了几个比较常见<img src='/icons/90615de.gif' />开源协议<img src='/icons/90615dou.gif' />如果想要了解其他<img src='/icons/90615de.gif' />协议和详细了解这些协议<img src='/icons/90615dou.gif' />我个人推荐这个网址:http://www.opensource.org/licenses/<br/><br/>
　　Mozilla Public License<br/><br/>
　　MPL License<img src='/icons/90615dou.gif' />允许免费重发布、免费修改<img src='/icons/90615dou.gif' />但要求修改后<img src='/icons/90615de.gif' />代码版权归软件Software<img src='/icons/90615de.gif' />发起者<img src='/icons/90615dou2.gif' />这种授权维护了商业软件Software<img src='/icons/90615de.gif' />利益<img src='/icons/90615dou.gif' /><img src='/icons/90615dou.gif' />它要求基于这种软件Software得修改无偿贡献版权给该软件Software<img src='/icons/90615dou2.gif' />这样<img src='/icons/90615dou.gif' />围绕该软件Software得所有代码得版权都集中在发起开发人得手中<img src='/icons/90615dou2.gif' />但MPL是允许修改<img src='/icons/90615dou.gif' />无偿使用得<img src='/icons/90615dou2.gif' />MPL软件Software对链接没有要求<img src='/icons/90615dou2.gif' /><br/><br/>
　　BSD开源协议<br/><br/>
　　BSD开源协议是<img src='/icons/90615yi.gif' />个给于使用者很大自由<img src='/icons/90615de.gif' />协议<img src='/icons/90615dou2.gif' />可以自由<img src='/icons/90615de.gif' />使用<img src='/icons/90615dou.gif' />修改源代码<img src='/icons/90615dou.gif' />也可以将修改后<img src='/icons/90615de.gif' />代码作为开源或者专有软件Software再发布<img src='/icons/90615dou2.gif' /> 当你发布使用了BSD协议<img src='/icons/90615de.gif' />代码<img src='/icons/90615dou.gif' />或则以BSD协议代码为基础做 2次开发自己<img src='/icons/90615de.gif' />产品时<img src='/icons/90615dou.gif' />需要满足 3个条件:<br/><br/>
　　1. 如果再发布<img src='/icons/90615de.gif' />产品中包含源代码<img src='/icons/90615dou.gif' />则在源代码中必须带有原来代码中<img src='/icons/90615de.gif' />BSD协议<img src='/icons/90615dou2.gif' /><br/><br/>
　　2. 如果再发布<img src='/icons/90615de.gif' />只是 2进制类库/软件Software<img src='/icons/90615dou.gif' />则需要在类库/软件Software<img src='/icons/90615de.gif' />文档和版权声明中包含原来代码中<img src='/icons/90615de.gif' />BSD协议<img src='/icons/90615dou2.gif' /><br/><br/>
　　3. 不可以用开源代码<img src='/icons/90615de.gif' />作者/机构名字和原来产品<img src='/icons/90615de.gif' />名字做市场推广<img src='/icons/90615dou2.gif' /><br/><br/>
　　BSD代码鼓励代码共享<img src='/icons/90615dou.gif' />但需要尊重代码作者<img src='/icons/90615de.gif' />著作权<img src='/icons/90615dou2.gif' />BSD由于允许使用者修改和重新发布代码<img src='/icons/90615dou.gif' />也允许使用或在BSD代码上开发商业软件Software发布和销售<img src='/icons/90615dou.gif' />因此是对商业集成很友好<img src='/icons/90615de.gif' />协议<img src='/icons/90615dou2.gif' />而很多<img src='/icons/90615de.gif' />公司企业在选用开源产品<img src='/icons/90615de.gif' />时候都首选BSD协议<img src='/icons/90615dou.gif' /><img src='/icons/90615yinwei.gif' />可以完全控制这些第 3方<img src='/icons/90615de.gif' />代码<img src='/icons/90615dou.gif' />在必要<img src='/icons/90615de.gif' />时候可以修改或者 2次开发<img src='/icons/90615dou2.gif' /><br/><br/>
　　Apache Licence 2.0<br/><br/>
　　Apache Licence是著名<img src='/icons/90615de.gif' />非盈利开源组织Apache采用<img src='/icons/90615de.gif' />协议<img src='/icons/90615dou2.gif' />该协议和BSD类似<img src='/icons/90615dou.gif' />同样鼓励代码共享和尊重原作者<img src='/icons/90615de.gif' />著作权<img src='/icons/90615dou.gif' />同样允许代码修改<img src='/icons/90615dou.gif' />再发布(作为开源或商业软件Software)<img src='/icons/90615dou2.gif' />需要满足<img src='/icons/90615de.gif' />条件:<br/><br/>
　　1. 需要给代码<img src='/icons/90615de.gif' />用户<img src='/icons/90615yi.gif' />份Apache Licence<br/><br/>
　　2. 如果你修改了代码<img src='/icons/90615dou.gif' />需要再被修改<img src='/icons/90615de.gif' />文件中介绍说明<img src='/icons/90615dou2.gif' /><br/><br/>
　　3. 在延伸<img src='/icons/90615de.gif' />代码中(修改和有源代码衍生<img src='/icons/90615de.gif' />代码中)需要带有原来代码中<img src='/icons/90615de.gif' />协议<img src='/icons/90615dou.gif' />商标<img src='/icons/90615dou.gif' />专利声明和其他原来作者规定需要包含<img src='/icons/90615de.gif' />介绍说明<img src='/icons/90615dou2.gif' /><br/><br/>
　　4. 如果再发布<img src='/icons/90615de.gif' />产品中包含<img src='/icons/90615yi.gif' />个Notice文件<img src='/icons/90615dou.gif' />则在Notice文件中需要带有Apache Licence<img src='/icons/90615dou2.gif' />你可以在Notice中增加自己<img src='/icons/90615de.gif' />许可<img src='/icons/90615dou.gif' />但不可以表现为对Apache Licence构成更改<img src='/icons/90615dou2.gif' /><br/><br/>
　　Apache Licence也是对商业应用友好<img src='/icons/90615de.gif' />许可<img src='/icons/90615dou2.gif' />使用者也可以在需要<img src='/icons/90615de.gif' />时候修改代码来满足需要并作为开源或商业产品发布/销售<img src='/icons/90615dou2.gif' /><br/><br/>
　　GPL<br/><br/>
　　GPL许可证是自由软件Software<img src='/icons/90615de.gif' />应用最广泛<img src='/icons/90615de.gif' />软件Software许可证<img src='/icons/90615dou.gif' />人们可以修改程式<img src='/icons/90615de.gif' /><img src='/icons/90615yi.gif' />个或几个副本或程式<img src='/icons/90615de.gif' />任何部分<img src='/icons/90615dou.gif' />以此形成基於这些程式<img src='/icons/90615de.gif' />衍生作品<img src='/icons/90615dou2.gif' />必须在修改过<img src='/icons/90615de.gif' />档案中附有明显<img src='/icons/90615de.gif' />介绍说明:您修改了此<img src='/icons/90615yi.gif' />档案及任何修改<img src='/icons/90615de.gif' />日期<img src='/icons/90615dou2.gif' /> 您必须让您发布或出版<img src='/icons/90615de.gif' />作品<img src='/icons/90615dou.gif' />包括本程式<img src='/icons/90615de.gif' />全部或<img src='/icons/90615yi.gif' />部分<img src='/icons/90615dou.gif' />或内含本程式<img src='/icons/90615de.gif' />全部或部分所衍生<img src='/icons/90615de.gif' />作品<img src='/icons/90615dou.gif' />允许第 3方在此许可证条款下使用<img src='/icons/90615dou.gif' />并且不得<img src='/icons/90615yinwei.gif' />此项授权行为而收费<img src='/icons/90615dou2.gif' /><br/><br/>
　　LGPL<br/><br/>
　　Linux就是采用了GPL<img src='/icons/90615dou2.gif' />GPL协议和BSD, Apache Licence等鼓励代码重用<img src='/icons/90615de.gif' />许可很不<img src='/icons/90615yi.gif' />样<img src='/icons/90615dou2.gif' />GPL<img src='/icons/90615de.gif' />出发点是代码<img src='/icons/90615de.gif' />开源/免费使用和引用/修改/衍生代码<img src='/icons/90615de.gif' />开源/免费使用<img src='/icons/90615dou.gif' />但不允许修改后和衍生<img src='/icons/90615de.gif' />代码做为闭源<img src='/icons/90615de.gif' />商业软件Software发布和销售<img src='/icons/90615dou2.gif' />这也就是为什么我们能用免费<img src='/icons/90615de.gif' />各种linux<img src='/icons/90615dou.gif' />包括商业公司<img src='/icons/90615de.gif' />linux和linux上各种各样<img src='/icons/90615de.gif' />由个人<img src='/icons/90615dou.gif' />组织<img src='/icons/90615dou.gif' />以及商业软件Software公司开发<img src='/icons/90615de.gif' />免费软件Software了<img src='/icons/90615dou2.gif' /><br/><br/>
　　GPL协议<img src='/icons/90615de.gif' />主要内容是只要在<img src='/icons/90615yi.gif' />个软件Software中使用(“使用”指类库引用<img src='/icons/90615dou.gif' />修改后<img src='/icons/90615de.gif' />代码或者衍生代码)GPL协议<img src='/icons/90615de.gif' />产品<img src='/icons/90615dou.gif' />则该软件Software产品必须也采用GPL协议<img src='/icons/90615dou.gif' />既必须也是开源和免费<img src='/icons/90615dou2.gif' />这就是所谓<img src='/icons/90615de.gif' />”传染性”<img src='/icons/90615dou2.gif' />GPL协议<img src='/icons/90615de.gif' />产品作为<img src='/icons/90615yi.gif' />个单独<img src='/icons/90615de.gif' />产品使用没有任何问题<img src='/icons/90615dou.gif' />还可以享受免费<img src='/icons/90615de.gif' />优势<img src='/icons/90615dou2.gif' /><br/><br/>
　　由于GPL严格要求使用了GPL类库<img src='/icons/90615de.gif' />软件Software产品必须使用GPL协议<img src='/icons/90615dou.gif' />对于使用GPL协议<img src='/icons/90615de.gif' />开源代码<img src='/icons/90615dou.gif' />商业软件Software或者对代码有保密要求<img src='/icons/90615de.gif' />部门就不适合集成/采用作为类库和 2次开发<img src='/icons/90615de.gif' />基础<img src='/icons/90615dou2.gif' /><br/><br/>
　　其它细节如再发布<img src='/icons/90615de.gif' />时候需要伴随GPL协议等和BSD/Apache等类似<br/><br/>
　　Public Do<img src='/icons/90615main.gif' /><br/><br/>
　　公共域授权<img src='/icons/90615dou2.gif' />将软件Software授权为公共域<img src='/icons/90615dou.gif' />这些软件Software包没有授权协议<img src='/icons/90615dou.gif' />任何人都可以随意使用它<img src='/icons/90615dou2.gif' /><br/><br/>
　　Artistic许可<br/><br/>
　　使作者保持对进<img src='/icons/90615yi.gif' />步开发<img src='/icons/90615de.gif' />控制<img src='/icons/90615dou2.gif' /><br/><br/>
 <a href="/mypdf/78835.pdf" title="查看 开源协议:Java程序员需要了解的几个开源协议 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78835.html</guid>
		</item>
		<item>
			<title><![CDATA[javascript字节数:巧用JAVASCRIPT代码限制文本字节数]]></title>
			<link>http://CrazyCoder.cn/Java/Article78834.html</link>
			<description>
				<![CDATA[

做项目时自己写<img src='/icons/35217yi.gif' />段js给大家<img src='/icons/35217dou2.gif' />有关文本限制字数<img src='/icons/35217de.gif' />问题<img src='/icons/35217dou.gif' />在实际开发中经常用到;主要问题出现在对中文<img src='/icons/35217de.gif' />限制<img src='/icons/35217dou.gif' />下面代码就解决有关限制字节数<img src='/icons/35217de.gif' />校验问题;只要将此下代码保存到<img src='/icons/35217yi.gif' />个js文件中并引入到校验<img src='/icons/35217de.gif' />页面中<img src='/icons/35217dou.gif' />便可使用!同时希望大家给和大力支持和宝贵意见<img src='/icons/35217dou.gif' />本人会在今后闲余的际<img src='/icons/35217dou.gif' />发表更多<img src='/icons/35217de.gif' />好文章<img src='/icons/35217dou.gif' />谢谢!!<br/><br/>
以下是引用片段:<br/>/*&nbsp; <br/>&nbsp;value: 值；&nbsp; <br/>&nbsp;<img src='/icons/35217byte.gif' />Length:数据库字节长度&nbsp; <br/>&nbsp;title:字段中文名称&nbsp; <br/>&nbsp;attribute:属性名称&nbsp; <br/>&nbsp;使用思路方法介绍说明:&nbsp; <br/><br/>
添加 (1) _disibledevent=>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2)&nbsp; id="name" 或【struts标签】styleId="name"&nbsp; <br/>&nbsp;注意:id名称和 attribute属性名称要<img src='/icons/35217yi.gif' />样&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;例子:&lt;textarea&nbsp; name="explain" id="explain" _disibledevent=>
&nbsp;或&nbsp; <br/><br/>
&lt;input type="text"&nbsp;&nbsp; name="explain"&nbsp; id="explain" _disibledevent=>
*/&nbsp; <br/><br/>
function limitLength(value, <img src='/icons/35217byte.gif' />Length, title, attribute) {&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var <img src='/icons/35217new.gif' />value = value.replace(/[^\x00-\xff]/g, "**");&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var length = <img src='/icons/35217new.gif' />value.length;&nbsp; <br/>&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //当填写<img src='/icons/35217de.gif' />字节数小于设置<img src='/icons/35217de.gif' />字节数&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src='/icons/35217if.gif' /> (length * 1 &lt;=<img src='/icons/35217byte.gif' />Length * 1){&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src='/icons/35217return.gif' />;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var limitDate = <img src='/icons/35217new.gif' />value.substr(0, <img src='/icons/35217byte.gif' />Length);&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var count = 0;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var limitvalue = "";&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp; for (var i = 0; i &lt; limitDate.length; i<img src='/icons/35217jiajia.gif' />) {&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var flat = limitDate.substr(i, 1);&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src='/icons/35217if.gif' /> (flat <img src='/icons/35217dd.gif' /> "*") {&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; count<img src='/icons/35217jiajia.gif' />;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp; var size = 0;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp; var istar = <img src='/icons/35217new.gif' />value.substr(<img src='/icons/35217byte.gif' />Length * 1 - 1, 1);//校验点是否为“×”&nbsp; <br/>&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; //<img src='/icons/35217if.gif' /> 基点是×; 判断在基点内有×为偶数还是奇数&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp; <img src='/icons/35217if.gif' /> (count % 2 <img src='/icons/35217dd.gif' /> 0) {&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //当为偶数时&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size = count / 2 + (<img src='/icons/35217byte.gif' />Length * 1 - count);&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; limitvalue = value.substr(0, size);&nbsp; <br/>&nbsp;&nbsp;&nbsp; } <img src='/icons/35217else.gif' /> {&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //当为奇数时&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size = (count - 1) / 2 + (<img src='/icons/35217byte.gif' />Length * 1 - count);&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; limitvalue = value.substr(0, size);&nbsp; <br/>&nbsp;&nbsp;&nbsp; }&nbsp; <br/>&nbsp;&nbsp; alert(title + "最大输入" + <img src='/icons/35217byte.gif' />Length + "个字节(相当于"+<img src='/icons/35217byte.gif' />Length /2+"个汉字)！");&nbsp; <br/>&nbsp;&nbsp; document.getElementById(attribute).value = limitvalue;&nbsp; <br/>&nbsp;&nbsp; <img src='/icons/35217return.gif' />;&nbsp; <br/>}&nbsp; <br/><br/>
 <a href="/mypdf/78834.pdf" title="查看 javascript字节数:巧用JAVASCRIPT代码限制文本字节数 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78834.html</guid>
		</item>
		<item>
			<title><![CDATA[adminscripts:使用AdminScripts脚本创建虚拟目录]]></title>
			<link>http://CrazyCoder.cn/Java/Article78833.html</link>
			<description>
				<![CDATA[

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AdminScripts脚本位于\Inetpub\AdminScripts目录下<img src='/icons/15698dou.gif' />本文介绍如何使用这些脚本来创建<img src='/icons/15698yi.gif' />个虚拟目录<img src='/icons/15698dou.gif' />并对该虚拟目录进行参数设置<img src='/icons/15698dou2.gif' /><br/><br/>
　　AdminScripts目录下<img src='/icons/15698de.gif' />脚本很多<img src='/icons/15698dou.gif' />这里只使用了其中<img src='/icons/15698de.gif' />两个<img src='/icons/15698dou.gif' />adsutil.vbs和chaccess.vbs:<br/><br/>
　　adsutil.vbs - 可用于创建并配置虚拟目录(实际上adsutil.vbs<img src='/icons/15698de.gif' />功能涵盖了其他所有脚本)<br/><br/>
　　chaccess.vbs - 设定虚拟目录<img src='/icons/15698de.gif' />权限<br/><br/>
　　下面是批处理脚本makevd.bat<img src='/icons/15698de.gif' />内容<img src='/icons/15698dou.gif' />首先介绍说明<img src='/icons/15698yi.gif' />下批处理脚本<img src='/icons/15698de.gif' /><img src='/icons/15698diaoyong.gif' />方式:<br/><br/>
　　makevd.bat "虚拟目录名称" "虚拟目录<img src='/icons/15698de.gif' />路径"<br/><br/>
　　举例:makevd.bat "myVirtualDirectory" "d:\myweb\test"<br/><br/>
　　接下来是makevd.bat<img src='/icons/15698de.gif' />内容:<br/><br/>
以下是引用片段:<br/>@echo off&nbsp; <br/>echo ######################################################&nbsp; <br/>echo ######### ########&nbsp; <br/>echo ######### 正在创建虚拟目录... ########&nbsp; <br/>echo ######### 请不要关闭本窗口！ ########&nbsp; <br/>echo ######### ########&nbsp; <br/>echo ######################################################&nbsp; <br/>REM 创建虚拟目录&nbsp; <br/>cscript scripts\adsutil.vbs //Nologo //T:300 create W3SVC/1/Root/%1 "IIsWebVirtualDir"&nbsp; <br/>REM 设置虚拟目录<img src='/icons/15698de.gif' />属性&nbsp; <br/>REM 创建<img src='/icons/15698yi.gif' />个进程内应用<img src='/icons/15698chengxu.gif' />(.Net中没有inproc和outproc<img src='/icons/15698de.gif' />区别<img src='/icons/15698dou.gif' />但旧脚本仍可使用)&nbsp; <br/>cscript scripts\adsutil.vbs //Nologo //T:60 appcreateinproc W3SVC/1/Root/%1&nbsp; <br/><br/>
REM 设定应用<img src='/icons/15698chengxu.gif' /><img src='/icons/15698de.gif' />根目录&nbsp; <br/>cscript scripts\adsutil.vbs //Nologo //T:60 <img src='/icons/15698set.gif' /> W3SVC/1/Root/%1/AppRoot /LM/W3SVC/1/Root/%1&nbsp; <br/>REM 设定应用<img src='/icons/15698chengxu.gif' /><img src='/icons/15698de.gif' />显示名称&nbsp; <br/>cscript scripts\adsutil.vbs //Nologo //T:60 <img src='/icons/15698set.gif' /> W3SVC/1/Root/%1/AppFriendlyName %1&nbsp; <br/>REM 设定应用<img src='/icons/15698chengxu.gif' /><img src='/icons/15698de.gif' />隔离等级(在.Net中不用设置)&nbsp; <br/>cscript scripts\adsutil.vbs //Nologo //T:60 <img src='/icons/15698set.gif' /> W3SVC/1/Root/%1/AppIsolated 2&nbsp; <br/>REM 设定虚拟目录<img src='/icons/15698de.gif' />路径&nbsp; <br/>cscript scripts\adsutil.vbs //Nologo //T:60 <img src='/icons/15698set.gif' /> W3SVC/1/Root/%1/Path %2&nbsp; <br/>REM 设定虚拟目录<img src='/icons/15698de.gif' />执行权限<img src='/icons/15698dou.gif' />513是纯脚本方式&nbsp; <br/>cscript scripts\adsutil.vbs //Nologo //T:60 <img src='/icons/15698set.gif' /> W3SVC/1/Root/%1/AccessFlags 513&nbsp; <br/>REM 设定AuthFlags<img src='/icons/15698de.gif' />值<img src='/icons/15698dou.gif' />5表示允许匿名访问和集成Windows验证&nbsp; <br/>cscript scripts\adsutil.vbs //Nologo //T:60 <img src='/icons/15698set.gif' /> W3SVC/1/Root/%1/AuthFlags 5&nbsp; <br/>REM 设定DirbrowseFlags<img src='/icons/15698de.gif' />值<img src='/icons/15698dou.gif' />DirbrowseFlags是控制目录浏览<img src='/icons/15698de.gif' />开关参数<img src='/icons/15698dou.gif' />比较复杂<img src='/icons/15698dou.gif' />照填就行了&nbsp; <br/>cscript scripts\adsutil.vbs //Nologo //T:60 <img src='/icons/15698set.gif' /> W3SVC/1/Root/%1/DirbrowseFlags 1073741886&nbsp; <br/>REM 设定默认文档&nbsp; <br/>cscript scripts\adsutil.vbs //Nologo //T:60 <img src='/icons/15698set.gif' /> W3SVC/1/Root/%1/DefaultDoc "Default.aspx"&nbsp; <br/>REM 设定目录权限(可读、不可写、可浏览脚本资源、不可查看目录)&nbsp; <br/>cscript scripts\chaccess.vbs //Nologo //T:60 -a W3SVC/1/Root/%1 +read -write +script -browse&nbsp; <br/>//NoLogo和//T:60是cscript<img src='/icons/15698de.gif' />运行参数<img src='/icons/15698dou.gif' />分别设定运行显示模式和最大运行时间&nbsp; <br/><br/>
 <a href="/mypdf/78833.pdf" title="查看 adminscripts:使用AdminScripts脚本创建虚拟目录 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78833.html</guid>
		</item>
		<item>
			<title><![CDATA[ria是什么:RIA世界里的 3种信仰]]></title>
			<link>http://CrazyCoder.cn/Java/Article78832.html</link>
			<description>
				<![CDATA[

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从Ajax到SilverLight<img src='/icons/60299dou.gif' />从Apollo和AIR(Adobe Integrated Runtime)到Flex和Flash<img src='/icons/60299dou.gif' />从JavaFX到OpenLaszlo<img src='/icons/60299dou.gif' />RIA(丰富互联网应用<img src='/icons/60299chengxu.gif' /><img src='/icons/60299dou.gif' /> Rich Internet Aplications)似乎已经成为这些天每个人话题<img src='/icons/60299de.gif' />焦点<img src='/icons/60299dou2.gif' />供应商们都争取成为被关注<img src='/icons/60299de.gif' />重点<img src='/icons/60299dou.gif' />开发人员也在试图选择<img src='/icons/60299yi.gif' />种“正确”<img src='/icons/60299de.gif' />技术<img src='/icons/60299dou2.gif' /><br/><br/>
　　在所有<img src='/icons/60299de.gif' />喧闹和混乱中<img src='/icons/60299dou.gif' />很容易迷失真相<img src='/icons/60299de.gif' />踪迹<img src='/icons/60299dou.gif' />当他们讨论RIA<img src='/icons/60299de.gif' />时候<img src='/icons/60299dou.gif' />所指有所区别<img src='/icons/60299dou2.gif' />RIA应该如何被构建<img src='/icons/60299dou.gif' />从Chris Messina<img src='/icons/60299de.gif' />在Mozilla的上研究和Brendan Eich认为<img src='/icons/60299de.gif' />开放Web<img src='/icons/60299dou.gif' />到由Microsoft 和Adobe 提供<img src='/icons/60299de.gif' />新技术<img src='/icons/60299dou.gif' />都有着各自<img src='/icons/60299de.gif' />哲学<img src='/icons/60299dou2.gif' /><br/><br/>
　　Simon Morris研究了上面提到<img src='/icons/60299de.gif' />所有技术<img src='/icons/60299dou.gif' />并提炼出<img src='/icons/60299yi.gif' />个RIA<img src='/icons/60299de.gif' />分类<img src='/icons/60299dou.gif' />即所谓<img src='/icons/60299de.gif' />“RIA世界里<img src='/icons/60299de.gif' /> 3种区别信仰”<img src='/icons/60299dou2.gif' /><br/><br/>
　　浏览器主义是信仰浏览器(或者<img src='/icons/60299yi.gif' />些类似<img src='/icons/60299de.gif' />以页面为中心、面向标记、HTTP绑定<img src='/icons/60299de.gif' />中间件平台)是未来最终用户面对<img src='/icons/60299de.gif' />软件Software;这个信仰仅仅基于这样<img src='/icons/60299de.gif' />观测:Web目前是作为访问互联网<img src='/icons/60299de.gif' />主导工具<img src='/icons/60299dou2.gif' /><br/><br/>
　　新式桌面主义<img src='/icons/60299de.gif' />信仰是浏览器作为<img src='/icons/60299yi.gif' />个最终用户面对<img src='/icons/60299de.gif' />应用<img src='/icons/60299chengxu.gif' />平台<img src='/icons/60299dou.gif' />终将成为<img src='/icons/60299yi.gif' />条被改变<img src='/icons/60299de.gif' />死路<img src='/icons/60299dou2.gif' />新式桌面主义<img src='/icons/60299de.gif' />目标是<img src='/icons/60299dou.gif' />努力将传统桌面应用<img src='/icons/60299chengxu.gif' /><img src='/icons/60299de.gif' />技术发展推进到它们能自由地进行本地客户端安装<img src='/icons/60299dou.gif' />像网页那样在需要时才进行部署<img src='/icons/60299de.gif' />境界<img src='/icons/60299dou2.gif' /><br/><br/>
　　实用新式桌面主义还是认为浏览器作为<img src='/icons/60299yi.gif' />个最终用户面对<img src='/icons/60299de.gif' />应用<img src='/icons/60299chengxu.gif' />平台<img src='/icons/60299dou.gif' />终将成为<img src='/icons/60299yi.gif' />条被改变<img src='/icons/60299de.gif' />死路<img src='/icons/60299dou.gif' />但他们也认识到<img src='/icons/60299yi.gif' />时还不能完全替代浏览器<img src='/icons/60299dou2.gif' /><br/><br/>
　　把上面<img src='/icons/60299de.gif' />风凉话放到<img src='/icons/60299yi.gif' />旁<img src='/icons/60299dou.gif' />在RIA技术<img src='/icons/60299de.gif' />范围中确实存在着3个重要<img src='/icons/60299de.gif' />阵营<img src='/icons/60299dou2.gif' />Simon对他喜欢<img src='/icons/60299de.gif' />(RIA构建)哲学继续解释道:<br/><br/>
　　<img src='/icons/60299yi.gif' />个可取<img src='/icons/60299de.gif' />RIA平台<img src='/icons/60299dou.gif' />我建议<img src='/icons/60299dou.gif' />将由现在<img src='/icons/60299de.gif' />富非互联网应用<img src='/icons/60299chengxu.gif' />(Rich Non-<img src='/icons/60299int.gif' />ernet Application)平台(如常规<img src='/icons/60299de.gif' />桌面应用<img src='/icons/60299chengxu.gif' />技术)变化而来<img src='/icons/60299dou.gif' />运行于网络空间<img src='/icons/60299dou.gif' />既保留了所有丰富<img src='/icons/60299de.gif' />功能又能在用户界面上使用原先<img src='/icons/60299de.gif' />窍门技巧<img src='/icons/60299dou.gif' />而不是像 有些人费力去促使<img src='/icons/60299de.gif' />那样(使用全新<img src='/icons/60299de.gif' />技术)<img src='/icons/60299dou2.gif' /><br/><br/>
　　Will Hartung指出(现在<img src='/icons/60299de.gif' />)<img src='/icons/60299yi.gif' />些应用<img src='/icons/60299chengxu.gif' />把这些阵营的间<img src='/icons/60299de.gif' />界线变模糊了:<br/><br/>
　　让Simon困惑<img src='/icons/60299de.gif' />是<img src='/icons/60299dou.gif' />Thunderbird属于什么?是浏览器主义还是新式桌面主义?Thunderbird<img src='/icons/60299de.gif' />很多地方由Javascript写成<img src='/icons/60299dou2.gif' /> 重要<img src='/icons/60299de.gif' />目标是进<img src='/icons/60299yi.gif' />步重构运行在Thunderbird(和Firefox)后端<img src='/icons/60299de.gif' />运行时<img src='/icons/60299dou.gif' />以便让它成为<img src='/icons/60299yi.gif' />个(不被任何厂商主导<img src='/icons/60299de.gif' />)更好<img src='/icons/60299de.gif' />客户端应用<img src='/icons/60299chengxu.gif' />开 发平台<img src='/icons/60299dou2.gif' /><br/><br/>
　　那么<img src='/icons/60299dou.gif' />RIA<img src='/icons/60299de.gif' />未来在哪里?它们重要吗?哪个技术和架构你认为将会存活下来<img src='/icons/60299dou.gif' />并为我们在将来构建应用<img src='/icons/60299chengxu.gif' />开辟道路?<br/><br/>
 <a href="/mypdf/78832.pdf" title="查看 ria是什么:RIA世界里的 3种信仰 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78832.html</guid>
		</item>
		<item>
			<title><![CDATA[java程序源码:如何有效防止Java程序源码被人偷窥?]]></title>
			<link>http://CrazyCoder.cn/Java/Article78830.html</link>
			<description>
				<![CDATA[

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java<img src='/icons/4900chengxu.gif' /><img src='/icons/4900de.gif' />源代码很容易被别人偷看<img src='/icons/4900dou.gif' />只要有<img src='/icons/4900yi.gif' />个反编译器<img src='/icons/4900dou.gif' />任何人都可以分析别人<img src='/icons/4900de.gif' />代码<img src='/icons/4900dou2.gif' />本文讨论如何在不修改原有<img src='/icons/4900chengxu.gif' /><img src='/icons/4900de.gif' />情况下<img src='/icons/4900dou.gif' />通过加密技术保护源代码<img src='/icons/4900dou2.gif' /><br/><br/>
　　<img src='/icons/4900yi.gif' />、为什么要加密?<br/><br/>
　　对于传统<img src='/icons/4900de.gif' />C或C<img src='/icons/4900jiajia.gif' />的类<img src='/icons/4900de.gif' />语言来说<img src='/icons/4900dou.gif' />要在Web上保护源代码是很容易<img src='/icons/4900de.gif' /><img src='/icons/4900dou.gif' />只要不发布它就可以<img src='/icons/4900dou2.gif' />遗憾<img src='/icons/4900de.gif' />是<img src='/icons/4900dou.gif' />Java<img src='/icons/4900chengxu.gif' /><img src='/icons/4900de.gif' />源代码很容易被别人偷看<img src='/icons/4900dou2.gif' />只要有<img src='/icons/4900yi.gif' />个反编译器<img src='/icons/4900dou.gif' />任何人都可以分析别人<img src='/icons/4900de.gif' />代码<img src='/icons/4900dou2.gif' />Java<img src='/icons/4900de.gif' />灵活性使得源代码很容易被窃取<img src='/icons/4900dou.gif' />但和此同时<img src='/icons/4900dou.gif' />它也使通过加密保护代码变得相对容易<img src='/icons/4900dou.gif' />我们唯<img src='/icons/4900yi.gif' />需要了解<img src='/icons/4900de.gif' />就是Java<img src='/icons/4900de.gif' />ClassLoader对象<img src='/icons/4900dou2.gif' />当然<img src='/icons/4900dou.gif' />在加密过程中<img src='/icons/4900dou.gif' />有关Java Cryptography Extension(JCE)<img src='/icons/4900de.gif' />知识也是必不可少<img src='/icons/4900de.gif' /><img src='/icons/4900dou2.gif' /><br/><br/>
　　有几种技术可以“模糊”Java类文件<img src='/icons/4900dou.gif' />使得反编译器处理类文件<img src='/icons/4900de.gif' />效果大打折扣<img src='/icons/4900dou2.gif' />然而<img src='/icons/4900dou.gif' />修改反编译器使的能够处理这些经过模糊处理<img src='/icons/4900de.gif' />类文件并不是什么难事<img src='/icons/4900dou.gif' />所以不能简单地依赖模糊技术来保证源代码<img src='/icons/4900de.gif' />安全<img src='/icons/4900dou2.gif' /><br/><br/>
　　我们可以用流行<img src='/icons/4900de.gif' />加密工具加密应用<img src='/icons/4900dou.gif' />比如PGP(Pretty Good Privacy)或GPG(GNU Privacy Guard)<img src='/icons/4900dou2.gif' />这时<img src='/icons/4900dou.gif' />最终用户在运行应用的前必须先进行解密<img src='/icons/4900dou2.gif' />但解密的后<img src='/icons/4900dou.gif' />最终用户就有了<img src='/icons/4900yi.gif' />份不加密<img src='/icons/4900de.gif' />类文件<img src='/icons/4900dou.gif' />这和事先不进行加密没有什么差别<img src='/icons/4900dou2.gif' /><br/><br/>
　　Java运行时装入字节码<img src='/icons/4900de.gif' />机制隐含地意味着可以对字节码进行修改<img src='/icons/4900dou2.gif' />JVM每次装入类文件时都需要<img src='/icons/4900yi.gif' />个称为ClassLoader<img src='/icons/4900de.gif' />对象<img src='/icons/4900dou.gif' />这个对象负责把新<img src='/icons/4900de.gif' />类装入正在运行<img src='/icons/4900de.gif' />JVM<img src='/icons/4900dou2.gif' />JVM给ClassLoader<img src='/icons/4900yi.gif' />个包含了待装入类(比如java.lang.Object)名字<img src='/icons/4900de.gif' /><img src='/icons/4900zifu.gif' />串<img src='/icons/4900dou.gif' />然后由ClassLoader负责找到类文件<img src='/icons/4900dou.gif' />装入原始数据<img src='/icons/4900dou.gif' />并把它转换成<img src='/icons/4900yi.gif' />个Class对象<img src='/icons/4900dou2.gif' /><br/><br/>
　　我们可以通过定制ClassLoader<img src='/icons/4900dou.gif' />在类文件执行的前修改它<img src='/icons/4900dou2.gif' />这种技术<img src='/icons/4900de.gif' />应用非常广泛??在这里<img src='/icons/4900dou.gif' />它<img src='/icons/4900de.gif' />用途是在类文件装入的时进行解密<img src='/icons/4900dou.gif' />因此可以看成是<img src='/icons/4900yi.gif' />种即时解密器<img src='/icons/4900dou2.gif' />由于解密后<img src='/icons/4900de.gif' />字节码文件永远不会保存到文件系统<img src='/icons/4900dou.gif' />所以窃密者很难得到解密后<img src='/icons/4900de.gif' />代码<img src='/icons/4900dou2.gif' /><br/><br/>
　　由于把原始字节码转换成Class对象<img src='/icons/4900de.gif' />过程完全由系统负责<img src='/icons/4900dou.gif' />所以创建定制ClassLoader对象其实并不困难<img src='/icons/4900dou.gif' />只需先获得原始数据<img src='/icons/4900dou.gif' />接着就可以进行包含解密在内<img src='/icons/4900de.gif' />任何转换<img src='/icons/4900dou2.gif' /><br/><br/>
　　Java 2在<img src='/icons/4900yi.gif' />定程度上简化了定制ClassLoader<img src='/icons/4900de.gif' />构建<img src='/icons/4900dou2.gif' />在Java 2中<img src='/icons/4900dou.gif' />loadClass<img src='/icons/4900de.gif' />缺省实现仍旧负责处理所有必需<img src='/icons/4900de.gif' />步骤<img src='/icons/4900dou.gif' />但为了顾及各种定制<img src='/icons/4900de.gif' />类装入过程<img src='/icons/4900dou.gif' />它还<img src='/icons/4900diaoyong.gif' /><img src='/icons/4900yi.gif' />个新<img src='/icons/4900de.gif' />findClass思路方法<img src='/icons/4900dou2.gif' /><br/><br/>
　　这为我们编写定制<img src='/icons/4900de.gif' />ClassLoader提供了<img src='/icons/4900yi.gif' />条捷径<img src='/icons/4900dou.gif' />减少了麻烦:只需覆盖findClass<img src='/icons/4900dou.gif' />而不是覆盖loadClass<img src='/icons/4900dou2.gif' />这种思路方法避免了重复所有装入器必需执行<img src='/icons/4900de.gif' />公共步骤<img src='/icons/4900dou.gif' /><img src='/icons/4900yinwei.gif' />这<img src='/icons/4900yi.gif' />切由loadClass负责<img src='/icons/4900dou2.gif' /><br/><br/>
　　不过<img src='/icons/4900dou.gif' />本文<img src='/icons/4900de.gif' />定制ClassLoader并不使用这种思路方法<img src='/icons/4900dou2.gif' />原因很简单<img src='/icons/4900dou2.gif' />如果由默认<img src='/icons/4900de.gif' />ClassLoader先寻找经过加密<img src='/icons/4900de.gif' />类文件<img src='/icons/4900dou.gif' />它可以找到;但由于类文件已经加密<img src='/icons/4900dou.gif' />所以它不会认可这个类文件<img src='/icons/4900dou.gif' />装入过程将失败<img src='/icons/4900dou2.gif' />因此<img src='/icons/4900dou.gif' />我们必须自己实现loadClass<img src='/icons/4900dou.gif' />稍微增加了<img src='/icons/4900yi.gif' />些工作量<img src='/icons/4900dou2.gif' /><br/><br/>
 <a href="/mypdf/78830.pdf" title="查看 java程序源码:如何有效防止Java程序源码被人偷窥? 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78830.html</guid>
		</item>
		<item>
			<title><![CDATA[java程序开发:Java程序开发中代理技术的使用思路方法]]></title>
			<link>http://CrazyCoder.cn/Java/Article78829.html</link>
			<description>
				<![CDATA[

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果你这样<img src='/icons/85381de.gif' />需求:在运行时创建实现<img src='/icons/85381yi.gif' />组给定接口<img src='/icons/85381de.gif' />类<img src='/icons/85381dou.gif' />注意这个类是在运行时创建<img src='/icons/85381de.gif' /><img src='/icons/85381dou.gif' />你就需要使用JAVA中<img src='/icons/85381de.gif' />代理类来达成你<img src='/icons/85381de.gif' />要求<img src='/icons/85381dou2.gif' /><br/><br/>
　　代理类提供在运行时创建类<img src='/icons/85381de.gif' />能力<img src='/icons/85381dou.gif' />这个新建<img src='/icons/85381de.gif' />类能实现你指定<img src='/icons/85381de.gif' />接口<img src='/icons/85381dou2.gif' /> 当然你不能在运行时为要实现<img src='/icons/85381de.gif' />接口中<img src='/icons/85381de.gif' />思路方法定义新代码<img src='/icons/85381dou.gif' />而是提供<img src='/icons/85381yi.gif' />个<img src='/icons/85381diaoyong.gif' />处理器来实现<img src='/icons/85381dou2.gif' /><img src='/icons/85381diaoyong.gif' />处理器是实现了InvocationHandler接口<img src='/icons/85381de.gif' />类<img src='/icons/85381de.gif' />对象<img src='/icons/85381dou.gif' />此接口只有<img src='/icons/85381yi.gif' />个思路方法:<br/><br/>
以下是引用片段:<br/><br/>
Object invoke(Object proxy,Method mtd,Object<img src='/icons/85381zhk2.gif' /> args)&nbsp; <br/><br/>
　　其中proxy是代理对象;mtd是描述思路方法<img src='/icons/85381de.gif' />类<img src='/icons/85381de.gif' />对象<img src='/icons/85381dou.gif' />此对象执行它<img src='/icons/85381de.gif' />invoke(Object obj,Object<img src='/icons/85381zhk2.gif' /> args)思路方法可以<img src='/icons/85381diaoyong.gif' />封装在Mthod对象中<img src='/icons/85381de.gif' />思路方法;args是存储了此思路方法参数<img src='/icons/85381de.gif' /><img src='/icons/85381shuzu.gif' /><img src='/icons/85381dou2.gif' /><br/><br/>
　　建立代理对象:使用Proxy类<img src='/icons/85381de.gif' /><img src='/icons/85381new.gif' />ProxyInstance思路方法<img src='/icons/85381dou.gif' />其格式如下:<br/><br/>
以下是引用片段:<br/><br/>
Object proxy=Proxy.<img src='/icons/85381new.gif' />ProxyInstance(null,<img src='/icons/85381int.gif' />erfaces,handler);&nbsp;<br/><br/>
　　其中第<img src='/icons/85381yi.gif' />个参数是<img src='/icons/85381yi.gif' />个类加载器<img src='/icons/85381dou.gif' />这里使用默认加载器<img src='/icons/85381dou.gif' />用null表示;第 2个参数是<img src='/icons/85381yi.gif' />个Class<img src='/icons/85381de.gif' /><img src='/icons/85381shuzu.gif' /><img src='/icons/85381dou.gif' />其每个元素是<img src='/icons/85381yi.gif' />个接口<img src='/icons/85381dou.gif' />这就是用来指定要实现<img src='/icons/85381de.gif' /><img src='/icons/85381yi.gif' />组接口<img src='/icons/85381dou.gif' />哪怕只有<img src='/icons/85381yi.gif' />个接口也要通过<img src='/icons/85381shuzu.gif' />来传递;第 3个参数就是<img src='/icons/85381diaoyong.gif' />处理器<img src='/icons/85381dou2.gif' /><br/><br/>
　　在代理对象上<img src='/icons/85381diaoyong.gif' />思路方法时<img src='/icons/85381dou.gif' /><img src='/icons/85381diaoyong.gif' />处理器<img src='/icons/85381de.gif' />invoke思路方法会被自动<img src='/icons/85381diaoyong.gif' /><img src='/icons/85381dou.gif' />正在<img src='/icons/85381diaoyong.gif' /><img src='/icons/85381de.gif' />思路方法和参数自动传递给inboke思路方法<img src='/icons/85381de.gif' />jmtdt args形式参数中<img src='/icons/85381dou.gif' />同时也会用args参数<img src='/icons/85381shuzu.gif' />中<img src='/icons/85381de.gif' />参数去<img src='/icons/85381diaoyong.gif' />mtd对象中指定<img src='/icons/85381de.gif' />思路方法<img src='/icons/85381dou2.gif' /><br/><br/>
　　代理<img src='/icons/85381de.gif' />应用:思路方法<img src='/icons/85381diaoyong.gif' />跟踪(把要跟踪<img src='/icons/85381de.gif' />对象包装成代理类对象);为远程<img src='/icons/85381diaoyong.gif' />思路方法提供路由;用户接口事件和动作关联(C#中有类似<img src='/icons/85381de.gif' />功能)<img src='/icons/85381dou2.gif' /><br/><br/>
 <a href="/mypdf/78829.pdf" title="查看 java程序开发:Java程序开发中代理技术的使用思路方法 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78829.html</guid>
		</item>
		<item>
			<title><![CDATA[ie浏览器问题:IE浏览器中一个值得关注的JS问题]]></title>
			<link>http://CrazyCoder.cn/Java/Article78828.html</link>
			<description>
				<![CDATA[

刚才在调试js<img src='/icons/29983dou.gif' />在mozilla中<img src='/icons/29983yi.gif' />切正常<img src='/icons/29983dou.gif' />但是在ie中却报告有configuration变量没有找到<img src='/icons/29983dou2.gif' />以下是代码:<br/><br/>
以下是引用片段:<br/>　　var Environment = <img src='/icons/29983new.gif' /> (function Environment$ctor<img src='/icons/29983kh.gif' /> <br/>　　{ <br/>　　this.processCommandLine = function Env$procCmdLine(q) <br/>　　{ <br/>　　var cmd = configuration 　　 {}; // &lt;---- 就是这<img src='/icons/29983yi.gif' />行报告<img src='/icons/29983cuowu.gif' /> <br/>　　// 其他代码省略 <br/>　　} <br/>　　}; <br/><br/>
　　我先后把这<img src='/icons/29983yi.gif' />行改成如下<img src='/icons/29983de.gif' />形式:<br/><br/>
以下是引用片段:<br/>　　var cmd = configuration <img src='/icons/29983dd.gif' /> null? {}: configuration; <br/>　　var cmd = "un<img src='/icons/29983define.gif' />d" <img src='/icons/29983dd.gif' /> typeof(configuration) ? {}: configuration; <br/>　　var cmd = {}; <img src='/icons/29983if.gif' />( "un<img src='/icons/29983define.gif' />d" <img src='/icons/29983dd.gif' /> typeof(configuration) ) cmd = configuration; <br/>　　都是报告同样<img src='/icons/29983de.gif' />错<img src='/icons/29983dou2.gif' />尝试了多种思路方法没有效果的后<img src='/icons/29983dou.gif' />无奈中把这<img src='/icons/29983yi.gif' />行修改成如下<img src='/icons/29983de.gif' />形式: <br/>　　var cmd = window.configuration 　　 {}; <br/><br/>
<br/>　　竟然通过了!!!<br/><br/>
　　最后分析<img src='/icons/29983dou.gif' />原因就是JScript中实现和标准<img src='/icons/29983de.gif' />ECMAScript有差距<img src='/icons/29983dou.gif' />原来应该configuration找不到<img src='/icons/29983de.gif' />话<img src='/icons/29983dou.gif' />应该往上递推<img src='/icons/29983dou.gif' />扩大作用域搜索范围<img src='/icons/29983dou.gif' />直到搜索到全局变量中<img src='/icons/29983dou2.gif' />很显然<img src='/icons/29983dou.gif' />JScript没有这样做<img src='/icons/29983dou2.gif' /><br/><br/>
　　所以<img src='/icons/29983dou.gif' />以后大家要是遇到Mozilla中好使<img src='/icons/29983dou.gif' />但是IE中莫名其妙地报告变量找不到<img src='/icons/29983de.gif' />话<img src='/icons/29983dou.gif' />尝试<img src='/icons/29983yi.gif' />下加上windows.前缀吧<img src='/icons/29983dou2.gif' /><br/><br/>
 <a href="/mypdf/78828.pdf" title="查看 ie浏览器问题:IE浏览器中一个值得关注的JS问题 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78828.html</guid>
		</item>
		<item>
			<title><![CDATA[安装程序乱码:乱码的处理！程序员永远无法避免的话题]]></title>
			<link>http://CrazyCoder.cn/Java/Article78827.html</link>
			<description>
				<![CDATA[

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为什么说乱码是中国<img src='/icons/10464chengxu.gif' />员无法避免<img src='/icons/10464de.gif' />话题呢?这个首先要从编码机制上说起<img src='/icons/10464dou.gif' />大家都是中文和英文<img src='/icons/10464de.gif' />编码格式不是<img src='/icons/10464yi.gif' />样<img src='/icons/10464dou.gif' />解码也是不<img src='/icons/10464yi.gif' />样<img src='/icons/10464de.gif' />!如果中国<img src='/icons/10464de.gif' /><img src='/icons/10464chengxu.gif' />员不会遇到乱码<img src='/icons/10464dou.gif' />那么只有使用汉语编程<img src='/icons/10464dou2.gif' />汉语编程是如何回事我也不大清楚<img src='/icons/10464dou.gif' />应该是前年吧<img src='/icons/10464dou.gif' />我<img src='/icons/10464yi.gif' />朋友给我介绍汉语编程<img src='/icons/10464dou.gif' />如何不错不错?当时<img src='/icons/10464yinwei.gif' />学习忙没去关注这个<img src='/icons/10464dou.gif' />等我闲了<img src='/icons/10464dou.gif' />那个朋友不弄这个<img src='/icons/10464dou.gif' />问他他也不说不大清楚<img src='/icons/10464dou.gif' />最后自己对这个学习也不了了的了<img src='/icons/10464dou2.gif' /><br/><br/>
　　今天我写这个不是讲解中英文的间<img src='/icons/10464de.gif' />差距<img src='/icons/10464dou.gif' />解码等<img src='/icons/10464dou.gif' />我是将我在这几年工作遇到各种各样<img src='/icons/10464de.gif' />乱码<img src='/icons/10464de.gif' />解决思路方法<img src='/icons/10464dou.gif' />整理总结<img src='/icons/10464yi.gif' />样<img src='/icons/10464dou.gif' />也希望大家能把自己晕倒解决乱码<img src='/icons/10464de.gif' />思路方法都说出来<img src='/icons/10464dou.gif' />咱们弄<img src='/icons/10464yi.gif' />个解决乱码<img src='/icons/10464de.gif' />“葵花宝典”<img src='/icons/10464dou2.gif' /><br/><br/>
　　对于Java由于默认<img src='/icons/10464de.gif' />编码方式是 UNICODE,所以用中文也易出问题,常见<img src='/icons/10464de.gif' />解决是<br/><br/>
　　String s2 = <img src='/icons/10464new.gif' /> String(s1.getBytes(“ISO-8859-1”),”GBK”);<br/><br/>
　　1、utf8解决JSP中文乱码问题<br/><br/>
　　<img src='/icons/10464yi.gif' />般说来在每个页面<img src='/icons/10464de.gif' />开始处<img src='/icons/10464dou.gif' />加入:<br/><br/>
以下是引用片段:<br/>&lt;%@ page language="java" contentType="text/html; char<img src='/icons/10464set.gif' />=UTF-8"&nbsp; <br/>pageEncoding="UTF-8"%&gt;&nbsp; <br/>&lt;%&nbsp; <br/>request.<img src='/icons/10464set.gif' />CharacterEncoding("UTF-8");&nbsp; <br/>%&gt;&nbsp; <br/><br/>
　　char<img src='/icons/10464set.gif' />=UTF-8 <img src='/icons/10464de.gif' />作用是指定JSP向客户端输出<img src='/icons/10464de.gif' />编码方式为“UTF-8”<br/><br/>
　　pageEncoding="UTF-8" 为了让JSP引擎能正确地解码含有中文<img src='/icons/10464zifu.gif' /><img src='/icons/10464de.gif' />JSP页面<img src='/icons/10464dou.gif' />这在LINUX中很有效<br/><br/>
　　request.<img src='/icons/10464set.gif' />CharacterEncoding("UTF-8"); 是对请求进行了中文编码<br/><br/>
　　有时<img src='/icons/10464dou.gif' />这样仍不能解决问题<img src='/icons/10464dou.gif' />还需要这样处理<img src='/icons/10464yi.gif' />下:<br/><br/>
　　String msg = request.getParameter("message");<br/><br/>
　　String str=<img src='/icons/10464new.gif' /> String(msg.getBytes("ISO-8859-1"),"UTF-8");<br/><br/>
　　out.pr<img src='/icons/10464int.gif' />ln(st);<br/><br/>
　　2、Tomcat 5.5 中文乱码<br/><br/>
　　1)只要把%TOMCAT安装目录%/ webapps\servlets-examples\WEB-INF\<img src='/icons/10464class.gif' />es\filters\SetCharacterEncodingFilter.<img src='/icons/10464class.gif' />文件拷到你<img src='/icons/10464de.gif' />webapp目录/filters下<img src='/icons/10464dou.gif' />如果没有filters目录<img src='/icons/10464dou.gif' />就创建<img src='/icons/10464yi.gif' />个<img src='/icons/10464dou2.gif' /><br/><br/>
　　2)在你<img src='/icons/10464de.gif' />web.xml里加入如下几行: <br/><br/>
以下是引用片段:<br/>&lt;filter&gt;&nbsp; <br/>&lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt;&nbsp; <br/>&lt;filter-<img src='/icons/10464class.gif' />&gt;filters.SetCharacterEncodingFilter&lt;/filter-<img src='/icons/10464class.gif' />&gt;&nbsp; <br/>&lt;init-param&gt;&nbsp; <br/>&lt;param-name&gt;encoding&lt;/param-name&gt;&nbsp; <br/>&lt;param-value&gt;GBK&lt;/param-value&gt;&nbsp; <br/>&lt;/init-param&gt;&nbsp; <br/>&lt;/filter&gt;&nbsp; <br/>&lt;filter-mapping&gt;&nbsp; <br/>&lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt;&nbsp; <br/>&lt;url-pattern&gt;/*&lt;/url-pattern&gt;&nbsp; <br/>&lt;/filter-mapping&gt;&nbsp; <br/>　　3)完成.<br/><br/>
　　2 get方式<img src='/icons/10464de.gif' />解决办法<br/><br/>
　　1) 打开tomcat<img src='/icons/10464de.gif' />server.xml文件<img src='/icons/10464dou.gif' />找到区块<img src='/icons/10464dou.gif' />加入如下<img src='/icons/10464yi.gif' />行:<br/><br/>
　　URIEncoding=”GBK”<br/><br/>
　　完整<img src='/icons/10464de.gif' />应如下:<br/><br/>
　　 以下是引用片段:<br/>&nbsp;&lt;Connector&nbsp; <br/>port="80" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"&nbsp; <br/>enableLookups="false" redirectPort="8443" acceptCount="100"&nbsp; <br/>debug="0" connectionTimeout="20000"&nbsp; <br/>disableUploadTimeout="true"&nbsp; <br/>URIEncoding="GBK"&nbsp; <br/>/&gt;&nbsp; <br/>　　2)重启tomcat,<img src='/icons/10464yi.gif' />切OK<img src='/icons/10464dou2.gif' /> <br/><br/>
　　3、xmlHttpRequest中文问题<br/><br/>
　　页面jsp用<img src='/icons/10464de.gif' />GBK编码<br/><br/>
　 以下是引用片段:<br/>　代码&nbsp; <br/>&lt;%@ page contentType="text/html; char<img src='/icons/10464set.gif' />=GBK"%&gt; 　　 <br/>javascript部分 <br/>　　代码 <br/>　　 <br/>function addFracasReport<img src='/icons/10464kh.gif' /> {&nbsp; <br/>var url="controler?actionId=0_06_03_01&amp;actionFlag=0010";&nbsp; <br/>var urlmsg="&amp;reportId="+fracasReport1.textReportId.value; //故障报告表编号&nbsp; <br/>var xmlHttp=Common.createXMLHttpRequest<img src='/icons/10464kh.gif' />;&nbsp; <br/>xmlHttp.onreadystatechange = Common.getReadyStateHandler(xmlHttp, eval("turnAnalyPage"));&nbsp; <br/>xmlHttp.open("POST",url,true);&nbsp; <br/>xmlHttp.<img src='/icons/10464set.gif' />RequestHeader( " Content-Type " , " application/x-www-form-urlencoded);&nbsp; <br/>xmlHttp.send(urlmsg);&nbsp; <br/>}&nbsp; <br/>　　后台java中获得<img src='/icons/10464de.gif' />reportId是乱码<img src='/icons/10464dou.gif' />不知道该如何转<img src='/icons/10464dou.gif' />主要是不知道xmlHttp.send(urlmsg);以后是什么编码?在后面用java来转<img src='/icons/10464dou.gif' />试了几种<img src='/icons/10464dou.gif' />都没有成功<img src='/icons/10464dou.gif' />其中有:<br/><br/>
　　 以下是引用片段:<br/>代码 <br/>　　public <img src='/icons/10464static.gif' /> String UTF_8ToGBK(String str) { <br/>　　try { <br/>　　<img src='/icons/10464return.gif' /> <img src='/icons/10464new.gif' /> String(str.getBytes("UTF-8"), "GBK"); <br/>　　} catch (Exception ex) { <br/>　　<img src='/icons/10464return.gif' /> null; <br/>　　} <br/>　　} <br/>　　public <img src='/icons/10464static.gif' /> String UTF8ToGBK(String str) { <br/>　　try { <br/>　　<img src='/icons/10464return.gif' /> <img src='/icons/10464new.gif' /> String(str.getBytes("UTF-16BE"), "GBK"); <br/>　　} catch (Exception ex) { <br/>　　<img src='/icons/10464return.gif' /> null; <br/>　　} <br/>　　} <br/>　　public <img src='/icons/10464static.gif' /> String GBK(String str) { <br/>　　try { <br/>　　<img src='/icons/10464return.gif' /> <img src='/icons/10464new.gif' /> String(str.getBytes("GBK"),"GBK"); <br/>　　} catch (Exception ex) { <br/>　　<img src='/icons/10464return.gif' /> null; <br/>　　} <br/>　　} <br/>　　public <img src='/icons/10464static.gif' /> String getStr(String str) { <br/>　　try { <br/>　　String temp_p = str; <br/>　　String temp = <img src='/icons/10464new.gif' /> String(temp_p.getBytes("ISO8859_1"), "GBK"); <br/>　　temp = sqlStrchop(temp); <br/>　　<img src='/icons/10464return.gif' /> temp; <br/>　　} catch (Exception e) { <br/>　　<img src='/icons/10464return.gif' /> null; <br/>　　} <br/>　　}&nbsp; <br/><br/>
 <a href="/mypdf/78827.pdf" title="查看 安装程序乱码:乱码的处理！程序员永远无法避免的话题 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78827.html</guid>
		</item>
		<item>
			<title><![CDATA[java对象的序列化:Java对象的序列化和反序列化实战]]></title>
			<link>http://CrazyCoder.cn/Java/Article78826.html</link>
			<description>
				<![CDATA[

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当两个进程在进行远程通信时<img src='/icons/55065dou.gif' />彼此可以发送各种类型<img src='/icons/55065de.gif' />数据<img src='/icons/55065dou2.gif' />无论是何种类型<img src='/icons/55065de.gif' />数据<img src='/icons/55065dou.gif' />都会以 2进制序列<img src='/icons/55065de.gif' />形式在网络上传送<img src='/icons/55065dou2.gif' />发送方需要把这个Java对象转换为字节序列<img src='/icons/55065dou.gif' />才能在网络上传送；接收方则需要把字节序列再恢复为Java对象<img src='/icons/55065dou2.gif' /> <br/><br/>
　　把Java对象转换为字节序列<img src='/icons/55065de.gif' />过程称为对象<img src='/icons/55065de.gif' />序列化<img src='/icons/55065dou2.gif' /><br/><br/>
　　把字节序列恢复为Java对象<img src='/icons/55065de.gif' />过程称为对象<img src='/icons/55065de.gif' />反序列化<img src='/icons/55065dou2.gif' /><br/><br/>
　　对象<img src='/icons/55065de.gif' />序列化主要有两种用途:<br/><br/>
　　1) 把对象<img src='/icons/55065de.gif' />字节序列永久地保存到硬盘上<img src='/icons/55065dou.gif' />通常存放在<img src='/icons/55065yi.gif' />个文件中；<br/><br/>
　　2) 在网络上传送对象<img src='/icons/55065de.gif' />字节序列<img src='/icons/55065dou2.gif' /><br/><br/>
　　<img src='/icons/55065yi.gif' />． JDK类库中<img src='/icons/55065de.gif' />序列化API<br/><br/>
　　java.io.ObjectOutputStream代表对象输出流<img src='/icons/55065dou.gif' />它<img src='/icons/55065de.gif' />writeObject(Object obj)思路方法可对参数指定<img src='/icons/55065de.gif' />obj对象进行序列化<img src='/icons/55065dou.gif' />把得到<img src='/icons/55065de.gif' />字节序列写到<img src='/icons/55065yi.gif' />个目标输出流中<img src='/icons/55065dou2.gif' /><br/><br/>
　　java.io.ObjectInputStream代表对象输入流<img src='/icons/55065dou.gif' />它<img src='/icons/55065de.gif' />readObject<img src='/icons/55065kh.gif' />思路方法从<img src='/icons/55065yi.gif' />个源输入流中读取字节序列<img src='/icons/55065dou.gif' />再把它们反序列化为<img src='/icons/55065yi.gif' />个对象<img src='/icons/55065dou.gif' />并将其返回<img src='/icons/55065dou2.gif' />、<br/><br/>
　　只有实现了Serializable和Externalizable接口<img src='/icons/55065de.gif' />类<img src='/icons/55065de.gif' />对象才能被序列化<img src='/icons/55065dou2.gif' />Externalizable接口继承自Serializable接口<img src='/icons/55065dou.gif' />实现Externalizable接口<img src='/icons/55065de.gif' />类完全由自身来控制序列化<img src='/icons/55065de.gif' />行为<img src='/icons/55065dou.gif' />而仅实现Serializable接口<img src='/icons/55065de.gif' />类可以采用默认<img src='/icons/55065de.gif' />序列化方式 <img src='/icons/55065dou2.gif' /><br/><br/>
　　对象序列化包括如下步骤:<br/><br/>
　　1) 创建<img src='/icons/55065yi.gif' />个对象输出流<img src='/icons/55065dou.gif' />它可以包装<img src='/icons/55065yi.gif' />个其他类型<img src='/icons/55065de.gif' />目标输出流<img src='/icons/55065dou.gif' />如文件输出流；<br/><br/>
　　2) 通过对象输出流<img src='/icons/55065de.gif' />writeObject<img src='/icons/55065kh.gif' />思路方法写对象<img src='/icons/55065dou2.gif' /><br/><br/>
　　对象反序列化<img src='/icons/55065de.gif' />步骤如下:<br/><br/>
　　1) 创建<img src='/icons/55065yi.gif' />个对象输入流<img src='/icons/55065dou.gif' />它可以包装<img src='/icons/55065yi.gif' />个其他类型<img src='/icons/55065de.gif' />源输入流<img src='/icons/55065dou.gif' />如文件输入流；<br/><br/>
　　2) 通过对象输入流<img src='/icons/55065de.gif' />readObject<img src='/icons/55065kh.gif' />思路方法读取对象<img src='/icons/55065dou2.gif' /><br/><br/>
　　下面让我们来看<img src='/icons/55065yi.gif' />个对应<img src='/icons/55065de.gif' />例子<img src='/icons/55065dou.gif' />类<img src='/icons/55065de.gif' />内容如下:<br/><br/>
import java.io.*;<br/>import java.util.Date;<br/><br/>
/**<br/>* 对象<img src='/icons/55065de.gif' />序列化和反序列化测试类. <br/>* @author &lt;a href="AmigoXiemailto:xiexingxing1121@126.com"&gt;AmigoXie&lt;/a&gt;<br/>* @version 1.0 <br/>* Creation date: 2007-9-15 - 下午21:45:48<br/>*/<br/><br/>
public <img src='/icons/55065class.gif' /> ObjectSaver {<br/>　/**<br/>　* @param args<br/>　* @author &lt;a href="AmigoXiemailto:xiexingxing1121@126.com"&gt;AmigoXie&lt;/a&gt;<br/>　* Creation date: 2007-9-15 - 下午21:45:37<br/>　*/<br/><br/>
public <img src='/icons/55065static.gif' /> void <img src='/icons/55065main.gif' />(String<img src='/icons/55065zhk2.gif' /> args) throws Exception {<br/>　ObjectOutputStream out = <img src='/icons/55065new.gif' /> ObjectOutputStream<br/>(<img src='/icons/55065new.gif' /> FileOutputStream("D:""objectFile.obj"));<br/><br/>
　//序列化对象<br/><br/>
　Customer customer = <img src='/icons/55065new.gif' /> Customer("阿蜜果", 24);<br/>　out.writeObject("你好!");<br/>　out.writeObject(<img src='/icons/55065new.gif' /> Date<img src='/icons/55065kh.gif' />);<br/>　out.writeObject(customer);<br/>　out.writeInt(123); //写入基本类型数据<br/>　out.close<img src='/icons/55065kh.gif' />;<br/>　//反序列化对象<br/><br/>
　ObjectInputStream in = <img src='/icons/55065new.gif' /> ObjectInputStream<br/>(<img src='/icons/55065new.gif' /> FileInputStream("D:""objectFile.obj"));<br/><br/>
　<img src='/icons/55065System.gif' />.out.pr<img src='/icons/55065int.gif' />ln("obj1=" + (String) in.readObject<img src='/icons/55065kh.gif' />);<br/>　<img src='/icons/55065System.gif' />.out.pr<img src='/icons/55065int.gif' />ln("obj2=" + (Date) in.readObject<img src='/icons/55065kh.gif' />);<br/>　Customer obj3 = (Customer) in.readObject<img src='/icons/55065kh.gif' />;<br/>　<img src='/icons/55065System.gif' />.out.pr<img src='/icons/55065int.gif' />ln("obj3=" + obj3);<br/>　<img src='/icons/55065int.gif' /> obj4 = in.readInt<img src='/icons/55065kh.gif' />;<br/>　<img src='/icons/55065System.gif' />.out.pr<img src='/icons/55065int.gif' />ln("obj4=" + obj4);<br/>　in.close<img src='/icons/55065kh.gif' />;<br/>}<br/>}<br/><br/>
<img src='/icons/55065class.gif' /> Customer implements Serializable {<br/>private String name;<br/>private <img src='/icons/55065int.gif' /> age;<br/>public Customer(String name, <img src='/icons/55065int.gif' /> age) {<br/>this.name = name;<br/>this.age = age;<br/>}<br/><br/>
public String toString<img src='/icons/55065kh.gif' /> {<br/><img src='/icons/55065return.gif' /> "name=" + name + ", age=" + age;<br/>}<br/>} <br/><br/>
　　输出结果如下:<br/><br/>
obj1=你好!<br/><br/>
obj2=Sat Sep 15 22:02:21 CST 2007<br/><br/>
obj3=name=阿蜜果, age=24<br/><br/>
obj4=123 <br/><br/>
　　因此例比较简单<img src='/icons/55065dou.gif' />在此不再详述<img src='/icons/55065dou2.gif' /><br/><br/>
　　 2．实现Serializable接口<br/><br/>
　　ObjectOutputStream只能对Serializable接口<img src='/icons/55065de.gif' />类<img src='/icons/55065de.gif' />对象进行序列化<img src='/icons/55065dou2.gif' />默认情况下<img src='/icons/55065dou.gif' />ObjectOutputStream按照默认方式序列化<img src='/icons/55065dou.gif' />这种序列化方式仅仅对对象<img src='/icons/55065de.gif' />非transient<img src='/icons/55065de.gif' />例子变量进行序列化<img src='/icons/55065dou.gif' />而不会序列化对象<img src='/icons/55065de.gif' />transient<img src='/icons/55065de.gif' />例子变量<img src='/icons/55065dou.gif' />也不会序列化静态变量<img src='/icons/55065dou2.gif' /><br/><br/>
　　当ObjectOutputStream按照默认方式反序列化时<img src='/icons/55065dou.gif' />具有如下特点:<br/><br/>
　　1) 如果在内存中对象所属<img src='/icons/55065de.gif' />类还没有被加载<img src='/icons/55065dou.gif' />那么会先加载并<img src='/icons/55065chushi.gif' />化这个类<img src='/icons/55065dou2.gif' />如果在<img src='/icons/55065class.gif' />path中不存在相应<img src='/icons/55065de.gif' />类文件<img src='/icons/55065dou.gif' />那么会抛出ClassNotFoundException；<br/><br/>
　　2) 在反序列化时不会<img src='/icons/55065diaoyong.gif' />类<img src='/icons/55065de.gif' />任何构造思路方法<img src='/icons/55065dou2.gif' /><br/><br/>
　　如果用户希望控制类<img src='/icons/55065de.gif' />序列化方式<img src='/icons/55065dou.gif' />可以在可序列化类中提供以下形式<img src='/icons/55065de.gif' />writeObject<img src='/icons/55065kh.gif' />和readObject<img src='/icons/55065kh.gif' />思路方法<img src='/icons/55065dou2.gif' /><br/><br/>
private void writeObject(java.io.ObjectOutputStream out) throws IOException<br/><br/>
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException; <br/><br/>
　　当ObjectOutputStream对<img src='/icons/55065yi.gif' />个Customer对象进行序列化时<img src='/icons/55065dou.gif' />如果该对象具有writeObject<img src='/icons/55065kh.gif' />思路方法<img src='/icons/55065dou.gif' />那么就会执行这<img src='/icons/55065yi.gif' />思路方法<img src='/icons/55065dou.gif' />否则就按默认方式序列化<img src='/icons/55065dou2.gif' />在该对象<img src='/icons/55065de.gif' />writeObjectt<img src='/icons/55065kh.gif' />思路方法中<img src='/icons/55065dou.gif' />可以先<img src='/icons/55065diaoyong.gif' />ObjectOutputStream<img src='/icons/55065de.gif' />defaultWriteObject<img src='/icons/55065kh.gif' />思路方法<img src='/icons/55065dou.gif' />使得对象输出流先执行默认<img src='/icons/55065de.gif' />序列化操作<img src='/icons/55065dou2.gif' />同理可得出反序列化<img src='/icons/55065de.gif' />情况<img src='/icons/55065dou.gif' />不过这次是defaultReadObject<img src='/icons/55065kh.gif' />思路方法<img src='/icons/55065dou2.gif' /><br/><br/>
　　有些对象中包含<img src='/icons/55065yi.gif' />些敏感信息<img src='/icons/55065dou.gif' />这些信息不宜对外公开<img src='/icons/55065dou2.gif' />如果按照默认方式对它们序列化<img src='/icons/55065dou.gif' />那么它们<img src='/icons/55065de.gif' />序列化数据在网络上传输时<img src='/icons/55065dou.gif' />可能会被不法份子窃取<img src='/icons/55065dou2.gif' />对于这类信息<img src='/icons/55065dou.gif' />可以对它们进行加密后再序列化<img src='/icons/55065dou.gif' />在反序列化时则需要解密<img src='/icons/55065dou.gif' />再恢复为原来<img src='/icons/55065de.gif' />信息<img src='/icons/55065dou2.gif' /><br/><br/>
　　默认<img src='/icons/55065de.gif' />序列化方式会序列化整个对象图<img src='/icons/55065dou.gif' />这需要递归遍历对象图<img src='/icons/55065dou2.gif' />如果对象图很复杂<img src='/icons/55065dou.gif' />递归遍历操作需要消耗很多<img src='/icons/55065de.gif' />空间和时间<img src='/icons/55065dou.gif' />它<img src='/icons/55065de.gif' />内部数据结构为双向列表<img src='/icons/55065dou2.gif' /><br/><br/>
　　在应用时<img src='/icons/55065dou.gif' />如果对某些成员变量都改为transient类型<img src='/icons/55065dou.gif' />将节省空间和时间<img src='/icons/55065dou.gif' />提高序列化<img src='/icons/55065de.gif' />性能<img src='/icons/55065dou2.gif' /><br/><br/>
　　 3． 实现Externalizable接口<br/><br/>
　　Externalizable接口继承自Serializable接口<img src='/icons/55065dou.gif' />如果<img src='/icons/55065yi.gif' />个类实现了Externalizable接口<img src='/icons/55065dou.gif' />那么将完全由这个类控制自身<img src='/icons/55065de.gif' />序列化行为<img src='/icons/55065dou2.gif' />Externalizable接口声明了两个思路方法:<br/><br/>
public void writeExternal(ObjectOutput out) throws IOException<br/><br/>
public void readExternal(ObjectInput in) throws IOException , ClassNotFoundException <br/><br/>
　　前者负责序列化操作<img src='/icons/55065dou.gif' />后者负责反序列化操作<img src='/icons/55065dou2.gif' /><br/><br/>
　　在对实现了Externalizable接口<img src='/icons/55065de.gif' />类<img src='/icons/55065de.gif' />对象进行反序列化时<img src='/icons/55065dou.gif' />会先<img src='/icons/55065diaoyong.gif' />类<img src='/icons/55065de.gif' />不带参数<img src='/icons/55065de.gif' />构造思路方法<img src='/icons/55065dou.gif' />这是有别于默认反序列方式<img src='/icons/55065de.gif' /><img src='/icons/55065dou2.gif' />如果把类<img src='/icons/55065de.gif' />不带参数<img src='/icons/55065de.gif' />构造思路方法删除<img src='/icons/55065dou.gif' />或者把该构造思路方法<img src='/icons/55065de.gif' />访问权限设置为private、默认或protected级别<img src='/icons/55065dou.gif' />会抛出java.io.InvalidException: no valid constructor异常<img src='/icons/55065dou2.gif' /><br/><br/>
　　 4． 可序列化类<img src='/icons/55065de.gif' />区别版本<img src='/icons/55065de.gif' />序列化兼容性<br/><br/>
　　凡是实现Serializable接口<img src='/icons/55065de.gif' />类都有<img src='/icons/55065yi.gif' />个表示序列化版本标识符<img src='/icons/55065de.gif' />静态变量:<br/><br/>
private <img src='/icons/55065static.gif' /> final long serialVersionUID; <br/><br/>
　　以上serialVersionUID<img src='/icons/55065de.gif' />取值是Java运行时环境根据类<img src='/icons/55065de.gif' />内部细节自动生成<img src='/icons/55065de.gif' /><img src='/icons/55065dou2.gif' />如果对类<img src='/icons/55065de.gif' />源代码作了修改<img src='/icons/55065dou.gif' />再重新编译<img src='/icons/55065dou.gif' />新生成<img src='/icons/55065de.gif' />类文件<img src='/icons/55065de.gif' />serialVersionUID<img src='/icons/55065de.gif' />取值有可能也会发生变化<img src='/icons/55065dou2.gif' /><br/><br/>
　　类<img src='/icons/55065de.gif' />serialVersionUID<img src='/icons/55065de.gif' />默认值完全依赖于Java编译器<img src='/icons/55065de.gif' />实现<img src='/icons/55065dou.gif' />对于同<img src='/icons/55065yi.gif' />个类<img src='/icons/55065dou.gif' />用区别<img src='/icons/55065de.gif' />Java编译器编译<img src='/icons/55065dou.gif' />有可能会导致区别<img src='/icons/55065de.gif' />serialVersionUID<img src='/icons/55065dou.gif' />也有可能相同<img src='/icons/55065dou2.gif' />为了提高哦啊serialVersionUID<img src='/icons/55065de.gif' />独立性和确定性<img src='/icons/55065dou.gif' />强烈建议在<img src='/icons/55065yi.gif' />个可序列化类中显示<img src='/icons/55065de.gif' />定义serialVersionUID<img src='/icons/55065dou.gif' />为它赋予明确<img src='/icons/55065de.gif' />值<img src='/icons/55065dou2.gif' />显式地定义serialVersionUID有两种用途:<br/><br/>
　　1) 在某些场合<img src='/icons/55065dou.gif' />希望类<img src='/icons/55065de.gif' />区别版本对序列化兼容<img src='/icons/55065dou.gif' />因此需要确保类<img src='/icons/55065de.gif' />区别版本具有相同<img src='/icons/55065de.gif' />serialVersionUID；<br/><br/>
　　2) 在某些场合<img src='/icons/55065dou.gif' />不希望类<img src='/icons/55065de.gif' />区别版本对序列化兼容<img src='/icons/55065dou.gif' />因此需要确保类<img src='/icons/55065de.gif' />区别版本具有区别<img src='/icons/55065de.gif' />serialVersionUID<img src='/icons/55065dou2.gif' /><br/><br/>
 <a href="/mypdf/78826.pdf" title="查看 java对象的序列化:Java对象的序列化和反序列化实战 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78826.html</guid>
		</item>
		<item>
			<title><![CDATA[apache内部重定向:java内部重定向死循环检测详解]]></title>
			<link>http://CrazyCoder.cn/Java/Article78825.html</link>
			<description>
				<![CDATA[

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最近听到<img src='/icons/63785yi.gif' />个消息<img src='/icons/63785dou.gif' />据说腾讯<img src='/icons/63785de.gif' />财付通在招聘 Java 方面<img src='/icons/63785de.gif' />高手<img src='/icons/63785dou.gif' />"参和系统架构选型"<img src='/icons/63785dou.gif' />要把底层架构从 C/C<img src='/icons/63785jiajia.gif' /> 迁移到 Java 架构上来<img src='/icons/63785dou2.gif' />其实当你<img src='/icons/63785de.gif' />项目到<img src='/icons/63785yi.gif' />定规模的后更多需要考虑<img src='/icons/63785de.gif' />是多人协作开发<img src='/icons/63785de.gif' />问题<img src='/icons/63785dou.gif' />可能当初财付通<img src='/icons/63785de.gif' />核心代码也就是<img src='/icons/63785yi.gif' />两个人用C/C<img src='/icons/63785jiajia.gif' />搞定<img src='/icons/63785de.gif' /><img src='/icons/63785dou.gif' />可是当业务扩大、复杂的后<img src='/icons/63785dou.gif' />发现多人C/C<img src='/icons/63785jiajia.gif' />来并行发开变<img src='/icons/63785de.gif' />不是那么靠谱<img src='/icons/63785dou2.gif' />于是乎java这种近乎工业标准<img src='/icons/63785de.gif' />东西出来了<img src='/icons/63785dou2.gif' /><img src='/icons/63785dou2.gif' /><img src='/icons/63785dou2.gif' />有点扯远了<img src='/icons/63785dou2.gif' />引出我们今天<img src='/icons/63785de.gif' />话题<img src='/icons/63785dou.gif' />java多人并行开发是很出色<img src='/icons/63785dou.gif' />但是只要是并行<img src='/icons/63785de.gif' />那么就会存在<img src='/icons/63785yi.gif' />些问题<img src='/icons/63785dou2.gif' /><br/><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比如:A<img src='/icons/63785chengxu.gif' />员在A页面写了以个逻辑<img src='/icons/63785dou.gif' />当逻辑判断满足就内部重定向到B<img src='/icons/63785chengxu.gif' />员写<img src='/icons/63785de.gif' />B页面<img src='/icons/63785dou.gif' />但是刚好B<img src='/icons/63785chengxu.gif' />员在B页面中<img src='/icons/63785de.gif' />逻辑是满足某些条件就跳转到A页面<img src='/icons/63785dou.gif' />于是乎当某些特定条件下<img src='/icons/63785dou.gif' />两个页面就在不停<img src='/icons/63785de.gif' />重定向<img src='/icons/63785yi.gif' />直到jvm<img src='/icons/63785de.gif' />溢出<img src='/icons/63785dou2.gif' /><br/><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 平时我们遇到这种问题可能找<img src='/icons/63785yi.gif' />会就找到了<img src='/icons/63785dou.gif' />也基本上没有什么影响<img src='/icons/63785dou2.gif' />但是在<img src='/icons/63785yi.gif' />个成熟<img src='/icons/63785de.gif' />业务系统中遇到这样<img src='/icons/63785de.gif' />问题就是致命<img src='/icons/63785de.gif' /><img src='/icons/63785dou2.gif' />可能会导致服务器挂掉<img src='/icons/63785dou2.gif' /><img src='/icons/63785dou2.gif' />或者整个集群<img src='/icons/63785de.gif' />连锁反应(集体挂掉)<img src='/icons/63785dou2.gif' />当然你<img src='/icons/63785de.gif' />用户也就访问不到你<img src='/icons/63785de.gif' />站点了<img src='/icons/63785dou.gif' />在工业标准中我们考虑更多<img src='/icons/63785de.gif' />就是如何让系统更稳定<img src='/icons/63785dou2.gif' />比如:淘宝<img src='/icons/63785yi.gif' />天都宕机了<img src='/icons/63785dou.gif' />该有多少商家要发疯<img src='/icons/63785dou2.gif' /><br/><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 再次进入正题<img src='/icons/63785dou.gif' />如何来解决这种问题保证系统<img src='/icons/63785de.gif' />绝对稳定呢？很简单<img src='/icons/63785yi.gif' />个fielter就搞定了<br/><br/>
view plaincopy to clipboardpr<img src='/icons/63785int.gif' />?<br/>package org.fielter.test;&nbsp;&nbsp; <br/>&nbsp; <br/>import java.io.IOException;&nbsp;&nbsp; <br/>import java.util.ArrayList;&nbsp;&nbsp; <br/>import java.util.List;&nbsp;&nbsp; <br/>&nbsp; <br/>import javax.servlet.Filter;&nbsp;&nbsp; <br/>import javax.servlet.FilterChain;&nbsp;&nbsp; <br/>import javax.servlet.FilterConfig;&nbsp;&nbsp; <br/>import javax.servlet.ServletException;&nbsp;&nbsp; <br/>import javax.servlet.ServletRequest;&nbsp;&nbsp; <br/>import javax.servlet.ServletResponse;&nbsp;&nbsp; <br/>import javax.servlet.http.HttpServletRequest;&nbsp;&nbsp; <br/>&nbsp; <br/>/**&nbsp; <br/>&nbsp;* 过滤形成环路<img src='/icons/63785de.gif' />fielter &lt;p&gt;&nbsp; <br/>&nbsp;*&nbsp;&nbsp; <br/>&nbsp;* @author yuezhen&nbsp; <br/>&nbsp;*/&nbsp; <br/>public <img src='/icons/63785class.gif' /> CircleFilter implements Filter {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; public void init(FilterConfig filterConfig) throws ServletException {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; public void doFilter(ServletRequest request, ServletResponse response,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FilterChain filterChain) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean circle=false;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletRequest req = (HttpServletRequest) request;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;String&gt; list =<img src='/icons/63785new.gif' /> ArrayList&lt;String&gt;<img src='/icons/63785kh.gif' />;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 从request中取出list&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src='/icons/63785if.gif' />(req.getAttribute("circle.finder.forward.list")!=null){&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list=(List&lt;String&gt;)req.getAttribute("circle.finder.forward.list");&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<img src='/icons/63785else.gif' />{&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //list为null表明是初次<img src='/icons/63785de.gif' />请求<img src='/icons/63785dou.gif' />获取原始<img src='/icons/63785de.gif' />请求来源 <img src='/icons/63785dou.gif' />并放入list&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.add((String)req.getAttribute("javax.servlet.forward.request_uri"));&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果原始请求地址和需要跳转<img src='/icons/63785de.gif' />地址<img src='/icons/63785yi.gif' />致<img src='/icons/63785dou.gif' />抛出异常&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src='/icons/63785if.gif' />(list.contains(req.getRequestURI<img src='/icons/63785kh.gif' />)){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; circle=true;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br/>&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 将本次需要forward<img src='/icons/63785de.gif' />路径放入list<img src='/icons/63785dou.gif' />并保存&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.add(req.getRequestURI<img src='/icons/63785kh.gif' />);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; req.<img src='/icons/63785set.gif' />Attribute("circle.finder.forward.list", list);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 用<img src='/icons/63785System.gif' />.out来代替log&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src='/icons/63785System.gif' />.out.pr<img src='/icons/63785int.gif' />ln("");&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src='/icons/63785System.gif' />.out.pr<img src='/icons/63785int.gif' />ln("[info] <img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' />=");&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src='/icons/63785System.gif' />.out.pr<img src='/icons/63785int.gif' />ln("[info] "+list);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src='/icons/63785System.gif' />.out.pr<img src='/icons/63785int.gif' />ln("[info] <img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' />=");&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src='/icons/63785if.gif' />(circle){&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src='/icons/63785System.gif' />.out.pr<img src='/icons/63785int.gif' />ln("[error] find circle");&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 清空list&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.clear<img src='/icons/63785kh.gif' />;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; req.removeAttribute("circle.finder.forward.list");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 可以选择抛出异常<img src='/icons/63785dou.gif' />或者用其他<img src='/icons/63785de.gif' />处理方式&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw <img src='/icons/63785new.gif' /> Exception<img src='/icons/63785kh.gif' />;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filterChain.doFilter(request, response);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(Exception e){&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 发现了重定向<img src='/icons/63785de.gif' />死循环<img src='/icons/63785de.gif' />后续处理&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 页面显示发现死循环&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.getOutputStream<img src='/icons/63785kh.gif' />.pr<img src='/icons/63785int.gif' />("has circle");&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException e1) {&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e1.pr<img src='/icons/63785int.gif' />StackTrace<img src='/icons/63785kh.gif' />;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; public void destroy<img src='/icons/63785kh.gif' /> {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>}&nbsp; <br/>package org.fielter.test;<br/><br/>
import java.io.IOException;<br/>import java.util.ArrayList;<br/>import java.util.List;<br/><br/>
import javax.servlet.Filter;<br/>import javax.servlet.FilterChain;<br/>import javax.servlet.FilterConfig;<br/>import javax.servlet.ServletException;<br/>import javax.servlet.ServletRequest;<br/>import javax.servlet.ServletResponse;<br/>import javax.servlet.http.HttpServletRequest;<br/><br/>
/**<br/>&nbsp;* 过滤形成环路<img src='/icons/63785de.gif' />fielter &lt;p&gt;<br/>&nbsp;* <br/>&nbsp;* @author yuezhen<br/>&nbsp;*/<br/>public <img src='/icons/63785class.gif' /> CircleFilter implements Filter {&nbsp;<br/>&nbsp;&nbsp;&nbsp; public void init(FilterConfig filterConfig) throws ServletException {&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; &nbsp;<br/>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br/>&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; public void doFilter(ServletRequest request, ServletResponse response,&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FilterChain filterChain) {&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; &nbsp;try{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;boolean circle=false;<br/>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;HttpServletRequest req = (HttpServletRequest) request;<br/>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;List&lt;String&gt; list =<img src='/icons/63785new.gif' /> ArrayList&lt;String&gt;<img src='/icons/63785kh.gif' />;<br/>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;// 从request中取出list<br/>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<img src='/icons/63785if.gif' />(req.getAttribute("circle.finder.forward.list")!=null){<br/>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;list=(List&lt;String&gt;)req.getAttribute("circle.finder.forward.list");<br/>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;}<img src='/icons/63785else.gif' />{<br/>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;//list为null表明是初次<img src='/icons/63785de.gif' />请求<img src='/icons/63785dou.gif' />获取原始<img src='/icons/63785de.gif' />请求来源 <img src='/icons/63785dou.gif' />并放入list<br/>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;list.add((String)req.getAttribute("javax.servlet.forward.request_uri"));<br/>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果原始请求地址和需要跳转<img src='/icons/63785de.gif' />地址<img src='/icons/63785yi.gif' />致<img src='/icons/63785dou.gif' />抛出异常<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src='/icons/63785if.gif' />(list.contains(req.getRequestURI<img src='/icons/63785kh.gif' />)){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;circle=true;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 将本次需要forward<img src='/icons/63785de.gif' />路径放入list<img src='/icons/63785dou.gif' />并保存<br/>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;list.add(req.getRequestURI<img src='/icons/63785kh.gif' />);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;req.<img src='/icons/63785set.gif' />Attribute("circle.finder.forward.list", list);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 用<img src='/icons/63785System.gif' />.out来代替log<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src='/icons/63785System.gif' />.out.pr<img src='/icons/63785int.gif' />ln("");<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src='/icons/63785System.gif' />.out.pr<img src='/icons/63785int.gif' />ln("[info] <img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' />=");<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src='/icons/63785System.gif' />.out.pr<img src='/icons/63785int.gif' />ln("[info] "+list);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src='/icons/63785System.gif' />.out.pr<img src='/icons/63785int.gif' />ln("[info] <img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' /><img src='/icons/63785dd.gif' />=");<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src='/icons/63785if.gif' />(circle){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<img src='/icons/63785System.gif' />.out.pr<img src='/icons/63785int.gif' />ln("[error] find circle");<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;// 清空list<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;list.clear<img src='/icons/63785kh.gif' />;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;req.removeAttribute("circle.finder.forward.list");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;// 可以选择抛出异常<img src='/icons/63785dou.gif' />或者用其他<img src='/icons/63785de.gif' />处理方式<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;throw <img src='/icons/63785new.gif' /> Exception<img src='/icons/63785kh.gif' />;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;filterChain.doFilter(request, response);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp; &nbsp;}catch(Exception e){<br/>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;// 发现了重定向<img src='/icons/63785de.gif' />死循环<img src='/icons/63785de.gif' />后续处理<br/>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;try {<br/>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;// 页面显示发现死循环<br/>&nbsp;&nbsp;&nbsp;&nbsp;response.getOutputStream<img src='/icons/63785kh.gif' />.pr<img src='/icons/63785int.gif' />("has circle");<br/>&nbsp;&nbsp;&nbsp;} catch (IOException e1) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;e1.pr<img src='/icons/63785int.gif' />StackTrace<img src='/icons/63785kh.gif' />;<br/>&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp; &nbsp;}<br/>&nbsp;&nbsp;&nbsp; &nbsp;<br/>&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; public void destroy<img src='/icons/63785kh.gif' /> {&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br/>}<br/>&nbsp;<br/><br/>
上面这个fielter会检测请求<img src='/icons/63785de.gif' />原始来源地址<img src='/icons/63785dou.gif' />然后判断和当前需要跳转<img src='/icons/63785de.gif' />地址是否<img src='/icons/63785yi.gif' />致<img src='/icons/63785dou.gif' />如果<img src='/icons/63785yi.gif' />致那么肯定会形成以个环路<img src='/icons/63785dou.gif' />于是jvm就在不停执行跳转<img src='/icons/63785yi.gif' />直到堆栈溢出<img src='/icons/63785dou2.gif' /><br/><br/>
对fielter进行了改进<img src='/icons/63785dou.gif' />用<img src='/icons/63785yi.gif' />个list来记录了forward<img src='/icons/63785de.gif' />跳转路径<img src='/icons/63785dou.gif' />方便在页面显示出形成环路<img src='/icons/63785de.gif' />过程<br/><br/>
当我们检测到这种环路<img src='/icons/63785dou.gif' />我们就可以抛出异常<img src='/icons/63785dou.gif' />定义统<img src='/icons/63785yi.gif' /><img src='/icons/63785de.gif' /><img src='/icons/63785cuowu.gif' />页面<img src='/icons/63785dou2.gif' /><img src='/icons/63785dou2.gif' /><img src='/icons/63785dou2.gif' /><img src='/icons/63785dou2.gif' />等等来友好<img src='/icons/63785de.gif' />解决的<img src='/icons/63785dou2.gif' /><img src='/icons/63785dou2.gif' /><img src='/icons/63785dou2.gif' /><br/><br/>
如下fielter<img src='/icons/63785de.gif' />配置就可以看到<img src='/icons/63785dou.gif' />我们过滤了所有forward跳转<img src='/icons/63785de.gif' />请求<br/><br/>
view plaincopy to clipboardpr<img src='/icons/63785int.gif' />?<br/>&lt;filter&gt;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;CircleFilter&lt;/filter-name&gt;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-<img src='/icons/63785class.gif' />&gt;org.fielter.test.CircleFilter&lt;/filter-<img src='/icons/63785class.gif' />&gt;&nbsp; <br/>&nbsp;&nbsp;&nbsp; &lt;/filter&gt;&nbsp; <br/>&nbsp;&nbsp;&nbsp; &lt;filter-mapping&gt;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;CircleFilter&lt;/filter-name&gt;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;dispatcher&gt;FORWARD&lt;/dispatcher&gt;&nbsp; <br/>&nbsp;&nbsp;&nbsp; &lt;/filter-mapping&gt;&nbsp;&nbsp; <br/>&lt;filter&gt;<br/>&nbsp;&nbsp;&lt;filter-name&gt;CircleFilter&lt;/filter-name&gt;<br/>&nbsp;&nbsp;&lt;filter-<img src='/icons/63785class.gif' />&gt;org.fielter.test.CircleFilter&lt;/filter-<img src='/icons/63785class.gif' />&gt;<br/>&nbsp;&lt;/filter&gt;<br/>&nbsp;&lt;filter-mapping&gt;<br/>&nbsp;&nbsp;&lt;filter-name&gt;CircleFilter&lt;/filter-name&gt;<br/>&nbsp;&nbsp;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br/>&nbsp;&nbsp;&lt;dispatcher&gt;FORWARD&lt;/dispatcher&gt;<br/>&nbsp;&lt;/filter-mapping&gt;&nbsp; <br/><br/>
如果有其他需求<img src='/icons/63785dou.gif' />类似<img src='/icons/63785de.gif' />配置就OK了<br/><br/>
由于没有图片<img src='/icons/63785dou.gif' />只好上文字了<img src='/icons/63785dou.gif' />如果出现环<img src='/icons/63785dou.gif' />就会在页面显示<img src='/icons/63785dou.gif' />可以下个例子自己看效果<br/><br/>
has circle,the cytle is : [/fielter/index.htm, /fielter/test2.htm, /fielter/test.htm, /fielter/test2.htm]<br/><br/>
接下来附带<img src='/icons/63785yi.gif' />个maven搭<img src='/icons/63785de.gif' />测试列子<img src='/icons/63785dou.gif' />直接mvn jetty:run<img src='/icons/63785dou.gif' />然后再浏览器中http://localhost:8080/fielter/index.htm&nbsp; 就可以看到拦截<img src='/icons/63785de.gif' />效果了<br/><br/>
 <a href="/mypdf/78825.pdf" title="查看 apache内部重定向:java内部重定向死循环检测详解 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78825.html</guid>
		</item>
		<item>
			<title><![CDATA[java中异常处理机制:Java编程中异常处理的优劣的道]]></title>
			<link>http://CrazyCoder.cn/Java/Article78824.html</link>
			<description>
				<![CDATA[

Java编程中<img src='/icons/44267de.gif' />异常处理是<img src='/icons/44267yi.gif' />个很常见<img src='/icons/44267de.gif' />话题了<img src='/icons/44267dou.gif' />几乎任何<img src='/icons/44267yi.gif' />门介绍性<img src='/icons/44267de.gif' />Java课程都会提到异常处理<img src='/icons/44267dou2.gif' />不过<img src='/icons/44267dou.gif' />我认为很多人其实并没有真正掌握正确处理异常情况<img src='/icons/44267de.gif' />思路方法和策略<img src='/icons/44267dou.gif' />最多也就不过了解个大概<img src='/icons/44267dou.gif' />知道点概念<img src='/icons/44267dou2.gif' />本文就对 3种区别程度和质量<img src='/icons/44267de.gif' />Java异常处理进行了讨论<img src='/icons/44267dou.gif' />所阐述<img src='/icons/44267de.gif' />处理异常<img src='/icons/44267de.gif' />方式按手法<img src='/icons/44267de.gif' />高下分为: <br/>　　好<img src='/icons/44267dou.gif' />不好和恶劣 3种<img src='/icons/44267dou2.gif' /><br/><br/>
　　同时向你提供了<img src='/icons/44267yi.gif' />些解决这些问题<img src='/icons/44267de.gif' />窍门技巧<img src='/icons/44267dou2.gif' /> <br/><br/>
　　首先解释<img src='/icons/44267yi.gif' />些java异常处理中必须搞清楚<img src='/icons/44267de.gif' />定义和机制<img src='/icons/44267dou2.gif' />Java语言规范标准将自Error类或RuntimeException类衍生出来<img src='/icons/44267de.gif' />任何违例都称作“不可检查”(Unchecked)异常;其他所有异常则称作“可检查”(Checked)异常<img src='/icons/44267dou2.gif' /> <br/><br/>
　　所谓可检查异常<img src='/icons/44267dou.gif' />是指我们应该自行处理<img src='/icons/44267de.gif' />异常<img src='/icons/44267dou2.gif' />至于处理<img src='/icons/44267de.gif' />手段<img src='/icons/44267dou.gif' />要么加以控制(try catch)<img src='/icons/44267dou.gif' />要么通告(throws)他们有可能产生<img src='/icons/44267dou2.gif' />通常<img src='/icons/44267dou.gif' />应捕捉那些已知如何处理<img src='/icons/44267de.gif' />异常<img src='/icons/44267dou.gif' />而通告那些不知如何处理<img src='/icons/44267de.gif' />异常<img src='/icons/44267dou2.gif' /> <br/><br/>
　　而对那些不可检查异常来说<img src='/icons/44267dou.gif' />他们要么在我们<img src='/icons/44267de.gif' />控制的外(Error),要么是我们首先就不该允许<img src='/icons/44267de.gif' />情况(RuntimeException). <br/><br/>
　　至于异常<img src='/icons/44267de.gif' />指定<img src='/icons/44267dou.gif' />Java<img src='/icons/44267de.gif' />规则非常简单:<img src='/icons/44267yi.gif' />个思路方法必须通告自己可能产生<img src='/icons/44267de.gif' />所有可检查异常<img src='/icons/44267dou2.gif' />编写自己<img src='/icons/44267de.gif' />思路方法时<img src='/icons/44267dou.gif' />并不<img src='/icons/44267yi.gif' />定要通告出思路方法实际可能产生<img src='/icons/44267de.gif' />每<img src='/icons/44267yi.gif' />个异常对象<img src='/icons/44267dou.gif' />要想理解什么时候必须要思路方法<img src='/icons/44267de.gif' />throws丛句来通告异常<img src='/icons/44267dou.gif' />就必须知道对<img src='/icons/44267yi.gif' />个异常来说<img src='/icons/44267dou.gif' />他只有可能在下面 4种情况下才会产生: <br/><br/>
　　1．<img src='/icons/44267diaoyong.gif' />了可能产生异常<img src='/icons/44267de.gif' />思路方法<img src='/icons/44267dou2.gif' />比如BufferedReader类<img src='/icons/44267de.gif' />readLine思路方法<img src='/icons/44267dou2.gif' />该思路方法通告java.io.IOException异常 <br/><br/>
　　2．侦测到<img src='/icons/44267yi.gif' />个<img src='/icons/44267cuowu.gif' /><img src='/icons/44267dou.gif' />并用throw语句产生异常<img src='/icons/44267dou2.gif' /> <br/><br/>
　　3．出现<img src='/icons/44267yi.gif' />个编程<img src='/icons/44267cuowu.gif' /><img src='/icons/44267dou2.gif' />比如a[-1] = 0<img src='/icons/44267dou2.gif' /> <br/><br/>
　　4．Java产生内部<img src='/icons/44267cuowu.gif' /><img src='/icons/44267dou2.gif' /> <br/><br/>
　　如果出现头两种情况的<img src='/icons/44267yi.gif' /><img src='/icons/44267dou.gif' />必须告诉打算使用自己思路方法<img src='/icons/44267de.gif' />人:假如使用这个思路方法<img src='/icons/44267dou.gif' />可能造成<img src='/icons/44267yi.gif' />个异常<img src='/icons/44267de.gif' />产生(即在思路方法头上使用throws)<img src='/icons/44267dou.gif' /><img src='/icons/44267yi.gif' />个简单<img src='/icons/44267de.gif' />记忆思路方法: <br/><br/>
　 　只要含有throw,就要通告throws<img src='/icons/44267dou2.gif' />如果<img src='/icons/44267yi.gif' />个思路方法必须同时处理多个异常<img src='/icons/44267dou.gif' />就必须在头内指出所有异常<img src='/icons/44267dou2.gif' />就像下例展示<img src='/icons/44267de.gif' />那样<img src='/icons/44267dou.gif' />用逗号对他们进行分割: <br/><br/>
<img src='/icons/44267class.gif' /> Animation&nbsp; <br/>{ <br/>　　public Image loadImage(Str<img src='/icons/44267int.gif' /> s)&nbsp; throws EOFException,MalformedURLException&nbsp; <br/>　　{ <br/>　　　………… <br/>　　} <br/>} <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/><br/>
　　然而<img src='/icons/44267dou.gif' />我们不需要通告内部java<img src='/icons/44267cuowu.gif' /><img src='/icons/44267dou.gif' />也不应该通告自RuntimeException衍生出来<img src='/icons/44267de.gif' />异常<img src='/icons/44267dou2.gif' /> <br/><br/>
　　好<img src='/icons/44267de.gif' />异常处理 <br/><br/>
　　好异常处理提供了处理<img src='/icons/44267chengxu.gif' /><img src='/icons/44267cuowu.gif' /><img src='/icons/44267de.gif' />统<img src='/icons/44267yi.gif' />机制<img src='/icons/44267dou2.gif' />事实上<img src='/icons/44267dou.gif' />Java语言通过向<img src='/icons/44267diaoyong.gif' />者提出异常警告<img src='/icons/44267de.gif' />方式而显著地提升了软件Software开发中<img src='/icons/44267de.gif' />异常处理能力<img src='/icons/44267dou2.gif' />这种方式把Java语言中<img src='/icons/44267de.gif' />“思路方法(method)”进行了扩展和增强<img src='/icons/44267dou.gif' />使的包括了自身<img src='/icons/44267de.gif' /><img src='/icons/44267cuowu.gif' />条件<img src='/icons/44267dou2.gif' />下面就让我们看<img src='/icons/44267yi.gif' />个例子<img src='/icons/44267dou.gif' />这个例子介绍说明了这种情况<img src='/icons/44267dou2.gif' /> <br/><br/>
　　以下是FileInputStream构造器的<img src='/icons/44267yi.gif' /><img src='/icons/44267de.gif' />原型: <br/><br/>
public FileInputStream(String name) throws FileNotFoundException Java <br/><br/>
　　<img src='/icons/44267de.gif' />思路方法和构造器必须声明他们在被<img src='/icons/44267diaoyong.gif' />时可能“扔出”<img src='/icons/44267de.gif' />异常<img src='/icons/44267dou.gif' />采用<img src='/icons/44267de.gif' />关键字就是“throws”<img src='/icons/44267dou2.gif' />这种在思路方法原型中出现<img src='/icons/44267de.gif' />异常提示增加了编程<img src='/icons/44267de.gif' />可靠性<img src='/icons/44267dou2.gif' /> <br/><br/>
　　显而易见<img src='/icons/44267dou.gif' />这种方式是向思路方法<img src='/icons/44267de.gif' /><img src='/icons/44267diaoyong.gif' />者提示了可能出现<img src='/icons/44267de.gif' />异常条件<img src='/icons/44267dou.gif' />这样<img src='/icons/44267diaoyong.gif' />者就可以对这些异常作出适当<img src='/icons/44267de.gif' />相应处理<img src='/icons/44267dou2.gif' />以下代码示意我们是如何捕获并且处理FileNotFoundException 这<img src='/icons/44267yi.gif' />异常<img src='/icons/44267de.gif' />: <br/><br/>
try&nbsp; <br/>{&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; FileInputStream fis = <img src='/icons/44267new.gif' /> FileInputStream(args[0]);&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; // other code here ...&nbsp;&nbsp; <br/>}&nbsp; <br/>catch (FileNotFoundException fnfe)&nbsp; <br/>{&nbsp; <br/>&nbsp;&nbsp;&nbsp; <img src='/icons/44267System.gif' />.out.pr<img src='/icons/44267int.gif' />ln("File: " + args[0] + " not found. Aborting.");&nbsp; <br/>&nbsp;&nbsp;&nbsp; <img src='/icons/44267System.gif' />.exit(1);&nbsp; <br/>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/><br/>
　　Java异常处理还有其他<img src='/icons/44267yi.gif' />些优秀<img src='/icons/44267de.gif' />特性<img src='/icons/44267dou.gif' />这就是可检查异常、用户定义异常和在JDK 1.4中推出<img src='/icons/44267de.gif' />新型Java记录API(Java Logging API)<img src='/icons/44267dou2.gif' />java.lang.Exception<img src='/icons/44267de.gif' />所有子类都属于可检查异常<img src='/icons/44267dou2.gif' />可检查异常(checked exception)是扔出该异常<img src='/icons/44267de.gif' />思路方法所必须提示<img src='/icons/44267de.gif' />异常<img src='/icons/44267dou.gif' />这种异常必须被捕获或者向<img src='/icons/44267diaoyong.gif' />者提示<img src='/icons/44267dou2.gif' />用户定义异常(User-<img src='/icons/44267define.gif' />d exceptions)是定制<img src='/icons/44267de.gif' />异常类<img src='/icons/44267dou.gif' />这种异常类扩展了java.lang.Exception类<img src='/icons/44267dou2.gif' />优良<img src='/icons/44267de.gif' />Java<img src='/icons/44267chengxu.gif' />规定定制异常封装、报告和处理他们自己独有<img src='/icons/44267de.gif' />情况<img src='/icons/44267dou2.gif' />最新<img src='/icons/44267de.gif' />Java记录API(logging API)则可以集中记录异常<img src='/icons/44267dou2.gif' /><br/><br/>
 <a href="/mypdf/78824.pdf" title="查看 java中异常处理机制:Java编程中异常处理的优劣的道 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78824.html</guid>
		</item>
		<item>
			<title><![CDATA[开源协议:Java程序员需要了解的几个开源协议]]></title>
			<link>http://CrazyCoder.cn/Java/Article78823.html</link>
			<description>
				<![CDATA[

今天工作<img src='/icons/24749de.gif' />任务要写<img src='/icons/24749yi.gif' />些跟开源协议相关<img src='/icons/24749de.gif' />约定介绍说明<img src='/icons/24749dou.gif' />所以在网上搜索了<img src='/icons/24749yi.gif' />些资料以供参考<img src='/icons/24749dou.gif' />下面列出了几个比较常见<img src='/icons/24749de.gif' />开源协议<img src='/icons/24749dou.gif' />如果想要了解其他<img src='/icons/24749de.gif' />协议和详细了解这些协议<img src='/icons/24749dou.gif' />我个人推荐这个网址:http://www.opensource.org/licenses/<br/><br/>
　　Mozilla Public License<br/><br/>
　　MPL License<img src='/icons/24749dou.gif' />允许免费重发布、免费修改<img src='/icons/24749dou.gif' />但要求修改后<img src='/icons/24749de.gif' />代码版权归软件Software<img src='/icons/24749de.gif' />发起者<img src='/icons/24749dou2.gif' />这种授权维护了商业软件Software<img src='/icons/24749de.gif' />利益<img src='/icons/24749dou.gif' /><img src='/icons/24749dou.gif' />它要求基于这种软件Software得修改无偿贡献版权给该软件Software<img src='/icons/24749dou2.gif' />这样<img src='/icons/24749dou.gif' />围绕该软件Software得所有代码得版权都集中在发起开发人得手中<img src='/icons/24749dou2.gif' />但MPL是允许修改<img src='/icons/24749dou.gif' />无偿使用得<img src='/icons/24749dou2.gif' />MPL软件Software对链接没有要求<img src='/icons/24749dou2.gif' /><br/><br/>
　　BSD开源协议<br/><br/>
　　BSD开源协议是<img src='/icons/24749yi.gif' />个给于使用者很大自由<img src='/icons/24749de.gif' />协议<img src='/icons/24749dou2.gif' />可以自由<img src='/icons/24749de.gif' />使用<img src='/icons/24749dou.gif' />修改源代码<img src='/icons/24749dou.gif' />也可以将修改后<img src='/icons/24749de.gif' />代码作为开源或者专有软件Software再发布<img src='/icons/24749dou2.gif' /> 当你发布使用了BSD协议<img src='/icons/24749de.gif' />代码<img src='/icons/24749dou.gif' />或则以BSD协议代码为基础做 2次开发自己<img src='/icons/24749de.gif' />产品时<img src='/icons/24749dou.gif' />需要满足 3个条件:<br/><br/>
　　1. 如果再发布<img src='/icons/24749de.gif' />产品中包含源代码<img src='/icons/24749dou.gif' />则在源代码中必须带有原来代码中<img src='/icons/24749de.gif' />BSD协议<img src='/icons/24749dou2.gif' /><br/><br/>
　　2. 如果再发布<img src='/icons/24749de.gif' />只是 2进制类库/软件Software<img src='/icons/24749dou.gif' />则需要在类库/软件Software<img src='/icons/24749de.gif' />文档和版权声明中包含原来代码中<img src='/icons/24749de.gif' />BSD协议<img src='/icons/24749dou2.gif' /><br/><br/>
　　3. 不可以用开源代码<img src='/icons/24749de.gif' />作者/机构名字和原来产品<img src='/icons/24749de.gif' />名字做市场推广<img src='/icons/24749dou2.gif' /><br/><br/>
　　BSD代码鼓励代码共享<img src='/icons/24749dou.gif' />但需要尊重代码作者<img src='/icons/24749de.gif' />著作权<img src='/icons/24749dou2.gif' />BSD由于允许使用者修改和重新发布代码<img src='/icons/24749dou.gif' />也允许使用或在BSD代码上开发商业软件Software发布和销售<img src='/icons/24749dou.gif' />因此是对商业集成很友好<img src='/icons/24749de.gif' />协议<img src='/icons/24749dou2.gif' />而很多<img src='/icons/24749de.gif' />公司企业在选用开源产品<img src='/icons/24749de.gif' />时候都首选BSD协议<img src='/icons/24749dou.gif' /><img src='/icons/24749yinwei.gif' />可以完全控制这些第 3方<img src='/icons/24749de.gif' />代码<img src='/icons/24749dou.gif' />在必要<img src='/icons/24749de.gif' />时候可以修改或者 2次开发<img src='/icons/24749dou2.gif' /><br/><br/>
　　Apache Licence 2.0<br/><br/>
　　Apache Licence是著名<img src='/icons/24749de.gif' />非盈利开源组织Apache采用<img src='/icons/24749de.gif' />协议<img src='/icons/24749dou2.gif' />该协议和BSD类似<img src='/icons/24749dou.gif' />同样鼓励代码共享和尊重原作者<img src='/icons/24749de.gif' />著作权<img src='/icons/24749dou.gif' />同样允许代码修改<img src='/icons/24749dou.gif' />再发布(作为开源或商业软件Software)<img src='/icons/24749dou2.gif' />需要满足<img src='/icons/24749de.gif' />条件:<br/><br/>
　　1. 需要给代码<img src='/icons/24749de.gif' />用户<img src='/icons/24749yi.gif' />份Apache Licence<br/><br/>
　　2. 如果你修改了代码<img src='/icons/24749dou.gif' />需要再被修改<img src='/icons/24749de.gif' />文件中介绍说明<img src='/icons/24749dou2.gif' /><br/><br/>
　　3. 在延伸<img src='/icons/24749de.gif' />代码中(修改和有源代码衍生<img src='/icons/24749de.gif' />代码中)需要带有原来代码中<img src='/icons/24749de.gif' />协议<img src='/icons/24749dou.gif' />商标<img src='/icons/24749dou.gif' />专利声明和其他原来作者规定需要包含<img src='/icons/24749de.gif' />介绍说明<img src='/icons/24749dou2.gif' /><br/><br/>
　　4. 如果再发布<img src='/icons/24749de.gif' />产品中包含<img src='/icons/24749yi.gif' />个Notice文件<img src='/icons/24749dou.gif' />则在Notice文件中需要带有Apache Licence<img src='/icons/24749dou2.gif' />你可以在Notice中增加自己<img src='/icons/24749de.gif' />许可<img src='/icons/24749dou.gif' />但不可以表现为对Apache Licence构成更改<img src='/icons/24749dou2.gif' /><br/><br/>
　　Apache Licence也是对商业应用友好<img src='/icons/24749de.gif' />许可<img src='/icons/24749dou2.gif' />使用者也可以在需要<img src='/icons/24749de.gif' />时候修改代码来满足需要并作为开源或商业产品发布/销售<img src='/icons/24749dou2.gif' /><br/><br/>
　　GPL<br/><br/>
　　GPL许可证是自由软件Software<img src='/icons/24749de.gif' />应用最广泛<img src='/icons/24749de.gif' />软件Software许可证<img src='/icons/24749dou.gif' />人们可以修改程式<img src='/icons/24749de.gif' /><img src='/icons/24749yi.gif' />个或几个副本或程式<img src='/icons/24749de.gif' />任何部分<img src='/icons/24749dou.gif' />以此形成基於这些程式<img src='/icons/24749de.gif' />衍生作品<img src='/icons/24749dou2.gif' />必须在修改过<img src='/icons/24749de.gif' />档案中附有明显<img src='/icons/24749de.gif' />介绍说明:您修改了此<img src='/icons/24749yi.gif' />档案及任何修改<img src='/icons/24749de.gif' />日期<img src='/icons/24749dou2.gif' /> 您必须让您发布或出版<img src='/icons/24749de.gif' />作品<img src='/icons/24749dou.gif' />包括本程式<img src='/icons/24749de.gif' />全部或<img src='/icons/24749yi.gif' />部分<img src='/icons/24749dou.gif' />或内含本程式<img src='/icons/24749de.gif' />全部或部分所衍生<img src='/icons/24749de.gif' />作品<img src='/icons/24749dou.gif' />允许第 3方在此许可证条款下使用<img src='/icons/24749dou.gif' />并且不得<img src='/icons/24749yinwei.gif' />此项授权行为而收费<img src='/icons/24749dou2.gif' /><br/><br/>
　　LGPL<br/><br/>
　　Linux就是采用了GPL<img src='/icons/24749dou2.gif' />GPL协议和BSD, Apache Licence等鼓励代码重用<img src='/icons/24749de.gif' />许可很不<img src='/icons/24749yi.gif' />样<img src='/icons/24749dou2.gif' />GPL<img src='/icons/24749de.gif' />出发点是代码<img src='/icons/24749de.gif' />开源/免费使用和引用/修改/衍生代码<img src='/icons/24749de.gif' />开源/免费使用<img src='/icons/24749dou.gif' />但不允许修改后和衍生<img src='/icons/24749de.gif' />代码做为闭源<img src='/icons/24749de.gif' />商业软件Software发布和销售<img src='/icons/24749dou2.gif' />这也就是为什么我们能用免费<img src='/icons/24749de.gif' />各种linux<img src='/icons/24749dou.gif' />包括商业公司<img src='/icons/24749de.gif' />linux和linux上各种各样<img src='/icons/24749de.gif' />由个人<img src='/icons/24749dou.gif' />组织<img src='/icons/24749dou.gif' />以及商业软件Software公司开发<img src='/icons/24749de.gif' />免费软件Software了<img src='/icons/24749dou2.gif' /><br/><br/>
　　GPL协议<img src='/icons/24749de.gif' />主要内容是只要在<img src='/icons/24749yi.gif' />个软件Software中使用(“使用”指类库引用<img src='/icons/24749dou.gif' />修改后<img src='/icons/24749de.gif' />代码或者衍生代码)GPL协议<img src='/icons/24749de.gif' />产品<img src='/icons/24749dou.gif' />则该软件Software产品必须也采用GPL协议<img src='/icons/24749dou.gif' />既必须也是开源和免费<img src='/icons/24749dou2.gif' />这就是所谓<img src='/icons/24749de.gif' />”传染性”<img src='/icons/24749dou2.gif' />GPL协议<img src='/icons/24749de.gif' />产品作为<img src='/icons/24749yi.gif' />个单独<img src='/icons/24749de.gif' />产品使用没有任何问题<img src='/icons/24749dou.gif' />还可以享受免费<img src='/icons/24749de.gif' />优势<img src='/icons/24749dou2.gif' /><br/><br/>
　　由于GPL严格要求使用了GPL类库<img src='/icons/24749de.gif' />软件Software产品必须使用GPL协议<img src='/icons/24749dou.gif' />对于使用GPL协议<img src='/icons/24749de.gif' />开源代码<img src='/icons/24749dou.gif' />商业软件Software或者对代码有保密要求<img src='/icons/24749de.gif' />部门就不适合集成/采用作为类库和 2次开发<img src='/icons/24749de.gif' />基础<img src='/icons/24749dou2.gif' /><br/><br/>
　　其它细节如再发布<img src='/icons/24749de.gif' />时候需要伴随GPL协议等和BSD/Apache等类似<br/><br/>
　　Public Do<img src='/icons/24749main.gif' /><br/><br/>
　　公共域授权<img src='/icons/24749dou2.gif' />将软件Software授权为公共域<img src='/icons/24749dou.gif' />这些软件Software包没有授权协议<img src='/icons/24749dou.gif' />任何人都可以随意使用它<img src='/icons/24749dou2.gif' /><br/><br/>
　　Artistic许可<br/><br/>
　　使作者保持对进<img src='/icons/24749yi.gif' />步开发<img src='/icons/24749de.gif' />控制<img src='/icons/24749dou2.gif' /><br/><br/>
 <a href="/mypdf/78823.pdf" title="查看 开源协议:Java程序员需要了解的几个开源协议 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78823.html</guid>
		</item>
		<item>
			<title><![CDATA[oracledblink创建:有效创建oracle dblink 的两种方式]]></title>
			<link>http://CrazyCoder.cn/Java/Article78822.html</link>
			<description>
				<![CDATA[

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 两台区别<img src='/icons/69349de.gif' />数据库服务器<img src='/icons/69349dou.gif' />从<img src='/icons/69349yi.gif' />台数据库服务器<img src='/icons/69349de.gif' /><img src='/icons/69349yi.gif' />个用户读取另<img src='/icons/69349yi.gif' />台数据库服务器下<img src='/icons/69349de.gif' />某个用户<img src='/icons/69349de.gif' />数据<img src='/icons/69349dou.gif' />这个时候可以使用dblink<img src='/icons/69349dou2.gif' /><br/><br/>
　　其实dblink和数据库中<img src='/icons/69349de.gif' />view差不多<img src='/icons/69349dou.gif' />建dblink<img src='/icons/69349de.gif' />时候需要知道待读取数据库<img src='/icons/69349de.gif' />ip地址<img src='/icons/69349dou.gif' />ssid以及数据库用户名和密码<img src='/icons/69349dou2.gif' /><br/><br/>
　　创建可以采用两种方式:<br/><br/>
　&nbsp;&nbsp;&nbsp; 1、已经配置本地服务<br/><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以下是引用片段:<br/>　　create public database <br/>　　link fwq12 connect to fzept <br/>　　ident<img src='/icons/69349if.gif' />ied by neu using 'fjept' <br/>　　CREATE DATABASE LINK数据库链接名CONNECT TO 用户名 IDENTIFIED BY 密码 USING ‘本地配置<img src='/icons/69349de.gif' />数据<img src='/icons/69349de.gif' />例子名’;<br/><br/>
　　 2、未配置本地服务<br/><br/>
　　 以下是引用片段:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create database link linkfwq <br/>　　 connect to fzept ident<img src='/icons/69349if.gif' />ied by neu <br/>　　 using '(DESCRIPTION = <br/>　　 (ADDRESS_LIST = <br/>　　 (ADDRESS = (PROTOCOL = TCP)(HOST = 10.142.202.12)(PORT = 1521)) <br/>　　 ) <br/>　　 (CONNECT_DATA = <br/>　　 (SERVICE_NAME = fjept) <br/>　　 ) <br/>　　 )'; <br/>　　host=数据库<img src='/icons/69349de.gif' />ip地址<img src='/icons/69349dou.gif' />service_name=数据库<img src='/icons/69349de.gif' />ssid<img src='/icons/69349dou2.gif' /><br/><br/>
　　其实两种思路方法配置dblink是差不多<img src='/icons/69349de.gif' /><img src='/icons/69349dou.gif' />我个人感觉还是第 2种思路方法比较好<img src='/icons/69349dou.gif' />这样不受本地服务<img src='/icons/69349de.gif' />影响<img src='/icons/69349dou2.gif' /><br/><br/>
　　数据库连接<img src='/icons/69349zifu.gif' />串可以用NET8 EASY CONFIG或者直接修改TNSNAMES.ORA里定义.<br/><br/>
　　数据库参数global_name=true时要求数据库链接名称跟远端数据库名称<img src='/icons/69349yi.gif' />样<br/><br/>
　　数据库全局名称可以用以下命令查出<br/><br/>
　　SELECT * FROM GLOBAL_NAME;<br/><br/>
　　查询远端数据库里<img src='/icons/69349de.gif' />表<br/><br/>
　　SELECT …… FROM 表名@数据库链接名;<br/><br/>
　　查询、删除和插入数据和操作本地<img src='/icons/69349de.gif' />数据库是<img src='/icons/69349yi.gif' />样<img src='/icons/69349de.gif' /><img src='/icons/69349dou.gif' />只不过表名需要写成“表名@dblink服务器”而已<img src='/icons/69349dou2.gif' /><br/><br/>
　　附带说下同义词创建:<br/><br/>
　　CREATE SYNONYM同义词名FOR 表名;<br/><br/>
　　CREATE SYNONYM同义词名FOR 表名@数据库链接名;<br/><br/>
　　删除dblink:DROP PUBLIC DATABASE LINK linkfwq<img src='/icons/69349dou2.gif' /><br/><br/>
　　如果创建全局dblink<img src='/icons/69349dou.gif' />必须使用systm或sys用户<img src='/icons/69349dou.gif' />在database前加public<img src='/icons/69349dou2.gif' /><br/><br/>
　　参考资料:<br/><br/>
　　http://download-west.oracle.com/docs/cd/B19306_01/server.102/b14231/ds_admin.htm#i1008271<br/><br/>
 <a href="/mypdf/78822.pdf" title="查看 oracledblink创建:有效创建oracle dblink 的两种方式 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78822.html</guid>
		</item>
		<item>
			<title><![CDATA[uml学习笔记:UML的精粹——学习笔记(一)]]></title>
			<link>http://CrazyCoder.cn/Java/Article78821.html</link>
			<description>
				<![CDATA[

UML有 3种使用方式:用作草图绘制<img src='/icons/49831dou.gif' />用于蓝图绘制<img src='/icons/49831dou.gif' />用于<img src='/icons/49831chengxu.gif' />编制<img src='/icons/49831dou2.gif' /><br/><br/>
　　倾向于将UML用于草图绘制<img src='/icons/49831dou.gif' />绘制草图<img src='/icons/49831de.gif' />实质是选择<img src='/icons/49831dou.gif' />重点是进行交流<img src='/icons/49831dou.gif' />常用<img src='/icons/49831de.gif' />介质是白板<img src='/icons/49831dou2.gif' /><br/><br/>
　　草图是故意不完备<img src='/icons/49831de.gif' /><img src='/icons/49831dou.gif' />要突出重要<img src='/icons/49831de.gif' />信息<img src='/icons/49831dou2.gif' />草图是探究性<img src='/icons/49831de.gif' /><img src='/icons/49831dou.gif' />蓝图是定义性<img src='/icons/49831de.gif' /><img src='/icons/49831dou2.gif' />草图用于正向工程(设计阶段)<img src='/icons/49831dou.gif' />蓝图用于逆向工程(根据已有<img src='/icons/49831de.gif' />代码导出)<img src='/icons/49831dou2.gif' />详细文档应该根据代码生成<img src='/icons/49831dou2.gif' /><br/><br/>
　　UML最重要<img src='/icons/49831de.gif' />是类图和顺序图<img src='/icons/49831dou2.gif' /><br/><br/>
　　瀑布风格和迭代风格<br/><br/>
　　瀑布风格是基于活动来分解项目<img src='/icons/49831de.gif' /><img src='/icons/49831dou.gif' />迭代风格根据功能子集来分解项目<img src='/icons/49831dou2.gif' /><br/><br/>
　　迭代<img src='/icons/49831de.gif' /><img src='/icons/49831yi.gif' />种常用技术是时间框定法<img src='/icons/49831dou.gif' />迫使各次迭代<img src='/icons/49831de.gif' />时间长度固定<img src='/icons/49831dou2.gif' />通过定时搁置功能<img src='/icons/49831dou.gif' />使人们能够在搁置日期和搁置功能的间进行明智<img src='/icons/49831de.gif' />选择<img src='/icons/49831dou2.gif' /><br/><br/>
　　敏捷过程是强适应性<img src='/icons/49831de.gif' />过程<img src='/icons/49831dou2.gif' />敏捷思路方法强调项目成功最重要<img src='/icons/49831de.gif' />原因是人<img src='/icons/49831de.gif' />素质以及人的间<img src='/icons/49831de.gif' />良好协同<img src='/icons/49831dou.gif' />敏捷思路方法倾向使用时间框定<img src='/icons/49831de.gif' />短小迭代<img src='/icons/49831dou2.gif' />每<img src='/icons/49831yi.gif' />次迭代结束时要进行<img src='/icons/49831yi.gif' />次迭代回顾<img src='/icons/49831dou2.gif' /><br/><br/>
　　RUP本质上是<img src='/icons/49831yi.gif' />个迭代过程<img src='/icons/49831dou.gif' />分为 4个阶段:<img src='/icons/49831chushi.gif' /><img src='/icons/49831dou.gif' />细化<img src='/icons/49831dou.gif' />构造<img src='/icons/49831dou.gif' />移交<img src='/icons/49831dou2.gif' /><br/><br/>
　　需求分析最重要<img src='/icons/49831de.gif' />是和用户及客户<img src='/icons/49831de.gif' />交流<img src='/icons/49831dou2.gif' /><br/><br/>
　　类图<br/><br/>
　　类图表述系统中各个对象<img src='/icons/49831de.gif' />类型以及其间存在<img src='/icons/49831de.gif' />各种静态关系<img src='/icons/49831dou2.gif' /><br/><br/>
　　对不重要<img src='/icons/49831de.gif' />事(如日期或布尔值<img src='/icons/49831dou.gif' /><img src='/icons/49831yi.gif' />般说<img src='/icons/49831dou.gif' />值类型)使用属性<img src='/icons/49831dou.gif' />对较为重要<img src='/icons/49831de.gif' />类使用关联<img src='/icons/49831dou2.gif' /><br/><br/>
　　非常反感那些除了<img src='/icons/49831yi.gif' />组域及其get/<img src='/icons/49831set.gif' />思路方法没有行为<img src='/icons/49831de.gif' />类<img src='/icons/49831dou2.gif' />如果你在利用get思路方法重复<img src='/icons/49831diaoyong.gif' />数据<img src='/icons/49831dou.gif' />这预示着某<img src='/icons/49831yi.gif' />行为应该移往具有数据<img src='/icons/49831de.gif' />对象<img src='/icons/49831dou2.gif' /><br/><br/>
　　依赖应该单向<img src='/icons/49831dou.gif' />依赖越少越好<img src='/icons/49831dou.gif' />特别谨慎循环依赖<img src='/icons/49831dou.gif' />尤其反对包间<img src='/icons/49831de.gif' />循环依赖<img src='/icons/49831dou2.gif' />对类使用依赖最常见<img src='/icons/49831de.gif' />情形是阐明瞬间关系<img src='/icons/49831dou.gif' />比如<img src='/icons/49831dou.gif' />把<img src='/icons/49831yi.gif' />个对象作为参数传递到另<img src='/icons/49831yi.gif' />个对象时<img src='/icons/49831dou2.gif' /><br/><br/>
　　不要试图使用对你可用<img src='/icons/49831de.gif' />所有图示法<img src='/icons/49831dou.gif' />保持图示简单<img src='/icons/49831dou.gif' />集中考虑关键方面<img src='/icons/49831dou2.gif' />绘制类图时总以使用某种形式<img src='/icons/49831de.gif' />行为技术为宜<img src='/icons/49831dou2.gif' /><br/><br/>
　　顺序图<br/><br/>
　　尽量省去回送<img src='/icons/49831dou2.gif' /><br/><br/>
　　单<img src='/icons/49831yi.gif' />职责<img src='/icons/49831dou.gif' />提倡分布式控制(把处理分散到多个对象里去)<img src='/icons/49831dou2.gif' /><br/><br/>
　　减少过程式编程<img src='/icons/49831dou.gif' />如<img src='/icons/49831if.gif' />/<img src='/icons/49831else.gif' /><img src='/icons/49831dou.gif' />改用多态解决类似问题<img src='/icons/49831dou2.gif' /><br/><br/>
　　把顺序图看作各个对象如何交互<img src='/icons/49831de.gif' />形象化表示而不是<img src='/icons/49831yi.gif' />种对控制基理<img src='/icons/49831de.gif' />建模思路方法<img src='/icons/49831dou2.gif' />顺序图擅长示明对象间<img src='/icons/49831de.gif' />协作<img src='/icons/49831dou.gif' />不擅长于示明行为<img src='/icons/49831de.gif' />精确定义<img src='/icons/49831dou2.gif' /><br/><br/>
　　CRC卡<br/><br/>
　　CRC<img src='/icons/49831de.gif' /><img src='/icons/49831yi.gif' />个重要部分是认识职责<img src='/icons/49831dou2.gif' />任意<img src='/icons/49831yi.gif' />个类都可以用少量职责对其概括<img src='/icons/49831dou2.gif' />对具有 3项以上职责<img src='/icons/49831de.gif' />卡片提出质问<img src='/icons/49831dou.gif' />是否应该把类分解<img src='/icons/49831dou.gif' />或把职责合并成<img src='/icons/49831yi.gif' />个更高层次<br/><br/>
　　<img src='/icons/49831de.gif' />概述<img src='/icons/49831dou2.gif' /><br/><br/>
 <a href="/mypdf/78821.pdf" title="查看 uml学习笔记:UML的精粹——学习笔记(一) 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78821.html</guid>
		</item>
		<item>
			<title><![CDATA[java入门学习:新手入门:学习Java的一点经验心得体会]]></title>
			<link>http://CrazyCoder.cn/Java/Article78820.html</link>
			<description>
				<![CDATA[

在Java私塾<img src='/icons/3153de.gif' />学习快完成了,突然想把自己<img src='/icons/3153de.gif' />学习心得体会整理总结<img src='/icons/3153yi.gif' />下.<br/><br/>
　　我觉得在JAVA<img src='/icons/3153de.gif' />初期阶段尽量少用工具,像eclipse,JBuild这些工具可以晚<img src='/icons/3153yi.gif' />点在用,<br/><br/>
　　最开始有个写字板和JDK就可以了,我觉得在开始阶段主要是为了打下扎实<img src='/icons/3153de.gif' />基础,不然有时工具很多都帮你生成了,<br/><br/>
　　也是为了培养<img src='/icons/3153yi.gif' />种好<img src='/icons/3153de.gif' />编程习惯,最初<img src='/icons/3153de.gif' />时候还是自己多动动手好了,毕竟没有学会走路跑步肯定快不了<img src='/icons/3153dou2.gif' /><br/><br/>
　　学习JAVA<img src='/icons/3153yi.gif' />定要先把JAVA<img src='/icons/3153de.gif' />几个基本组成元素学好<img src='/icons/3153dou2.gif' /><br/><br/>
　　1、数据类型: JAVA是<img src='/icons/3153yi.gif' />种强类型语言<img src='/icons/3153dou.gif' />各种类型不会自动转换<img src='/icons/3153dou.gif' />使用前必须先定义<img src='/icons/3153dou2.gif' /><br/><br/>
　　2、思路方法: 思路方法相当于定义<img src='/icons/3153yi.gif' />个"宏"、<img src='/icons/3153yi.gif' />个"<img src='/icons/3153hanshu.gif' />"<img src='/icons/3153dou.gif' /> 思路方法<img src='/icons/3153de.gif' />定义格式为:"介绍说明符 修饰符 返回值 思路方法名(参数){思路方法体}<img src='/icons/3153dou2.gif' />"<br/><br/>
　　在学习思路方法<img src='/icons/3153de.gif' />时候要注意"介绍说明符、"修饰符"、"返回值"这 3样东西<img src='/icons/3153dou2.gif' /><br/><br/>
　　3、类: 在JAVA中最经常听到词<img src='/icons/3153dou.gif' />也是最麻烦<img src='/icons/3153de.gif' />东西<img src='/icons/3153dou2.gif' /><br/><br/>
　　4、变量常量: JAVA<img src='/icons/3153de.gif' />常量名<img src='/icons/3153yi.gif' />般用全大写字母表示<img src='/icons/3153dou.gif' />并且为了节省内存,<img src='/icons/3153yi.gif' />般定义为静态(JAVA<img src='/icons/3153chengxu.gif' />中<img src='/icons/3153de.gif' />名字我们经常有个默认<img src='/icons/3153de.gif' />规则<img src='/icons/3153dou.gif' />类名所有单词第<img src='/icons/3153yi.gif' />个字母大写<img src='/icons/3153dou.gif' /><br/><br/>
　　思路方法名第 2个单词开始第<img src='/icons/3153yi.gif' />个字母大写<img src='/icons/3153dou.gif' />变量名小写<img src='/icons/3153dou.gif' />这样我们<img src='/icons/3153yi.gif' />看<img src='/icons/3153chengxu.gif' />就非常清楚了<img src='/icons/3153dou.gif' />从小养成良好<img src='/icons/3153de.gif' />习惯嘛<img src='/icons/3153dou.gif' />呵呵)<img src='/icons/3153dou2.gif' />学习变量<img src='/icons/3153de.gif' />时候要注意两个特殊<img src='/icons/3153de.gif' />东西"this" 和"super"<img src='/icons/3153dou2.gif' /><br/><br/>
　　同时我们就要学习什么叫"覆盖"、"重载"<img src='/icons/3153dou2.gif' /><br/><br/>
　　5、控制流: 所有<img src='/icons/3153de.gif' />编程语言<img src='/icons/3153de.gif' />控制语句无非就是几个<img src='/icons/3153if.gif' /> <img src='/icons/3153else.gif' /> for while do switch<img src='/icons/3153dou2.gif' /><br/><br/>
　　6、接口: <img src='/icons/3153yi.gif' />个抽象<img src='/icons/3153de.gif' />东西<img src='/icons/3153dou.gif' />接口可以多继承<img src='/icons/3153dou.gif' />解决了类只能单继承<img src='/icons/3153de.gif' />问题<img src='/icons/3153dou2.gif' /><br/><br/>
　　7、线程: 线程是个比较复杂<img src='/icons/3153de.gif' />东西<img src='/icons/3153dou.gif' />例如<img src='/icons/3153yi.gif' />个赛马<img src='/icons/3153chengxu.gif' />有 7匹马赛跑<img src='/icons/3153dou.gif' />就有 7个线程<img src='/icons/3153dou.gif' /><br/><br/>
　　看起来好象是同时在跑<img src='/icons/3153dou.gif' />其实是计算机分配区别<img src='/icons/3153de.gif' />时间段让 7个线程运行<img src='/icons/3153dou2.gif' />我们初学者<img src='/icons/3153de.gif' /><img src='/icons/3153chengxu.gif' />可能还用不上<img src='/icons/3153dou2.gif' /><br/><br/>
　　到这里为止<img src='/icons/3153dou.gif' />JAVA<img src='/icons/3153de.gif' />基本概念我们有<img src='/icons/3153yi.gif' />定<img src='/icons/3153de.gif' />了解了<img src='/icons/3153dou.gif' />我们就开始研究JAVA<img src='/icons/3153de.gif' />类了<img src='/icons/3153dou2.gif' /><br/><br/>
　　JAVA<img src='/icons/3153de.gif' />核心API(也就是SUN公司已经为我们写好<img src='/icons/3153de.gif' />类)有以下几种<img src='/icons/3153dou2.gif' />(还有其他很多<img src='/icons/3153de.gif' />扩充类)<br/><br/>
　　Java.lang java.io java.util java.net java.awt java.applet java.sql java.text<br/><br/>
　　每个类有很多思路方法<img src='/icons/3153dou.gif' />每个对象<img src='/icons/3153de.gif' />类型区别<img src='/icons/3153dou.gif' />可以使用<img src='/icons/3153de.gif' />思路方法也区别<img src='/icons/3153dou.gif' />我们最好有<img src='/icons/3153yi.gif' />本类库在手中<img src='/icons/3153dou.gif' /><br/><br/>
　　可以随时查阅<img src='/icons/3153dou.gif' />如果您<img src='/icons/3153de.gif' />英语好<img src='/icons/3153dou.gif' />也可以上SUN公司<img src='/icons/3153de.gif' />网站WebSite或使用JBUILDER<img src='/icons/3153de.gif' />帮助文档<img src='/icons/3153dou2.gif' /><br/><br/>
　　谁都不可能<img src='/icons/3153yi.gif' />下子记住这么多类<img src='/icons/3153de.gif' />使用方法<img src='/icons/3153dou.gif' />而且也并不是所有<img src='/icons/3153de.gif' />类对我们<img src='/icons/3153de.gif' /><img src='/icons/3153chengxu.gif' />都有用<img src='/icons/3153dou.gif' /><br/><br/>
　　我们当然是选择我们需要<img src='/icons/3153de.gif' />类进行学习<img src='/icons/3153dou2.gif' /><br/><br/>
　　<img src='/icons/3153yi.gif' />般<img src='/icons/3153chengxu.gif' />都逃不过<img src='/icons/3153zifu.gif' />串操作、文件操作、数据库操作<img src='/icons/3153dou.gif' /><br/><br/>
　　所以java.lang java.io java.sql这几个类我们必须要看<img src='/icons/3153dou2.gif' /><br/><br/>
　　由于这只是介绍<img src='/icons/3153yi.gif' />下初学JAVA<img src='/icons/3153de.gif' />经验<img src='/icons/3153dou.gif' />可能大家看了这篇文章后连<img src='/icons/3153yi.gif' />个HELLO WORLD 都编不出来<img src='/icons/3153dou.gif' /><br/><br/>
　　但是如果能为大家在<img src='/icons/3153yi.gif' />本厚厚<img src='/icons/3153de.gif' />JAVA书中节省<img src='/icons/3153yi.gif' />点时间<img src='/icons/3153dou.gif' />我想总算有点贡献<img src='/icons/3153dou2.gif' /><br/><br/>
　　希望大家迅速在JAVA中找到适合自己用<img src='/icons/3153de.gif' />东西(<img src='/icons/3153yinwei.gif' />JAVA实在太强大)<img src='/icons/3153dou2.gif' /><br/><br/>
 <a href="/mypdf/78820.pdf" title="查看 java入门学习:新手入门:学习Java的一点经验心得体会 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78820.html</guid>
		</item>
		<item>
			<title><![CDATA[word文档转换pdf文件:Java程序把Word文档直接转换成Html文件]]></title>
			<link>http://CrazyCoder.cn/Java/Article78819.html</link>
			<description>
				<![CDATA[

Jacob是Java和Windows下<img src='/icons/83634de.gif' />Com桥<img src='/icons/83634dou.gif' />通过它我们可以在Java<img src='/icons/83634chengxu.gif' />中<img src='/icons/83634diaoyong.gif' />COM组件<img src='/icons/83634dou2.gif' />如果你<img src='/icons/83634de.gif' />JDK是1.4<img src='/icons/83634dou.gif' />那你需要下载Jacob1.9<img src='/icons/83634de.gif' />jni库才能正常运行<img src='/icons/83634dou.gif' />早期版本在JDK1.4下有些问题<img src='/icons/83634dou2.gif' /><br/>以下是引用片段:<br/>package com; <br/>/**<br/>* 〈p〉Title:Word文档转html类〈/p〉<br/>* 〈p〉Description: 〈/p〉<br/>* 〈p〉Copyright:<img src='/icons/83634kh.gif' /> 2002〈/p〉<br/>* @author 舵手<br/>* @version 1.0<br/>*/<br/>import com.jacob.com.*; <br/>import com.jacob.activeX.*; <br/><br/>
public <img src='/icons/83634class.gif' /> WordtoHtml {<br/>/**<br/>*文档转换<img src='/icons/83634hanshu.gif' /><br/>*@param docfile word文档<img src='/icons/83634de.gif' />绝对路径加文件名(包含扩展名)<br/>*@param htmlfile 转换后<img src='/icons/83634de.gif' />html文件绝对路径和文件名(不含扩展名)<br/>*/<br/>public <img src='/icons/83634static.gif' /> void change(String docfile, String htmlfile) {<br/>ActiveXComponent app = <img src='/icons/83634new.gif' /> ActiveXComponent("Word.Application"); // 启动word<br/>try {<br/>app.<img src='/icons/83634set.gif' />Property("Visible", <img src='/icons/83634new.gif' /> Variant(false)); <br/>//设置word不可见<br/>Object docs = app.getProperty("Documents").toDispatch<img src='/icons/83634kh.gif' />; <br/>Object doc = Dispatch.invoke(docs,"Open",Dispatch.Method,<img src='/icons/83634new.gif' /> Object<img src='/icons/83634zhk2.gif' /> <br/>{ docfile, <img src='/icons/83634new.gif' /> Variant(false),<img src='/icons/83634new.gif' /> Variant(true) }, <img src='/icons/83634new.gif' /> <img src='/icons/83634int.gif' />[1]).toDispatch<img src='/icons/83634kh.gif' />; <br/>// 打开word文件<br/>Dispatch.invoke(doc, "SaveAs", Dispatch.Method, <img src='/icons/83634new.gif' /> Object<img src='/icons/83634zhk2.gif' /> {htmlfile,<br/><img src='/icons/83634new.gif' /> Variant(8) }, <img src='/icons/83634new.gif' /> <img src='/icons/83634int.gif' />[1]); <br/>// 作为html格式保存到临时文件<br/>Variant f = <img src='/icons/83634new.gif' /> Variant(false); <br/>Dispatch.call(doc, "Close", f); <br/>} catch (Exception e) {<br/>e.pr<img src='/icons/83634int.gif' />StackTrace<img src='/icons/83634kh.gif' />; <br/>} finally {<br/>app.invoke("Quit", <img src='/icons/83634new.gif' /> Variant<img src='/icons/83634zhk2.gif' />{}); <br/>}<br/>}<br/>public <img src='/icons/83634static.gif' /> void <img src='/icons/83634main.gif' />(String<img src='/icons/83634zhk2.gif' /> strs){<br/>WordtoHtml.change("c:\\a\\运输管理调度系统总体方案.doc", "c:\\a\\t"); <br/><br/>
}<br/>} <br/><br/>
 <a href="/mypdf/78819.pdf" title="查看 word文档转换pdf文件:Java程序把Word文档直接转换成Html文件 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2010-03-04</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article78819.html</guid>
		</item>
	</channel>
</rss>
