Java 使用“获取数据时遇到问题”&&引用;特殊字符

Java 使用“获取数据时遇到问题”&&引用;特殊字符,java,xml,velocity,Java,Xml,Velocity,在我们的应用程序中,我们有一个屏幕/页面,为不同的产品显示不同的列。这些列中的所有记录都是从数据库中获取的 此外,我们在屏幕底部有两个导出按钮,用于以PDF和XLS格式显示所有记录 除了一种情况外,这些功能工作正常。我们在屏幕中有一列name,其值是从数据库中获取的。当名称列下的任何记录中有&时,导出功能停止工作 例如: 对于名为“BOWOG BEHEER B.V.”的pdf和xls,导出工作正常 但由于“BOWOG&BEHEER B.V.”的名字,它停止了工作。单击导出按钮时,pdf和xls显

在我们的应用程序中,我们有一个屏幕/页面,为不同的产品显示不同的列。这些列中的所有记录都是从数据库中获取的

此外,我们在屏幕底部有两个导出按钮,用于以PDF和XLS格式显示所有记录

除了一种情况外,这些功能工作正常。我们在屏幕中有一列name,其值是从数据库中获取的。当名称列下的任何记录中有&时,导出功能停止工作

例如

对于名为“BOWOG BEHEER B.V.”的pdf和xls,导出工作正常

但由于“BOWOG&BEHEER B.V.”的名字,它停止了工作。单击导出按钮时,pdf和xls显示为空白页

有人能帮忙吗

下面是一段代码:-(非完整代码)



我现在有了一些想法。实际上,这个问题存在于vm(velocity模板)。“name”列取自vm文件,代码如下:-

美元!{result.counterpartyName}


对于多个记录,这在每个循环中都存在。谁能建议我如何忽略vm文件本身中的特殊字符。因此,即使“名称”列有“&”或“-”等特殊字符,我们也能够正确导出。

根据您的代码,您似乎正在使用XML转换服务

我想说的是,可能是参数中包含悬空符号的数据。要成为准备好转换的有效XML,
&
应该是
&。但是,根据给定的代码,不可能说出XML数据来自何处。你说它来自数据库,所以我想应该通过修改数据库中的数据来解决这个问题

编辑:


看起来我有一部分是对的,但数据库不包含XML—如果我理解正确,数据是作为原始表格数据来自数据库的,但使用velocity模板将其格式化为XML。如果是这样的话,那么应该在velocity模板中使用XML转义。

您能分享一些代码吗?不可能在这么小的细节上帮助您。寻求调试帮助的问题(“为什么此代码不起作用?”)必须包括所需的行为、特定的问题或错误,以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:。下面是一段代码:-请您现在查看一下。您是否已调试以检查代码“停止工作”的行?请把这个问题也加上。我现在有一些想法。实际上,这个问题存在于vm(velocity模板)。“name”列取自vm文件,代码如下:-$!{result.counterpartyName}这是多条记录的每个循环的结果。谁能建议我如何忽略vm文件本身中的特殊字符。这样,即使“名称”列有“&”或“-”等特殊字符,我们也能够正确导出。@您在问题中提到的user2326831问题是导出为PDF和XLS。是否使用velocity模板导出为PDF?这似乎很难相信。是的,我们使用的是速度模板。这就是我的客户正在使用的。您能帮我一下吗?@user2326831是转换服务使用的velocity模板吗?你能给我们看一下使用的模板吗?@user2326831,你不应该使用吗?
public class CVRExportServlet extends HttpServlet {

    private final SimpleDateFormat sdf = new SimpleDateFormat("ddMMyyyy");

    /** context. */
    private ResourceContext context = null;

