﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-xpsir-文章分类-转载区</title><link>http://www.blogjava.net/xpsir/category/5455.html</link><description>下君尽己之能，中君尽人之力，上君尽人之智；</description><language>zh-cn</language><lastBuildDate>Sat, 10 Jul 2010 14:26:34 GMT</lastBuildDate><pubDate>Sat, 10 Jul 2010 14:26:34 GMT</pubDate><ttl>60</ttl><item><title>Quartz任务调度CronTrigger配置格式详细说明</title><link>http://www.blogjava.net/xpsir/articles/325188.html</link><dc:creator>小P</dc:creator><author>小P</author><pubDate>Sun, 04 Jul 2010 04:12:00 GMT</pubDate><guid>http://www.blogjava.net/xpsir/articles/325188.html</guid><wfw:comment>http://www.blogjava.net/xpsir/comments/325188.html</wfw:comment><comments>http://www.blogjava.net/xpsir/articles/325188.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xpsir/comments/commentRss/325188.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xpsir/services/trackbacks/325188.html</trackback:ping><description><![CDATA[CronTrigger配置完整格式为： [秒] [分] [小时] [日] [月] [周] [年]

 序号	说明	 是否必填	 允许填写的值	允许的通配符
 1	 秒	 是	 0-59 	  , - * /
 2	 分	 是	 0-59 
  , - * /
 3	小时	 是	 0-23	  , - * /
 4	 日	 是	 1-31	  , - * ? / L W
 5	 月	 是	 1-12 or JAN-DEC	  , - * /
 6	 周	 是	 1-7 or SUN-SAT	  , - * ? / L #
 7	 年	 否	 empty 或 1970-2099	  , - * /
通配符说明:
* 表示所有值. 例如:在分的字段上设置 "*",表示每一分钟都会触发。
? 表示不指定值。使用的场景为不需要关心当前设置这个字段的值。例如:要在每月的10号触发一个操作，但不关心是周几，所以需要周位置的那个字段设置为"?" 具体设置为 0 0 0 10 * ?
- 表示区间。例如 在小时上设置 "10-12",表示 10,11,12点都会触发。
, 表示指定多个值，例如在周字段上设置 "MON,WED,FRI" 表示周一，周三和周五触发
/ 用于递增触发。如在秒上面设置"5/15" 表示从5秒开始，每增15秒触发(5,20,35,50)。 在月字段上设置'1/3'所示每月1号开始，每隔三天触发一次。
L 表示最后的意思。在日字段设置上，表示当月的最后一天(依据当前月份，如果是二月还会依据是否是润年[leap]), 在周字段上表示星期六，相当于"7"或"SAT"。如果在"L"前加上数字，则表示该数据的最后一个。例如在周字段上设置"6L"这样的格式,则表示“本月最后一个星期五" 
W 表示离指定日期的最近那个工作日(周一至周五). 例如在日字段上设置"15W"，表示离每月15号最近的那个工作日触发。如果15号正好是周六，则找最近的周五(14号)触发, 如果15号是周未，则找最近的下周一(16号)触发.如果15号正好在工作日(周一至周五)，则就在该天触发。如果指定格式为 "1W",它则表示每月1号往后最近的工作日触发。如果1号正是周六，则将在3号下周一触发。(注，"W"前只能设置具体的数字,不允许区间"-").
# 序号(表示每月的第几个周几)，例如在周字段上设置"6#3"表示在每月的第三个周六.注意如果指定"#5",正好第五周没有周六，则不会触发该配置(用在母亲节和父亲节再合适不过了) ；

小提示：
'L'和 'W'可以一组合使用。如果在日字段上设置"LW",则表示在本月的最后一个工作日触发；
周字段的设置，若使用英文字母是不区分大小写的，即MON 与mon相同；
        
常用示例:

0 0 12 * * ?	每天12点触发
0 15 10 ? * *	每天10点15分触发
0 15 10 * * ?	每天10点15分触发
0 15 10 * * ? *	每天10点15分触发
0 15 10 * * ? 2005	2005年每天10点15分触发
0 * 14 * * ?	每天下午的 2点到2点59分每分触发
0 0/5 14 * * ?	每天下午的 2点到2点59分(整点开始，每隔5分触发)
0 0/5 14,18 * * ?	每天下午的 2点到2点59分、18点到18点59分(整点开始，每隔5分触发)
0 0-5 14 * * ?	每天下午的 2点到2点05分每分触发
0 10,44 14 ? 3 WED	3月分每周三下午的 2点10分和2点44分触发
0 15 10 ? * MON-FRI	从周一到周五每天上午的10点15分触发
0 15 10 15 * ?	每月15号上午10点15分触发
0 15 10 L * ?	每月最后一天的10点15分触发
0 15 10 ? * 6L	每月最后一周的星期五的10点15分触发
0 15 10 ? * 6L 2002-2005	从2002年到2005年每月最后一周的星期五的10点15分触发
0 15 10 ? * 6#3	每月的第三周的星期五开始触发
0 0 12 1/5 * ?	每月的第一个中午开始每隔5天触发一次
0 11 11 11 11 ?	每年的11月11号 11点11分触发(光棍节)<img src ="http://www.blogjava.net/xpsir/aggbug/325188.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xpsir/" target="_blank">小P</a> 2010-07-04 12:12 <a href="http://www.blogjava.net/xpsir/articles/325188.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>项目管理系统模块</title><link>http://www.blogjava.net/xpsir/articles/271247.html</link><dc:creator>小P</dc:creator><author>小P</author><pubDate>Mon, 18 May 2009 02:16:00 GMT</pubDate><guid>http://www.blogjava.net/xpsir/articles/271247.html</guid><wfw:comment>http://www.blogjava.net/xpsir/comments/271247.html</wfw:comment><comments>http://www.blogjava.net/xpsir/articles/271247.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xpsir/comments/commentRss/271247.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xpsir/services/trackbacks/271247.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="WORD-SPACING: 0px; FONT: 12px/18px Tahoma; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; TEXT-ALIGN: left; orphans: 2; widows: 2; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0">
				<h4 style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 1.15em; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em; COLOR: black; LINE-HEIGHT: 1.3em; PADDING-TOP: 0px">信息交流</h4>
				<ul style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1.5em; PADDING-TOP: 0px">
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">信息交流用来发布各种信息文件，企业可以根据自己的实际需要自行进行栏目的分级设置。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">可设定各栏目相关的发布、管理权限，实现内部新闻、公告、规章制度等公用信息的统一上传管理。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">可以根据实际情况定义信息栏目名称（如新闻、公告、规章制度、通报...），系统支持多层次目录结构，同时支持按目录授权访问。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">文档的授权可以按人员、部门、职务、分组、角色、项目组等多种方式指定，更方便企业管理。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">内部消息：与内部成员的沟通交流、文件传递，也用于系统的事务消息发送，如工作跟踪督办。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">常用链接：可以将单位经常使用的各类相关站点进行设置。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">企业论坛：可以随时发表相关的意见或针对某一问题进行讨论。</li>
				</ul>
				<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">
						<span class="F4E20">Shenzhen Hiblue Software</span>
				</p>
				<h4 style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 1.15em; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em; COLOR: black; LINE-HEIGHT: 1.3em; PADDING-TOP: 0px">事件日程</h4>
				<ul style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1.5em; PADDING-TOP: 0px">
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">事件日程以成员、部门、或团队为单位，按时间顺序，将相关的工作任务、工作计划、待办事务、流程事务以图表方式显示出来。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">成员通过事件日程可明确自己的工作目标，经理也可以使用事件日程工具对员工的工作做出合理统筹的安排。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">此外，事件日程功能也支持创建日程安排，如创建约会、会议计划或其他日程计划。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">可根据时间、日、周、月查询日程信息，并在日程中添加备忘。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">事件日程还具有冲突检查功能，以及到期提醒功能。</li>
				</ul>
				<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">
						<span class="F521F">ｈｉ－ｂｌｕｅ．ｃｏｍ</span>
				</p>
				<h4 style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 1.15em; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em; COLOR: black; LINE-HEIGHT: 1.3em; PADDING-TOP: 0px">项目管理</h4>
				<ul style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1.5em; PADDING-TOP: 0px">
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">项目管理管理项目的整个生命周期，包括项目的启动、计划、执行、控制和结束。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">企业可以根据实际情况实现合理的项目运作，对项目的任务、成员、财务、资源进行恰当的分配和管理，系统可自动启动相关的工作流。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">通过项目管理，项目经理可以掌控所有的项目信息（计划，资金，物质，人员，进程），跟踪整个项目的生命周期，全程监控项目的进展，管理与项目相关的活动，并从矩阵视图观察组织的效能。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">项目管理系统适用于：市场工程、软件工程、开发过程、项目实施、以及各种特定的项目工程。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">项目管理可针对整个组织机构、部门或具体的工程项目进行管理。项目的发布人员可以使用本功能制订整个机构的项目工作计划，同时将这些计划分配到具 体的执行人员； 掌握项目的执行情况及其相关的工作进度、项目文档、工作任务、项目进度信息，进行项目统计、任务统计、工时统计等分析查看。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">机构成员根据参于的项目工作，可以定期上传相应的工作报告并可上传多个相应的附件。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">项目管理制定工作流程是：首先设置、建立相应的项目类别和任务类别，项目类别建立时将指定相应的工作流程。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">可制订相应的项目并可针对需要进行指定相应的负责人及执行人，根据项目类别的选定，就会拥有项目类别事先定义好的工作流程。根据工作流程可一步一步实施执行到结束。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">项目管理模块里还提供了对项目文档的管理、知识共享、工作交办等功能。</li>
				</ul>
				<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">
						<span class="F561E">H i b l u e S o f t w a r e</span>
				</p>
				<h4 style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 1.15em; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em; COLOR: black; LINE-HEIGHT: 1.3em; PADDING-TOP: 0px">工作任务</h4>
				<ul style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1.5em; PADDING-TOP: 0px">
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">工作任务是企业日常工作任务或项目的工作计划任务，系统通过工作任务流程，实现工作流程自动化。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">工作任务可设定分类、优先级、重要性、紧急程度等属性，可按项目、部门、成员等对象进行任务分配。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">通过工作流程的自动化，实现更好、更快的进行任务的过程。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">工作任务的计划安排：计划安排实现对日常工作计划的安排、下达、负责人员的指定，同时支持进行计划的再分解操作。实现工作由上到下，由总到分的统一安排管理。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">工作任务的跟踪检查：系统对已经安排的工作任务自动跟踪检查，对于提交完成的工作申请进行核准，从而实现对于工作任务时间进度、工时进度、任务进度的多种跟踪检查。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">工作任务的报告日志：系统提供的报告日志可以使工作任务负责人方便的进行相关报告的提交，为将来的工作考评提供了准确、翔实的数据。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">工作任务的费用管理：通过与费用报销模块的连接，方便管理者对于相关工作任务的费用投入情况进行直接管理。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">工作任务的查询功能：可以使管理者对于任务进展情况进行直接、准确的监控管理。</li>
				</ul>
				<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">
						<span class="F5A1D">深 圳 市 升 蓝 软 件 开 发 有 限 公 司</span>
				</p>
				<h4 style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 1.15em; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em; COLOR: black; LINE-HEIGHT: 1.3em; PADDING-TOP: 0px">审批流程</h4>
				<ul style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1.5em; PADDING-TOP: 0px">
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">审批流程就是根据审批的规则集，利用信息技术以及现代化的管理手段，实现一个审批流程的自动化，在这个过程中文档、信息在参与者之间传递。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">流程审批用于企业用户之间进行的各种办公申请、公文流转、合同会签、立项审批、事务审批的过程自动化处理，通常由发起者（如文件起草人）发起流程，经过本部门以及其他部门的处理（如签署、会签），最终到达流程的终点（如发出文件、归档、批准）。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">企业可以根据单位的实际情况定义审批流程，从简单流程（如请假申请）到复杂流程（如立项审批）均可以PMS系统中定义和实施。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">PMS系统的审批流程具备三种应用流程模式：自定义流程、预定义流程、固定流程，满足企业的不同流程处理的需要。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">PMS系统的审批流程可以使用用流程模板制定，可方便批量地快速布署和实施工作流程。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">PMS系统的审批流程支持多种方式指定对象，可使用绝对对象和相对对象，在定义和实施中具有非常方便高效的意义。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">PMS系统的审批流程支持会签功能，支持多节点和多线程，在流程中支持使用子程序。</li>
				</ul>
				<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">
						<span class="F5E1C">S h e n z h e n H i b l u e</span>
				</p>
				<h4 style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 1.15em; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em; COLOR: black; LINE-HEIGHT: 1.3em; PADDING-TOP: 0px">文档管理</h4>
				<ul style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1.5em; PADDING-TOP: 0px">
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">文档管理是存储企业电子数据的基础，它可以让所有的知识文档在同一个平台上运作，在一个中央数据库中统一存储和管理各种信息和现有业务。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">在文档管理模块中，可以轻松创建，存储，搜索你需要的文档（合同，方案书，产品说明书等任何可以以文字表达下来的信息），并组织创建企业整个的知识管理库。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">文档管理还可以管理公司的内部网站和外部网站，并可设计灵活多样的信息门户。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">文档管理还提供多种知识管理工具以提升企业对知识的分享、积累、创新和利用。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">文档管理是对组织机构中的各类电子文档实现统一存储和管理，支持加密、权限定义、分类定义。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">全文检索功能使查找文件更加方便快捷，工作效率明显提高。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">文件的流通流转更加便捷，员工间文档的协作更加方便。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">降低纸质文档的依赖，节省文档管理的成本。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">重复利用历史的文档，发挥知识财富的价值。</li>
				</ul>
				<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">
						<span class="F621B">深 圳 升 蓝 版 权 所 有</span>
				</p>
				<h4 style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 1.15em; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em; COLOR: black; LINE-HEIGHT: 1.3em; PADDING-TOP: 0px">公文流转</h4>
				<ul style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1.5em; PADDING-TOP: 0px">
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">公文流转以用于处理工作中的单位内外部的各种电子公文/审批公文/通知公文，应用审批流程控制的原理实现准确、及时的公文的处理。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">公文流程的特点：</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">公文流转可自动控制公文的拟定、审核、阅读、办理、完成等公文流程的全过程工作。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">公文管理模块相对传统公文处理而言，在很大程度上提高了公文处理效率和准确性。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">公文管理使用软件自主开发的符合XPDL标准的工作流程控制模块，支持多线程、多条件的工作和审批流程。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">公文流程支持会签功能，可适用于复杂的重大合同或文件的审批。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">公文流程支持预定义流程、自定义流程、固定流程。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">公文流程的主要作业：</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">发文收文：发文起草、发布来文登记的功能，通过系统提供的在线编辑、附件上传功能可以与其它文档编辑工具进行结合。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">公文办理：根据预先设置的公文办理流程，实现公文的过程的流程控制，支持多种流程模型，支持会签、退签、修改后续流程等操作，可满足了各种复杂的公文办理流程的要求。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">催办跳转：对于超过办理期限或需特殊办理的公文，可以进行发送催办通知、邮件，跳转操作等功能实现，对于办理流程的跟踪检查、特殊流转的要求。提高公文流转办理的工作效率。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">归档销毁：通过与系统文档管理的连接，对于已完成流转办理的公文，可以进行相应的归档、销毁操作。</li>
				</ul>
				<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">
						<span class="F661A">Ｈ ｉ － Ｂ ｌ ｕ ｅ ． Ｃ ｏ ｍ</span>
				</p>
				<h4 style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 1.15em; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em; COLOR: black; LINE-HEIGHT: 1.3em; PADDING-TOP: 0px">知识管理</h4>
				<ul style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1.5em; PADDING-TOP: 0px">
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">知识仓库利用其广泛的数据知识资源，经过严密、科学的分析整理，根据条件的不同，可利用于各行各业，指导各行各业的单位实体或个人能够沿正确的发展方向发展，能够将最先进的理论、最新的技术运用到最实际的生产生活中去。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">知识管理模块，帮助企业构造适合自身的知识库：指出重要的知识对象，设计出知识管理的基础设施，评估并导入最适合企业的技术平台，发挥知识价值的功能。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">提供知识库的检索功能：用户可以按照知识树或知识项目的名称、知识项目中包含得内容进行检索。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">应用系统的整合：它可以同企业门户进行完美的整合，帮助企业减少系统管理维护的工作量。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">提供分析报表，方便优化管理：图形化的报表分析，提供各个部门、人员一段时间内的发布文章的状况，并且各篇文章的点击率。 能为某个部门或用户推荐相关的知识</li>
				</ul>
				<h4 style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 1.15em; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em; COLOR: black; LINE-HEIGHT: 1.3em; PADDING-TOP: 0px">人事管理</h4>
				<ul style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1.5em; PADDING-TOP: 0px">
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">人力资源是对组织中的人事工作进行管理：括人员的基本信息、履历信息管理、人员的调动分配、人员信息查询统计、绩效考核、培训等，。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">人力资源管理除了传统的人力资源管理的功能外，更为重要的是通过与其他模块的协同工作，实现人力资源管理的全方位化和个性化。</li>
						<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">集中的工作信息：在PMS 项目管理系统中，如果找到某一个员工，那么这个员工在公司内的所有痕迹都能被提取出来，例如有关的文档，客户，资产，产品，服务，项目，工作任务以及有关 的财务信息在相关权限控制下展现在你的面前，为科学的分析人员的情况，制订人力资源策略提供强大的工具。</li>
				</ul>&lt;!-- r.t--&gt;
