设计器启动参数
启动命令与启动参数
设计器的启动主类为com.runqian.report4.ide.FrameMain,该类提供了一系列的传入参数,命令格式为:
com.runqian.report4.ide.FrameMain <options> <raqFile>
其中<raqFile>为启动设计器时缺省打开的报表模板文件名 <options>为其它可选参数,主要包括: -semantic 设计器启动时缺省打开的语义层文件名
-license 设计器启动时缺省使用的授权文件名
-url 缺省远程服务器的url
-user 当前用户名
-password 当前用户密码
-help 打出帮助消息
其中:如果url为空,此时定义的semantic作为本地语义层文件读取,如果url不为空,此时定义的semantic作为远程语义层文件,交由url去读取。
启发用途
有了设计器的这些启动参数后,有什么用处呢?
1、 可以在设计器启动时直接打开某个报表模板
意义:远程报表设计时,报表模板都存储在服务器上,用户不知道存在哪些报表模板名,如要进行权限控制也相对比较困难,此时可以利用这个参数,为用户做好一个网页,这个网页上列出用户有权限访问的报表模板,用户点击其中一个,则把该报表模板的名称传递给设计器并同时启动设计器。
2、 可以在设计器启动时直接打开某个语义层文件
意义:报表应用理论上只支持一个语义层文件,如果要实现不同的用户看见不同的语义视图和字段,就必须采取第三章介绍的远程服务器,在其中文件访问的方法里进行权限控制,根据用户权限,修改读进内存中的语义文件,最后返回给客户端这种办法虽然理论上行得通,但是编程的工作量比较大,而且要结合用户表进行管理维护,适合用户权限比较复杂的情况。当用户的语义权限很单纯时,例如所有用户分成几个组,不同组的语义文件内容不同,但是同一组的语义文件内容完全相同,此时可以利用这个语义文件名参数来进行简单控制。做法:根据用户权限设计好多个语义文件,然后在用户启动设计器的时候,根据用户名获得对应的语义文件名传递给设计器,于是设计器启动时就自动打开了该用户有权限访问的语义文件。
3、 可以在设计器启动时直接进行用户登录
意义:远程设计器往往是和用户的门户网站集成在一起,用户在门户网站已经登录一次了,如果访问远程设计器还需要再登录一次,用户往往很烦。此时可以利用设计器的用户名密码参数,写一个servlet或者jsp,用户访问时,先从用户session里获取用户名密码等参数,传递给设计器并同时启动设计器,
4、 可以在设计器启动时直接使用某个授权文件
远程设计器不可能在启动时让用户自己选择授权文件,因此只能随着jar一起自动下载。一个做法是:将授权文件命名为系统缺省授权文件defaultlicense.lic,这种做法可以保证客户端每个人都有授权文件可用。
但是,如果不同的用户想要不同的设计器授权,此时就只能利用这个参数了。
充分利用jnlp传递设计器启动参数
看了第二章的介绍,大家知道,java web start的方式启动远程设计器可以实现自动下载、自动更新、不重复下载等功能,而java web start的核心配置文件就是jnlp文件。
也就是说,如果我们要在远程设计器启动时传递启动参数,就必须充分利用jnlp文件。
现在,我们回过头看一下前面介绍的jnlp文件,找到启动主类一行,如下所示:
………….<application-desc main-class="com.runqian.report4.ide.FrameMain"/> //启动的类……………
这一行的定义是最核心的,他指明了jar包下载结束后客户端运行哪个类作为设计器启动的入口,我们可以把这一行的定义扩展为如下格式:
…………<application-desc main-class="com.runqian.report4.ide.FrameMain"><argument>argname1</argument><argument>argvalue1 </argument><argument>argname2 </argument><argument>argvalue2 </argument><argument>…… </argument></application-desc>………….
注意:这里为主类传递的参数是不分参数名和参数值的,需要自己组合,我们规定:参数名后要紧跟相应的参数值,其中缺省的报表模板名没有参数名,放在最后即可。
举例:
…………<application-desc main-class="com.runqian.report4.ide.FrameMain"><argument>-semantic </argument><argument>……</argument> //前一个参数名对应的参数值<argument>-license </argument><argument>……</argument><argument>-url </argument><argument>…… </argument><argument>-user </argument><argument>…… </argument><argument>-password </argument><argument>…… </argument><argument>-help </argument><argument>…… </argument><argument>/…/….raq </argument>//缺省的报表模板名不需要参数名,放在最后即可</application-desc>………….
动态生成jnlp
上一节介绍了通过jnlp传递设计器启动参数,大家会发现,这些启动参数大部分都是动态的,不可能在文件中写死,这时候怎么办呢?
最好的办法就是写一个servlet或者jsp,动态生成jnlp文件,然后把生成的jnlp文件通过response传递到客户端即可。
举例:
package example;import javax.servlet.*;import javax.servlet.http.*;import java.io.*;public class RaqWebEditor extends HttpServlet {public void service( HttpServletRequest request, HttpServletResponse response ) {PrintWriter pw = null;BufferedReader br = null;try {response.setContentType( "application/x-java-jnlp-file;charset=GBK" );pw = response.getWriter();String jnlp=””’;…… //动态生成jnlp文件内容,拼成字符串pw.print( jnlp ); //向客户端输出jnlp文件内容}catch ( Exception e ) {if ( pw != null ) {pw.println( "error\n" + e.getMessage() );}e.printStackTrace();}finally {if ( pw != null ) {try {pw.close();}catch ( Exception e ) {}}if ( br != null ) {try {br.close();}catch ( Exception e ) {}}}}}