    private Map createParametersFromRequest(final HttpServletRequest request) {
        // copy all request parameters
        final Map parameters = new HashMap();
        final Enumeration names = request.getParameterNames();

        while (names.hasMoreElements()) {
            final String name = (String) names.nextElement();
            final String[] values = request.getParameterValues(name);

            if (values.length > 1) {
                parameters.put(name, values);
            } else {
                parameters.put(name, values[0]);
            }
        }
        // parse request uri to get type and format
        final String requestURI = request.getRequestURI();
        String type = StringUtils.left(requestURI, requestURI.lastIndexOf('.'));
        type = StringUtils.substring(type, requestURI.lastIndexOf('/') + 1);

        final String format = StringUtils.substring(requestURI, requestURI.lastIndexOf('.') + 1);

        parameters.put(Constants.EXPORT_TYPE_PARAMETER, type);
        parameters.put(Constants.EXPORT_FORMAT_PARAMETER, format);

        // determine themeUrl
        final String requestUrl = request.getRequestURL().toString();
        final int index = requestUrl.indexOf(request.getContextPath());
        String server = "";
        if (index > -1) {
            server = requestUrl.substring(0, index);
        }

    private void fillParameters(final HttpServletRequest request, final HttpServletResponse response, final Map parameters)
      throws ApplicationException {

        parameters.put("props", ResourceBundle.getBundle("messages"));

        // Create search request using the search form
        final SearchForm form = (SearchForm) request.getSession().getAttribute(
        (String) request.getSession().getAttribute(CvrConstants.SESS_ATTR_CVR_SEARCH_FORM_NAME));
        final SearchRequest searchRequest = form.getSearchRequest();
        searchRequest.setPageNumber(1);
        searchRequest.setRowsPerPage(10000);
        parameters.put("searchRequest", searchRequest);     
    }

    public void service(final HttpServletRequest request, final HttpServletResponse response)
            throws ServletException, IOException {

        final long startTime = System.currentTimeMillis();

        // create parameters from request
        final Map parameters = this.createParametersFromRequest(request);
        parameters.put(ResourceContext.class.getName(), this.context);

        try {
            this.fillParameters(request, response, parameters);
            final SearchRequest searchRequest = (SearchRequest) parameters.get("searchRequest");
            if (searchRequest == null || searchRequest.getCounterPartyList() == null
                    || searchRequest.getCounterPartyList().isEmpty()) {
            throw new ExportException("Exception occurred while handling export: empty counterparty list");
            } else {
                if (searchRequest.getCounterPartyList().size() == 1) {
                    this.handleSingleReportExport(response, parameters);
                } else {
                    this.handleMutlipleReportExport(response, parameters);
                }
            }
        } catch (final Exception e) {
            this.handleException(e, request, response);
          }
       }

    private void handleSingleReportExport(final HttpServletResponse response, final Map parameters) throws Exception {


        final XmlExportService exportService = this.getXmlExportService();
        final ApplicationContext context = this.getApplicationContext();
        final XmlTransformationService xmlTransformationService = (XmlTransformationService) context.getBean("transformationService");

        // perform export
        exportService.export(parameters);

        // perform transformation
        final ExportResult exportResult = xmlTransformationService.transform(parameters);

        // write result to stream
        response.setContentType(exportResult.getContentType());

        response.setContentLength(exportResult.getContentLength());
        if (parameters.get("format").equals("csv")) {

            response.setContentType("text/csv");
            response.setHeader("Content-disposition", "attachment; filename=export.csv");
        } else if (parameters.get("format").equals("pdf")) {

            response.setContentType("application/pdf");
            response.setHeader("Content-disposition", "inline; filename=export.pdf");
        }

        final ServletOutputStream out = response.getOutputStream();
        out.write(exportResult.getBytes());
        out.flush();
        out.close();

    }

    private void handleMutlipleReportExport(final HttpServletResponse response, final Map parameters) throws Exception {
        final SearchRequest searchRequest = (SearchRequest) parameters.get("searchRequest");

        response.setContentType("application/force-download");
        response.setHeader("Content-Encoding" , "x-compress");
        response.setHeader("Content-Disposition", "attachment; filename=export_" + parameters.get("format") + ".zip");

        final XmlExportService exportService = this.getXmlExportService();
        final ApplicationContext context = this.getApplicationContext();
        final XmlTransformationService xmlTransformationService = (XmlTransformationService) context.getBean("transformationService");

        // start the zip process
        final ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());

        // create a file for each counterparty and add it to the zip file
        for (final String counterPartyId : searchRequest.getCounterPartyList()) {
            // make sure to reset the counterparty to the current one in the loop
            searchRequest.setCounterPartyList(Arrays.asList(new String[] {counterPartyId}));

            // perform export
            exportService.export(parameters);

            // perform transformation
            final ExportResult exportResult = xmlTransformationService.transform(parameters);

            // add the file to the zip
            final String fileName = counterPartyId + "_" + sdf.format(searchRequest.getRevaluationDate()) + "." + parameters.get("format");

            zos.putNextEntry(new ZipEntry(fileName));
            zos.write(exportResult.getBytes());
            zos.closeEntry();
        }
        // finish the zip process
        zos.flush();
        zos.close();    
    }