准备工作:      
       初次接触到webwork2,花了一天左右的时间研究一番,在MyEclipse上运行起来一个j2ee报表项目的DEMO。关于怎么样在MyEclipse上配置webwork2,本人主要参考了文章: http://wiki.javascud.org/display/ww2cndoc/Setting+up+Eclipse+with+Tomcat ,这真是不错的文章。基本上只要参考该文章按部就班配置即可。
      当然另一个重要的部分就是先设计报表模板,这里我们选择杰表2008作为报表工具。
       用杰表2008创建美洲国家资源表的参数报表, 
 [img]http://www.blogjava.net/images/blogjava_net/simon1006/webwork/design.JPG[/img]
图1是报表模板;
[img]http://www.blogjava.net/images/blogjava_net/simon1006/webwork/data.JPG[/img]
图2是报表所用到的数据源
[img]http://www.blogjava.net/images/blogjava_net/simon1006/webwork/sql.JPG[/img]
图3是参数查询的sql语句
[img]http://www.blogjava.net/images/blogjava_net/simon1006/webwork/parameter3.JPG[/img]
图4是参数的设置截图

     最后  将设计好的模板保存在  d:/country.xml,下面开始webwork2与报表的集成。

一、在webwork2中,你的控制层主要是实现一个action接口,然后再在xwork.xml中将action请求指向跳转的页面;
比如我的xwork.xml中是这样配置的:
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.1.1//EN" " http://www.opensymphony.com/xwork/xwork-1.1.1.dtd">
<xwork>
   <include file="webwork-default.xml"/>
 <package name="default" extends="webwork-default">
     <!-- Include webwork defaults (from WebWork JAR). -->
     <default-interceptor-ref name="completeStack"/> 

      <action name="reportAction"
         class="com.chinadcl.ReportAction">
         <result name="success">reportAction.jsp</result>
      </action>
      <action name="ajaxReport"
         class="com.chinadcl.AjaxReport">
         <!--<result name="success">jrs.jsp</result>
      --></action>
   </package>
  </xwork>

二、再看AjaxReport.java
注意:这里从ajax传进来的xml文件如下:

<report>
<path>
d:/country.xml</path>
<parameter>'South America'</parameter>
</report>

package com.chinadcl; 

import java.io.*;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.PrintWriter; 

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException; 

import com.jatools.core.ReportJob;
import com.opensymphony.webwork.ServletActionContext;
import com.opensymphony.xwork.Action; 

public class AjaxReport implements Action { 

 public String execute() throws Exception {
  // TODO Auto-generated method stub
  System.out.println("AjaxReport...");
  HttpServletResponse response = ServletActionContext.getResponse(); 

  response.setHeader("Pragma", "No-cache");
  response.setHeader("Cache-Control", "no-cache");
  response.setDateHeader("Expires", 0);
  response.setContentType("text/http;charset=utf-8");

//以下是解析WEB页面传输进来的xml文件
  HttpServletRequest request = ServletActionContext.getRequest(); 

  StringBuffer xml = new StringBuffer();
  try { 

   BufferedReader reader = request.getReader();
   String line = null;
   while ((line = reader.readLine()) != null) {
    xml.append(line);
   }
  } catch (Exception e) {
   System.out.println("XML读取有误`…" + e.toString());
  }
  String xml_data = xml.toString();
  Document xmlDoc = null;
  try {
   DocumentBuilder builder = DocumentBuilderFactory.newInstance()
     .newDocumentBuilder();
   xmlDoc = builder
     .parse(new ByteArrayInputStream(xml_data.getBytes()));
  } catch (ParserConfigurationException e) {
   System.out.println(e);
  } catch (SAXException e) {
   System.out.println(e);
  }
  String filePath = xmlDoc.getElementsByTagName("path").item(0)
    .getTextContent();
  String parameter = xmlDoc.getElementsByTagName("parameter").item(0)
    .getTextContent();
 //以下是根据参数
 //调用杰表2008生成报表,并返回给AJAX前台
  PrintWriter out = response.getWriter();
  ReportJob job = new ReportJob(new FileInputStream(filePath));
  job.setParameter("$parameter3", parameter);
  job.setParameter(job.HTML_BODY_ONLY, "true");
  try {

   ReportFactory rf = new ReportFactory();
   rf.createOutput("country", "D:/country_temp");
   job.printAsDHTML(rf, out);
  } catch (Exception e) {
   e.printStackTrace();
  } 

  out.close();
//注意这里是返回null,如果是返回SUCCESS,将调用xwork.xml中的jrs.jsp页面
//<action name="ajaxReport"
//         class="com.chinadcl.AjaxReport">
//         <!--<result name="success">jrs.jsp</result>
//      --></action>
//  因为在这里生产的报表直接返回给ajax前台,所以在xwork.xml中不需要配置返回结果,因为根本不调用。
   return null;
 } 

}

三、在report.js中替换点div,显示报表:
var report_area = document.getElementById("jatools-report");
var xmlDoc = xmlHttp.responseText;
report_area.innerHTML = xmlDoc;

四、编程工作已经完成,下面让我们看看效果:
首先是初始化页面:
[img]http://www.blogjava.net/images/blogjava_net/simon1006/webwork/r1.JPG[/img]
然后选择Noorth America点击Show Result 按钮,通过ajax部分刷新报表显示的div层,如下:
[img]http://www.blogjava.net/images/blogjava_net/simon1006/webwork/r2.JPG[/img]
再看看选择South America的报表效果:
[img]http://www.blogjava.net/images/blogjava_net/simon1006/webwork/r3.JPG[/img]

至此,大功告成,以上便是在webwork2中集成杰表2008一个demo项目。
联系我:e-mail: jiangdh@jatools.com
               qq:     29357120
                msn:  mailto:dh.jiang@live.cn