<h4 style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 1.15em; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em; COLOR: black; LINE-HEIGHT: 1.3em; PADDING-TOP: 0px">客户管理</h4><ul style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1.5em; PADDING-TOP: 0px"><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">客户关系管理自动化并改善与销售、市场营销、客户服务和支持等领域的客户关系有关的商业流程。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">客户管理的核心是客户价值管理，它将客户价值分为既成价值、潜在价值和模型价值，通过一对一营销原则，满足不同价值客户的个性化需求，提高客户忠诚度和保有率，实现客户价值持续贡献，从而全面提升企业盈利能力。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">找到并成交一位新客户需要投入很大的努力，企业80%的利润来自20%的老客户，完善的客户管理是企业利润的源泉。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">客户管理是为企业在激烈市场竞争中，提供一套方便有力的管理工具，可以帮助企业为客户提供更加完备周到的服务，通过有效地进行客户资源管理，使企业的产品和服务更加满足客户的实际需要，从而给企业带来更加丰厚的效益。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">PMS 项目管理系统的客户关系管理模块，以数据仓库、商业智能、知识发现等技术方法，使得收集、整理、加工和利用客户信息的质量大大提高。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">PMS 项目管理系统还支持数据挖掘技术，根据企业客户档案的特点建立合理的数据挖掘分析模型和挖掘方法，从大量客户档案原始资料中通过数据选择和检测，揭示出隐含的具有潜在价值的信息。</li></ul>&lt;!-- r.t--&gt;
<h4 style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 1.15em; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em; COLOR: black; LINE-HEIGHT: 1.3em; PADDING-TOP: 0px">销售管理</h4><ul style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1.5em; PADDING-TOP: 0px"><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">销售管理系统主要用来处理与企业的销售活动相关的业务内容，比如与客户签订销售订单、发货、办理出库、退货、收取销售货款等，而且还可以处理应收款、预收款以及现收款等往来款业务。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">通过销售订单录入与变更，跟踪管理销售情况；</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">根据货品报价和销售数量开出销售发票，根据发货单产生结算凭证和收货单；</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">提供实际销售商品金额与帐面金额核对功能；</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">提供了客户信用额度控制功能，可以达到降低销售风险，减少应收呆账的目的，还可以实现业务员销售业绩、销售指标完成情况的考核功能。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">销售计划：销售计划的制定、额度管理、销售力量管理和地域管理。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">销售管理：为现场销售人员设计，主要功能包括联系人和客户管理、机会管理、日程安排、佣金预测、报价、报告和分析。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">销售佣金：允许销售经理创建和管理销售队伍的奖励和佣金计划，并帮助销售代表形象地了解各自的销售业绩。</li></ul>&lt;!-- r.t--&gt;
<h4 style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 1.15em; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em; COLOR: black; LINE-HEIGHT: 1.3em; PADDING-TOP: 0px">订单管理</h4><ul style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1.5em; PADDING-TOP: 0px"><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">订单管理是处理订单从录入到结清的整个过程的业务流程，主要包括：</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">订单的情况的记录、跟踪和控制，包括针对销售合同的执行；</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">控制订货价格、数量和客户、业务员信用管理；</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">随时对订单完成情况的跟踪、控制订单的实际执行；</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">根据实际补货情况实现追加执行订单；</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">进行比较并显示订单执行差异，并通过业务和分析报表进行订单执行情况的反映。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">通过订单管理的工作流程程序，订单管理控制整个交易过程，并形成记录和报告。</li></ul>&lt;!-- r.t--&gt;
<h4 style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 1.15em; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em; COLOR: black; LINE-HEIGHT: 1.3em; PADDING-TOP: 0px">合同管理</h4><ul style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1.5em; PADDING-TOP: 0px"><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">合同管理是指企业对以自身为当事人的合同依法进行订立、履行、变更、解除、转让、终止以及审查、监督、控制等一系列行为的总称。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">合同管理的订立、履行、变更、解除、转让、终止是合同管理的内容；审查、监督、控制是合同管理的手段。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">合同管理是全过程的、系统性的、动态性的。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">合同管理的全过程就是由洽谈、草拟、签订、生效开始，直至合同失效为止，不仅要管理签订前的管理，更要进行签订后的管理。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">合同管理的系统性就是凡涉及合同条款内容的各部门都要一起来管理。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">合同管理的动态性就是注重履约全过程的情况变化，特别要掌握对我方不利的变化，及时对合同进行修改、变更、补充或中止和终止。</li></ul>&lt;!-- r.t--&gt;
<h4 style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 1.15em; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em; COLOR: black; LINE-HEIGHT: 1.3em; PADDING-TOP: 0px">财务管理</h4><ul style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1.5em; PADDING-TOP: 0px"><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">用款管理：对于单位内部的各种用款进行在线提交、审批、借出登记、归还登记的管理，降低日常用款管理工作的工作强度，提高工作效率。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">报销管理：对于单位内部的各种用款进行在线提交、审批、报销登记的管理，降低日常报销管理工作的工作强度，提高工作效率。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">应收款管理：对订单的应收款进行统计和查询，并自动提醒经办人员跟踪回款。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">应付款管理：对费用产生的应付款进行统计和查询，并自动提醒经办人员及时跟踪付款。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">统计查询：支持用户按部门、款项类别、相关计划进行相应的统计查询。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">与财务软件的接口：本系统可与财务管理系统进行数据交换，实现财务管理扩展功能。</li></ul>&lt;!-- r.t--&gt;
<h4 style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 1.15em; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em; COLOR: black; LINE-HEIGHT: 1.3em; PADDING-TOP: 0px">自定义表单</h4><ul style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1.5em; PADDING-TOP: 0px"><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">自定义表单很象我们平时使用的印刷好的表格，可以用来：1.填写表格，2.通过表格执行办理或审批流程。例如：</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">《请假条》表格，由申请人填表，主管批准，人事部备案，这是一种审批流程表单，包含申请、流程、审批三种应用。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">《质量问题报告》表格，由客服填写，技术部/品质部调查，仓库补货，财务核销费用，包含填表、流程两种应用（没有审批）。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">《出库单》等各种数据表和电子表格。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">自定义表单主要有两种使用场合：</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">数据自定义表单：这种表单的条目可以任意制定，并可设置权限，没有流程控制；</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">流程自定义表单：可以灵活实现各种流程功能，流程又分为：1.工作流程，2.审批流程两种应用方式；</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">自定义表单特点：</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">具备完整的流程控制和权限管理功能，可以直接应用在审批流程或工作流程控制上；</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">支持使用明细表，在一项记录中带有多项子记录时，可以使用明细表；</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">字段可使用系统中的数据表记录建立关系（相当于数据库外键），如产品、客户、成员、项目、订单、采购单等；</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">可创建流程类型的自定义表单（如生产流程表），或用于数据类型的自定义表单（如销售计划表）</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">项目管理系统对自定义表单的定义和设置可使用模板来定义，避免管理员花费大量的时间在系统设置工作上。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">自定义表单提供直观的自定义表单设计器，用户可以创建无限数量的表单，实现扩充系统初期未设计的各种功能，以适应企业未来的发展需求。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">自定义表单极大的扩展了PMS 项目管理系统的应用，通过将各种纸质表格使用PMS系统的表单进行登记、管理，实现规范的表格的填写和存储，通过表单的流程对相关作业进行管理控制，通过报表进行统计、查询。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">客户在当前的开发的基础上，可以自己使用自定义表单、自定义字段进行功能的扩充，迅速升级系统的功能，而无须重写代码，也无须了解原来系统的设计细节。</li></ul>&lt;!-- r.t--&gt;
<h4 style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 1.15em; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em; COLOR: black; LINE-HEIGHT: 1.3em; PADDING-TOP: 0px">个人工具</h4><ul style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1.5em; PADDING-TOP: 0px"><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">个人办公提供个性化的工作界面，方便用户处理日常的工作事务。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">个人设置：</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">修改系统登录密码；</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">用户桌面设置、常用菜单设置、风格选择和设置；</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">个性化定义，包括讨论区昵称、头像、签名文件等的设置；</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">编辑用户的个人资料，其他用户可以查询用户公开信息（不公开敏感资料）；</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">个人工作平台：</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">用户桌面：集中显示成员工作相关的主要信息摘要，使员工及时了解需要办理的各项事务，进行自己的工作日程安排。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">邮件收发：通过邮件和短信功能、实现与内部或外部联系人的工作交流。具备的POP3邮件管理功能，可以实现对外部邮箱的管理功能。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">个人通讯录：通过个人通讯录可以方便、快捷的实现对于常用联系人的分类管理、综合查询等功能。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">内部消息管理：实时短消息功能可以实现员工之间在线实时交流，也可以使用短消息进行提醒闹钟设置功能。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">个人日程管理：显示个人日程相关的事件条目，便于用户对日常工作计划进行安排管理。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">流程操作：可执行流程申请提交、填写表单、上传附件、流程审批、协办、委办等操作，并可查看流程图。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">个人知识库：用来收集和管理个人关心的知识文档。</li></ul>&lt;!-- r.t--&gt;
<h4 style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 1.15em; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em; COLOR: black; LINE-HEIGHT: 1.3em; PADDING-TOP: 0px">邮件系统</h4><ul style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1.5em; PADDING-TOP: 0px"><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">邮件系统实现内部、外部邮件收发功能。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">与日常使用普通Outlook、Foxmail或Gmail、MSN等常见的邮件收发方式有显著的不同：本系统除了实现内、外邮件的收发外，关键是实现邮件信息的与内部系统的事务相关联，并实现邮件信息的共享。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">使用数据库统一存储邮件，收发的邮件自动与客户目录、联系人目录、订单、采购单、项目等系统内部表记录关联起来。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">邮件系统的信息共享：避免因某个成员请假或其他原因造成客户邮件丢失或工作停顿的风险。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">邮件系统的工作协同：与外部的邮件通常是一项事务（如报价、服务、咨询等事务），统一的邮件系统可以实现事务过程的跟踪、记录和协调。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">邮件系统支持使用邮件模板和群发，模板可实现邮件内容和格式的规范，群发可方便向客户或指定的内部、外部对象组发送单一或批量的邮件。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">内部邮件可用于内部信息传递，以及系统工作通知的手段，适合企业用户上传、互传文件或信息。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">（提示：由于强调协作共享，因此不能对邮件的私密内容提供保障）</li></ul>&lt;!-- r.t--&gt;
<h4 style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 1.15em; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em; COLOR: black; LINE-HEIGHT: 1.3em; PADDING-TOP: 0px">业务流程重组</h4><ul style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1.5em; PADDING-TOP: 0px"><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">PMS 项目管理系统采用工作流组件，用户只需填写有关表单，系统会按照定义好的流程自动往下跑，下一级审批者将会收到相关资料，并可以根据需要修改、跟踪、管理、查询、统计、打印等，大大提高了效率，提升了公司的核心竞争力。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">工作流管理系统是一个真正的“人-机”系统，用户是系统中的基本角色，是直接的任务分派对象，他可以直接看到电脑针对自己列出的“任务清单”，跟踪每一项任务的状态，或继续一项任务，而不必从一个模块退出，进入另一个模块，搜索相应任务的线索。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">工作流管理是直接面向用户的。这样，用户的任务分派和任务的完成状态，可以被最大程度地受到优化。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">工作流的定义借助于图形化工具，依照业务过程实例的情况定义相应工作的安排。</li></ul>&lt;!-- r.t--&gt;
<h4 style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 1.15em; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em; COLOR: black; LINE-HEIGHT: 1.3em; PADDING-TOP: 0px">全文检索</h4><ul style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1.5em; PADDING-TOP: 0px"><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">全文检索是从数据库的海量无序的内容中，发现有意义的文章或知识。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">企业文档种类繁多，如果没有功能强大的全文检索引擎，这些文档没有利用的价值。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">通过数据挖掘技术，对文档和数据进行量化、整理，从而实现基于知识的决策。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">在信息时代，获取信息（或文档）是一件非常容易的事，获得有效的信息才是关键中的关键。全文检索技术的目标就是帮助用户实现获取有用的信息。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">全文检索技术，可实现与Google相同的搜索引擎功能，不仅仅具有搜索功能，更能根据输入的关键字，找到最佳匹配的文档。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">全文检索技术，通过数据向量化分析，可对文本信息进行度量，在信息度量基础上建立的搜索引擎，不是简单文字的搜索，而是经过优化的与主题相关度的搜索引擎。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">全文检索技术，能根据不同的知识特征进行分类，采用多种类型的数据库进行分布式存储，能对各种结构的知识进行统一集成。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">全文检索技术，能以各种手段为普通用户提供便捷的知识查询，返回有用的结果，同时能在查询中起到导航作用。</li></ul>&lt;!-- r.t--&gt;
<h4 style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 1.15em; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em; COLOR: black; LINE-HEIGHT: 1.3em; PADDING-TOP: 0px">报表图表</h4><ul style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1.5em; PADDING-TOP: 0px"><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">PMS 项目管理系统分析和报告工具，为企业管理者进行各种商业知识分析决策支持。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">在一个充分集成的信息化环境中，信息管理相对比较容易理解，这样公司内的每个人都可以更快地制定或执行更合理的决策。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">系统的报表采用Microsoft Reporting Services高级报表技术，可以方便产生各种报表，报表可以在线浏览报表，或输出为Word、Excel等常见的文件格式。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">报表的内容可以系统中的任何记录都可以产生报表，也可以是各处室每月固定上报的月工作动态，报表的格式可以在具体实施时根据内容定制。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">报表可以以图表的形式对系统中的数据进行统计分析，图表模式的报表可以更直观在表现数据分析的结果。</li></ul>&lt;!-- r.t--&gt;
<h4 style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 1.15em; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em; COLOR: black; LINE-HEIGHT: 1.3em; PADDING-TOP: 0px">系统后台</h4><ul style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1.5em; PADDING-TOP: 0px"><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">系统管理员通过通过系统后台进行系统的设置和管理。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">系统管理员可查看系统日志、系统资源情况等信息。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">系统管理员可进行密码恢复或加密文档的解密操作。</li></ul>&lt;!-- r.t--&gt;
<h4 style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 1.15em; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em; COLOR: black; LINE-HEIGHT: 1.3em; PADDING-TOP: 0px">机构成员</h4><ul style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1.5em; PADDING-TOP: 0px"><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">建立单位的组织机构体系，为单位的成员指定所属的部门、职位。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">组织机构是PMS 项目管理系统的基础架构之一，系统的任务分配、审批流程等均需要依赖于组织机构的信息。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">首次安装系统后，通过机构成员中的功能，建立起组织机构的结构。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">PMS 项目管理系统支持动态绘制组织机构图。</li></ul>&lt;!-- r.t--&gt;
<h4 style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 1.15em; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em; COLOR: black; LINE-HEIGHT: 1.3em; PADDING-TOP: 0px">系统设置</h4><ul style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1.5em; PADDING-TOP: 0px"><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">系统设置包括：机构、角色、权限、成员、字典、属性、分类、流程、表单、菜单、语言、界面、配色、模板等系统需要的基础属性数据。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">系统设置维护为管理员提供一个方便的工具进行基础数据的录入和维护。</li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0.25em 30px; PADDING-TOP: 0px">管理员可以使用批处理工具一次编辑大量的数据，提高工作效率。</li></ul></span><img src ="http://www.blogjava.net/xpsir/aggbug/271247.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xpsir/" target="_blank">小P</a> 2009-05-18 10:16 <a href="http://www.blogjava.net/xpsir/articles/271247.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Acegi为你的Spring应用加把锁！</title><link>http://www.blogjava.net/xpsir/articles/271245.html</link><dc:creator>小P</dc:creator><author>小P</author><pubDate>Mon, 18 May 2009 02:09:00 GMT</pubDate><guid>http://www.blogjava.net/xpsir/articles/271245.html</guid><wfw:comment>http://www.blogjava.net/xpsir/comments/271245.html</wfw:comment><comments>http://www.blogjava.net/xpsir/articles/271245.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xpsir/comments/commentRss/271245.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xpsir/services/trackbacks/271245.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="WORD-SPACING: 0px; FONT: 12px Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0">
				<table cellspacing="0" cellpadding="0" width="96%" align="center" border="0">
						<tbody>
								<tr>
										<td style="FONT-SIZE: 12px; COLOR: rgb(0,0,0)"> </td>
								</tr>
								<tr>
										<td class="d_font4" style="FONT-SIZE: 14px; COLOR: rgb(0,0,0); LINE-HEIGHT: 24px">
												<p>
														<strong>简介</strong>
												</p>
												<p>对于一个典型的Web应用，完善的认证和授权机制是必不可少的，在SpringFramework中，Juergen Hoeller提供的范例JPetStore给了一些这方面的介绍，但还远远不够，Acegi是一个专门为SpringFramework提供安全机制的项目，全称为Acegi Security System for Spring，当前版本为0.5.1，就其目前提供的功能，应该可以满足绝大多数应用的需求。</p>
												<p>本文的主要目的是希望能够说明如何在基于Spring构架的Web应用中使用Acegi，而不是详细介绍其中的每个接口、每个类。注意，即使对已经存在的Spring应用，通过下面介绍的步骤，也可以马上享受到Acegi提供的认证和授权。</p>
												<p>
														<strong>基础工作</strong>
												</p>
												<p>在你的Web应用的lib中添加Acegi下载包中的acegi-security.jar</p>
												<p>
														<strong>web.xml</strong>
												</p>
												<p>实现认证和授权的最常用的方法是通过filter，Acegi亦是如此，通常Acegi需要在web.xml添加以下5个filter：</p>
												<p>
												</p>
												<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
														<tbody>
																<tr>
																		<td class="code" style="FONT-SIZE: 12px; COLOR: rgb(0,0,0)" bgcolor="#e6e6e6">
																				<pre>
																						<p>&lt;filter&gt; <br />  &lt;filter-name&gt;Acegi Channel Processing Filter&lt;/filter-name&gt; <br />  &lt;filter-class&gt;net.sf.acegisecurity.util.FilterToBeanProxy&lt;/filter-class&gt; <br />  &lt;init-param&gt; <br />    &lt;param-name&gt;targetClass&lt;/param-name&gt; <br />    &lt;param-value&gt;net.sf.acegisecurity.securechannel.ChannelProcessingFilter&lt;/param-value&gt; <br />  &lt;/init-param&gt; <br />&lt;/filter&gt; <br />&lt;filter&gt; <br />  &lt;filter-name&gt;Acegi Authentication Processing Filter&lt;/filter-name&gt; <br />  &lt;filter-class&gt;net.sf.acegisecurity.util.FilterToBeanProxy&lt;/filter-class&gt; <br />  &lt;init-param&gt; <br />    &lt;param-name&gt;targetClass&lt;/param-name&gt; <br />    &lt;param-value&gt;net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilter&lt;/param-value&gt; <br />  &lt;/init-param&gt; <br />&lt;/filter&gt; <br />&lt;filter&gt; <br />  &lt;filter-name&gt;Acegi HTTP BASIC Authorization Filter&lt;/filter-name&gt; <br />  &lt;filter-class&gt;net.sf.acegisecurity.util.FilterToBeanProxy&lt;/filter-class&gt; <br />  &lt;init-param&gt; <br />    &lt;param-name&gt;targetClass&lt;/param-name&gt; <br />    &lt;param-value&gt;net.sf.acegisecurity.ui.basicauth.BasicProcessingFilter&lt;/param-value&gt; <br />  &lt;/init-param&gt; <br />&lt;/filter&gt; <br />&lt;filter&gt; <br />  &lt;filter-name&gt;Acegi Security System for Spring Auto Integration Filter&lt;/filter-name&gt; <br />  &lt;filter-class&gt;net.sf.acegisecurity.ui.AutoIntegrationFilter&lt;/filter-class&gt; <br />&lt;/filter&gt; <br />&lt;filter&gt; <br />  &lt;filter-name&gt;Acegi HTTP Request Security Filter&lt;/filter-name&gt; <br />  &lt;filter-class&gt;net.sf.acegisecurity.util.FilterToBeanProxy&lt;/filter-class&gt; <br />  &lt;init-param&gt; <br />    &lt;param-name&gt;targetClass&lt;/param-name&gt; <br />    &lt;param-value&gt;net.sf.acegisecurity.intercept.web.SecurityEnforcementFilter&lt;/param-value&gt; <br />  &lt;/init-param&gt; <br />&lt;/filter&gt; </p>
																				</pre>
																		</td>
																</tr>
														</tbody>
												</table>
												<p>最先引起迷惑的是net.sf.acegisecurity.util.FilterToBeanProxy，Acegi自己的文档上解释是：“What  FilterToBeanProxy does is delegate the Filter's methods through to a bean which is obtained from the Spring application context. This enables the bean to benefit from the Spring application context lifecycle support and configuration flexibility.”，如希望深究的话，去看看源代码应该不难理解。</p>
												<p>再下来就是添加filter-mapping了：</p>
												<p>
												</p>
												<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
														<tbody>
																<tr>
																		<td class="code" style="FONT-SIZE: 12px; COLOR: rgb(0,0,0)" bgcolor="#e6e6e6">
																				<pre>
																						<p>&lt;filter-mapping&gt; <br />  &lt;filter-name&gt;Acegi Channel Processing Filter&lt;/filter-name&gt; <br />  &lt;url-pattern&gt;/*&lt;/url-pattern&gt; <br />&lt;/filter-mapping&gt; <br />&lt;filter-mapping&gt; <br />  &lt;filter-name&gt;Acegi Authentication Processing Filter&lt;/filter-name&gt; <br />  &lt;url-pattern&gt;/*&lt;/url-pattern&gt; <br />&lt;/filter-mapping&gt; <br />&lt;filter-mapping&gt; <br />  &lt;filter-name&gt;Acegi HTTP BASIC Authorization Filter&lt;/filter-name&gt; <br />  &lt;url-pattern&gt;/*&lt;/url-pattern&gt; <br />&lt;/filter-mapping&gt; <br />&lt;filter-mapping&gt; <br />  &lt;filter-name&gt;Acegi Security System for Spring Auto Integration Filter&lt;/filter-name&gt; <br />  &lt;url-pattern&gt;/*&lt;/url-pattern&gt; <br />&lt;/filter-mapping&gt; <br />&lt;filter-mapping&gt; <br />  &lt;filter-name&gt;Acegi HTTP Request Security Filter&lt;/filter-name&gt; <br />  &lt;url-pattern&gt;/*&lt;/url-pattern&gt; <br />&lt;/filter-mapping&gt; </p>
																				</pre>
																		</td>
																</tr>
														</tbody>
												</table> <br />这里，需要注意以下三点：<span class="Apple-converted-space"> </span><br />1) 这几个filter的顺序是不能更改的，顺序不对将无法正常工作；<span class="Apple-converted-space"> </span><br />2) 如果你的应用不需要安全传输，如https，则将"Acegi Channel Processing Filter"相关内容注释掉即可；<span class="Apple-converted-space"> </span><br />3) 如果你的应用不需要Spring提供的远程访问机制，如Hessian and Burlap，将"Acegi HTTP BASIC Authorization Filter"相关内容注释掉即可。<p>#p#</p><p><strong>applicationContext.xml</strong></p><p>接下来就是要添加applicationContext.xml中的内容了，从刚才FilterToBeanFactory的解释可以看出，真正的filter都在Spring的applicationContext中管理：</p><p>1)首先，你的数据库中必须具有保存用户名和密码的table，Acegi要求table的schema必须如下：</p><p></p><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" style="FONT-SIZE: 12px; COLOR: rgb(0,0,0)" bgcolor="#e6e6e6"><pre><p>CREATE TABLE users ( <br />    username VARCHAR(50) NOT NULL PRIMARY KEY, <br />    password VARCHAR(50) NOT NULL, <br />    enabled BIT NOT NULL <br />); <br />CREATE TABLE authorities ( <br />    username VARCHAR(50) NOT NULL, <br />    authority VARCHAR(50) NOT NULL <br />); <br />CREATE UNIQUE INDEX ix_auth_username ON authorities ( username, authority ); <br />ALTER TABLE authorities ADD CONSTRAINT fk_authorities_users foreign key (username) </p><p>REFERENCES users <br />(username); </p></pre></td></tr></tbody></table><p>2)添加访问你的数据库的datasource和Acegi的jdbcDao，如下：</p><p></p><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" style="FONT-SIZE: 12px; COLOR: rgb(0,0,0)" bgcolor="#e6e6e6"><pre><p>&lt;bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"&gt; <br />  &lt;property name="driverClassName"&gt;&lt;value&gt;${jdbc.driverClassName}&lt;/value&gt;&lt;/property&gt; <br />  &lt;property name="url"&gt;&lt;value&gt;${jdbc.url}&lt;/value&gt;&lt;/property&gt; <br />  &lt;property name="username"&gt;&lt;value&gt;${jdbc.username}&lt;/value&gt;&lt;/property&gt; <br />  &lt;property name="password"&gt;&lt;value&gt;${jdbc.password}&lt;/value&gt;&lt;/property&gt; <br />&lt;/bean&gt; <br />&lt;bean id="jdbcDaoImpl" class="net.sf.acegisecurity.providers.dao.jdbc.JdbcDaoImpl"&gt; <br />  &lt;property name="dataSource"&gt;&lt;ref bean="dataSource"/&gt;&lt;/property&gt; <br />&lt;/bean&gt; </p></pre></td></tr></tbody></table><p>3)添加DaoAuthenticationProvider：</p><p></p><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" style="FONT-SIZE: 12px; COLOR: rgb(0,0,0)" bgcolor="#e6e6e6"><pre><p>&lt;bean id="daoAuthenticationProvider" </p><p>class="net.sf.acegisecurity.providers.dao.DaoAuthenticationProvider"&gt; <br />  &lt;property name="authenticationDao"&gt;&lt;ref bean="authenticationDao"/&gt;&lt;/property&gt; <br />  &lt;property name="userCache"&gt;&lt;ref bean="userCache"/&gt;&lt;/property&gt; <br />&lt;/bean&gt; </p><p>&lt;bean id="userCache" class="net.sf.acegisecurity.providers.dao.cache.EhCacheBasedUserCache"&gt; <br />  &lt;property name="minutesToIdle"&gt;&lt;value&gt;5&lt;/value&gt;&lt;/property&gt; <br />&lt;/bean&gt; </p></pre></td></tr></tbody></table><p>如果你需要对密码加密，则在daoAuthenticationProvider中加入：&lt;property name="passwordEncoder"&gt;&lt;ref bean="passwordEncoder"/&gt;&lt;/property&gt;，Acegi提供了几种加密方法，详细情况可看包net.sf.acegisecurity.providers.encoding</p><p>4)添加authenticationManager：</p><p></p><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" style="FONT-SIZE: 12px; COLOR: rgb(0,0,0)" bgcolor="#e6e6e6"><pre><p>&lt;bean id="authenticationManager" class="net.sf.acegisecurity.providers.ProviderManager"&gt; <br />  &lt;property name="providers"&gt; <br />    &lt;list&gt; <br />      &lt;ref bean="daoAuthenticationProvider"/&gt; <br />    &lt;/list&gt; <br />   &lt;/property&gt; <br />&lt;/bean&gt; </p></pre></td></tr></tbody></table><p>5)添加accessDecisionManager：</p><p></p><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" style="FONT-SIZE: 12px; COLOR: rgb(0,0,0)" bgcolor="#e6e6e6"><pre><p> &lt;bean id="accessDecisionManager" class="net.sf.acegisecurity.vote.AffirmativeBased"&gt; <br />  &lt;property name="allowIfAllAbstainDecisions"&gt; <br />    &lt;value&gt;false&lt;/value&gt; <br />  &lt;/property&gt; <br />  &lt;property name="decisionVoters"&gt; <br />    &lt;list&gt;&lt;ref bean="roleVoter"/&gt;&lt;/list&gt; <br />  &lt;/property&gt; <br />&lt;/bean&gt; <br />&lt;bean id="roleVoter" class="net.sf.acegisecurity.vote.RoleVoter"/&gt; </p></pre></td></tr></tbody></table><p>6)添加authenticationProcessingFilterEntryPoint：</p><p></p><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" style="FONT-SIZE: 12px; COLOR: rgb(0,0,0)" bgcolor="#e6e6e6"><pre><p>&lt;bean id="authenticationProcessingFilterEntryPoint" <br />class="net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint"&gt; <br />  &lt;property name="loginFormUrl"&gt;&lt;value&gt;/acegilogin.jsp&lt;/value&gt;&lt;/property&gt; <br />  &lt;property name="forceHttps"&gt;&lt;value&gt;false&lt;/value&gt;&lt;/property&gt; <br />&lt;/bean&gt; </p></pre></td></tr></tbody></table><p>其中acegilogin.jsp是登陆页面，一个最简单的登录页面如下：</p><p></p><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" style="FONT-SIZE: 12px; COLOR: rgb(0,0,0)" bgcolor="#e6e6e6"><pre><p>&lt;%@ taglib prefix='c' uri='http://java.sun.com/jstl/core' %&gt; <br />&lt;%@ page import="net.sf.acegisecurity.ui.AbstractProcessingFilter" %&gt; <br />&lt;%@ page import="net.sf.acegisecurity.AuthenticationException" %&gt; <br />&lt;html&gt; <br />  &lt;head&gt; <br />    &lt;title&gt;Login&lt;/title&gt; <br />  &lt;/head&gt; </p><p>  &lt;body&gt; <br />    &lt;h1&gt;Login&lt;/h1&gt; <br />    &lt;form action="&lt;c:url value='j_acegi_security_check'/&gt;" method="POST"&gt; <br />      &lt;table&gt; <br />        &lt;tr&gt;&lt;td&gt;User:&lt;/td&gt;&lt;td&gt;&lt;input type='text' name='j_username'&gt;&lt;/td&gt;&lt;/tr&gt; <br />        &lt;tr&gt;&lt;td&gt;Password:&lt;/td&gt;&lt;td&gt;&lt;input type='password' name='j_password'&gt;&lt;/td&gt;&lt;/tr&gt; <br />        &lt;tr&gt;&lt;td colspan='2'&gt;&lt;input name="submit" type="submit"&gt;&lt;/td&gt;&lt;/tr&gt; <br />        &lt;tr&gt;&lt;td colspan='2'&gt;&lt;input name="reset" type="reset"&gt;&lt;/td&gt;&lt;/tr&gt; <br />      &lt;/table&gt; <br />    &lt;/form&gt; <br />  &lt;/body&gt; <br />&lt;/html&gt; </p></pre></td></tr></tbody></table><p>7)添加filterInvocationInterceptor：</p><p></p><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" style="FONT-SIZE: 12px; COLOR: rgb(0,0,0)" bgcolor="#e6e6e6"><pre><p>&lt;bean id="filterInvocationInterceptor" <br />class="net.sf.acegisecurity.intercept.web.FilterSecurityInterceptor"&gt; <br />  &lt;property name="authenticationManager"&gt; <br />    &lt;ref bean="authenticationManager"/&gt; <br />  &lt;/property&gt; <br />  &lt;property name="accessDecisionManager"&gt; <br />    &lt;ref bean="accessDecisionManager"/&gt; <br />  &lt;/property&gt; <br />  &lt;property name="objectDefinitionSource"&gt; <br />    &lt;value&gt; <br />      CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON <br />      \A/sec/administrator.*\Z=ROLE_SUPERVISOR <br />      \A/sec/user.*\Z=ROLE_TELLER <br />    &lt;/value&gt; <br />  &lt;/property&gt; <br />&lt;/bean&gt; </p></pre></td></tr></tbody></table><p>这里请注意，要objectDefinitionSource中定义哪些页面需要权限访问，需要根据自己的应用需求进行修改，我上面给出的定义的意思是这样的：</p><p>#p#</p><p>a. CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON意思是在比较请求路径时全部转换为小写<span class="Apple-converted-space"> </span><br />b. \A/sec/administrator.*\Z=ROLE_SUPERVISOR意思是只有权限为ROLE_SUPERVISOR才能访问/sec/administrator*的页面<span class="Apple-converted-space"> </span><br />c. \A/sec/user.*\Z=ROLE_TELLER意思是只有权限为ROLE_TELLER的用户才能访问/sec/user*的页面</p><p>8)添加securityEnforcementFilter：</p><p></p><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" style="FONT-SIZE: 12px; COLOR: rgb(0,0,0)" bgcolor="#e6e6e6"><pre><p>&lt;bean id="securityEnforcementFilter" </p><p>class="net.sf.acegisecurity.intercept.web.SecurityEnforcementFilter"&gt; <br />  &lt;property name="filterSecurityInterceptor"&gt; <br />    &lt;ref bean="filterInvocationInterceptor"/&gt; <br />  &lt;/property&gt; <br />  &lt;property name="authenticationEntryPoint"&gt; <br />    &lt;ref bean="authenticationProcessingFilterEntryPoint"/&gt; <br />  &lt;/property&gt; <br />&lt;/bean&gt; </p></pre></td></tr></tbody></table><p>9)添加authenticationProcessingFilter：</p><p></p><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" style="FONT-SIZE: 12px; COLOR: rgb(0,0,0)" bgcolor="#e6e6e6"><pre><p>&lt;bean id="authenticationProcessingFilter" <br />class="net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilter"&gt; <br />  &lt;property name="authenticationManager"&gt; <br />    &lt;ref bean="authenticationManager"/&gt; <br />  &lt;/property&gt; <br />  &lt;property name="authenticationFailureUrl"&gt; <br />    &lt;value&gt;/loginerror.jsp&lt;/value&gt; <br />  &lt;/property&gt; <br />  &lt;property name="defaultTargetUrl"&gt; <br />    &lt;value&gt;/&lt;/value&gt; <br />  &lt;/property&gt; <br />  &lt;property name="filterProcessesUrl"&gt; <br />    &lt;value&gt;/j_acegi_security_check&lt;/value&gt; <br />  &lt;/property&gt; <br />&lt;/bean&gt; </p></pre></td></tr></tbody></table><p>其中authenticationFailureUrl是认证失败的页面。</p><p>10)如果需要一些页面通过安全通道的话，添加下面的配置：</p><p></p><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" style="FONT-SIZE: 12px; COLOR: rgb(0,0,0)" bgcolor="#e6e6e6"><pre><p>&lt;bean id="channelProcessingFilter" </p><p>class="net.sf.acegisecurity.securechannel.ChannelProcessingFilter"&gt; <br />  &lt;property name="channelDecisionManager"&gt; <br />    &lt;ref bean="channelDecisionManager"/&gt; <br />  &lt;/property&gt; <br />  &lt;property name="filterInvocationDefinitionSource"&gt; <br />    &lt;value&gt; <br />      CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON <br />      \A/sec/administrator.*\Z=REQUIRES_SECURE_CHANNEL <br />      \A/acegilogin.jsp.*\Z=REQUIRES_SECURE_CHANNEL <br />      \A/j_acegi_security_check.*\Z=REQUIRES_SECURE_CHANNEL <br />      \A.*\Z=REQUIRES_INSECURE_CHANNEL <br />    &lt;/value&gt; <br />  &lt;/property&gt; <br />&lt;/bean&gt; </p><p>&lt;bean id="channelDecisionManager" </p><p>class="net.sf.acegisecurity.securechannel.ChannelDecisionManagerImpl"&gt; <br />  &lt;property name="channelProcessors"&gt; <br />    &lt;list&gt; <br />      &lt;ref bean="secureChannelProcessor"/&gt; <br />      &lt;ref bean="insecureChannelProcessor"/&gt; <br />    &lt;/list&gt; <br />  &lt;/property&gt; <br />&lt;/bean&gt; <br />&lt;bean id="secureChannelProcessor" </p><p>class="net.sf.acegisecurity.securechannel.SecureChannelProcessor"/&gt; <br />&lt;bean id="insecureChannelProcessor" </p><p>class="net.sf.acegisecurity.securechannel.InsecureChannelProcessor"/&gt; </p></pre></td></tr></tbody></table><p><strong>缺少了什么？</strong></p><p>Acegi目前提供了两种“secure object”，分别对页面和方法进行安全认证管理，我这里介绍的只是利用FilterSecurityInterceptor对访问页面的权限控制，除此之外，Acegi还提供了另外一个Interceptor——MethodSecurityInterceptor，它结合runAsManager可实现对对象中的方法的权限控制，使用方法可参看Acegi自带的文档和contact范例。</p><p><strong>最后要说的</strong></p><p>本来以为只是说明如何使用Acegi而已，应该非常简单，但真正写起来才发现想要条理清楚的理顺所有需要的bean还是很困难的，但愿我没有遗漏太多东西，如果我的文章有什么遗漏或错误的话，还请参看Acegi自带的quick-start范例，但请注意，这个范例是不能直接拿来用的。</p></td>
								</tr>
						</tbody>
				</table>
		</span><img src ="http://www.blogjava.net/xpsir/aggbug/271245.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xpsir/" target="_blank">小P</a> 2009-05-18 10:09 <a href="http://www.blogjava.net/xpsir/articles/271245.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>prototype.js常用函数及其用法</title><link>http://www.blogjava.net/xpsir/articles/132012.html</link><dc:creator>小P</dc:creator><author>小P</author><pubDate>Tue, 24 Jul 2007 03:26:00 GMT</pubDate><guid>http://www.blogjava.net/xpsir/articles/132012.html</guid><wfw:comment>http://www.blogjava.net/xpsir/comments/132012.html</wfw:comment><comments>http://www.blogjava.net/xpsir/articles/132012.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xpsir/comments/commentRss/132012.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xpsir/services/trackbacks/132012.html</trackback:ping><description><![CDATA[<div class=postText>
<table style="BORDER-RIGHT: gray 1px dotted; BORDER-TOP: gray 1px dotted; BORDER-LEFT: gray 1px dotted; BORDER-BOTTOM: gray 1px dotted" cellSpacing=0 cellPadding=0 width="95%" align=center border=0>
    <tbody>
        <tr>
            <td bgColor=#f1f2df height=30>
            <div class=STYLE2 align=center><span class=style1>prototype.js常用函数及其用法</span></div>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="90%" align=center>
    <tbody>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="90%" align=center>
    <tbody>
        <tr>
            <td height=10>&nbsp;</td>
        </tr>
    </tbody>
</table>
<table style="BORDER-RIGHT: gray 1px dotted; BORDER-TOP: gray 1px dotted; BORDER-LEFT: gray 1px dotted; BORDER-BOTTOM: gray 1px dotted" cellSpacing=0 cellPadding=5 width="95%" align=center border=0>
    <tbody>
        <tr>
            <td class=tr3 bgColor=#fbfbf2>prototype.js常用函数:
            <table height=1194 cellSpacing=0 cellPadding=0 width=943 border=1>
                <tbody>
                    <tr>
                        <td width=208>函数名</td>
                        <td width=385>&nbsp;解释</td>
                        <td width=340>&nbsp;举例</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Element.toggle</td>
                        <td>&nbsp;交替隐藏或显示</td>
                        <td>&nbsp;Element.toggle(''div1'',''div2'')</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Element.hide</td>
                        <td>&nbsp;隐藏</td>
                        <td>&nbsp;Element.hide(''div1'',''div2'')</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Element.show</td>
                        <td>显示</td>
                        <td>&nbsp;Element.show(''div1'',''div2'')</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Element.remove</td>
                        <td>&nbsp;删除</td>
                        <td>&nbsp;Element.remove(''div1'',''div2'')</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Element.getHeight</td>
                        <td>&nbsp;取得高度</td>
                        <td>&nbsp;Element.getHeight(''div1'')</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Toggle.display</td>
                        <td>&nbsp;和Element.toggle相同</td>
                        <td>&nbsp;Toggle.display(''div1'',''div2'')</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Insertion.Before</td>
                        <td>&nbsp;在DIV前插入文字</td>
                        <td>&nbsp;Insertion.Before(''div1'',''my content'')</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Insertion.After</td>
                        <td>&nbsp;在DIV后插入文字</td>
                        <td>&nbsp;Insertion.After(''div1'',''my content'')</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Insertion.Top</td>
                        <td>&nbsp;在DIV里最前插入文字</td>
                        <td>&nbsp;Insertion.Top(''div1'',''this is a text'')</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Insertion.Bottom</td>
                        <td>&nbsp;在DIV里最后插入文字</td>
                        <td>&nbsp;Insertion.Bottom(''div1'',''this is a text'')</td>
                    </tr>
                    <tr>
                        <td>&nbsp;PeriodicalExecuter</td>
                        <td>&nbsp;以给定频率调用一段JavaScript</td>
                        <td>&nbsp;PeridicalExecutor(test, 1)"这里test是Javascript的函数,1是频率(1秒).</td>
                    </tr>
                    <tr>
                        <td>&nbsp;$</td>
                        <td>&nbsp;取得一个DIV, 相当于getElementById()</td>
                        <td>&nbsp;$(''div1'')</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Field.clear</td>
                        <td>&nbsp;清空一个输入框</td>
                        <td>&nbsp;Field.clear(''textfield1'')</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Field.focus</td>
                        <td>把&nbsp;焦点集中在输入框上</td>
                        <td>&nbsp;Field.focus(''select1'')</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Field.present</td>
                        <td>&nbsp;判断内容是否为空</td>
                        <td>&nbsp;alert(Field.present(''textfield1''))"</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Field.select</td>
                        <td>&nbsp;选择输入框的内容</td>
                        <td>&nbsp;Field.select(''textfield1'')"</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Field.activate</td>
                        <td>&nbsp;把&nbsp;焦点集中在输入框上并选择输入框的内容</td>
                        <td>&nbsp;Field.activate(''textfield1'')"</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Form.serialize</td>
                        <td>&nbsp;把表格内容转化成string</td>
                        <td>&nbsp;</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Form.getElements</td>
                        <td>&nbsp;取得表格内容为数组形式</td>
                        <td>&nbsp;</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Form.disable</td>
                        <td>&nbsp;disable表格所有内容</td>
                        <td>&nbsp;Form.disable(''form1'') (这个好象不work)</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Form.focusFirstElement</td>
                        <td>&nbsp;把焦点集中在表格第一个元素上</td>
                        <td>&nbsp;Form.focusFirstElement(''form1'')</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Form.reset</td>
                        <td>&nbsp;Reset表格</td>
                        <td>Form.reset(''form1'')</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Form.Element.getValue</td>
                        <td>&nbsp;取得表格输入框的值</td>
                        <td>&nbsp;Form.Element.getValue(''text1'')</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Form.Element.serialize</td>
                        <td>&nbsp;&nbsp;把表格中输入框内容转化成string</td>
                        <td>&nbsp;Form.Element.serialize(''text1'')</td>
                    </tr>
                    <tr>
                        <td>&nbsp;$F</td>
                        <td>&nbsp;等同于Form.Element.getValue()</td>
                        <td>&nbsp;$F(''text1'')</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Effect.Highlight</td>
                        <td>&nbsp;高亮特效.</td>
                        <td>&nbsp;Effect.Highlight(''text1'')</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Effect.Fade</td>
                        <td>&nbsp;褪色特效</td>
                        <td>&nbsp;</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Effect.Scale</td>
                        <td>&nbsp;放大缩小(百分比）</td>
                        <td>
                        <p>Effect.Scale(''text1'', 200)<br>这里200 = 200%, 即两倍</p>
                        </td>
                    </tr>
                    <tr>
                        <td>&nbsp;Effect.Squish</td>
                        <td>&nbsp;消失特效．文字缩小后消失</td>
                        <td>&nbsp;Effect.Squish(''text1'')</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Effect.Puff</td>
                        <td>&nbsp;消失特效．文字放大后消失</td>
                        <td>&nbsp;Effect.Puff(''text1'')</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Effect.Appear</td>
                        <td>&nbsp;出现特效</td>
                        <td>&nbsp;</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Effect.ContentZoom</td>
                        <td>&nbsp;ZOOM特效．</td>
                        <td>&nbsp;</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Ajax.Request</td>
                        <td>&nbsp;传送Ajax请求给服务器</td>
                        <td>&nbsp;Ajax.Request(''http://server/s.php'')</td>
                    </tr>
                    <tr>
                        <td>&nbsp;Ajax.Updater</td>
                        <td>&nbsp;传送Ajax请求给服务器并用答复的结果更新指定的Container</td>
                        <td>&nbsp;Ajax.Updater(''text1'',''http://server/s.php'')</td>
                    </tr>
                </tbody>
            </table>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基本用法:prototype.js给每个主要的类都分了一个Class,使用起来很方便.要产生特定的效果,只要用new Class.function(&lt;argument&gt;)就可以了.例如:</p>
            <pre>&lt;DIV id="div1"&gt;&lt;a href="#" onclick="new Element.toggle('div2')"&gt;Click Me&lt;/a&gt;&lt;/DIV&gt;<br>&lt;DIV id="div2"&gt;Hello!&lt;/DIV&gt;</pre>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当点击Click Me的时候,div2就会交替隐藏或显示.注意,你可以给toggle加上无限个parameter,比如Element.toggle(''div2'',''div3'',''div4'',...)</p>
            </td>
        </tr>
    </tbody>
</table>
&nbsp;<br></div><img src ="http://www.blogjava.net/xpsir/aggbug/132012.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xpsir/" target="_blank">小P</a> 2007-07-24 11:26 <a href="http://www.blogjava.net/xpsir/articles/132012.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>精通ejb</title><link>http://www.blogjava.net/xpsir/articles/131600.html</link><dc:creator>小P</dc:creator><author>小P</author><pubDate>Sat, 21 Jul 2007 03:20:00 GMT</pubDate><guid>http://www.blogjava.net/xpsir/articles/131600.html</guid><wfw:comment>http://www.blogjava.net/xpsir/comments/131600.html</wfw:comment><comments>http://www.blogjava.net/xpsir/articles/131600.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xpsir/comments/commentRss/131600.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xpsir/services/trackbacks/131600.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 总 揽 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一、Server方组件结构 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EJB是一种Server方的组件结构，它可以非常简单的开发基于java的企业级的分布式对象应用。使用EJB可以开发出易升级的、可靠的、安全的应用程序，而不用独立开发复杂的分布式对象框架；EJB可以迅速开发服务方应用程序，快速建立基于java...&nbsp;&nbsp;<a href='http://www.blogjava.net/xpsir/articles/131600.html'>阅读全文</a><img src ="http://www.blogjava.net/xpsir/aggbug/131600.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xpsir/" target="_blank">小P</a> 2007-07-21 11:20 <a href="http://www.blogjava.net/xpsir/articles/131600.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Java实现网络传输数据的压缩</title><link>http://www.blogjava.net/xpsir/articles/28882.html</link><dc:creator>小P</dc:creator><author>小P</author><pubDate>Sat, 21 Jan 2006 08:07:00 GMT</pubDate><guid>http://www.blogjava.net/xpsir/articles/28882.html</guid><wfw:comment>http://www.blogjava.net/xpsir/comments/28882.html</wfw:comment><comments>http://www.blogjava.net/xpsir/articles/28882.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xpsir/comments/commentRss/28882.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xpsir/services/trackbacks/28882.html</trackback:ping><description><![CDATA[<TABLE class=border cellSpacing=0 cellPadding=2 width="100%" align=center border=0>
<TBODY>
<TR vAlign=center align=middle>
<TD colSpan=2 height=40><FONT size=4><STRONG>使用Java实现网络传输数据的压缩</STRONG></FONT> </TD></TR>
<TR class=tdbg_rightall align=middle>
<TD colSpan=2>［ 作者：liudong&nbsp;&nbsp;&nbsp;&nbsp;转贴自：Matrix&nbsp;&nbsp;&nbsp;&nbsp;点击数：150&nbsp;&nbsp;&nbsp;&nbsp;更新时间：2005-6-1&nbsp;&nbsp;&nbsp;&nbsp;文章录入：<A href="http://www.xsail.net/UserInfo.asp?UserID=3">sailing</A> ］ 
<HR width="80%" color=#ff3333 noShade SIZE=2>
</TD></TR>
<TR>
<TD colSpan=2>
<TABLE style="WORD-BREAK: break-all" cellSpacing=5 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD vAlign=top width="98%" height=200><FONT face=宋体 size=3>本周,我回答了两个使用Java进行数据压缩的问题.<BR><BR>第一个问题是:&nbsp;我怎样才能压缩那些不在文件中的数据.<BR><BR>第二个问题是:&nbsp;我以极大的热情阅读了Todd&nbsp;Sundsted的"压缩你的数据,从而提高你的网络应用程序的性能",但是读完后我却有点失望.当我读到文章标题时我很高兴.我想我总算找到了解决问题的办法了.<BR><BR>在我们的公司,我们试图提高一个组织数据的RMI应用程序的性能.服务器端进行了绝大部分的处理和优化.我们花了一年半的时间去提高性能,但是现在看来瓶颈在于数据的传输上.在一天的任何时间内,我们都有可能在客户和服务器之间传送成千上万的数据.<BR><BR>一种可能的解决办法,我建议我们能够在把数据返回给客户端时先压缩这些数据,这在Todd的文章中已经说得很清楚了.但是,文章中的例子却是压缩文件,而不是我们所需要的----对数据进行压缩.<BR><BR>在RMI中的实现中,我们先从数据库取得数据,再把数据放入一个列表中,接着把这个列表返回给客户端,最后再把它们插入JTable中.我想在把数据返回给客户时,首先把列表中的数据压缩,然后在客户端解压缩,最后把数据插入到表格中.<BR><BR>这样的想法可行吗?<BR><BR>A:最近我收到了一些关于Todd的文章的疑问.很多读者看起来对文章中的举例很疑惑.因为文章中的例子是以文件压缩为核心的.<BR><BR>首先回答第一个问题,当你使用ZipInputStream&nbsp;和&nbsp;ZipOutputStream&nbsp;并没有强制你必须使用文件.唯一要注意的是你必须把数据转换为字节数组的形式.<BR><BR>第二个问题比较棘手.在网络中,以RMI方式通信就需要作一些调整了.为了在传送数据之前就让RMI进行数据压缩,你必须创建一个能够压缩数据的新的套接字.然后,当你创建了一个套接字后,你得告诉RMI使用这一套接字.<BR><BR>以下是创建一个RMI形式的套接字的简要步骤:<BR><BR>1:选择或者创建一个新的套接字.(可以参看SUN'S的"创建一个典型的套接字").<BR><BR>2:创建一个服务器端的套接字.<BR><BR>3:创建一个RMIClientSocketFactory<BR><BR>4:创建一个RMIServerSocketFactory<BR><BR>5:创建一个继承了UnicastRemoteObjec的远程对象,从而使用新的factories.<BR><BR>根据这一大致的想法,我们来看每一步如何具体的实现.<BR><BR>步骤1:&nbsp;创建ZipSocket&nbsp;<BR><BR>由于要进行Zip压缩,我们重新创建这样的套接字<BR><BR>mport&nbsp;java.io.InputStream;<BR><BR>import&nbsp;java.io.OutputStream;<BR><BR>import&nbsp;java.util.zip.ZipInputStream;<BR><BR>import&nbsp;java.util.zip.ZipOutputStream;<BR><BR>import&nbsp;java.net.Socket;<BR><BR>public&nbsp;class&nbsp;ZipSocket&nbsp;extends&nbsp;Socket&nbsp;{<BR><BR><BR><BR>private&nbsp;InputStream&nbsp;in;<BR><BR>private&nbsp;OutputStream&nbsp;out;<BR><BR><BR><BR>public&nbsp;ZipSocket()&nbsp;{&nbsp;super();&nbsp;}<BR><BR><BR><BR>public&nbsp;ZipSocket(String&nbsp;host,&nbsp;int&nbsp;port)&nbsp;<BR><BR>throws&nbsp;IOException&nbsp;{<BR><BR>super(host,&nbsp;port);<BR><BR>}<BR><BR><BR><BR>public&nbsp;InputStream&nbsp;getInputStream()&nbsp;<BR><BR>throws&nbsp;IOException&nbsp;{<BR><BR>if&nbsp;(in&nbsp;==&nbsp;null)&nbsp;{<BR><BR>in&nbsp;=&nbsp;new&nbsp;ZipInputStream(super.getInputStream());<BR><BR>}<BR><BR>return&nbsp;in;<BR><BR>}<BR><BR><BR><BR>public&nbsp;OutputStream&nbsp;getOutputStream()&nbsp;<BR><BR>throws&nbsp;IOException&nbsp;{<BR><BR>if&nbsp;(out&nbsp;==&nbsp;null)&nbsp;{<BR><BR>out&nbsp;=&nbsp;new&nbsp;ZipOutputStream(super.getOutputStream());<BR><BR>}<BR><BR>return&nbsp;out;<BR><BR>}<BR><BR><BR><BR>public&nbsp;synchronized&nbsp;void&nbsp;close()&nbsp;throws&nbsp;IOException&nbsp;{<BR><BR>OutputStream&nbsp;o&nbsp;=&nbsp;getOutputStream();<BR><BR>o.flush();<BR><BR>super.close();<BR><BR>}<BR><BR>}<BR><BR><BR><BR><BR><BR>步骤2:&nbsp;创建ZipServerSocket&nbsp;<BR><BR><BR><BR>import&nbsp;java.net.ServerSocket;<BR><BR>import&nbsp;java.net.Socket;<BR><BR>import&nbsp;java.io.IOException;<BR><BR><BR><BR>public&nbsp;class&nbsp;ZipServerSocket&nbsp;extends&nbsp;ServerSocket<BR><BR>{<BR><BR>public&nbsp;ZipServerSocket(int&nbsp;port)&nbsp;throws&nbsp;IOException&nbsp;{&nbsp;<BR><BR>super(port);<BR><BR>}<BR><BR><BR><BR>public&nbsp;Socket&nbsp;accept()&nbsp;throws&nbsp;IOException&nbsp;{&nbsp;<BR><BR>Socket&nbsp;socket&nbsp;=&nbsp;new&nbsp;ZipSocket();<BR><BR>implAccept(socket);<BR><BR>return&nbsp;socket;<BR><BR>}<BR><BR>}<BR><BR><BR><BR><BR><BR>步骤3:创建ZipClientSocketFactory&nbsp;<BR><BR>客户端的factory的创建必须遵循以下的形式:&nbsp;<BR><BR><BR><BR>import&nbsp;java.io.IOException;&nbsp;<BR><BR>import&nbsp;java.io.Serializable;&nbsp;<BR><BR>import&nbsp;java.net.Socket;&nbsp;<BR><BR>import&nbsp;java.rmi.server.RMIClientSocketFactory;<BR><BR><BR><BR>public&nbsp;class&nbsp;ZipClientSocketFactory&nbsp;<BR><BR>implements&nbsp;RMIClientSocketFactory,&nbsp;Serializable&nbsp;{&nbsp;<BR><BR>public&nbsp;Socket&nbsp;createSocket(String&nbsp;host,&nbsp;int&nbsp;port)&nbsp;<BR><BR>throws&nbsp;IOException&nbsp;{&nbsp;<BR><BR>ZipSocket&nbsp;socket&nbsp;=&nbsp;new&nbsp;ZipSocket(host,&nbsp;port);&nbsp;<BR><BR>return&nbsp;socket;&nbsp;<BR><BR>}&nbsp;<BR><BR>}<BR><BR><BR><BR>步骤4:创建ZipServerSocketFactory&nbsp;<BR><BR><BR><BR>import&nbsp;java.io.IOException;&nbsp;<BR><BR>import&nbsp;java.io.Serializable;&nbsp;<BR><BR>import&nbsp;java.net.ServerSocket;&nbsp;<BR><BR>import&nbsp;java.rmi.server.RMIServerSocketFactory;&nbsp;<BR><BR><BR><BR>public&nbsp;class&nbsp;ZipServerSocketFactory&nbsp;<BR><BR>implements&nbsp;RMIServerSocketFactory,&nbsp;Serializable&nbsp;{&nbsp;<BR><BR><BR><BR>public&nbsp;ServerSocket&nbsp;createServerSocket(int&nbsp;port)&nbsp;<BR><BR>throws&nbsp;IOException&nbsp;{&nbsp;<BR><BR>ZipServerSocket&nbsp;server&nbsp;=&nbsp;new&nbsp;ZipServerSocket(port);&nbsp;<BR><BR>return&nbsp;server;&nbsp;<BR><BR>}&nbsp;<BR><BR>}<BR><BR><BR><BR>步骤5:&nbsp;创建一个继承了UnicastRemoteObjec的远程对象,从而使用新的factories.&nbsp;<BR><BR>public&nbsp;class&nbsp;YourRMIObject&nbsp;extends&nbsp;UnicastRemoteObject&nbsp;{<BR><BR><BR><BR>public&nbsp;YourRemoteObject(&nbsp;int&nbsp;port&nbsp;)&nbsp;{<BR><BR>super(&nbsp;port,&nbsp;new&nbsp;ZipClientSocketFactory(),&nbsp;new&nbsp;ZipServerSocketFactory()&nbsp;);<BR><BR>}<BR><BR><BR><BR>//&nbsp;剩下的是你自己的程序实现<BR><BR><BR><BR>}<BR><BR><BR><BR>现在你的通信数据得到了压缩.<BR><BR><BR><BR><BR><BR>关于作者:<BR><BR>Tony&nbsp;Sintes&nbsp;是一个独立咨询人,同时也是First&nbsp;Class&nbsp;Consulting,&nbsp;Inc.&nbsp;的创始人.这一咨询公司主要致力与对各个不同的企业系统进行量身定制和培训&nbsp;.&nbsp;业余时间,Tony&nbsp;是一个积极的自由作家,同时也是Sams出版的&lt;&lt;21天学通面向对象编程&gt;&gt;的作者&nbsp;(Sams,&nbsp;2001;&nbsp;ISBN:&nbsp;0672321092).&nbsp;<BR></FONT></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/xpsir/aggbug/28882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xpsir/" target="_blank">小P</a> 2006-01-21 16:07 <a href="http://www.blogjava.net/xpsir/articles/28882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>qq</title><link>http://www.blogjava.net/xpsir/articles/28022.html</link><dc:creator>小P</dc:creator><author>小P</author><pubDate>Sat, 14 Jan 2006 06:22:00 GMT</pubDate><guid>http://www.blogjava.net/xpsir/articles/28022.html</guid><wfw:comment>http://www.blogjava.net/xpsir/comments/28022.html</wfw:comment><comments>http://www.blogjava.net/xpsir/articles/28022.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xpsir/comments/commentRss/28022.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xpsir/services/trackbacks/28022.html</trackback:ping><description><![CDATA[<FORM name=qqform action=http://www.mmbest.com/html/QQ/go.asp method=post target=_blank>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD height=30 style="FONT-SIZE: 12px">与我聊天吧<INPUT id=hiden type=hidden value=ok name=hiden><INPUT id=qqnum3 maxLength=9 value=51565441 name=qqnum  style="FONT-SIZE: 12px"> <INPUT style="FONT-SIZE: 12px" onclick="document.forms[0].action='http://www.mmbest.com/html/QQ/go.asp';document.forms[0].target='_blank';document.forms[0].submit();" type=button value=聊天 name=Submit> </TD></TR></TBODY></TABLE></FORM><img src ="http://www.blogjava.net/xpsir/aggbug/28022.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xpsir/" target="_blank">小P</a> 2006-01-14 14:22 <a href="http://www.blogjava.net/xpsir/articles/28022.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle+jsp中blob类型存储大文本问题解决方法</title><link>http://www.blogjava.net/xpsir/articles/23186.html</link><dc:creator>小P</dc:creator><author>小P</author><pubDate>Fri, 09 Dec 2005 10:06:00 GMT</pubDate><guid>http://www.blogjava.net/xpsir/articles/23186.html</guid><wfw:comment>http://www.blogjava.net/xpsir/comments/23186.html</wfw:comment><comments>http://www.blogjava.net/xpsir/articles/23186.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xpsir/comments/commentRss/23186.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xpsir/services/trackbacks/23186.html</trackback:ping><description><![CDATA[oracle+jsp中blob类型存储大文本问题解决方法<BR>oracle 存储大文本一直是一个棘手的问题。<BR>一、存数据库：<BR>&lt;%@page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %&gt;<BR>&lt;%<BR>//定义变量<BR>java.sql.Connection conn; //数据库连接对象<BR>String sql;<BR>long id;<BR>ResultSet rs;<BR>Statement stmt,stmt1;
<P>java.sql.DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); //装载JDBC驱动程序<BR>conn = java.sql.DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.2:1521:lqxm","lqxm","lqxm"); //连接数据库</P>
<P>request.setCharacterEncoding("GBK");<BR>String title = request.getParameter("title");<BR>String content = request.getParameter("content");<BR>String sort = request.getParameter("sort");<BR>String type = request.getParameter("type");<BR>String rq = request.getParameter("rq");<BR>String qy = request.getParameter("qy");<BR>//插入数据,此时blob字段中插入的是空值<BR>sql="insert into t_flfg (xlh,title,content,rq,sort,type,qy) ";<BR>sql=sql+"Values(FLFG_SEQ.NEXTVAL,'" + title + "',empty_clob(),'" + rq + "','" + sort + "','" + type + "','" + qy + "')";<BR>stmt=conn.createStatement();<BR>stmt.executeUpdate(sql);<BR>conn.commit();</P>
<P>conn.setAutoCommit(false);<BR>stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENS99vIVE,ResultSet.CONCUR_UPDATABLE);<BR>//取得刚才插入的ID<BR>sql="select max(xlh) as xlh from t_flfg ";<BR>rs=stmt.executeQuery(sql);<BR>if(rs.next()) {<BR>id=rs.getInt("xlh");<BR>}<BR>rs.close();</P>
<P>sql = "select content from t_flfg where xlh="+id+" for update";<BR>rs = stmt.executeQuery(sql);<BR>if (rs.next()) {<BR>oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob(1);<BR>clob.putString(1, content);<BR>sql = "update t_flfg set content=? where xlh=" + id + ""; //将大文本更新进去，呵呵<BR>PreparedStatement pstmt = conn.prepareStatement(sql);<BR>pstmt.setClob(1, clob);<BR>pstmt.executeUpdate();<BR>}</P>
<P>conn.commit();<BR>stmt.close();<BR>conn.close();<BR>%&gt;</P>
<P>二、检索显示数据：<BR>&lt;%<BR>ResultSet rs = flfgSave.searchOneInfo(request.getParameter("xlh")); //查询数据库获取记录集<BR>rs.next();</P>
<P>int y;<BR>String content = "";<BR>oracle.sql.CLOB clob1;<BR>char ac[] = new char[299];</P>
<P>String title = rs.getString("title");</P>
<P>clob1 = (oracle.sql.CLOB)rs.getObject("content");<BR>Reader reader = clob1.getCharacterStream();<BR>while((y = reader.read(ac, 0, 299)) != -1)<BR>content += new String(ac, 0, y); //这就是取出来的大文本<BR>%&gt; </P><img src ="http://www.blogjava.net/xpsir/aggbug/23186.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xpsir/" target="_blank">小P</a> 2005-12-09 18:06 <a href="http://www.blogjava.net/xpsir/articles/23186.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>应用Java技术开发WAP应用程序</title><link>http://www.blogjava.net/xpsir/articles/21931.html</link><dc:creator>小P</dc:creator><author>小P</author><pubDate>Wed, 30 Nov 2005 03:42:00 GMT</pubDate><guid>http://www.blogjava.net/xpsir/articles/21931.html</guid><wfw:comment>http://www.blogjava.net/xpsir/comments/21931.html</wfw:comment><comments>http://www.blogjava.net/xpsir/articles/21931.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xpsir/comments/commentRss/21931.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xpsir/services/trackbacks/21931.html</trackback:ping><description><![CDATA[<B>序言：</B><BR>　　<BR>　　由于前些时间，一些matrixer常问关于j2me中使用Pak文件的问题。本人虽学艺不深，但满怀热心的做了一番探索，现将制作Pak文件的看法和方法公布出来，大家多多提意见。<BR>　　<BR>　　<B>一、什么是Pak文件</B>：<BR>　　<BR>　　Pak文件就是将多个文件打包为一个单独文件，在这个文件中保存着多个文件的数据，当然还有一些描述文件结构的数据。所以将“Pak”作为文件的后缀是一种常规的用法，大家可以自定义其它的文件后缀。<BR>　　<BR>　　<B>二、为什么使用Pak文件：</B><BR>　　<BR>　　由于MIDP对发布安装的j2me程序大小进行了限制，所以缩小发布程序就意味着能够提供更多的程序或者内容（如图片、音乐）给用户。而通过研究发现zip/jar算法对大文件的压缩率高于对等量的多个小文件的压缩率。<BR>　　<BR>　　当然还有其它方法，这里简单做一下讨论比如使用混淆器ProGuard的“-overloadaggressively”选项使jar文件缩小，但也会导致一些错误，因为这种方法生成jar中的class符合java byte code标准，但是与java语法相悖，严重的可能造成一些jre对Object的序列化错误。<BR>　　<BR>　　所以使用Pak方法将程序中要用到的资源（图片、音乐、文本）组合为单一文件是一个安全有效的方法。而且对于一些商用程序，完全可以在pak文件中对文件数据进行加密，很好的保护了作者和公司的权益。本人的sample中使用了简单的“加减法”加密，对于手机这类设备来讲是一个效率较高的选择。<BR>　　<BR>　　<B>三、Pak文件的结构：</B><BR>　　<BR>　　大家可以自己设计Pak文件结构，本人这里只是抛砖引玉的作个sample。下面就是本人设计的Pak文件结构：<BR>　　<BR>　　PAK File Header：Pak文件的头部<BR>　　<BR>　　* 签名：6字节char数组 * 版本号：32位float * 文件table数量：32位整数 * 密码行为：8位字节 * 密码：8位字节 * 文件唯一ID：10字节char数组 * 保留位：32位整数(4字节)<BR>　　<BR>　　File Table：Pak文件中包含文件的列表，在一个Pak文件中一个被包含的文件对应一个File Table。<BR>　　<BR>　　* 文件名：30字节char数组 * 文件大小：32位整型 * 文件在pak文件中的位移：32位整数<BR>　　<BR>　　Concatenated File Data：按File Table的顺序连接在一起的文件数据。<BR>　　* 文件数据<BR>　　<BR>　　<B>四、程序框架：</B><BR>　　<BR>　　说明：由于Pak文件的制作和使用分别要使用两个java应用领域：j2se和j2me，所以本人将PakUtil类制作了2个版本（j2se和j2me）。<BR>　　<BR>　　程序框架如下：<BR>　　1。PakHeader类，定义了Pak文件头。<BR>　　2。PakFileTable类，定义Pak文件table。<BR>　　3。PakUtil类（j2se版），具备两个功能：将多个png图片合成一个Pak文件，并使用简单的加减加密法对其进行加密；从Pak文件中取出png图片，构造byte数组（可以用来构造Image对象）或者写为文件。<BR>　　PakUtil类（j2me版），具备的功能：从Pak文件中取出png图片，构造byte数组（可以用来构造Image对象）。<BR>　　<BR>　　<B>五、PakHeader和PakFileTable类</B>：<BR>　　<BR>　　PakHeader.java：<BR>　　package cn.org.matrix.gmatrix.gameLab.util.pak;/** * Pak文件头： * 结构： *<BR>　　签名：6字节char数组 *　 版本号：32位float *<BR>　　文件table数量：32位整数 *<BR>　　密码行为：8位字节 *　 密码：8位字节 *<BR>　　文件唯一ID：10字节char数组 *<BR>　　保留位：32位整数(4字节) * @author cleverpig * */class PakHeader {<BR>　　//定义文件唯一ID长度<BR>　　public static final int UNIQUEID_LENGTH=10;<BR>　　//定义文件签名长度<BR>　　public static final int SIGNATURE_LENGTH=6;<BR>　　//定义加法运算<BR>　　public static final int ADDITION_CIPHERACTION=0;<BR>　　//定义减法运算<BR>　　public static final int SUBTRACT_CIHOERACTION=1;<BR>　　//文件签名<BR>　　private char[] signature=new char[SIGNATURE_LENGTH];<BR>　　//版本号<BR>　　private float version=0f;<BR>　　//文件table数量<BR>　　private long numFileTableEntries=0;<BR>　　//密码使用方法：在原数据上进行加法还是减法<BR>　　private byte cipherAction=ADDITION_CIPHERACTION;<BR>　　//密码值<BR>　　private byte cipherValue=0x00;<BR>　　//唯一ID<BR>　　private char[] uniqueID=new char[UNIQUEID_LENGTH];<BR>　　//保留的4字节<BR>　　private long reserved=0;<BR>　　public PakHeader(){<BR>　　}<BR>　　/**<BR>　　* 构造方法<BR>　　* @param signature 签名<BR>　　* @param version 版本<BR>　　* @param numFileTableEntries 文件table数量<BR>　　* @param cipherAction 密码使用方法<BR>　　* @param cipherValue 密码值<BR>　　* @param uniqueID 唯一ID<BR>　　* @param reserved 保留的2字节<BR>　　*/<BR>　　public PakHeader(char[] signature,float version,<BR>　　long numFileTableEntries,byte cipherAction,<BR>　　byte cipherValue,char[] uniqueID,long reserved){<BR>　　for(int i=0;i&lt;SIGNATURE_LENGTH;this.signature[i]=signature[i],i++)<BR>　　;<BR>　　this.version=version;<BR>　　this.cipherAction=cipherAction;<BR>　　this.numFileTableEntries=numFileTableEntries;<BR>　　this.cipherValue=cipherValue;<BR>　　for(int i=0;i&lt;UNIQUEID_LENGTH;this.uniqueID[i]=uniqueID[i],i++);<BR>　　this.reserved=reserved;<BR>　　}　　　　　　　　<BR>　　public byte getCipherValue() {<BR>　　return cipherValue;　　　　<BR>　　}<BR>　　public void setCipherValue(byte cipherValue) {<BR>　　this.cipherValue = cipherValue;<BR>　　}<BR>　　public long getNumFileTableEntries() {<BR>　　return numFileTableEntries;<BR>　　}<BR>　　public void setNumFileTableEntries(long numFileTableEntries) {<BR>　　this.numFileTableEntries = numFileTableEntries;<BR>　　}<BR>　　public long getReserved() {<BR>　　return reserved;<BR>　　}<BR>　　public void setReserved(long reserved) {<BR>　　this.reserved = reserved;<BR>　　}<BR>　　public char[] getUniqueID() {<BR>　　return uniqueID;<BR>　　}<BR>　　public void setUniqueID(char[] uniqueID) {<BR>　　for(int i=0;i&lt;UNIQUEID_LENGTH;this.uniqueID[i]=uniqueID[i],i++)<BR>　　;　　　　<BR>　　}　　　　<BR>　　public float getVersion() {<BR>　　return version;<BR>　　}　　　　<BR>　　public void setVersion(float version) {<BR>　　this.version = version;<BR>　　}<BR>　　public byte getCipherAction() {<BR>　　return cipherAction;<BR>　　}<BR>　　public void setCipherAction(byte cipherAction) {<BR>　　this.cipherAction = cipherAction;<BR>　　}<BR>　　public char[] getSignature() {<BR>　　return signature;<BR>　　}<BR>　　public void setSignature(char[] signature) {<BR>　　for(int i=0;i&lt;SIGNATURE_LENGTH;this.signature[i] = signature[i],i++)<BR>　　;　　　　<BR>　　}<BR>　　/**<BR>　　* 返回PakHeader的大小<BR>　　* @return 返回PakHeader的大小<BR>　　*/　　　　<BR>　　public static int size(){<BR>　　return SIGNATURE_LENGTH+4+4+1+1+UNIQUEID_LENGTH+4;<BR>　　}<BR>　　public String toString(){<BR>　　String result="";<BR>　　result+="\t签名:"+new String(this.signature).trim()<BR>　　+"\t版本号:"+this.version<BR>　　+"\t文件table数量:"+this.numFileTableEntries<BR>　　+"\t密码行为:" +this.cipherAction<BR>　　+"\t密码:"+this.cipherValue　　　　　　　　　　　　<BR>　　+"\t文件唯一ID:"+new String(this.uniqueID).trim()　　　　　　　　　　　　+"\t保留位:"+this.reserved;　　　　　　　　<BR>　　return result;　　　　<BR>　　}}<BR>　　<BR>　　PakFileTable.java<BR>　　package cn.org.matrix.gmatrix.gameLab.util.pak;/** * Pak文件table类 * 文件table结构： *<BR>　　文件名：30字节char数组 *<BR>　　文件大小：32位整型 *<BR>　　文件在pak文件中的位移：32位整数 * @author cleverpig * */class PakFileTable {<BR>　　public static final int FILENAME_LENGTH=30;<BR>　　//文件名<BR>　　private char[] fileName=new char[FILENAME_LENGTH];<BR>　　//文件大小<BR>　　private long fileSize=0L;<BR>　　//文件在pak文件中的位移<BR>　　private long offSet=0L;<BR>　　public PakFileTable(){<BR>　　}<BR>　　/**<BR>　　* 构造方法<BR>　　* @param fileName 文件名<BR>　　* @param fileSize 文件大小<BR>　　* @param offSet 文件在Pak文件中的位移<BR>　　*/<BR>　　public PakFileTable(char[] fileName,<BR>　　long fileSize,long offSet){<BR>　　for(int i=0;i&lt;FILENAME_LENGTH;this.fileName[i]=fileName[i],i++)<BR>　　;　　　　　　　　this.fileSize=fileSize;<BR>　　this.offSet=offSet;<BR>　　}<BR>　　public char[] getFileName() {<BR>　　return fileName;<BR>　　}<BR>　　public void setFileName(char[] fileName) {<BR>　　for(int i=0;i&lt;fileName.length;this.fileName[i]=fileName[i],i++)<BR>　　;　　　　<BR>　　}<BR>　　public long getFileSize() {<BR>　　return fileSize;<BR>　　}<BR>　　public void setFileSize(long fileSize) {<BR>　　this.fileSize = fileSize;<BR>　　}<BR>　　public long getOffSet() {<BR>　　return offSet;<BR>　　}<BR>　　public void setOffSet(long offSet) {<BR>　　this.offSet = offSet;<BR>　　}<BR>　　/**<BR>　　* 返回文件Table的大小<BR>　　* @return 返回文件Table的大小<BR>　　*/　　　　<BR>　　public static int size(){<BR>　　return FILENAME_LENGTH+4+4;<BR>　　}<BR>　　public String toString(){<BR>　　return "\t文件名:"+new String(this.fileName).trim()<BR>　　+"\t文件大小:"+this.fileSize<BR>　　+"\t文件位移:"+this.offSet;<BR>　　}}<BR>　　<BR>　　<B>六、PakUtil类（j2se版）：</B><BR>　　<BR>　　PakUtil.java<BR>　　package cn.org.matrix.gmatrix.gameLab.util.pak;import java.io.*;<BR>　　import java.util.Vector;<BR>　　/** * Pak工具类 * 功能：<BR>　　*1.将多个png图片合成一个Pak文件，并使用简单的加减加密法对其进行加密；<BR>　　* 2.从Pak文件中取出png图片，构造byte数组（可以用来构造Image对象）或者写为文件 * @author cleverpig * */public class PakUtil {<BR>　　public PakUtil(){<BR>　　}<BR>　　/**<BR>　　* 返回文件长度<BR>　　* @param filePath 文件路径<BR>　　* @return 文件长度<BR>　　*/<BR>　　private long getFileSize(String filePath){<BR>　　File file=new File(filePath);<BR>　　return file.length();<BR>　　}<BR>　　/**<BR>　　* 返回文件名<BR>　　* @param filePath 文件路径<BR>　　* @return 文件名<BR>　　*/<BR>　　<BR>　　private String getFileName(String filePath){<BR>　　File file=new File(filePath);<BR>　　return file.getName();<BR>　　}<BR>　　/**<BR>　　* 计算文件位移的起始点<BR>　　* @return 文件位移的起始点<BR>　　*/<BR>　　private long workOutOffsetStart(PakHeader header){<BR>　　//计算出文件头+文件table的长度<BR>　　return PakHeader.size()+header.getNumFileTableEntries()*PakFileTable.size();<BR>　　}<BR>　　/**<BR>　　* 计算文件位移<BR>　　* @param fileIndex 文件序号<BR>　　* @param lastFileOffset 上一个文件位移<BR>　　* @return　文件在pak文件中的位移<BR>　　*/<BR>　　private long workOutNextOffset(long sourceFileSize,long lastFileOffset){<BR>　　return lastFileOffset+sourceFileSize;　　　　<BR>　　}<BR>　　/**<BR>　　* 生成文件table<BR>　　* @param sourceFileName 源文件名<BR>　　* @param sourceFileSize 源文件长度<BR>　　* @param currentFileOffset 当前文件位移<BR>　　* @return 生成的PakFileTable对象<BR>　　*/　　　　<BR>　　private PakFileTable generateFileTable(String sourceFileName,<BR>　　long sourceFileSize,long currentFileOffset){<BR>　　PakFileTable ft=new PakFileTable();<BR>　　ft.setFileName(sourceFileName.toCharArray());<BR>　　ft.setFileSize(sourceFileSize);<BR>　　ft.setOffSet(currentFileOffset);<BR>　　return ft;<BR>　　}<BR>　　/**<BR>　　* 将char字符数组写入到DataOutputStream中<BR>　　* @param toWriteCharArray 被写入的char数组<BR>　　* @param dos DataOutputStream<BR>　　* @throws Exception<BR>　　*/　　　　<BR>　　private void writeCharArray(char[] toWriteCharArray,DataOutputStream dos) throws Exception{<BR>　　for(int i=0;i&lt;toWriteCharArray.length;dos.writeChar(toWriteCharArray[i]),i++);<BR>　　}　　　　　　　　<BR>　　/**<BR>　　* 使用文件头中的密码对数据进行加密<BR>　　* @param buff 被加密的数据<BR>　　* @param buffLength 数据的长度<BR>　　* @param header 文件头<BR>　　*/<BR>　　private void encryptBuff(byte[] buff,int buffLength,PakHeader header){<BR>　　for(int i=0;i&lt;buffLength;i++){<BR>　　switch(header.getCipherAction()){<BR>　　case PakHeader.ADDITION_CIPHERACTION:<BR>　　buff[i]+=header.getCipherValue();<BR>　　break;<BR>　　case PakHeader.SUBTRACT_CIHOERACTION:<BR>　　buff[i]-=header.getCipherValue();<BR>　　break;<BR>　　}<BR>　　}<BR>　　}<BR>　　/**<BR>　　* 使用文件头中的密码对数据进行解密<BR>　　* @param buff 被解密的数据<BR>　　* @param buffLength 数据的长度<BR>　　* @param header 文件头<BR>　　*/<BR>　　private void decryptBuff(byte[] buff,int buffLength,PakHeader header){<BR>　　for(int i=0;i&lt;buffLength;i++){<BR>　　switch(header.getCipherAction()){<BR>　　case PakHeader.ADDITION_CIPHERACTION:<BR>　　buff[i]-=header.getCipherValue();<BR>　　break;<BR>　　case PakHeader.SUBTRACT_CIHOERACTION:<BR>　　buff[i]+=header.getCipherValue();<BR>　　break;<BR>　　}<BR>　　}<BR>　　}<BR>　　/**<BR>　　* 制作Pak文件<BR>　　* @param sourceFilePath 源文件路径数组<BR>　　* @param destinateFilePath 目的文件路径（Pak文件）<BR>　　* @param cipherAction 密码行为<BR>　　* @param cipherValue 密码<BR>　　* @throws Exception<BR>　　*/<BR>　　public void makePakFile(String[] sourceFilePath,<BR>　　String destinateFilePath,PakHeader header) throws Exception{<BR>　　PakFileTable[] fileTable=new PakFileTable[sourceFilePath.length];<BR>　　//计算文件位移起始点<BR>　　long fileOffset=workOutOffsetStart(header);<BR>　　//逐个建立文件table<BR>　　for(int i=0;i&lt;sourceFilePath.length;i++){<BR>　　String sourceFileName=getFileName(sourceFilePath[i]);<BR>　　long sourceFileSize=getFileSize(sourceFilePath[i]);<BR>　　PakFileTable ft=generateFileTable(sourceFileName,sourceFileSize,fileOffset);<BR>　　//计算下一个文件位移<BR>　　fileOffset=workOutNextOffset(sourceFileSize,fileOffset);<BR>　　fileTable[i]=ft;<BR>　　}<BR>　　//写入文件头<BR>　　File wFile=new File(destinateFilePath);<BR>　　FileOutputStream fos=new FileOutputStream(wFile);<BR>　　DataOutputStream dos=new DataOutputStream(fos);<BR>　　writeCharArray(header.getSignature(),dos);<BR>　　dos.writeFloat(header.getVersion());<BR>　　dos.writeLong(header.getNumFileTableEntries());<BR>　　dos.writeByte(header.getCipherAction());<BR>　　dos.writeByte(header.getCipherValue());<BR>　　writeCharArray(header.getUniqueID(),dos);<BR>　　dos.writeLong(header.getReserved());<BR>　　//写入文件table<BR>　　for(int i=0;i&lt;fileTable.length;i++){<BR>　　writeCharArray(fileTable[i].getFileName(),dos);<BR>　　dos.writeLong(fileTable[i].getFileSize());<BR>　　dos.writeLong(fileTable[i].getOffSet());<BR>　　}<BR>　　//写入文件数据<BR>　　for(int i=0;i&lt;fileTable.length;i++){<BR>　　File ftFile=new File(sourceFilePath[i]);<BR>　　FileInputStream ftFis=new FileInputStream(ftFile);<BR>　　DataInputStream ftDis=new DataInputStream(ftFis);<BR>　　byte[] buff=new byte[256];<BR>　　int readLength=0;<BR>　　while((readLength=ftDis.read(buff))!=-1){<BR>　　encryptBuff(buff,readLength,header);<BR>　　dos.write(buff,0,readLength);<BR>　　}<BR>　　ftDis.close();<BR>　　ftFis.close();<BR>　　}<BR>　　dos.close();<BR>　　}<BR>　　/**<BR>　　* 从DataInputStream读取char数组　　　　 * @param dis DataInputStream<BR>　　* @param readLength 读取长度<BR>　　* @return char数组<BR>　　* @throws Exception<BR>　　*/<BR>　　private char[] readCharArray(DataInputStream dis,int readLength) throws Exception{<BR>　　char[] readCharArray=new char[readLength];<BR>　　for(int i=0;i&lt;readLength;i++){<BR>　　readCharArray[i]=dis.readChar();<BR>　　}<BR>　　return readCharArray;<BR>　　}<BR>　　/**<BR>　　* 从PAK文件中读取文件头<BR>　　* @param dis DataInputStream<BR>　　* @return PakHeader<BR>　　* @throws Exception<BR>　　*/<BR>　　private PakHeader readHeader(DataInputStream dis) throws Exception{<BR>　　PakHeader header=new PakHeader();<BR>　　char[] signature=readCharArray(dis,PakHeader.SIGNATURE_LENGTH);<BR>　　header.setSignature(signature);<BR>　　header.setVersion(dis.readFloat());<BR>　　header.setNumFileTableEntries(dis.readLong());<BR>　　header.setCipherAction(dis.readByte());<BR>　　header.setCipherValue(dis.readByte());<BR>　　char[] uniqueID=readCharArray(dis,PakHeader.UNIQUEID_LENGTH);<BR>　　header.setUniqueID(uniqueID);<BR>　　header.setReserved(dis.readLong());<BR>　　return header;<BR>　　}<BR>　　/**<BR>　　* 读取所有的文件table<BR>　　* @param dis DataInputStream<BR>　　* @param fileTableNumber 文件表总数<BR>　　* @return 文件table数组<BR>　　* @throws Exception<BR>　　*/<BR>　　private PakFileTable[] readFileTable(DataInputStream dis,int fileTableNumber) throws Exception{<BR>　　PakFileTable[] fileTable=new PakFileTable[fileTableNumber];<BR>　　for(int i=0;i&lt;fileTableNumber;i++){<BR>　　PakFileTable ft=new PakFileTable();<BR>　　ft.setFileName(readCharArray(dis,PakFileTable.FILENAME_LENGTH));<BR>　　ft.setFileSize(dis.readLong());<BR>　　ft.setOffSet(dis.readLong());<BR>　　fileTable[i]=ft;<BR>　　}　　　　　　　　<BR>　　return fileTable;<BR>　　}<BR>　　/**<BR>　　* 从pak文件读取文件到byte数组<BR>　　* @param dis DataInputStream<BR>　　* @param fileTable PakFileTable<BR>　　* @return byte数组<BR>　　* @throws Exception<BR>　　*/<BR>　　private byte[] readFileFromPak(DataInputStream dis,PakHeader header,PakFileTable fileTable) throws Exception{<BR>　　dis.skip(fileTable.getOffSet()-workOutOffsetStart(header));<BR>　　//<BR>　　int fileLength=(int)fileTable.getFileSize();<BR>　　byte[] fileBuff=new byte[fileLength];<BR>　　int readLength=dis.read(fileBuff,0,fileLength);<BR>　　if (readLength&lt;fileLength){<BR>　　System.out.println("读取数据长度不正确");<BR>　　return null;<BR>　　}<BR>　　else{<BR>　　decryptBuff(fileBuff,readLength,header);<BR>　　return fileBuff;<BR>　　}<BR>　　}<BR>　　/**<BR>　　* 将buffer中的内容写入到文件<BR>　　* @param fileBuff 保存文件内容的buffer<BR>　　* @param fileName 文件名<BR>　　* @param extractDir 文件导出目录<BR>　　* @throws Exception<BR>　　*/<BR>　　private void writeFileFromByteBuffer(byte[] fileBuff,String fileName,String extractDir) throws Exception{<BR>　　String extractFilePath=extractDir+fileName;<BR>　　File wFile=new File(extractFilePath);<BR>　　FileOutputStream fos=new FileOutputStream(wFile);<BR>　　DataOutputStream dos=new DataOutputStream(fos);<BR>　　dos.write(fileBuff);<BR>　　dos.close();<BR>　　fos.close();<BR>　　}<BR>　　/**<BR>　　* 从pak文件中取出指定的文件到byte数组，如果需要的话可以将byte数组写为文件<BR>　　* @param pakFilePath　pak文件路径<BR>　　* @param extractFileName pak文件中将要被取出的文件名<BR>　　* @param writeFile 是否需要将byte数组写为文件<BR>　　* @param extractDir 如果需要的话可以将byte数组写为文件，extractDir为取出数据被写的目录文件<BR>　　* @return byte数组<BR>　　* @throws Exception<BR>　　*/<BR>　　public byte[] extractFileFromPak(String pakFilePath,<BR>　　String extractFileName,boolean writeFile,String extractDir) throws Exception{<BR>　　File rFile=new File(pakFilePath);<BR>　　FileInputStream fis=new FileInputStream(rFile);<BR>　　DataInputStream dis=new DataInputStream(fis);<BR>　　PakHeader header=readHeader(dis);<BR>　　PakFileTable[] fileTable=readFileTable(dis,(int)header.getNumFileTableEntries());<BR>　　boolean find=false;　　　　　　　　int fileIndex=0;<BR>　　for(int i=0;i&lt;fileTable.length;i++){<BR>　　String fileName=new String(fileTable[i].getFileName()).trim();<BR>　　if (fileName.equals(extractFileName)){<BR>　　find=true;<BR>　　fileIndex=i;<BR>　　break;<BR>　　}<BR>　　}<BR>　　if (find==false){<BR>　　System.out.println("没有找到指定的文件");<BR>　　return null;　　　　　　　　<BR>　　}　　　　　　 <BR>　　else{<BR>　　byte[] buff=readFileFromPak(dis,header,fileTable[fileIndex]);<BR>　　if (writeFile){<BR>　　writeFileFromByteBuffer(buff,extractFileName,extractDir);<BR>　　}　　　　　　　　　　　　<BR>　　else{<BR>　　dis.close();<BR>　　fis.close();<BR>　　}<BR>　　return buff;<BR>　　}<BR>　　}<BR>　　/**<BR>　　* 从pak文件中取出指定的Pak文件的信息<BR>　　* @param pakFilePath　pak文件路径<BR>　　* @return 装载文件头和文件table数组的Vector<BR>　　* @throws Exception<BR>　　*/<BR>　　public Vector showPakFileInfo(String pakFilePath) throws Exception{<BR>　　File rFile=new File(pakFilePath);<BR>　　FileInputStream fis=new FileInputStream(rFile);<BR>　　DataInputStream dis=new DataInputStream(fis);<BR>　　PakHeader header=readHeader(dis);<BR>　　PakFileTable[] fileTable=readFileTable(dis,(int)header.getNumFileTableEntries());　　　　　　　　Vector result=new Vector();<BR>　　result.add(header);<BR>　　result.add(fileTable);<BR>　　return result;<BR>　　}<BR>　　public static void main(String[] argv) throws Exception{<BR>　　PakUtil pu=new PakUtil();<BR>　　//构造文件头<BR>　　char[] signature=new char[PakHeader.SIGNATURE_LENGTH];<BR>　　signature=new String("012345").toCharArray();<BR>　　char[] uniqueID=new char[PakHeader.UNIQUEID_LENGTH];<BR>　　uniqueID=new String("0123456789").toCharArray();<BR>　　PakHeader header=new PakHeader();<BR>　　header.setSignature(signature);<BR>　　header.setNumFileTableEntries(3);<BR>　　header.setCipherAction((byte)PakHeader.ADDITION_CIPHERACTION);<BR>　　header.setCipherValue((byte)0x0f);<BR>　　header.setUniqueID(uniqueID);<BR>　　header.setVersion(1.0f);<BR>　　header.setReserved(0L);<BR>　　String[] filePathArray={"F:\\eclipse3.1RC3\\workspace\\gmatrixProject_j2se\\testFiles\\apple.png",<BR>　　"F:\\eclipse3.1RC3\\workspace\\gmatrixProject_j2se\\testFiles\\cushaw.png",<BR>　　"F:\\eclipse3.1RC3\\workspace\\gmatrixProject_j2se\\testFiles\\flash.png"};<BR>　　String extractFilePath="F:\\eclipse3.1RC3\\workspace\\gmatrixProject_j2se\\testFiles\\test.pak";<BR>　　//制作Pak文件<BR>　　System.out.println("制作Pak文件...");<BR>　　pu.makePakFile(filePathArray,extractFilePath,header);<BR>　　System.out.println("制作Pak文件完成");<BR>　　//从Pak文件中取出所有的图片文件<BR>　　Vector pakInfo=pu.showPakFileInfo(extractFilePath);<BR>　　header=(PakHeader)pakInfo.elementAt(0);<BR>　　System.out.println("Pak文件信息:");<BR>　　System.out.println("文件头:");<BR>　　System.out.println(header);<BR>　　PakFileTable[] fileTable=(PakFileTable[])pakInfo.elementAt(1);<BR>　　for(int i=0;i&lt;fileTable.length;i++){<BR>　　System.out.println("文件table["+i+"]:");<BR>　　System.out.println(fileTable[i]);<BR>　　}<BR>　　String restoreDir="F:\\eclipse3.1RC3\\workspace\\gmatrixProject_j2se\\testFiles\\extract\\";<BR>　　String restoreFileName=null;<BR>　　byte[] fileBuff=null;<BR>　　for(int i=0;i&lt;fileTable.length;i++){<BR>　　restoreFileName=new String(fileTable[i].getFileName()).trim();<BR>　　System.out.println("从Pak文件中取出"+restoreFileName+"文件...");<BR>　　fileBuff=pu.extractFileFromPak(extractFilePath,restoreFileName,true,restoreDir);<BR>　　System.out.println("从Pak文件中取出"+restoreFileName+"文件保存在"+restoreDir+"目录");<BR>　　}<BR>　　}}<BR>　　<BR>　　<B>七、PakUtil类（j2me版）：</B><BR>　　<BR>　　PakUtil.java<BR>　　package cn.org.matrix.gmatrix.gameLab.util.pak;<BR>　　import java.io.*;<BR>　　import java.util.Vector;<BR>　　/** * Pak工具类 * 功能： * 从Pak文件中取出png图片，构造byte数组（可以用来构造Image对象） * @author cleverpig * */public class PakUtil {<BR>　　public PakUtil(){<BR>　　}<BR>　　/**<BR>　　* 计算文件位移的起始点<BR>　　* @return 文件位移的起始点<BR>　　*/<BR>　　private long workOutOffsetStart(PakHeader header){<BR>　　//计算出文件头+文件table的长度<BR>　　return PakHeader.size()+header.getNumFileTableEntries()*PakFileTable.size();<BR>　　}<BR>　　/**<BR>　　* 从DataInputStream读取char数组<BR>　　* @param dis DataInputStream<BR>　　* @param readLength 读取长度<BR>　　* @return char数组<BR>　　* @throws Exception<BR>　　*/<BR>　　private char[] readCharArray(DataInputStream dis,int readLength) throws Exception{<BR>　　char[] readCharArray=new char[readLength];<BR>　　for(int i=0;i&lt;readLength;i++){<BR>　　readCharArray[i]=dis.readChar();<BR>　　}<BR>　　return readCharArray;<BR>　　}<BR>　　/**<BR>　　* 从PAK文件中读取文件头<BR>　　* @param dis DataInputStream<BR>　　* @return PakHeader<BR>　　* @throws Exception<BR>　　*/<BR>　　private PakHeader readHeader(DataInputStream dis) throws Exception{<BR>　　PakHeader header=new PakHeader();<BR>　　char[] signature=readCharArray(dis,PakHeader.SIGNATURE_LENGTH);<BR>　　header.setSignature(signature);<BR>　　header.setVersion(dis.readFloat());<BR>　　header.setNumFileTableEntries(dis.readLong());<BR>　　header.setCipherAction(dis.readByte());<BR>　　header.setCipherValue(dis.readByte());<BR>　　char[] uniqueID=readCharArray(dis,PakHeader.UNIQUEID_LENGTH);<BR>　　header.setUniqueID(uniqueID);<BR>　　header.setReserved(dis.readLong());<BR>　　return header;<BR>　　}<BR>　　/**<BR>　　* 读取所有的文件table<BR>　　* @param dis DataInputStream<BR>　　* @param fileTableNumber 文件表总数<BR>　　* @return 文件table数组<BR>　　* @throws Exception<BR>　　*/<BR>　　private PakFileTable[] readFileTable(DataInputStream dis,int fileTableNumber) throws Exception{<BR>　　PakFileTable[] fileTable=new PakFileTable[fileTableNumber];<BR>　　for(int i=0;i&lt;fileTableNumber;i++){<BR>　　PakFileTable ft=new PakFileTable();<BR>　　ft.setFileName(readCharArray(dis,PakFileTable.FILENAME_LENGTH));<BR>　　ft.setFileSize(dis.readLong());<BR>　　ft.setOffSet(dis.readLong());<BR>　　fileTable[i]=ft;<BR>　　}<BR>　　return fileTable;<BR>　　}<BR>　　/**<BR>　　* 从pak文件读取文件到byte数组<BR>　　* @param dis DataInputStream<BR>　　* @param fileTable PakFileTable<BR>　　* @return byte数组<BR>　　* @throws Exception<BR>　　*/　　　　<BR>　　private byte[] readFileFromPak(DataInputStream dis,PakHeader header,PakFileTable fileTable) throws Exception{<BR>　　dis.skip(fileTable.getOffSet()-workOutOffsetStart(header));<BR>　　//<BR>　　int fileLength=(int)fileTable.getFileSize();<BR>　　byte[] fileBuff=new byte[fileLength];<BR>　　int readLength=dis.read(fileBuff,0,fileLength);<BR>　　if (readLength&lt;fileLength){<BR>　　System.out.println("读取数据长度不正确");<BR>　　return null;<BR>　　}<BR>　　else{<BR>　　decryptBuff(fileBuff,readLength,header);<BR>　　}　　　　　　　　<BR>　　return fileBuff;<BR>　　}<BR>　　/**<BR>　　* 使用文件头中的密码对数据进行解密<BR>　　* @param buff 被解密的数据<BR>　　* @param buffLength 数据的长度<BR>　　* @param header 文件头<BR>　　*/<BR>　　private void decryptBuff(byte[] buff,int buffLength,PakHeader header){<BR>　　for(int i=0;i&lt;buffLength;i++){<BR>　　switch(header.getCipherAction()){<BR>　　case PakHeader.ADDITION_CIPHERACTION:<BR>　　buff[i]-=header.getCipherValue();<BR>　　break;<BR>　　case PakHeader.SUBTRACT_CIHOERACTION:<BR>　　buff[i]+=header.getCipherValue();<BR>　　break;<BR>　　}<BR>　　}<BR>　　}<BR>　　/**<BR>　　* 从pak文件中取出指定的文件到byte数组<BR>　　* @param pakResourceURL　pak文件的资源路径<BR>　　* @param extractResourceName pak文件中将要被取出的文件名<BR>　　* @return byte数组　　　　 <BR>　　* @throws Exception<BR>　　*/　　　　<BR>　　public byte[] extractResourceFromPak(String pakResourceURL<BR>　　,String extractResourceName) throws Exception{<BR>　　InputStream is=this.getClass().getResourceAsStream(pakResourceURL);<BR>　　DataInputStream dis=new DataInputStream(is);<BR>　　PakHeader header=readHeader(dis);//<BR>　　System.out.println("文件头:");//<BR>　　System.out.println(header);<BR>　　PakFileTable[] fileTable=readFileTable(dis,(int)header.getNumFileTableEntries());//<BR>　　for(int i=0;i&lt;fileTable.length;i++){//<BR>　　System.out.println("文件table["+i+"]:");//<BR>　　System.out.println(fileTable[i]);//<BR>　　}<BR>　　boolean find=false;<BR>　　int fileIndex=0;<BR>　　for(int i=0;i&lt;fileTable.length;i++){<BR>　　String fileName=new String(fileTable[i].getFileName()).trim();<BR>　　if (fileName.equals(extractResourceName)){<BR>　　find=true;<BR>　　fileIndex=i;<BR>　　break;<BR>　　}<BR>　　}<BR>　　if (find==false){<BR>　　System.out.println("没有找到指定的文件");<BR>　　return null;<BR>　　}<BR>　　else{<BR>　　byte[] buff=readFileFromPak(dis,header,fileTable[fileIndex]);<BR>　　return buff;<BR>　　}<BR>　　}<BR>　　/**<BR>　　* 从pak文件中取出指定的Pak文件的信息<BR>　　* @param pakResourcePath　pak文件资源路径<BR>　　* @return 装载文件头和文件table数组的Vector<BR>　　* @throws Exception<BR>　　*/<BR>　　public Vector showPakFileInfo(String pakResourcePath) throws Exception{<BR>　　InputStream is=this.getClass().getResourceAsStream(pakResourcePath);<BR>　　DataInputStream dis=new DataInputStream(is);<BR>　　PakHeader header=readHeader(dis);<BR>　　PakFileTable[] fileTable=readFileTable(dis,(int)header.getNumFileTableEntries());<BR>　　Vector result=new Vector();<BR>　　result.addElement(header);<BR>　　result.addElement(fileTable);<BR>　　return result;<BR>　　}<BR>　　public static void main(String[] argv) throws Exception{<BR>　　PakUtil pu=new PakUtil();<BR>　　String extractResourcePath="/test.pak";<BR>　　//从Pak文件中取出所有的图片文件<BR>　　Vector pakInfo=pu.showPakFileInfo(extractResourcePath);<BR>　　PakHeader header=(PakHeader)pakInfo.elementAt(0);<BR>　　System.out.println("Pak文件信息:");<BR>　　System.out.println("文件头:");<BR>　　System.out.println(header);<BR>　　PakFileTable[] fileTable=(PakFileTable[])pakInfo.elementAt(1);<BR>　　for(int i=0;i&lt;fileTable.length;i++){<BR>　　System.out.println("文件table["+i+"]:");<BR>　　System.out.println(fileTable[i]);<BR>　　}<BR>　　String restoreFileName=null;　　　　　　　 <BR>　　byte[] fileBuff=null;<BR>　　for(int i=0;i&lt;fileTable.length;i++){<BR>　　restoreFileName=new String(fileTable[i].getFileName()).trim();<BR>　　System.out.println("从Pak文件中取出"+restoreFileName+"文件数据...");<BR>　　fileBuff=pu.extractResourceFromPak(extractResourcePath,restoreFileName);<BR>　　System.out.println("从Pak文件中取出"+restoreFileName+"文件数据完成");<BR>　　}　　　 <BR>　　 }}<BR>　　<BR>　　<B>八、源代码使用简介：</B><BR>　　<BR>　　Pak过程：j2se版的PakUtil将testFiles目录中的三个png文件Pak成为test.pak文件。<BR>　　UnPak过程：j2se版的PakUtil将testFiles目录中test.pak文件释放到testFiles\extract目录下；j2me版的PakUtil从res目录中的test.pak文件读取出其中所包含的3个png文件数据并装入到byte数据，用来构造Image对象，大家请运行PakUtilTestMIDlet.java便可看到输出的信息。<img src ="http://www.blogjava.net/xpsir/aggbug/21931.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xpsir/" target="_blank">小P</a> 2005-11-30 11:42 <a href="http://www.blogjava.net/xpsir/articles/21931.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>3步把您的java程序转换为webservice</title><link>http://www.blogjava.net/xpsir/articles/21929.html</link><dc:creator>小P</dc:creator><author>小P</author><pubDate>Wed, 30 Nov 2005 03:37:00 GMT</pubDate><guid>http://www.blogjava.net/xpsir/articles/21929.html</guid><wfw:comment>http://www.blogjava.net/xpsir/comments/21929.html</wfw:comment><comments>http://www.blogjava.net/xpsir/articles/21929.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xpsir/comments/commentRss/21929.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xpsir/services/trackbacks/21929.html</trackback:ping><description><![CDATA[1、选择要转换的java文件，生成class<BR>　　2、写wsdd<BR>　　3、发布<BR>　　<BR>　　剩下的就只有调用了wsdl2java<BR>　　<BR>　　我原来的系统是CICS的，对后台封装了一层，现在用webservice再封装一层，前台页面，控制，数据传输，数据处理统统都可以分开了，爽<BR>　　<BR>　　//以下是从网上找的关于AXIS的入门教程<BR>　　<BR>　　<B>一、Axis安装 1、环境 J2SE SDK 1.3 or 1.4: 我使用 1.4.2 Servlet Container: 我使用的Tomcat 5.0<BR>　　</B><BR>　　2、到 http://ws.apache.org/Axis/网站下载Axis安装包<BR>　　<BR>　　3、解压缩安装包，将Axis_UNZIP_PATH\Axis-version\webapps下的Axis包拷贝到TOMCAT_HOME\webapps\下，以下约定Axis_HOME为该TOMCAT_HOME\webapps\Axis目录<BR>　　<BR>　　4、启动tomcat,访问http://localhost:8080/Axis 检查安装是否成功<BR>　　<BR>　　5、以上步骤执行成功，可以开发webservice例子了<BR>　　<BR>　　Axis支持三种web service的部署和开发，分别为：<BR>　　<BR>　　1、Dynamic Invocation Interface ( DII)<BR>　　<BR>　　2、Stubs方式<BR>　　<BR>　　3、Dynamic Proxy方式<BR>　　<BR>　　<B>二、编写DII(Dynamic Invocation Interface )方式web服务</B><BR>　　<BR>　　1.编写服务端程序HelloClient<BR>　　<BR>　　public class HelloClient<BR>　　{<BR>　　public String getName(String name)<BR>　　{<BR>　　return "hello "+name;<BR>　　}<BR>　　}<BR>　　<BR>　　2、将源码拷贝到Axis_HOME下，重命名为 HelloClient.jws<BR>　　<BR>　　3、访问连接http://localhost:8080/Axis/HelloClient.jws?wsdl，页面显示Axis自动生成的wsdl<BR>　　<BR>　　4、编写访问服务的客户端 TestHelloClient.java<BR>　　<BR>　　import org.apache.Axis.client.Call;<BR>　　import org.apache.Axis.client.Service;<BR>　　import javax.xml.namespace.QName;<BR>　　import javax.xml.rpc.ServiceException;<BR>　　import java.net.MalformedURLException;<BR>　　import java.rmi.RemoteException;<BR>　　<BR>　　public class SayHelloClient2<BR>　　{<BR>　　public static void main(String[] args)<BR>　　{<BR>　　try<BR>　　{<BR>　　String endpoint =<BR>　　"http://localhost:8080/Axis/HelloClient.jws";<BR>　　<BR>　　Service service = new Service();<BR>　　Call call = null;<BR>　　<BR>　　call = (Call) service.createCall();<BR>　　<BR>　　call.setOperationName(new QName(<BR>　　"http://localhost:8080/Axis/HelloClient.jws",<BR>　　"getName"));<BR>　　call.setTargetEndpointAddress<BR>　　(new java.net.URL(endpoint));<BR>　　<BR>　　String ret = (String) call.invoke(new Object[]<BR>　　{"zhangsan"});<BR>　　System.out.println("return value is " + ret);<BR>　　}<BR>　　catch (Exception ex)<BR>　　{<BR>　　ex.printStackTrace();<BR>　　}<BR>　　}<BR>　　}<BR>　　<BR>　　<B>三、编写Dynamic Proxy方式访问服务</B><BR>　　<BR>　　1、编写部署服务端程序，同上边DII方式，本次仍使用上边部署的HelloClient<BR>　　<BR>　　2、编写代理接口<BR>　　<BR>　　public interface HelloClientInterface<BR>　　extends java.rmi.Remote<BR>　　{<BR>　　public String getName(String name)<BR>　　throws java.rmi.RemoteException;<BR>　　}<BR>　　<BR>　　3、编写并执行客户端程序TestHelloClient.java<BR>　　<BR>　　import javax.xml.rpc.Service;<BR>　　import javax.xml.rpc.ServiceFactory;<BR>　　import java.net.URL;<BR>　　import javax.xml.namespace.QName;<BR>　　<BR>　　public class TestHelloClient<BR>　　{<BR>　　public static void main(String[] args)<BR>　　{<BR>　　try<BR>　　{<BR>　　String wsdlUrl =<BR>　　"http://localhost:8080/Axis/HelloClient.jws?wsdl";<BR>　　String nameSpaceUri =<BR>　　"http://localhost:8080/Axis/HelloClient.jws";<BR>　　String serviceName = "HelloClientService";<BR>　　String portName = "HelloClient";<BR>　　<BR>　　ServiceFactory serviceFactory =<BR>　　ServiceFactory.newInstance();<BR>　　Service afService =<BR>　　serviceFactory.createService(new URL(wsdlUrl),<BR>　　new QName(nameSpaceUri, serviceName));<BR>　　HelloClientInterface proxy = (HelloClientInterface)<BR>　　afService.getPort(new QName(<BR>　　nameSpaceUri, portName),<BR>　　HelloClientInterface.class);<BR>　　System.out.println<BR>　　("return value is "+proxy.getName("john") ) ;<BR>　　}catch(Exception ex)<BR>　　{<BR>　　ex.printStackTrace() ;<BR>　　}<BR>　　}<BR>　　}<BR>　　<BR>　　<B>四、编写wsdd发布web服务，编写stub client访问web服务</B><BR>　　<BR>　　1、编写服务端程序server,SayHello.java，编译server.SayHello.java<BR>　　package server;<BR>　　public class SayHello<BR>　　{<BR>　　public String getName(String name)<BR>　　{<BR>　　return "hello "+name;<BR>　　}<BR>　　}<BR>　　<BR>　　2.编写LogHandler.java<BR>　　import org.apache.Axis.AxisFault;<BR>　　import org.apache.Axis.Handler;<BR>　　import org.apache.Axis.MessageContext;<BR>　　import org.apache.Axis.handlers.BasicHandler;<BR>　　<BR>　　import java.util.Date;<BR>　　<BR>　　public class LogHandler<BR>　　extends BasicHandler<BR>　　{<BR>　　public void invoke<BR>　　(MessageContext msgContext)<BR>　　throws AxisFault<BR>　　{<BR>　　/** Log an access each time<BR>　　we get invoked.<BR>　　*/<BR>　　try {<BR>　　Handler serviceHandler<BR>　　= msgContext.getService();<BR>　　<BR>　　Integer numAccesses =<BR>　　(Integer)serviceHandler.getOption("accesses");<BR>　　if (numAccesses == null)<BR>　　numAccesses = new Integer(0);<BR>　　numAccesses = new Integer<BR>　　(numAccesses.intValue() + 1);<BR>　　Date date = new Date();<BR>　　String result =<BR>　　date + ": service " +<BR>　　msgContext.getTargetService() +<BR>　　" accessed " + numAccesses + " time(s).";<BR>　　serviceHandler.setOption<BR>　　("accesses", numAccesses);<BR>　　System.out.println(result);<BR>　　} catch (Exception e)<BR>　　{<BR>　　throw AxisFault.makeFault(e);<BR>　　}<BR>　　}<BR>　　}<BR>　　<BR>　　3、编写wsdd文件<BR>　　<BR>　　deploy.wsdd<BR>　　&lt;deployment xmlns=<BR>　　"http://xml.apache.org/Axis/wsdd/"<BR>　　xmlns:java=<BR>　　"http://xml.apache.org/Axis/wsdd/providers/java"&gt;<BR>　　&lt;handler name="print" type="java:LogHandler"/&gt;<BR>　　&lt;service name="sayhello"<BR>　　provider="java:RPC"&gt;<BR>　　&lt;requestFlow&gt;<BR>　　&lt;handler type="print"/&gt;<BR>　　&lt;/requestFlow&gt;<BR>　　&lt;parameter name="className"<BR>　　value="server.SayHello"/&gt;<BR>　　&lt;parameter name="allowedMethods"<BR>　　value="*"/&gt;<BR>　　&lt;/service&gt;<BR>　　&lt;/deployment&gt;<BR>　　<BR>　　3、将编译后的文件拷贝到Axis_HOME/WEB-INF/classes下，如：D:\tomcat\webapps\Axis\WEB-INF\classes<BR>　　<BR>　　4、发布服务：<BR>　　<BR>　　java org.apache.Axis.client.AdminClient deploy.wsdd<BR>　　<BR>　　5、生成client stub文件<BR>　　<BR>　　a:方式1<BR>　　<BR>　　将SayHello.java拷贝到Axis_HOME/下，重命名为SayHello.jws，<BR>　　<BR>　　执行下面的命令生存client stub<BR>　　<BR>　　java org.apache.Axis.wsdl.WSDL2Java<BR>　　-p client　http://localhost:8080<BR>　　/Axis/services/SayHello.jws?wsdl<BR>　　<BR>　　b:方式2<BR>　　<BR>　　执行如下命令生成SayHello.wsdl<BR>　　<BR>　　java org.apache.Axis.wsdl.Java2WSDL<BR>　　-oSayHello.wsdl -lhttp://localhost:8080<BR>　　/Axis/services/SayHello -nsayhello server.SayHello<BR>　　<BR>　　执行如下命令生成client stub<BR>　　<BR>　　java org.apache.Axis.wsdl.WSDL2Java<BR>　　SayHello.wsdl　-p client<BR>　　<BR>　　生成的stub client文件列表为：<BR>　　<BR>　　1.SayHello.java<BR>　　<BR>　　2.SayHelloService.java。<BR>　　<BR>　　3.SayHelloServiceLocator.java<BR>　　<BR>　　4.SayHelloSoapBindingStub.java<BR>　　<BR>　　6、编写客户端程序，编译并执行<BR>　　<BR>　　public class SayHelloClient<BR>　　{<BR>　　public static void main(String[] args)<BR>　　{<BR>　　try<BR>　　{<BR>　　SayHelloService service = new client.<BR>　　SayHelloServiceLocator();<BR>　　client.SayHello_PortType<BR>　　client = service.getSayHello();<BR>　　String retValue=client.getName("zhangsan");<BR>　　System.out.println(retValue);<BR>　　}<BR>　　catch (Exception e)<BR>　　{<BR>　　System.err.println<BR>　　("Execution failed. Exception: " + e);<BR>　　}<BR>　　}<BR>　　}<BR>　　<BR>　　您也可以写server-config.wsdd<BR>　　&lt;?xml version="1.0" encoding="UTF-8"?&gt;<BR>　　&lt;deployment xmlns="http://xml.apache.org/axis/wsdd/"<BR>　　xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"&gt;<BR>　　&lt;globalConfiguration&gt;<BR>　　<BR>　　&lt;parameter name="adminPassword" value="admin"/&gt;<BR>　　&lt;parameter name="attachments.implementation"<BR>　　value="org.apache.axis.attachments.AttachmentsImpl"/&gt;<BR>　　&lt;parameter name="sendXsiTypes" value="true"/&gt;<BR>　　&lt;parameter name="sendMultiRefs" value="true"/&gt;<BR>　　&lt;parameter name="sendXMLDeclaration" value="true"/&gt;<BR>　　&lt;parameter name="axis.sendMinimizedElements" value="true"/&gt;<BR>　　<BR>　　&lt;requestFlow&gt;<BR>　　&lt;handler type="java:org.apache.axis.handlers.JWSHandler"&gt;<BR>　　&lt;parameter name="scope" value="session"/&gt;<BR>　　&lt;/handler&gt;<BR>　　<BR>　　&lt;handler type="java:org.apache.axis.handlers.JWSHandler"&gt;<BR>　　&lt;parameter name="scope" value="request"/&gt;<BR>　　&lt;parameter name="extension" value=".jwr"/&gt;<BR>　　&lt;/handler&gt;<BR>　　<BR>　　&lt;/requestFlow&gt;<BR>　　<BR>　　&lt;/globalConfiguration&gt;<BR>　　&lt;handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/&gt;<BR>　　&lt;handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/&gt;<BR>　　&lt;handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/&gt;<BR>　　&lt;handler name="print" type="java:stub.LogHandler"/&gt;<BR>　　<BR>　　&lt;service name="sayhello" provider="java:RPC"&gt;<BR>　　&lt;requestFlow&gt;<BR>　　&lt;handler type="print"/&gt;<BR>　　&lt;/requestFlow&gt;<BR>　　&lt;parameter name="className"　 value="stub.server.SayHello"/&gt;<BR>　　&lt;parameter name="allowedMethods"　value="*"/&gt;<BR>　　&lt;/service&gt;<BR>　　<BR>　　&lt;transport name="http"&gt;<BR>　　&lt;requestFlow&gt;<BR>　　&lt;handler type="URLMapper"/&gt;<BR>　　&lt;handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/&gt;<BR>　　&lt;/requestFlow&gt;<BR>　　&lt;/transport&gt;<BR>　　&lt;transport name="local"&gt;<BR>　　&lt;responseFlow&gt;<BR>　　&lt;handler type="LocalResponder"/&gt;<BR>　　&lt;/responseFlow&gt;<BR>　　&lt;/transport&gt;<BR>　　&lt;/deployment&gt;<img src ="http://www.blogjava.net/xpsir/aggbug/21929.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xpsir/" target="_blank">小P</a> 2005-11-30 11:37 <a href="http://www.blogjava.net/xpsir/articles/21929.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>