【问题标题】:How to read json or xml file using java servlets? [closed]如何使用 java servlet 读取 json 或 xml 文件? [关闭]
【发布时间】:2011-12-25 19:07:03
【问题描述】:

我正在使用 NetBeans,我将创建一个基于 Web 的应用程序,该应用程序根据一些工具处理任何 xml 和 json 文件。到目前为止,我已经使用 html 创建了一个基本站点,并且我还有一些用 javabeans 编写的 java 代码。 我想问你,你认为通过 java servlet 读取和处理 xml 或 json 文件的最佳方式是什么?如何将文件(用户选择的文件传递到可以进行进一步处理的一侧)。我读过 HTTPClient 类是一个好方法,但是我不确定这是否是最好的。

感谢您的宝贵时间

【问题讨论】:

    标签: java xml json servlets javabeans


    【解决方案1】:

    您可以使用 Apache Commons FileUpload 库来处理多部分请求。当带有文件元素的表单发布到 servlet 时,您会收到多部分请求。

    例如:

    import java.io.*;
    import java.util.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    
    import org.apache.commons.fileupload.*;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    import org.apache.commons.io.FilenameUtils;
    import org.apache.commons.lang.StringUtils;
    import org.apache.log4j.Logger;
    
    (...)
    
        public void doPost(HttpServletRequest request, HttpServletResponse response) {
            if (ServletFileUpload.isMultipartContent(request)) {
                handleMultiPartContent(request);
            }
        }
    
        private void handleMultiPartContent(HttpServletRequest request) {
    
            ServletFileUpload upload = new ServletFileUpload();
            upload.setFileSizeMax(2097152); // 2 Mb
            try {
                FileItemIterator iter = upload.getItemIterator(request);
                while (iter.hasNext()) {
                    FileItemStream item = iter.next();
                    if (!item.isFormField()) {
                        File tempFile = saveFile(item);
                        // process the file
                    }
                }
            }
            catch (FileUploadException e) {
                LOG.debug("Error uploading file", e);
            }
            catch (IOException e) {
                LOG.debug("Error uploading file", e);
            }
        }
    
        private File saveFile(FileItemStream item) {
    
            InputStream in = null;
            OutputStream out = null;
            try {
                in = item.openStream();
                File tmpFile = File.createTempFile("tmp_upload", null);
                tmpFile.deleteOnExit();
                out = new FileOutputStream(tmpFile);
                long bytes = 0;
                byte[] buf = new byte[1024];
                int len;
                while ((len = in.read(buf)) > 0) {
                    out.write(buf, 0, len);
                    bytes += len;
                }
                LOG.debug(String.format("Saved %s bytes to %s ", bytes, tmpFile.getCanonicalPath()));
                return tmpFile;
            }
            catch (IOException e) {
    
                LOG.debug("Could not save file", e);
                Throwable cause = e.getCause();
                if (cause instanceof FileSizeLimitExceededException) {
                    LOG.debug("File too large", e);
                }
                else {
                    LOG.debug("Technical error", e);
                }
                return null;
            }
            finally {
                try {
                    if (in != null) {
                        in.close();
                    }
                    if (out != null) {
                        out.close();
                    }
                }
                catch (IOException e) {
                    LOG.debug("Could not close stream", e);
                }
            }
        }
    

    这会上传文件并将其作为临时文件保存在服务器的硬盘上。然后,您可以对文件进行所需的操作。

    特别是对于非常大的文件,更好的方法可能是跳过保存并直接处理 InputStream。为此,您需要一个合适的 XML 库(例如 Stax),它可以直接处理流。

    编辑:表单的 action 属性应该与 servlet-mapping 的 url-pattern 匹配。

    示例 HTML:

    <form action="upload" ENCTYPE='multipart/form-data' method="POST">
        <input type="file" name="user_file" accept="text/xml">
        <input type="submit" value="Validate" />
    </form>
    

    示例 web.xml sn-p:

    <servlet>
        <servlet-name>FileReaderServlet</servlet-name>
        <servlet-class>my.application.FileReaderServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>FileReaderServlet</servlet-name>
        <url-pattern>/upload</url-pattern>
    </servlet-mapping>
    

    【讨论】:

    • 谢谢!我将此代码用于我的 servlet,但它实际上什么也没做。我是这个领域的新手,我想我所做的事情中缺少一些东西。在 JSP 文件中,我得到了 html 代码。与 servlet 通信的表单如下:
      正如我所读的,当我在“动作”部分使用 servlet 的名称时,然后JSP 文件与这个 servlet 连接,它执行 Post 方法!
    • 我真的看不出问题出在哪里。就像验证按钮没有任何动作,它什么也没做。至少没有什么明显的。再次感谢!
    • 您是否在 web.xml 中定义和映射了您的 servlet?
    • 哦,是的,现在我明白了,是的,我纠正了它,现在它可以工作了,我还在 servlet 上添加了一些额外的东西!谢谢!
    • 没有web.xml文件可以创建项目吗?在更正之前,我没有 xml 文件,也没有出现错误。
    【解决方案2】:

    您可以使用 apache 提供的 HttpClient(或)Sun 提供的 HttpURLClient,两者都是很好的 API。如果您选择 apache,则需要安装额外的 Jars。

    Apache HttpClient 与 Sun 提供的一种方法相比,有一些额外的方法。

    【讨论】:

    • 好的,谢谢,我会尝试使用提供的 bt apache。我发现需要一些 jars 并安装它们,现在尝试将它们放在一起。
    猜你喜欢
    • 2012-08-01
    • 2011-11-11
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多