《[理学]润乾报表40远程设计部署手册.doc》由会员分享,可在线阅读,更多相关《[理学]润乾报表40远程设计部署手册.doc(37页珍藏版)》请在三一办公上搜索。
1、创新技术推动应用进步北京润乾信息系统技术有限公司远程设计部署手册北京润乾信息系统技术有限公司目录第一章 原理3一、 什么叫远程设计?3二、 远程设计的原理3三、 远程设计的部署步骤3第二章 远程设计器下载相关的部署5一、 什么是 Java Web Start?5二、 需要下载的jar包5三、 证书制作63.1 命令步骤:63.2 执行结果7四、 jar包签名7五、 jnlp文件与启动页面编写85.1 .jnlp文件的说明85.2 html文件的说明9第三章 远程服务器的编写与部署10一、 远程服务器功能与原理10二、 远程服务器例子代码介绍10三、 远程服务器的例子部署与使用介绍113.1 w
2、eb.xml文件配置113.2 用户信息文件users.properties123.3 远程数据源信息文件remoteDataSource.xml133.4 远程服务器的部署143.5 启发14第四章 远程数据连接15一、 原理15二、 部署与配置152.1 jdbc直连方式的配置与部署152.2 http jdbc方式的配置与部署16第五章 设计器启动参数19一、 启动命令与启动参数19二、 启发用途19三、 充分利用jnlp传递设计器启动参数20四、 动态生成jnlp21第六章 自定义菜单配置23一、 概述23二、 编程实现菜单功能232.1 com.runqian.report4.ide
3、.configmenu.CMAction232.2 com.runqian.report.ide.configmenu.ICMHandler232.3 例子25三、 增加菜单按钮253.1 report4config.xml文件结构:26四、 将实现菜单功能的相关类进行远程下载部署27第一章 原理1、 什么叫远程设计?远程设计是指用户在浏览器端可以基于语义层进行报表的设计,可以远程访问服务器的报表模板,可以修改保存服务器的报表模板,可以远程连接服务器的数据库,可以远程运行浏览报表数据的过程。2、 远程设计的原理润乾报表提供的远程设计,是采用java web start的方式,在浏览器端下载并且
4、运行报表设计器,同时提供了远程http jdbc的数据库连接方式以及直接jdbc的连接方式,可以满足客户端连接数据库的多种需求。提供了远程文件服务器,可以对报表模板、语义层文件的访问进行权限控制;提供了远程登陆服务,可以处理用户会话变量。处理登陆请求,将会话信息发送给客户端报表服务器远程服务器,包括登陆服务和文件服务浏览器端通过web start方式下载设计器发送登录请求发送连接数据源的请求连接数据源,并将查询结果返回客户端发送访问报表模板、语义层文件的请求将结果文件流返回给客户端示意图:从上述示意图可以看出,远程服务器主要处理了客户端的登录、连接数据源、访问报表及语义层文件等事件,并进行了相
5、关的权限控制和会话信息的传递。3、 远程设计的部署步骤该步骤主要实现一些自定义功能和高级控制,非必须,但是可以让远程设计更加人性化该步骤主要实现远程登录、远程数据连接、远程文件(包括报表和语义文件)访问的权限控制等等完成这一步骤,相当于实现了真正意义上的远程设计部署远程设计器下载jar包编写远程服务器,并进行相关部署与配置制作证书并对下载jar包进行签名编写下载配置文件jnlp和启动页面远程数据源连接相关部署这几个步骤可以实现远程设计器的下载,如果仅仅完成这几个步骤,相当于在客户端安装了设计器,此时设计器可以作为单机版来使用自定义菜单的配置与相关类实现了解设计器启动参数,实现一些高级控制下面的
6、章节,我们从web start方式下载设计器开始,逐步介绍每一个环节的部署以及二次开发。第二章 远程设计器下载相关的部署1、 什么是 Java Web Start?Java Web Start 是一个软件技术,它包含了 applet 的可移植性、Servlet 和 JavaServer Pages (JSP)的可维护性以及象 XML 和 HTML 这样的标记语言的简易性。它是基于 Java 的应用程序,允许从标准的 Web 服务器启动、部署和更新功能完全的 Java 2 客户机应用程序。在第一次启动 Java Web Start 时,用户可以从 Web 下载新的客户机应用程序;之后这些应用程序
7、可以通过 Web 页面的链接或(Windows 中的)桌面图标或“开始”菜单初始化。应用程序在 Java Web Start 下快速初始化,被高速缓存在客户机,并且可以远程的离线启动。另外,因为 Java Web Start 是从 Java 2 技术建立起来的,所以它继承了 Java 平台的完整的安全性体系结构。上面的解释是标准回答,不一定能理解,我们可以简单了说,java web start可以让用户在客户端自动下载润乾报表设计器,而且可以自动判断设计器是否有更新,如果更新,会自动重新下载,如果没有更新,就不需要重复下载。其次,所有准备在客户端下载的jar包,都要符合java的安全性要求,即
8、必须经过证书签名。所以,从原理上讲,java web start方式远程启动设计器和c/s模式并无本质差别,其实就是c/s的运行模式,无非实现了设计器的自动下载和更新而已。因此,这种方式的远程报表设计,主体程序都运行在客户端机器上,对客户端的机器性能有一定的要求,不会对服务器造成压力,和并发数无关。2、 需要下载的jar包在进行证书制作和签名之前,我们首先要了解,润乾远程设计器需要用到哪些jar?/设计器必须的jaralloy.jar jbcl.jarlistview.jarlog4j_128.jarparser.jarreport4.jarrqlicense.jar /设计器授权文件,文件名
9、为defaultlicense.lic,/该文件单独打一个jar,方便更新/特定功能点用到的jarbarcode.jar /条形码poi2.jar /导入导出exceltransfer3.5.jar /报表从3.5迁移到4.0itext2_rq.jar /导出pdf和wordjai_codec.jar /统计图jai_core.jar /统计图/http jdbc连接r4jdbcClient.jarr4jdbcServer.jar commons-codec-1.3.jarcommons-httpclient-3.0.jarcommons-logging.jar/jdbc包db2java.ja
10、rdb2jcc.jarmysql-connector-java-3.0.17-ga-bin.jaroracle9ijdbc.jar sqlserver.jarsybasejdbc5_5.jarhsqldb.jar上述jar包,除了设计器必须的以外,可以根据功能的需要进行取舍。选中的jar,最终都要被下载到客户端。选好需要的jar之后,请在服务器报表应用的根目录下建一个专门的目录,把这些jar全部部署到该目录下。下面,我们假设该目录名为/remoteDesigner,假设应用根目录为report,那么该目录就是report/remoteDesigner3、 证书制作3.1 命令步骤:keytoo
11、l -genkey -keystore reportremoteDesignerrunqian.keystore -alias RQReport -keyalg RSA -keysize 1024 -validity 7300 /keytool是jdk自带的命令,在jdk安装路径/bin 目录下。 /runqian.keystore是证书的文件名,自己任意取,签名时会用到 /RQReport是别名,可以自己任意取,签名的时候会用到输入keystore密码: runqian /密码可以自己任意取,签名的时候会用到您的名字与姓氏是什么? Unknown: 北京润乾软件技术有限公司您的组织单位名称是
12、什么? Unknown: 北京润乾软件技术有限公司您的组织名称是什么? Unknown: 北京润乾软件技术有限公司您所在的城市或区域名称是什么? Unknown: BJ您所在的州或省份名称是什么? Unknown: BJ该单位的两字母国家代码是什么 Unknown: CNCN=北京润乾软件技术有限公司, OU=北京润乾软件技术有限公司, O=北京润乾软件技术有限公司, L=BJ, ST=BJ, C=CN 正确吗? 否: y输入RQReport的主密码 (如果和 keystore 密码相同,按回车): runqian注意:l 上述命令执行时可能会报错,这时应该检查环境变量里JAVA_HOME,P
13、ATH是否正确。为了保证一致性,建议配置成WebServer使用的JDK。l 为了方便用户,report/remoteDesigner目录下“生成签名证书.txt”对上述命令做了同样的说明。3.2 执行结果上述命令执行完后,可以在reportremoteDesigner目录下发现一个文件:runqian.keystore,该文件就是做好的证书。如果重复执行上述命令,你会发现系统报错,说证书已存在。 因此初学者要注意了:如果你制作证书的过程报错,很可能该目录下已经存在一个同名的证书,重复制作会报错。4、 jar包签名证书做好后,就可以利用证书进行签名。下面是标准的签名命令:jarsigner -
14、keystore runqian.keystore -storepass runqian report4.jar RQReport其中:l jarsigner是jdk的命令,在jdk安装目录/bin 目录下l runqian.keystore是证书文件名l runqian 是制作证书时录入的密码l RQReport是制作证书时录入的别名l report4.jar是需要签名的jar包利用上述的签名命令,对所有需要下载的jar进行签名,即可大功告成。注意: jar包一旦发生更改,需要重新签名,例如往里增加或者更新了文件,都算更改。 必须在jar包所在的目录里执行该命令,比如“reportremot
15、eDesigner” 一旦发生找不到命令或类的错误,一般应当检查环境变量的“JAVA_HOME”和”PATH”5、 jnlp文件与启动页面编写5.1 .jnlp文件的说明jnlp是sun 规定的一种配置文件格式,他用于以web start方式启动时,配置需要下载哪些文件,哪些是必须下载,哪些是次要下载的,同时配置相关的权限、启动界面信息、启动命令等等关于Web Start的JNLP Specification可以到sun网站润乾公司提供的远程报表设计,包含了一个缺省的jnlp文件,即reportremoteDesignerrunqian_designer.jnlp,内容如下:/下载文件存放路径
16、,/即本章第二节说明的jar存放路径 /启动界面信息 北京润乾软件技术有限公司 北京润乾软件技术有限公司 /下载文件定义,eager表示必须下载,lazy表示空闲时下载 j2se version=1.4.1+ href= /启动的类 /安全控制 注意: href内容必须写成相对于Jnlp所在目录的相对路径,比如上面例子说明jar包和jnlp在同一目录下。5.2 html文件的说明以下的html文件用于远程以java web start的方式启动设计器,其内容可以自己修改,参照自己应用的页面风格。这里只列举出最关键部分的代码供参考。var javawsInstalled = false;on e
17、rror resume nextIf Not(IsObject(CreateObject(JavaWebStart.isInstalled) ThenjavawsInstalled = falseElsejavawsInstalled = trueEnd If /自动下载java web startif( !javawsInstalled ) document.write( 尚未安装java web start,请点击这里安装 );启动润乾报表设计器 /注意:这里指定的jnlp文件,就是上一小节讲解的jnlp第三章 远程服务器的编写与部署1、 远程服务器功能与原理远程服务器相当于客户端和服务器
18、之间的一个中间层,这个中间层避免了客户端直接访问服务器,通过该中间层实现用户权限的控制。请求文件,包括报表模板和语义层应用服务器远程服务器进行登录校验,权限控制客户端登录请求验证登录并返回会话信息及远程数据连接参数返回经过权限过滤的文件请求文件返回文件发送文件保存请求发送经过权限过滤的保存文件请求2、 远程服务器例子代码介绍例子代码共包括四个类:RemoteManager, RemoteServer, UserInfo, UserManager其中UserInfo为装载个人会话信息的类,UserManager为管理UserInfo的类RemoteServer为远程服务器,接受服务请求,返回服务
19、结果RemoteManager供RemoteServer调用,实现了所有服务请求的方法实现思路大致为:在RemoteServer类的初始化方法里,读取了用户信息配置文件里的所有用户信息,用UserInfo装载,并由UserManager管理。用户信息包括用户密码、权限、会话变量、无权限访问的语义视图和语义字段等等;RemoteServer类的初始化方法里,还读取了缺省语义层文件名和远程数据源配置参数,并把这些信息存储在RemoteManager里在RemoteServer类的service方法里,接受了客户端的登录、注销、访问文件、保存文件请求,并调用RemoteManager处理这些请求,将
20、请求结果以Response的形式返回给客户端在RemoteManager类里,分别实现了登录、注销、打开文件、保存文件四种方法,供RemoteServer调用,在这四个方法里进行权限的控制其中:登录的时候不仅仅校验了用户密码,还把用户的会话信息传递给了客户端response,同时还把缺省的语义层文件名、远程数据源连接参数传递给客户端;此处润乾公司提供了LoginResponse类作为返回的接口。因此客户端登录成功后,会自动发送打开缺省语义层文件的请求,该语义层文件经过权限过滤后会在客户端自动打开;而且客户端登录成功后,还会在系统/数据源菜单下,看到新增加了几个远程数据源配置,这几个都是登录时由
21、远程服务器传递过来的。打开文件和保存文件方法,会根据用户的会话信息里的权限信息,对访问权限进行过滤,之后执行,分别以OpenResponse和SaveResponse类作为返回的接口注销方法以LogoutResponse作为返回的接口返回接口是润乾报表规定的接口,不可随意改动,否则客户端不能识别。3、 接口说明下面详细介绍一下上面提到的远程服务器实际和远程设计器打交的全部接口,掌握了这几个接口,就可以最大灵活的写出自定义的远程服务器。下面举例用的代码,在上面提到的远程服务器例子代码中都可以找到具体的实现。3.1 接收命令远程设计器是通过发送“com.runqian.report4.remote
22、.Request”的子类来向远程服务器发出命令。远程服务器需要接收到并解析这个命令。在servlet中经典的接收命令的代码是:Java.io.InputStream is = request.getInputStream();/request是HttpServletRequest类型Java.io.ObjectInputStream ois = new ObjectInputStream( is );com.runqian.report4.remote.Request req = ( Request ) ois.readObject();远程设计器一共只会发出四种命令:请求在远程服务器登录、请
23、求从远程服务器注销、请求打开远程服务器上的文件、请求把文件保存在远程服务器,分别对应com.runqian.report4.remote.Request的四个子类:l LoginRequestl LogoutRequestl OpenRequestl SaveRequest显然接收到命令后通过instanceof方法就可以判断出req是这四种命令中的哪种了。3.2 返回应答而远程服务器总是通过返回“com.runqian.report4.remote.Response”类的子类来应答这些命令。Servlet里经典的应答代码如下:com.runqian.report4.remote.Respon
24、se res=null;res=./分析接收到的req命令,处理后给res赋值java.io.OutputStream os = response.getOutputStream();/response是HttpServletResponse类型java.io.ObjectOutputStream oos = new ObjectOutputStream( os );oos.writeObject( res );针对设计器的4种命令,远程服务器会对应回答:返回登陆结果、返回注销结果、返回请求的文件、返回保存文件后的结果.他们分别对应com.runqian.report4.remote.Resp
25、onse的四个子类:l LoginResponsel LogoutResponsel OpenResponsel SaveResponse3.3 命令: LoginRequest全面的类说明请参阅API说明文档,这里只给出常用的说明,下同。java.lang.Object com.runqian.report4.remote.Request com.runqian.report4.remote.LoginRequestAll Implemented Interfaces: java.io.Externalizable, java.io.Serializable用到的成员说明成员类型参数user
26、Id用户名属性password加密后的口令属性3.4 命令: LogoutRequestjava.lang.Object com.runqian.report4.remote.Request com.runqian.report4.remote.LogoutRequestAll Implemented Interfaces: java.io.Externalizable, java.io.Serializable用到的成员说明类型参数userId要注销的用户名String3.5 命令:OpenRequestjava.lang.Object com.runqian.report4.remote.
27、Request com.runqian.report4.remote.OpenRequestAll Implemented Interfaces: java.io.Externalizable, java.io.Serializable 用到的成员说明类型参数fileType请求的文件类型,比如语义层文件就是:com.runqian.report4.remote.Const.FILE_SEMANTICSIntuserId用户名StringfileName请求的文件名String3.6 命令:SaveRequestjava.lang.Object com.runqian.report4.remo
28、te.Request com.runqian.report4.remote.SaveRequestAll Implemented Interfaces: java.io.Externalizable, java.io.Serializable用到的成员说明类型参数userId用户名Stringfilename请求写入的文件名Stringdata文件数据Byte3.7 应答:LoginResponsejava.lang.Object com.runqian.report4.remote.Request com.runqian.report4.remote.LoginRequestAll Impl
29、emented Interfaces: java.io.Externalizable, java.io.Serializable用到的成员说明类型参数State应答状态。口令正确应当设为com.runqian.report4.remote.Const.OK。口令不正确应当设为com.runqian.report4.remote.Const.ERROR_PWD;用户名不存在的应当设为com.runqian.report4.remote.Const.INVALID_USERIntsessionVariables会话变量名及变量值。这是用来传递给设计器的,使报表中的会话变量赋值Java.util.h
30、ashMapusername用户名字(不是ID)StringdataSources数据源连接。每个连接做为一个键值对,其中键是数据源名字String型。值是数据源类com.runqian.report4.remote.DataSourceDefine,说明见3.11节。Java.util.hashMapPrivilege权限,具体说明见4-2节intsemanticsFileName语义层文件名StringalarmRowNum数据集行数预警,API说明中0表示不限制,-1也同样不限制int3.8 应答:LogoutResponsejava.lang.Object com.runqian.re
31、port4.remote.Response com.runqian.report4.remote.LogoutResponseAll Implemented Interfaces: java.io.Externalizable, java.io.Serializable 用到的成员说明类型参数state应答状态。正常注销应设为com.runqian.report4.remote.Const.OK。用户名不存在的应当设为com.runqian.report4.remote.Const.INVALID_USERInt3.9 应答: OpenResponsejava.lang.Object com.
32、runqian.report4.remote.Response com.runqian.report4.remote.OpenResponseAll Implemented Interfaces: java.io.Externalizable, java.io.Serializable用到的成员说明类型参数state应答状态。正常读文件应设为com.runqian.report4.remote.Const.OK。读取文件失败应当设为com.runqian.report4.remote.Const.Failed。用户名不存在的应当设为com.runqian.report4.remote.Cons
33、t.INVALID_USERIntclause错误信息Stringdata文件数据Byte3.10 应答:SaveResponsejava.lang.Object com.runqian.report4.remote.Response com.runqian.report4.remote.SaveResponseAll Implemented Interfaces: java.io.Externalizable, java.io.Serializable 用到的成员说明类型参数state应答状态。正常写文件应设为com.runqian.report4.remote.Const.OK。写文件失败
34、应当设为com.runqian.report4.remote.Const.Failed。用户名不存在的应当设为com.runqian.report4.remote.Const.INVALID_USERIntclause错误信息String3.11 远程数据源DataSourceDefinejava.lang.Object com.runqian.report4.usermodel.DataSourceConfig com.runqian.report4.remote.DataSourceDefineAll Implemented Interfaces: java.io.Serializable
35、 Direct Known Subclasses: DataSource 用到的成员说明类型参数setName设置数据源名voidString:数据源名setCaseSentence设置大小写是否敏感voidBoolen:是否敏感(true是敏感;false不敏感)setClientCharset设置客户端字符集VoidString:字符集代码(比如GBK)setDBCharset设置数据库服务端字符集VoidString:字符集代码(比如GBK)setDBType设置数据库类型VoidInt:数据库类型代码(详细说明见com.runqian.base4.util.DBTypes)setDri
36、ver设置数据库驱动类voidString:类全名(比如SQLServer是com.newatlanta.jturbo.driver.Driver)setDSType设置数据源类型voidByte:数据源类型(详见本类常量说明,比如关系型数据库是0)setNeedTranContent是否转换检索内容字符集voidBoolean:是否转换(true代表转换)setNeedTranSentence是否转换检索语句字符集voidBoolean:是否转换(true代表转换)setPassword设置数据库口令voidString:口令setUrl设置数据库连接URLvoidString连接URLse
37、tUser设置数据库用户名voidString用户名setUseSchema设置是否使用带模式的表名称VoidBoolean:是否使用(true代表使用)4、 远程服务器的例子部署与使用介绍4.1 web.xml文件配置在此文件中配置一个为远程报表设计器提供服务的Servlet,如上述例子代码介绍中的RemoteServer,配置如下: remoteServer com.runqian.report4.remote.example.RemoteServer usersConfig /WEB-INF/users.properties semanticsFile demo.xml dsConfig /WEB-INF/remoteDataSource.xml 10 servlet-nam