`
snoopy7713
  • 浏览: 1146764 次
  • 性别: Icon_minigender_2
  • 来自: 火星郊区
博客专栏
Group-logo
OSGi
浏览量:0
社区版块
存档分类
最新评论

Eclipse rcp/rap 开发经验总结(9) - rap上传与下载

    博客分类:
  • RAP
阅读更多

上传

上传即将文件上传到服务器上,在客户端需要写相应的脚本,服务器端需要注册相应的 handle 接受客户端的请求。

原理:

  Rap 的上传和下载是通过普通的 web 的方式进行上传和下载的 , 但是和传统的 wen 还不相同

1、  rap 本身就单线程在跑 , 和上传下载的线程不能进行混淆

所以采用的方式如下:

上传:通过传统的方式上传到指定目录 ,rap 不能直接操作上传的文件流 , 如果想获得上传的数据必须要先上传到指定文件 , 然后让 rap 去加载指定文件即可

下载: 先通过 rap 程序生成需要下载的文件到指定目录 , 然后通过 rap 加载成文件流的形式发送给客户端

 

1 在服务器端注册相应的 handler

  // 注册上传处理事件

  IServiceManager manager = RWT.getServiceManager ();

  IServiceHandler uploadHandler = new UploadServiceHandler();

manager.registerServiceHandler( "uploadServiceHandler" , uploadHandler); //$NON-NLS-1$

 

2 在客户端的脚本调用

目前的做法是创建上传的 dialog, dialog 里面添加 browser 控件,然后 browser 里书写上传的 javaScript 脚本,脚本请求的 url 格式可以通过以下类似的代码创建:

   private String createUploadUrl(String uploadFileName) {

      StringBuffer url = new StringBuffer();

      url.append(RWT.getRequest ().getContextPath());

      url.append(RWT.getRequest ().getServletPath());

      url.append( "?" ); //$NON-NLS-1$

      url.append(IServiceHandler . REQUEST_PARAM );

      url.append( "=uploadServiceHandler" ); //$NON-NLS-1$

      url.append( "&fileName=" ); //$NON-NLS-1$

      url.append(uploadFileName);

      return url.toString();

   }

3 服务器端 handler 的写法

public class UploadServiceHandler implements IServiceHandler {

   public void service() throws IOException, ServletException {

      HttpServletRequest request = RWT.getRequest ();

      request.setCharacterEncoding( "UTF-8" );

      String fileName = request.getParameter( "fileName" );

      FileOutputStream o = null ;

      BufferedReader bufferReader = null ;

      InputStream in = null ;

      try {

         in = request.getInputStream();

         File f = null ;

         try {

          f = new File(FileUtil.getTempFilePathAndName (RWT.getRequest ()

            .getSession().getAttribute( "userName" ).toString(),

                   fileName));

         } catch (Exception e) {

            throw new IOException(e);

         }

         o = new FileOutputStream(f);

         bufferReader = new BufferedReader( new InputStreamReader(in));

         String line = null ;

         boolean beginWrite = false ;

         boolean endWrite = false ;

         while ((line = bufferReader.readLine()) != null ) {

            if (line.indexOf(PriceDomainBean. class .getName()) != -1) {

                if (!beginWrite) {

                   beginWrite = true ;

                } else {

                   endWrite = true ;

                }

            }

            if (beginWrite) {

                o.write((line + "\r\n" ).getBytes());

            }

            if (endWrite) {

                break ;

            }

         }

      } catch (IOException e) {

         throw e;

      } finally {

         if ( null != o) {

            o.close();

         }

         in.close();

         if ( null != bufferReader) {

            bufferReader.close();

         }

      }

      HttpServletResponse response = RWT.getResponse ();

      response.setContentType( "text/html;charset=UTF-8" );

      response.getWriter().write(

            "<br><br><br><DIV align=center><h2> 上传成功 !</h2>" );

   }

}

下载

下载和上传采用的方式基本相同,只不过是将服务器文件读取到本地,和上传是一个相反的过程。

1 在服务器端注册相应的 handler

  // 注册下载处理事件

  IServiceManager manager = RWT.getServiceManager ();

  IServiceHandler downloadHandler = new DownloadServiceHandler();

  manager.registerServiceHandler( "downloadServiceHandler" , downloadHandler);

 

2 在客户端节本的调用

bowser 控件中书写 js 请求脚本,脚本请求的 url 如下

    private String createDownloadUrl(String fileName) {

        StringBuffer url = new StringBuffer();

        url.append (RWT.getRequest ().getContextPath());

        url.append (RWT.getRequest ().getServletPath());

        url.append ( "?" );

        url.append (IServiceHandler. REQUEST_PARAM );

        url.append ( "=downloadServiceHandler" );

        url.append ( "&fileName='+encodeURI('" );

        url.append (fileName);

        url.append ( "')" );

        return url.toString();

    }

3 服务器端 handler 的写法

public class DownloadServiceHandler implements IServiceHandler {

   public void service() throws IOException, ServletException {

      String fileName = URLDecoder.decode (

            RWT.getRequest ().getParameter( "fileName" ), "UTF-8" );

      String filePathAndName = null ;

      try {

         filePathAndName = FileUtil

         .getTempFilePathAndName (RWT.getRequest ().getSession()

                      .getAttribute( "userName" ).toString(), fileName);

      } catch (Exception e) {

         throw new IOException(e);

      }

      File file = new File(filePathAndName);

      if (!file.exists()) {

         return ;

      }

      HttpServletResponse response = RWT.getResponse ();

      response.setHeader( "pragma" , "no-cache" );

      response.setHeader( "cache-control" , "no-cache" );

      response.setDateHeader( "Expires" , 0);

      response.setCharacterEncoding( "UTF-8" );

      response.setContentType( "text/html;charset=UTF-8" );

      response.setHeader( "Content-Disposition" , "attachment;filename="

            + new String(fileName.getBytes( "gb2312" ), "ISO8859-1" ));

      try {

         BufferedInputStream in = new BufferedInputStream(

                new FileInputStream(filePathAndName));

         ByteArrayOutputStream out = new ByteArrayOutputStream(1024);

         byte [] temp = new byte [1024];

         int size = 0;

         while ((size = in.read(temp)) != -1) {

            out.write(temp, 0, size);

         }

         in.close();

         byte [] content = out.toByteArray();

         response.setContentLength(content. length );

         response.getOutputStream().write(content);

      } catch (IOException ioe) {

         throw new RuntimeException(ioe);

      } finally {

         try {

            FileUtil.deleteTempFile (RWT.getRequest ().getSession()

                   .getAttribute( "userName" ).toString(), fileName);

         } catch (Exception e) {

            throw new IOException(e);

         }

      }

   }

}

分享到:
评论

相关推荐

    eclipse-rcp-2022-06-R-linux-gtk-x86_64.tar.gz

    Eclipse IDE for RCP and RAP Developers(eclipse-rcp-2022-06-R-linux-gtk-x86_64.tar.gz) 适用于Linux x86_64: A complete set of tools for developers who want to create Eclipse plug-ins, Rich Client ...

    eclipse-rcp-2022-06-R-win32-x86_64.zip

    Eclipse IDE for RCP and RAP Developers(eclipse-rcp-2022-06-R-win32-x86_64.zip) 适用于Windows x86_64: A complete set of tools for developers who want to create Eclipse plug-ins, Rich Client ...

    eclipse-rcp-2022-06-R-macosx-cocoa-x86_64.dmg

    Eclipse IDE for RCP and RAP Developers(eclipse-rcp-2022-06-R-macosx-cocoa-x86_64.dmg) 适用于macOS x86_64: A complete set of tools for developers who want to create Eclipse plug-ins, Rich Client ...

    eclipse-rcp-2022-06-R-linux-gtk-aarch64.tar.gz

    Eclipse IDE for RCP and RAP Developers(eclipse-rcp-2022-06-R-linux-gtk-aarch64.tar.gz) 适用于Linux aarch64: A complete set of tools for developers who want to create Eclipse plug-ins, Rich Client ...

    eclipse-rcp-2022-06-R-macosx-cocoa-aarch64.dmg

    Eclipse IDE for RCP and RAP Developers(eclipse-rcp-2022-06-R-macosx-cocoa-aarch64.dmg) 适用于macOS aarch64: A complete set of tools for developers who want to create Eclipse plug-ins, Rich Client ...

    eclipse-jee-2018-09-win32-x86_64.zip

    8. **RCP和RAP框架**:Eclipse Rich Client Platform (RCP) 和 Rich Ajax Platform (RAP)允许开发人员构建自己的桌面应用程序和Web应用,2018-09版本可能包含相关更新和改进。 9. **持续集成**:Eclipse与Jenkins、...

    eclipse-rcp-2022-06-R-linux-gtk-x86_64.tar

    Eclipse RCP (Rich Client Platform) 和 RAP (Rich Ajax Platform) 是两个重要的软件开发框架,主要用于构建桌面应用程序和Web应用程序。Eclipse IDE for RCP and RAP 是一个专为这两种平台开发者设计的强大集成开发...

    通过例子学习EclipseRCP开发

    1. 安装Eclipse IDE:首先,你需要下载并安装Eclipse IDE for RCP and RAP Developers版本,这个版本包含了开发RCP应用所需的所有工具。 2. 创建新项目:在Eclipse中,选择“File” -&gt; “New” -&gt; “Project”,然后...

    菜鸟EclipseRCP学习之路

    1. 安装Eclipse IDE for RCP and RAP Developers版本,这是一个专门为RCP开发定制的集成开发环境。 2. 创建一个新的Eclipse RCP项目,选择适当的模板,如“Basic”或“Feature-Based”。 3. 配置项目的运行时环境,...

    eclipse 2020-06 国际化资源包

    Eclipse IDE for RCP and RAP Developers (includes Incubating components) Version: 2020-06 (4.16.0) Build id: 20200615-1200

    Eclipse RCP开发SDK_3.6.2.rar

    9. **插件(Plugins)**:Eclipse RCP的基础是插件模型,每个插件是一个可独立部署的单元,可以提供特定的功能。插件之间通过API进行通信,增强了系统的模块化。 10. **SWT和JFace**:Eclipse RCP使用SWT(Standard ...

    Eclipse RCP 初级入门教程

    要开始RCP开发,首先需要安装Eclipse IDE,然后安装Eclipse RCP和RAP开发工具(PDE)。这些工具提供了一整套用于创建、调试和部署RCP应用的工具集。 **4. 创建第一个RCP应用** 在Eclipse中,通过“新建 -&gt; 项目 -&gt; ...

    Eclipse RAP Deploy - 针对Eclipse 3.5 + Tomcat

    这通常包括安装Eclipse RAP插件,如RCP和RAP Developer Tools。这些插件提供了项目模板、构建配置和调试工具,帮助我们更轻松地构建和测试RAP应用。 接下来,我们要准备Tomcat服务器。Tomcat是一个流行的开源...

    Instant Eclipse 4 RCP Development How-to.pdf

    《即时Eclipse 4 RCP开发指南》这本书详细介绍了如何使用Eclipse 4来创建富客户端应用程序(Rich Client Platform,简称RCP),它是一本实践操作指南,包含了超过10个实用的配方。Eclipse 4 RCP是Eclipse平台中用于...

    eclipse-rcp-galileo-SR2-win32.zip

    Eclipse For RCP and RAP Developers开发包主要针对开发Eclipse插件,Eclipse RCP(富客户端应用程序),RAP(富客户端ajax应用程序)的程序员,还包含CVS、Mylyn和xml编辑器,EGit分布式版本控制等插件。...

    eclipse rap教程

    - **安装Eclipse IDE**:首先,你需要安装支持RAP开发的Eclipse版本,如Eclipse for RCP and RAP Developers。 - **安装RAP SDK**:通过Eclipse的软件更新站点添加RAP的SDK。 - **创建新项目**:使用RAP模板创建...

    RCP工程转成RAP,并在浏览器中运行

    RCP和RAP都是Eclipse基金会开发的框架,前者用于构建桌面应用程序,后者则用于构建Web应用程序。 1. **RCP与RAP的区别** RCP和RAP在结构上非常相似,主要区别在于运行环境和用户交互方式。RCP是桌面应用框架,依赖...

    eclipse rcp 客户端MySQL连接

    1. Eclipse IDE for RCP and RAP Developers:这是开发Eclipse RCP应用程序的基础。 2. MySQL Connector/J:这是MySQL的Java驱动,用于Java应用程序通过JDBC连接到MySQL数据库。 **步骤一:添加MySQL JDBC驱动** 在...

    RCP+Plug-in开发自学教程_RCP+Plug-in开发自学教程_源码

    1. **环境搭建**:安装Eclipse IDE for RCP and RAP Developers,获取必要的RCP开发工具集。 2. **创建新项目**:通过New -&gt; Project -&gt; Plug-in Project,创建一个新的Plug-in项目。 3. **编写代码**:在项目的src...

    Eclipse RCP入门

    要开始Eclipse RCP开发,你需要安装Eclipse IDE for RCP and RAP Developers。这个版本的Eclipse包含了创建、调试RCP应用所需的工具和库。通过新建“Plug-in Project”或“RCP Application”项目,可以启动一个新的...

Global site tag (gtag.js) - Google Analytics