‘壹’ 求 web 3d 引擎的工作原理
插件就是和网页上显示flash差不多的,是一个需要选择加载的小软件而已,并不那么神秘,它具有收集和侦别功能。
web3d引擎的原理更是简单,它也是一种普通的网络技术,只是呈现方式不同而已。
找本相关的书看一下吧,不要被它们显示的时候那种表象迷惑,好像很难,其实,它们和其它网络技术及显示原理都是一样的。
‘贰’ webpack 基本流程
Webpack 函数的核⼼逻辑是:根据配置⽣成编译器实例 compiler,然后处理参数,执⾏ WebpackOptionsApply().process,根据参数加载不同内部插件。在有回调函数的情况下,根据是否是 watch 模式来决定要执⾏ compiler.watch 还是 compiler.run。
Webpack 引擎基于插件系统搭建⽽成,不同的插件各司其职,在 Webpack ⼯作流程的某⼀个或多个时间点上,对构建流程的某个⽅⾯进⾏处理。
⼀个 Webpack 插件是⼀个包含 apply ⽅法的 JavaScript 对象。这个 apply ⽅法的执⾏逻辑,通常是注册 Webpack ⼯作流程中某⼀⽣命周期 Hook,并添加对应 Hook 中该插件的实际处理函数。
‘叁’ 有基于Java的好用的Web快速开发平台吗网上找了一些不太好用。最好能提供在线使用的网址,谢谢!
可以使用我公司的WebBuilder开发平台,可以在http://www.putdb.com上在线使用、评估和免费下载。
给您介绍一下该产品:
WebBuilder是一款跨平台、数据库和浏览器的Web可视化应用开发和部署平台。
使用WebBuilder可开发ERP、OA、CRM、HR、MIS以及电信、银行、政府、企业等各行业的行业应用系统,帮助信息化管理系统的快速构建。
WebBuilder帮助提高应用系统的开发效率,并降低成本。完善的基础架构,具有应用系统必须的完整功能,使系统的开发仅需致力于业务的开发。
应用开发:提供可视化的WebBuilder集成开发环境,帮助应用系统的快速开发,支持使用Eclipse等开发工具的开发和调试,可以在您原有使用的技术框架上混合使用。
应用部署:使用基于Web的资源管理器进行应用的部署,支持Java,.Net,PHP等大部分Web应用的部署。
自定义的应用描述语言:基于XML的Web应用描述语言,屏蔽不同平台、数据库和浏览器之间的差异。
完整的组件框架:提供应用开发所需的经过封装的前后台组件、开发框架以及应用模块,集成封装了大量Ext、Dhtml、FusionCharts、标准HTML和JS组件以及包括数据访问、流程引擎、计划任务、系统调度等框架在内的Java后台组件。
使用WebBuilder可快速开发出功能强大的各种企业级应用系统,也可以基于应用系统平台做深度的二次开发。
‘肆’ 开源流程引擎Camunda技术架构
Camunda是一个基于Java的框架,支持用于工作流和流程自动化的BPMN、用于案例管理的CMMN和用于业务决策管理的DMN。
本篇文章我们仅考虑BPMN流程引擎,先不涉及CMMN和DMN引擎。就流程引擎而言,Camunda是一个灵活的工作流框架,它的核心是一个在Java虚拟机内部运行的原生BPMN 2.0流程引擎,因此它可以嵌入到任何Java应用程序或运行时容器中。Camunda与Java EE 集成,并可以与Spring Framework和Spring Boot完美匹配。
Camunda BPMS到底包括哪些功能,我们拿官方的一张架构图进行解读分析。
1.从BPM应用维度看
Camunda分为流程设计和流程运行两个阶段,见图中最下方的蓝色大箭头,Model和Execute,按照这两个阶段,Camunda划分为两大部分功能,对应设计阶段的功能有 Modeler,对应运行阶段的功能有Engine、TaskList、Cockpit、Admin。
2.从BPM功能维度看
Camunda包括了流程设计器(Modeler)、流程引擎(Engine)、API接口(REST/Java API)、任务列表(TaskList)、流程管理控制台(Cockpit)、系统管理工具(Admin)。在Camunda商业产品中还包括了流程监控预警工具(Optimize)、流程协同设计工具(Cawemo)。这里重点先说一下Camunda流程设计器,支持两种模式,一种是富客户端的流程建模工具Camunda Modeler,需要在客户端安装;另一种是基于浏览器的流程设计器bpmn.io,这两款软件均开源。
3.从BPM角色维度看
Camunda分为业务分析师、流程开发工程师、最终用户、流程管理员、系统管理员这几个角色,每个角色对应BPMS不同的功能。业务分析师、流程开发工程师使用流程设计器(Modeler)进行流程建模,最终用户使用任务列表(TaskList)进行流程发起和审批,流程管理员使用流程管理控制台(Cockpit)进行流程管理,比如流程暂停恢复、流程异常干预等,系统管理员使用系统管理工具(Admin)进行系统管理,比如组织用户管理、权限管理等。
1.支持与Spring框架集成
Camunda支持与spring框架集成,把 camunda-engine-spring框架引入到项目的maven模块内,它可以与Spring 3、4或5版本一起使用,具体集成过程后面有文章单独介绍。
2.支持与spring boot集成
后面文章专题介绍
3.支持与CDI and Java EE 集成
CDI (Context and Dependency Injection)是 Java EE6的标准和依赖注入,Camunda通过camunda-engine-cdi模块集成可利用camunda引擎的配置和cdi的可扩展性。
4.支持与Runtime Container 集成
支持与tomcat、JBoss等常见的运行容器集成。
Camunda BPM是一个灵活的框架,支持嵌入式、分布式、集群等多种部署模式。
1.嵌入式部署
流程引擎以Jar包方式添加到应用程序中,通过这种方式,可以在应用程序生命周期中轻松启动和停止流程引擎。
2.基于web容器启动,多应用共享
流程引擎在运行时容器(Servlet容器、应用程序服务器等)中启动,流程引擎作为容器服务提供,可以由容器内部署的所有应用程序共享。这种方式在实际应用场景中不多见。
3.独立部署,多应用共享
在这种情况下,流程引擎独立部署,通过网络提供服务,网络上运行的不同应用程序可以通过远程通信通道与进程引擎交互,远程访问流程引擎的最简单方法是使用内置的REST服务接口。在企业级流程中心部署架构中,这是一种最常见的部署模式,在现在的微服务部署架构中,也可以采取这种方式。
4.集群部署
为了提供扩展或故障转移功能,流程引擎可以分布到集群中的不同节点,每个流程引擎实例都必须连接到共享数据库。Camunda BPM不提供现成的负载平衡功能,可以采用nginx等第三方负载均衡软件实现。
本文介绍了第三方库及其在Camunda中的使用。对于Camunda的每个组件,都列出了第三方库。对于每个库,都解释了该库是必需的依赖项还是可选的依赖项。必需的依赖是Camunda提供核心功能所依赖的库。在下面的列表中标记为(Required Dependency)。可选的依赖项是可以与Camunda集成的库。在下面的列表中标记为(可选依赖项)。
以下是Camunda7.15版本依赖得第三方类库:
1、Process Engine
流程引擎依赖于以下第三方类库:
MyBatis mapping framework (Required Dependency) for object-relational mapping.
Joda Time (Required Dependency) for parsing date formats.
Java Uuid Generator (JUG) (Optional Dependency) Id Generator. See the documentation on Id-Generators
SLF4J (Required Dependency) Logging Facade
此外,流程引擎还可以集成:
Apache Commons Email (Optional Dependency) for mail task support.
Spring Framework Spring-Beans (Optional Dependency) for configuration using camunda.cfg.xml.
Spring Framework Spring-Core (Optional Dependency) for configuration using camunda.cfg.xml.
Spring Framework Spring-ASM (Optional Dependency) for configuration using camunda.cfg.xml.
Groovy (Optional Dependency) for groovy script task support.
Jython (Optional Dependency) for Python script task support.
JRuby (Optional Dependency) for Ruby script task support.
Freemarker (Optional Dependency) for freemarker template engine support.
Apache Velocity (Optional Dependency) for apache velocity template engine support.
SAXON (Optional Dependency) for XSLT and XQuery template engine support.
2、REST API
REST API依赖于以下第三方库:
Jackson JAX-RS (Required Dependency) provider for JSON content type
Apache Commons FileUpload (Required Dependency)
此外,当使用Apache Tomcat时:
RESTEasy (Required Dependency)
3、Spring Support
Spring支持可以与以下第三方库集成:
Apache Commons DBCP (Optional Dependency)
Spring Framework Spring-Beans (Optional Dependency)
Spring Framework Spring-Core (Optional Dependency)
Spring Framework Spring-ASM (Optional Dependency)
Spring Framework Spring-Context (Optional Dependency)
Spring Framework Spring-JDBC (Optional Dependency)
Spring Framework Spring-ORM (Optional Dependency)
Spring Framework Spring-TX (Optional Dependency)
4、Camunda Spin
Camunda Spin依赖于以下第三方库:
Jackson Json (Required Dependency) for Json Dataformat Support
此外,Camunda Spin可以与以下库集成:
Jayway Json Path (Optional Dependency) for Json Path Support
5、Camunda Connect
Camunda Connect依赖于以下第三方库:
Apache Http Components (Required Dependency) for REST and SOAP support.
1、支持的Java开发环境
• Java版本: 8 / 9 / 10 / 11 / 12 / 13 / 14
• Springboot版本: 2.3.x.RELEASE
2、支持的Java运行环境
• Oracle JDK 8 / 9 / 10 / 11 / 12 / 13 / 14
• IBM JDK 8 (with J9 JVM)
• OpenJDK 8 / 9 / 10 / 11 / 12 / 13 / 14
3、支持的数据库软件
• Mysql 5.6 / 5.7
• MariaDB 10.0 / 10.2 / 10.3
• Oracle 11g / 12c / 18c / 19c
• IBM DB2 10.5 / 11.1
• PostgreSQL 9.4 / 9.6 / 10.4 / 10.7 / 11.1 / 11.2 / 12.2
• Microsoft SQL Server 2012/2014/2016/2017
• H2 1.4
4、支持的应用服务器
• Apache Tomcat 7.0 / 8.0 / 9.0
• JBoss EAP 6.4 / 7.0 / 7.1 / 7.2
• Wildfly Application Server 10.1+
• IBM WebSphere Application Server 8.5 / 9.0 企业版
• Oracle WebLogic Server 12c (12R2) 企业版
5、支持的浏览器
• Google Chrome
• Mozilla Firefox
• Microsoft Edge
6、流程设计器支持的操作系统
• Windows 7 / 10
• Mac OS X 10.11
• Ubuntu LTS
‘伍’ 从零打造一个Web地图引擎
说到地图,大家一定很熟悉,平时应该都使用过网络地图、高德地图、腾讯地图等,如果涉及到地图相关的开发需求,也有很多选择,比如前面的几个地图都会提供一套 js API ,此外也有一些开源地图框架可以使用,比如 OpenLayers 、 Leaflet 等。
那么大家有没有想过这些地图是怎么渲染出来的呢,为什么根据一个经纬度就能显示对应的地图呢,不知道没关系,本文会带各位从零实现一个简单的地图引擎,来帮助大家了解 GIS 基础知识及 Web 地图的实现原理。
首先我们去高德地图上选个经纬度,作为我们后期的地图中心点,打开 高德坐标拾取 工具,随便选择一个点:
笔者选择了杭州的雷峰塔,经纬度为: [120.148732,30.231006] 。
地图瓦片我们使用高德的在线瓦片,地址如下:
目前各大地图厂商的瓦片服务遵循的规则是有不同的:
谷歌和 TMS 的瓦片区别可以通过该地址可视化的查看: 地图瓦片 。
虽然规范不同,但原理基本是一致的,都是把地球投影成一个巨大的正方形世界平面图,然后按照四叉树进行分层切割,比如第一层,只有一张瓦片,显示整个世界的信息,所以基本只能看到洲和海的名称和边界线,第二层,切割成四张瓦片,显示信息稍微多了一点,以此类推,就像一个金字塔一样,底层分辨率最高,显示的细节最多,瓦片数也最多,顶层分辨率最低,显示的信息很少,瓦片数量相对也最少:
每一层的瓦片数量计算公式:
十八层就需要 68719476736 张瓦片,所以一套地图瓦片整体数量是非常庞大的。
瓦片切好以后,通过行列号和缩放层级来保存,所以可以看到瓦片地址中有三个变量: x 、 y 、 z
通过这三个变量就可以定位到一张瓦片,比如下面这个地址,行号为 109280 ,列号为 53979 ,缩放层级为 17 :
对应的瓦片为:
关于瓦片的更多信息可以阅读 瓦片地图原理 。
高德地图使用的是 GCJ-02坐标系 ,也称火星坐标系,由中国国家测绘局在02年发布,是在GPS坐标( WGS-84 坐标系)基础上经加密后而来,也就是增加了非线性的偏移,让你摸不准真实位置,为了国家安全,国内地图服务商都需要使用 GCJ-02坐标系 。
WGS-84 坐标系是国际通用的标准, EPSG 编号为 EPSG:4326 ,通常GPS设备获取到的原始经纬度和国外的地图厂商使用的都是 WGS-84 坐标系。
这两种坐标系都是地理坐标系,球面坐标,单位为 度 ,这种坐标方便在地球上定位,但是不方便展示和进行面积距离计算,我们印象中的地图都是平面的,所以就有了另外一种平面坐标系,平面坐标系是通过投影的方式从地理坐标系中转换过来,所以也称为投影坐标系,通常单位为 米 ,投影坐标系根据投影方式的不同存在多种,在 Web 开发的场景里通常使用的是 Web墨卡托投影 ,编号为 EPSG:3857 ,它基于 墨卡托投影 ,把 WGS-84 坐标系投影成正方形:
这是通过舍弃了南北 85.051129纬度 以上的地区实现的,因为它是正方形,所以一个大的正方形可以很方便的被分割为更小的正方形。
坐标系更详细的信息可参考 GIS之坐标系统 , EPSG:3857 的详细信息可参考 EPSG:3857 。
上一节里我们简单介绍了一下坐标系,按照 Web 地图的标准,我们的地图引擎也选择支持 EPSG:3857 投影,但是我们通过高德工具获取到的是火星坐标系的经纬度坐标,所以第一步要把经纬度坐标转换为 Web墨卡托 投影坐标,这里为了简单,先直接把火星坐标当做 WGS-84 坐标,后面再来看这个问题。
转换方法网上一搜就有:
3857 坐标有了,它的单位是 米 ,那么怎么转换成瓦片的行列号呢,这就涉及到 分辨率 的概念了,即地图上一像素代表实际多少米,分辨率如果能从地图厂商的文档里获取是最好的,如果找不到,也可以简单计算一下(如果使用计算出来的也不行,那就只能求助搜索引擎了),我们知道地球半径是 6378137 米, 3857 坐标系把地球当做正圆球体来处理,所以可以算出地球周长,投影是贴着地球赤道的:
所以投影成正方形的世界平面图后的边长代表的就是地球的周长,前面我们也知道了每一层级的瓦片数量的计算方式,而一张瓦片的大小一般是 256*256 像素,所以用地球周长除以展开后的世界平面图的边长就知道了地图上每像素代表实际多少米:
地球周长算出来是 40075016.68557849 ,可以看到 OpenLayers 就是这么计算的:
3857 坐标的单位是 米 ,那么把坐标除以分辨率就可以得到对应的像素坐标,再除以 256 ,就可以得到瓦片的行列号:
函数如下:
接下来我们把层级固定为 17 ,那么分辨率 resolution 就是 1.194328566955879 ,雷峰塔的经纬度转成 3857 的坐标为: [13374895.665697495, 3533278.205310311] ,使用上面的函数计算出来行列号为: [43744, 11556] ,我们把这几个数据代入瓦片的地址里进行访问:
一片空白,这是为啥呢,其实是因为原点不一样, 4326 和 3857 坐标系的原点在赤道和本初子午线相交点,非洲边上的海里,而瓦片的原点在左上角:
再来看下图会更容易理解:
3857 坐标系的原点相当于在世界平面图的中间,向右为 x 轴正方向,向上为 y 轴正方向,而瓦片地图的原点在左上角,所以我们需要根据图上【绿色虚线】的距离计算出【橙色实线】的距离,这也很简单,水平坐标就是水平绿色虚线的长度加上世界平面图的一半,垂直坐标就是世界平面图的一半减去垂直绿色虚线的长度,世界平面图的一半也就是地球周长的一半,修改 getTileRowAndCol 函数:
这次计算出来的瓦片行列号为 [109280, 53979] ,代入瓦片地址:
结果如下:
可以看到雷峰塔出来了。
我们现在能根据一个经纬度找到对应的瓦片,但是这还不够,我们的目标是要能在浏览器上显示出来,这就需要解决两个问题,一个是加载多少块瓦片,二是计算每一块瓦片的显示位置。
渲染瓦片我们使用 canvas 画布,模板如下:
地图画布容器 map 的大小我们很容易获取:
地图中心点我们设在画布中间,另外中心点的经纬度 center 和缩放层级 zoom 因为都是我们自己设定的,所以也是已知的,那么我们可以计算出中心坐标对应的瓦片:
缩放层级还是设为 17 ,中心点还是使用雷峰塔的经纬度,那么对应的瓦片行列号前面我们已经计算过了,为 [109280, 53979] 。
中心坐标对应的瓦片行列号知道了,那么该瓦片左上角在世界平面图中的像素位置我们也就知道了:
计算出来为 [27975680, 13818624] 。这个坐标怎么转换到屏幕上呢,请看下图:
中心经纬度的瓦片我们计算出来了,瓦片左上角的像素坐标也知道了,然后我们再计算出中心经纬度本身对应的像素坐标,那么和瓦片左上角的差值就可以计算出来,最后我们把画布的原点移动到画布中间(画布默认原点为左上角,x轴正方向向右,y轴正方向向下),也就是把中心经纬度作为坐标原点,那么中心瓦片的显示位置就是这个差值。
补充一下将经纬度转换成像素的方法:
计算中心经纬度对应的像素坐标:
计算差值:
最后通过 canvas 来把中心瓦片渲染出来:
这里先来看看 getTileUrl 方法的实现:
这里随机了四个子域: webrd01 、 webrd02 、 webrd03 、 webrd04 ,这是因为浏览器对于同一域名同时请求的资源是有数量限制的,而当地图层级变大后需要加载的瓦片数量会比较多,那么均匀分散到各个子域下去请求可以更快的渲染出所有瓦片,减少排队等待时间,基本所有地图厂商的瓦片服务地址都支持多个子域。
为了方便看到中心点的位置,我们再额外渲染两条中心辅助线,效果如下:
可以看到中心点确实是雷峰塔,当然这只是渲染了中心瓦片,我们要的是瓦片铺满整个画布,对于其他瓦片我们都可以根据中心瓦片计算出来,比如中心瓦片左边的一块,它的计算如下:
所以我们只要计算出中心瓦片四个方向各需要几块瓦片,然后用一个双重循环即可计算出画布需要的所有瓦片,计算需要的瓦片数量很简单,请看下图:
画布宽高的一半减去中心瓦片占据的空间即可得到该方向剩余的空间,然后除以瓦片的尺寸就知道需要几块瓦片了:
我们把中心瓦片作为原点,坐标为 [0, 0] ,来个双重循环扫描一遍即可渲染出所有瓦片:
效果如下:
很完美。
拖动可以这么考虑,前面已经实现了渲染指定经纬度的瓦片,当我们按住进行拖动时,可以知道鼠标滑动的距离,然后把该距离,也就是像素转换成经纬度的数值,最后我们再更新当前中心点的经纬度,并清空画布,调用之前的方法重新渲染,不停重绘造成是在移动的视觉假象。
监听鼠标相关事件:
在 onMousemove 方法里计算拖动后的中心经纬度及重新渲染画布:
movementX 和 movementY 属性能获取本次和上一次鼠标事件中的移动值,兼容性不是很好,不过自己计算该值也很简单,详细请移步 MDN 。乘以当前分辨率把 像素 换算成 米 ,然后把当前中心点经纬度也转成 3857 的 米 坐标,偏移本次移动的距离,最后再转回 4326 的经纬度坐标作为更新后的中心点即可。
为什么 x 是减, y 是加呢,很简单,我们鼠标向右和向下移动时距离是正的,相应的地图会向右或向下移动, 4326 坐标系向右和向上为正方向,那么地图向右移动时,中心点显然是相对来说是向左移了,因为向右为正方向,所以中心点经度方向就是减少了,所以是减去移动的距离,而地图向下移动,中心点相对来说是向上移了,因为向上为正方向,所以中心点纬度方向就是增加了,所以加上移动的距离。
更新完中心经纬度,然后清空画布重新绘制:
效果如下:
可以看到已经凌乱了,这是为啥呢,其实是因为图片加载是一个异步的过程,我们鼠标移动过程中,会不断的计算出要加载的瓦片进行加载,但是可能上一批瓦片还没加载完成,鼠标已经移动到新的位置了,又计算出一批新的瓦片进行加载,此时上一批瓦片可能加载完成并渲染出来了,但是这些瓦片有些可能已经被移除画布,不需要显示,有些可能还在画布内,但是使用的还是之前的位置,渲染出来也是不对的,同时新的一批瓦片可能也加载完成并渲染出来,自然导致了最终显示的错乱。
知道原因就简单了,首先我们加个缓存对象,因为在拖动过程中,很多瓦片只是位置变了,不需要重新加载,同一个瓦片加载一次,后续只更新它的位置即可;另外再设置一个对象来记录当前画布上应该显示的瓦片,防止不应该出现的瓦片渲染出来:
因为需要记录瓦片的位置、加载状态等信息,我们创建一个瓦片类:
然后修改之前的双重循环渲染瓦片的逻辑:
效果如下:
可以看到,拖动已经正常了,当然,上述实现还是很粗糙的,需要优化的地方很多,比如:
1.一般会先排个序,优先加载中心瓦片
2.缓存的瓦片越来越多肯定也会影响性能,所以还需要一些清除策略
这些问题有兴趣的可以自行思考。
拖动是实时更新中心点经纬度,那么缩放自然更新缩放层级就行了:
效果如下:
功能是有了,不过效果很一般,因为我们平常使用的地图缩放都是有一个放大或缩小的过渡动画,而这个是直接空白然后重新渲染,不仔细看都不知道是放大还是缩小。
所以我们不妨加个过渡效果,当我们鼠标滚动后,先将画布放大或缩小,动画结束后再根据最终的缩放值来渲染需要的瓦片。
画布默认缩放值为 1 ,放大则在此基础上乘以 2 倍,缩小则除以 2 ,然后动画到目标值,动画期间设置画布的缩放值及清空画布,重新绘制画布上的已有瓦片,达到放大或缩小的视觉效果,动画结束后再调用 renderTiles 重新渲染最终缩放值需要的瓦片。
效果如下:
虽然效果还是一般,不过至少能看出来是在放大还是缩小。
前面还遗留了一个小问题,即我们把高德工具上选出的经纬度直接当做 4326 经纬度,前面也讲过,它们之间是存在偏移的,比如手机 GPS 获取到的经纬度一般都是 84 坐标,直接在高德地图显示,会发现和你实际位置不一样,所以就需要进行一个转换,有一些工具可以帮你做些事情,比如 Gcoord 、 coordtransform 等。
上述效果看着比较一般,其实只要在上面的基础上稍微加一点瓦片的淡出动画,效果就会好很多,目前一般都是使用 canvas 来渲染 2D 地图,如果自己实现动画不太方便,也有一些强大的 canvas 库可以选择,笔者最后使用 Konva.js 库重做了一版,加入了瓦片淡出动画,最终效果如下:
另外只要搞清楚各个地图的瓦片规则,就能稍加修改支持更多的地图瓦片:
具体实现限于篇幅不再展开,有兴趣的可以阅读本文源码。
本文详细的介绍了一个简单的 web 地图开发过程,上述实现原理仅是笔者的个人思路,不代表 openlayers 等框架的原理,因为笔者也是 GIS 的初学者,所以难免会有问题,或更好的实现,欢迎指出。
在线 demo : https://wanglin2.github.io/web_map_demo/
完整源码: https://github.com/wanglin2/web_map_demo
‘陆’ 如何在web中使用activiti和sql server
一、按照如下方式新建一个web工程
之所以要用maven,主要是为了解决各种依赖项的问题,用maven来管理依赖项还是很方便的。
用Eclipse创建Maven结构的web项目的时候选择了Artifact
Id为maven-artchetype-webapp,由于这个catalog比较老,用的servlet还是2.3的,而一般现在都是用3.0,在
Project Facets里面修改Dynamic web mole为3.0的时候就会出现Cannot change version of
project facet Dynamic web mole to 3.0,如图:
解决这个问题的步骤如下:
1. 把Servlet改成3.0,打开项目的web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="schele-console" version="3.0">
2. 修改项目的设置,在Navigator下打开项目.settings目录下的org.eclipse.jdt.core.prefs
把1.5改成1.8
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.source=1.8
3. 打开org.eclipse.wst.common.project.facet.core.xml
把java改为1.8, 把jst.web改为3.0;
<?xml version="1.0" encoding="UTF-8"?>
<faceted-project>
<fixed facet="wst.jsdt.web"/>
<installed facet="jst.web" version="3.0"/>
<installed facet="wst.jsdt.web" version="1.0"/>
<installed facet="java" version="1.8"/>
</faceted-project>
二、解决报错The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
可以使用如下步骤来解决。
1、右击web工程-》属性或Build Path-》Java Build Path->Libraries-> Add Libray...->Server Runtime -》Tomcat Server
2、切换到Java Build Path界面中的Orader and Export,选择Tomcat。
三、修改项目的pom.xml文件,添加activiti相关依赖项
相关依赖项如下:
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>${activiti-version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>${activiti-version}</version>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.4.3</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.3.168</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.6</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
其中activiti-version的定义如下:
<properties>
<activiti-version>5.18.0</activiti-version>
</properties>
其实这些内容我都是从Activiti工程的pom文件中拷贝过来的。
四、添加activiti需要的配置文件
在activiti的userguide(http://activiti.org/userguide/index.html#_configuration )中有说。
如果我们使用如下语句来创建一个流程引擎实例
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine()
那么实际上他是到该项目的classpath路径下去找一个名为
activiti.cfg.xml的配置文件,然后根据该配置文件的设置,通过spring的方式来创建一个processEngine。而且是去找其中
的那个名字是default的processEngine。
所以我们可以在该项目的src/main/resources 目录下创建一个名为 activiti.cfg.xml的文件,然后将如下内容复制进去。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.">
</bean>
</beans>
五、创建sql server数据库
通过sql server management studio 创建一个数据库,比如名字叫做 activiti
六、在maven中添加sql server jdbc依赖项
在maven仓库中是没有sql server 的jdbc jar包的,可以按照如下步骤操作
Download the JDBC driver for Microsoft SQL Server
Visit the MSDN site for SQL Server and download the latest version of the JDBC driver for your operating system.
Unzip the package
Open a command prompt and switch into the expanded directory where the jar file is located.
Execute the following command. Be sure to modify the jar file name and version as necessary:
1
mvn install:install-file -Dfile=sqljdbc4.jar -Dpackaging=jar -DgroupId=com.microsoft.sqlserver -DartifactId=sqljdbc4 -Dversion=4.0
You should see something similar to this:
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-install-plugin:2.3.1:install-file (default-cli) @ standalone-pom ---
[INFO] Installing /Users/claude/installers/JDBC/sqljdbc_4.0/enu/sqljdbc4.jar to /Users/claude/.m2/repository/com/microsoft/sqlserver/sqljdbc4/4.0/sqljdbc4-4.0.jar
[INFO] Installing /var/folders/c6//T/mvninstall1874482299687761721.pom to /Users/claude/.m2/repository/com/microsoft/sqlserver/sqljdbc4/4.0/sqljdbc4-4.0.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.208s
[INFO] Finished at: Tue Mar 13 14:07:31 EDT 2012
[INFO] Final Memory: 3M/81M
[INFO] ------------------------------------------------------------------------
Modify your POM
Include the new dependency by modifying your project’s pom.xml. Add the following dependency:
1
2
3
4
5
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>sqljdbc4</artifactId>
<version>4.0</version>
</dependency>
Save the pom.xml file and build the project to make sure no errors exist.
七、让activiti连接sql server数据库
修改第四节中的activiti.cfg.xml文件,将 processEngineConfiguration的内容改成下文这样:
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.">
<property name="databaseSchemaUpdate" value="true"/>
<property name="jdbcUrl" value="jdbc:sqlserver://localhost:1433;databaseName=activiti2 " />
<property name="jdbcDriver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
<property name="jdbcUsername" value="sa" />
<property name="jdbcPassword" value="sa123" />
</bean>
八、在代码中使用activiti的api
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
if(processEngine != null)
{
out.println("<h1> Hello !" + processEngine.getName() + "</h1>");
IdentityService identityService = processEngine.getIdentityService();
List<String> keys = identityService.getUserInfoKeys("Kermit");
for(String key: keys)
{
out.println(String.format("<h1> key = %s, value = %s </h1>", key, identityService.getUserInfo("Kermit", key)));
}
}
以上在调用 ProcessEngines.getDefaultProcessEngine(); 的时候,实际上背后就会去调用搜索classPath目录下的activiti.cfg.xml文件,然后通过其中的配置来创建processEngine对象。
九、在eclipse中调试activiti项目
在eclipse中调试web项目,其实他是把相关的资料生成到如下路径:
<eclipse workspace dir>\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\MavenWeb
如果发现某项配置修改之后,调试的时候没有生效,那可以试着clean一下, Project ->clean...,然后重新生成即可。
‘柒’ Spring 的Web Flow 和 工作流有什么区别
Snaker工作流引擎本着轻量、简单、灵巧理念设计。
一、轻量:
1、可以不依赖主流的ioc、orm框架独立运行(使用JDBC+Dbutils)
2、整个jar占用170K
二、简单:
1、流程组件简单。
2、表设计简单(目前只有7张表)
3、上手简单,只需要根据实际的项目环境配置snaker.properties/snaker.xml两个文件即可
三、灵巧:
1、扩展性:暴露较多的可扩展接口,甚至是核心的流程组件(只需在snaker.xml中增加bean的配置即可)。
2、数据持久层面支持jdbc+dbutils、mybatis、hibernate、springjdbc。目前支持的数据库有oracle、mysql、sqlserver。
当然,基于以上三点设计肯定会损失流程引擎的一些特性。所以Snaker目前主要针对中小型项目需要增加工作流特性的系统。
‘捌’ 什么情况下,需要使用工作流引擎
流程无处不在,当我们需要把管理的细节做好节点控制,以及管理时间提醒,节点提醒,完成审批的时候,都是需要的,所以工作流引擎是无时无刻不需要的,因为他跟管理是同步的,但是管理的成本和价值是同步的,如果需要管控的细节,那么对应的就展示对应的细节,如果粗犷管理,会导致管理漏洞,但是管控大而全,就又会增加管理成本,导致管控的细节是否是跟价值呈现成正比。
流程组件应用场景——可视化流程配置、流程组件应用场景——流程审批方式多、流程组件应用场景——流程审批动作丰富、流程组件应用场景——流程审批通知方式多样化、流程组件应用场景——流程运行情况监控和统计
‘玖’ 2.简述web搜索引擎基本结构由哪三部分组成,以及各部分的作用
一个搜索引擎由搜索器 、索引器 、检索器 和用户接口 四个部分组成。搜索器的功能是在互联网 中漫游,发现和搜集信息。索引器的功能是理解搜索器所搜索的信息,从中抽取出索引项,用于表示文档 以及生成文档库的索引表。检索器的功能是根据用户的查询在索引库中快速检出文档,进行文档与查询的相关度评价,对将要输出的结果进行排序,并实现某种用户相关性反馈机制。用户接口的作用是输入用户查询、显示查询结果、提供用户相关性反馈机制。
‘拾’ vue集成流程设计引擎
相关阅读: 开源流程引擎选择
教程: bpmnjs教程
bpmn-js 是 BPMN 2.0 渲染工具包和 Web 模型。bpmn-js 正在努力成为 Camunda BPM 的一部分。bpmn-js 使用 Web 建模工具可以很方便的构建 BPMN 图表,可以把 BPMN 图表嵌入到你的项目中,容易扩展。bpmn-js是基于原生js开发,支持集成到vue、react等开源框架中。
官方网站
mxGraph是一个强大的JavaScript流程图前端库,可以快速创建交互式图表和图表应用程序,国内外着名的ProcessOne和draw.io都是使用该库创建的强大的在线流程图绘制网站. 由于mxGraph是一个开放的js绘图开发框架,我们可以开发出很炫的样式,或者完全按照项目需求定制。
官方网站