java - 在不使用数据源的情况下以 SmartGWT 的动态形式上传文件时从 GWT 中的 Servlet 获取回调

标签 java gwt servlets smartgwt

我正在使用 SmartGWT 动态表单 submitForm() 在客户端实现文件上传功能,代码如下:

final String DEFAULT_FILE_UPLOAD_SERVICE_PATH = "upload";
final String TARGET = "uploadTarget";

VLayout body = new VLayout();

uploadForm = new DynamicForm();

 // initialise the hidden frame
NamedFrame frame = new NamedFrame(TARGET);
frame.setWidth("1px");
frame.setHeight("1px");
frame.setVisible(false);

uploadForm.setEncoding(Encoding.MULTIPART);
uploadForm.setMethod(FormMethod.POST);
// set the (hidden) form target
uploadForm.setTarget(TARGET);

uploadForm.setAction(DEFAULT_FILE_UPLOAD_SERVICE_PATH);

// initialise the File name field
uploadItem = new UploadItem("filename");
uploadItem.setName("filename");
uploadItem.setTitle("File name");

// set the fields into the form
uploadForm.setFields(uploadItem);

// add the Upload Form and the (hidden) Frame to the main layout container
body.addMember(uploadForm);
body.addMember(frame);

在服务器端我有一个 servlet 来处理使用 Apache 文件上传库的文件上传请求,这里是代码:

@Singleton
@SuppressWarnings("serial")
public class FileUploadServlet extends HttpServlet {
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.process(request, response);
    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.process(request, response);
    }

    private void process(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // check that we have a file upload request
        if (ServletFileUpload.isMultipartContent(request)) {
            processFiles(request, response);
        }
    }

    private File tmpDir;
    private static final String DESTINATION_DIR_PATH = "/files/upload";
    private File destinationDir;

    public void init(ServletConfig config) throws ServletException {
        super.init(config);

        tmpDir = new File(((File) getServletContext().getAttribute("javax.servlet.context.tempdir")).toString());

        if (!tmpDir.isDirectory()) {
          throw new ServletException(tmpDir.toString() + " is not a directory");
        }

        Log.debug("tmpDir: " + tmpDir.toString());

        String realPath = getServletContext().getRealPath(DESTINATION_DIR_PATH);
        destinationDir = new File(realPath);

        if (!destinationDir.isDirectory()) {
          throw new ServletException(DESTINATION_DIR_PATH + " is not a directory");
        }
    }

    private void processFiles(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {

        // create a factory for disk-based file items
        DiskFileItemFactory factory = new DiskFileItemFactory();

        // set the size threshold, above which content will be stored on disk
        factory.setSizeThreshold(1 * 1024 * 1024); // 1 MB

        // set the temporary directory (this is where files that exceed the threshold will be stored)
        factory.setRepository(tmpDir);

        // create a new file upload handler
        ServletFileUpload upload = new ServletFileUpload(factory);

        try {
            // parse the request
            List<?> items = upload.parseRequest(request);

            // process the uploaded items
            Iterator<?> itr = items.iterator();

            while (itr.hasNext()) {
                FileItem item = (FileItem) itr.next();

                // write the uploaded file to the application's file staging area
                File file = new File(destinationDir, item.getName());
                item.write(file);
            }

        } catch (FileUploadException e) {
            Log.error("Error encountered while parsing the request", e);
        } catch (Exception e) {
            Log.error("Error encountered while uploading file", e);
        }
    }
}

使用上面的代码,文件上传工作正常。我的问题是我不知道如何从 servlet 取回电话。一tutorial说使用隐藏框架,但我不知道该怎么做。谁能帮我解决这个问题?谢谢。

最佳答案

您需要写出一个标记作为您的服务器响应,其中包含将在框架内执行的 JavaScript 代码。此代码将需要跳出框架以调用您已放入主页的某些函数(例如 top.someFunction())。要在主页中设置函数,请使用 JSNI 将 JavaScript 函数附加到窗口(JSNI 中的 $wnd)。

请注意,如果您使用的是 SmartGWT Pro+,则无需执行任何操作 - 此解决方案仅适用于使用 LGPL 版本的用户。

关于java - 在不使用数据源的情况下以 SmartGWT 的动态形式上传文件时从 GWT 中的 Servlet 获取回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8488078/

相关文章:

java - 如何将 HashMap(作为对象属性)保存到数据存储区

c# - 在 Eclipse Juno 中使用 Axis 1.1

GWT:延迟加载外部 JS 资源

java - GWT 2.5.1 的 Google Guava 15.0 错误?

java - 我怎样才能找到一个 servlet 的 URL?

java - Eclipse - 执行命令行时发生异常,没有这样的文件或目录

java - GWT DMP 插件崩溃

java - 更改 JSP servlet (Jasper) 的类加载器

java - 以编程方式阻止 session 跟踪的 URL 参数

java - JAX-RS 响应对象将对象字段显示为 NULL 值