Cell插件在J2EE系统中的应用

Cell插件在J2EE系统中的应用<!----><o:p></o:p>

 <o:p></o:p>

 <o:p></o:p>

[摘要] 在基于J2EE平台的信息系统中,具有丰富表现能力的Java Applet是界面层的一种重要形式。但Java API对打印的支持比较弱,打印输出复杂的单据和报表需要大量工作。本文介绍的系统通过引入一个ActiveX控件--Cell插件--来解决这个问题。该系统中,由Java Applet完成界面表现,由Cell插件完成打印输出,两者之间通过Sun公司的一套接口API互相通信。<o:p></o:p>

一、Java AppletOcx控件的交互<o:p></o:p>

1.1Java Applet访问Java Script方法和Ocx控件<o:p></o:p>

Sun公司在JDK中提供了一套从Java Applet访问Java ScriptAPI,由此可以实现Java Applet访问HTML页面中的DOM对象的机制。该API以一个Jar文件的形式提供:%JAVA_HOME%\jre\lib\jaws.jar,其中%JAVA_HOME%是你安装JDK的目录。将该jar文件加入到环境变量classpath中,就可以用它实现从Java AppletJava Script的调用了。下面是一段调用Java Script中的方法的代码实例:<o:p></o:p>

import netscape.javascript.*;<o:p></o:p>
import java.applet.*;<o:p></o:p>
import java.awt.*;<o:p></o:p>
class MyApplet extends Applet {<o:p></o:p>
     public void init() {<o:p></o:p>
         JSObject win = JSObject.getWindow(this);<o:p></o:p>
         JSObject doc = (JSObject) win.getMember("document");<o:p></o:p>
         win.call("f", null);<o:p></o:p>
     }<o:p></o:p>
}

在上面的代码中,win.call(“f”, null)调用了JavaScript中的方法f()<o:p></o:p>

1.2JavaScript访问Java Applet<o:p></o:p>

当使用Java Plugin1.4.x运行Java Applet时,只需把Java Applet中的方法视为Java Plugin这个控件的方法,直接在Java Script中进行调用即可。下面用一个简单的例子进行说明:<o:p></o:p>

(1) 在载入Java PluginObject标签中,用参数ID指定一个名字:<o:p></o:p>

<OBJECT ID="MyPlunin" WIDTH=500 HEIGHT=120<o:p></o:p>
CLASSID="CLSID:8AD9C840-044E-11d1-B3E9-00805F499D93"><o:p></o:p>
<PARAM NAME="code" value="MyApplet.class"><o:p></o:p>
...<o:p></o:p>
</OBJECT><o:p></o:p>

(2) HTML页面上增加一个按钮,点击它时从Java Script调用Java Applet中的方法:<o:p></o:p>

<input type="button" name="Button1" value="Start"<o:p></o:p>
onClick="calculate" language="JavaScript"><o:p></o:p>

(3) 假定你的Java AppletMyApplet.java,它有一个public方法method1(),那么就可以用如下的Java Script代码直接调用该方法:<o:p></o:p>

<SCRIPT language="JavaScript"><o:p></o:p>
       function calculate() {<o:p></o:p>
                      document.. MyPlunin.method1()<o:p></o:p>
       }<o:p></o:p>
</SCRIPT><o:p></o:p>

二、Cell插件简介<o:p></o:p>

华表的Cell插件是一个功能非常类似于Excel的、用于Web开发的ActiveX控件。它可以在Windows的浏览器中显示、编辑、打印表格。<o:p></o:p>

三、系统实现<o:p></o:p>

1.1 系统架构<o:p></o:p>

<!----><v:shapetype o:spt="75" coordsize="21600,21600" stroked="f" id="_x0000_t75" filled="f" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path gradientshapeok="t" o:extrusionok="f" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><v:shape type="#_x0000_t75" id="_x0000_i1026" o:ole="" style="WIDTH: 4in; HEIGHT: 186pt"><v:imagedata src="file:///C:/DOCUME~1/firefox1/LOCALS~1/Temp/msoclip1/01/clip_image001.png" o:title=""></v:imagedata></v:shape><o:p></o:p>

 <o:p></o:p>

图一是系统的配置示意图。由图可见,这是一个典型的三层应用系统。在本系统中,Java AppletCell插件部署在Web Server上,在运行时,它们被下载到客户端,运行在浏览器中。<o:p></o:p>

图二是系统的运行示意图。由图可见,运行在客户机上的Java Applet通过Web Server上的Servlet访问应用服务器上的EJB,与后台交互。Java Applet作为表示层,在客户机上显示界面。<o:p></o:p>

当需要打印输出时,Java Applet将数据和显示格式设置到华表插件中,并调用华表插件的打印与览和打印方法,完成打印功能。<o:p></o:p>

