本在经过一些时间,终于搞定了在applet上预览报表模板的功能,现帖出以供交流:
首先是解决的applet与servlet的相互通信,在servlet中把文件作为流的形式输出,applet中就可以调用了,servlet如下所示:
java 代码
- package servlets;
- import java.io.File;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.ObjectOutputStream;
- import java.io.PrintWriter;
- import javax.servlet.ServletContext;
- import javax.servlet.ServletException;
- import javax.servlet.ServletOutputStream;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import net.sf.jasperreports.engine.JRException;
- import net.sf.jasperreports.engine.JRReport;
- import net.sf.jasperreports.engine.JRRuntimeException;
- import net.sf.jasperreports.engine.util.JRLoader;
- public class DesignViewServlet extends HttpServlet {
- /**
- * 说明:
- * @param
- * @return
- */
- private static final long serialVersionUID = 2006;
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- ServletContext context = this.getServletConfig().getServletContext();
- File reportFile = new File(context.getRealPath("/reports/WebappReport.jasper"));
- if (!reportFile.exists()){
- throw new JRRuntimeException("File WebappReport.jasper 没有找到!");
- }else{
- response.setContentType("application/octet-stream");
- ServletOutputStream out=response.getOutputStream();
- ObjectOutputStream os=new ObjectOutputStream(out);
- os.writeObject(reportFile);
- os.flush();
- os.close();
- }
- }
- }
第二步则要写applet啦,applet如下所示:
java 代码
- import java.awt.BorderLayout;
- import java.io.DataInputStream;
- import java.io.File;
- import java.io.InputStream;
- import java.io.PrintWriter;
- import java.io.StringWriter;
- import java.net.URL;
- import java.net.URLConnection;
- import javax.swing.JApplet;
- import javax.swing.JOptionPane;
- import net.sf.jasperreports.engine.JRReport;
- import net.sf.jasperreports.engine.util.JRLoader;
- public class DesignViewApplet extends JApplet {
- public DesignViewApplet()
- {
- initComponents();
- }
- public void init()
- {
- try
- {
- URL url = new URL(getCodeBase(),"../servlets/designview");
- if(url!=null){
- try{
- File file = (File)JRLoader.loadObject(url);
- JRDesignViewSimple view=new JRDesignViewSimple(file.getPath(),false);
- this.pnlMain.add(view, BorderLayout.CENTER);
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- }
- catch (Exception e)
- {
- StringWriter swriter = new StringWriter();
- PrintWriter pwriter = new PrintWriter(swriter);
- e.printStackTrace(pwriter);
- JOptionPane.showMessageDialog(this, swriter.toString());
- }
- }
- private void initComponents() {//GEN-BEGIN:initComponents
- pnlMain = new javax.swing.JPanel();
- pnlMain.setLayout(new java.awt.BorderLayout());
- getContentPane().add(pnlMain, java.awt.BorderLayout.CENTER);
- }
- private javax.swing.JPanel pnlMain;
- }
上面用到一个方法JRDesignViewSimple view如下:
java 代码
- import java.io.InputStream;
- import net.sf.jasperreports.engine.JRException;
- import net.sf.jasperreports.engine.JRReport;
- import net.sf.jasperreports.view.JRDesignViewer;
- public class JRDesignViewSimple extends JRDesignViewer {
- public JRDesignViewSimple(String fileName, boolean isXML) throws JRException {
- super(fileName, isXML);
- }
- public JRDesignViewSimple(JRReport report) throws JRException {
- super(report);
- }
- public JRDesignViewSimple(InputStream is,boolean isXML) throws JRException {
- super(is,isXML);
- }
- }
这样java的代码就完成啦,下一步是写html来引用他!html的页面如下:
由于applet的代码帖不上,我作为附件形式上传。
这样只要打开页面引用就可以啦!其中对applet的安全会有要求,要在java的安装目录上加上其相应的代码,以上的例子和大家一起讨论!谢谢发言。