<v:shape type="#_x0000_t75" id="_x0000_i1025" o:ole="" style="WIDTH: 389.4pt; HEIGHT: 195pt"><v:imagedata src="file:///C:/DOCUME~1/firefox1/LOCALS~1/Temp/msoclip1/01/clip_image003.png" o:title=""></v:imagedata></v:shape><o:p></o:p>

1.2 Cell插件实现Java界面的打印<o:p></o:p>

1.2.1HTML页面上嵌入华表的Cell插件<o:p></o:p>

为了在Applet界面中调用华表的Cell插件,我们首先在HTML页面上隐藏了一个Cell插件:<o:p></o:p>

<OBJECT classid=clsid:3F166327-8030-4881-8BD2-EA25350E574A <o:p></o:p>

id=DCellWeb1   style="HEIGHT: 0px; WIDTH: 0px"><o:p></o:p>

<PARAM NAME="_Version" VALUE="65536"><o:p></o:p>

<PARAM NAME="_ExtentX" VALUE="14902"><o:p></o:p>

<PARAM NAME="_ExtentY" VALUE="6075"><o:p></o:p>

<PARAM NAME="_StockProps" VALUE="0"><o:p></o:p>

</OBJECT><o:p></o:p>

通过style="HEIGHT: 0px; WIDTH: 0px"指定Cell插件的高度和宽度都为0,从而达到隐藏Cell插件的目的。<o:p></o:p>

1.2.2 Applet中提供两个调用接口方法<o:p></o:p>

下面是一个Applet的代码实例,其中提供了callCellMethod()callJavaScriptMethod()两个接口方法,分别可用来调用Cell插件的方法和JavaScript的方法:<o:p></o:p>

public class MyApplet extends javax.swing.JApplet {<o:p></o:p>

private JSObject win = null;<o:p></o:p>

private JSObject cell = null;<o:p></o:p>

 <o:p></o:p>

public Object callCellMethod(String name, Object[] params) {<o:p></o:p>

       return getCell().call(name, params);<o:p></o:p>

}<o:p></o:p>

 <o:p></o:p>

public Object callJavaScript(String name, Object[] params) {<o:p></o:p>

       return getJSwin().call(name, params);<o:p></o:p>

}<o:p></o:p>

 <o:p></o:p>

private JSObject getCell() {<o:p></o:p>

       if (cell == null) {<o:p></o:p>

              try {<o:p></o:p>

                     JSObject doc = (JSObject)getJSwin().getMember("document");<o:p></o:p>

                     JSObject all = (JSObject)doc.getMember("all");<o:p></o:p>

                     cell = (JSObject)all.call("item", new Object[]{"DCellWeb1"});<o:p></o:p>

              }<o:p></o:p>

              catch (Exception e) {<o:p></o:p>

                     e.printStackTrace();<o:p></o:p>

              }<o:p></o:p>

       }<o:p></o:p>

       return cell;<o:p></o:p>

}<o:p></o:p>

 <o:p></o:p>

private netscape.javascript.JSObject getJSwin() {<o:p></o:p>

       if (win == null) {<o:p></o:p>

              win = netscape.javascript.JSObject.getWindow(this);<o:p></o:p>

       }<o:p></o:p>

       return win;<o:p></o:p>

}<o:p></o:p>

}<o:p></o:p>

通过getCell()这个方法,可以在Java Applet中直接获得用JSObject表示的Cell插件,从而可以直接调用它的方法。例如,在Java Applet中向Cell插件的一个单元格写入数据,可以如下调用:<o:p></o:p>

              Integer row = new Integer(1);<o:p></o:p>

              Integer column = new Integer(1);<o:p></o:p>

              Integer page = new Integer(0);<o:p></o:p>

              callCellMethod("SetCellString", new Object[]{column, row, page, “str”});<o:p></o:p>

其中SetCellStringCell插件提供的接口方法。这样就实现了从Java Applet到华表的Cell插件的调用。<o:p></o:p>

五、结论<o:p></o:p>

在这个应用系统中,我们只利用Cell插件的打印预览和打印两项功能,不用它做屏幕显示。所有打印格式和数据都在Java Applet中准备好,按单元格向Cell插件设置格式和数据,由Cell插件完成分页和打印功能。<o:p></o:p>

这是一种表现与数据分离的方式:Java Applet中只组织打印数据,所有打印的表现工作交给Cell插件完成,因此能够大大降低工作量。<o:p></o:p>

Cell插件除打印功能外,还具有输入、显示、编辑、图表等非常强大的功能,可以制作出非常复杂的报表。利用Cell插件,还可以将数据导出为ExcelPDF

你可能感兴趣的:(JavaScript,java,应用服务器,F#,Excel)