2015-01-07 1 views
2

화면/페이지이 있으며 다른 제품에 대해 다른 열을 표시합니다. 열의 모든 레코드는 데이터베이스에서 가져옵니다."&"특수 문자를 사용하여 데이터를 가져 오는 중 문제가 발생했습니다.

또한, 우리는 PDFXLS 형식으로 모든 기록을 보여주는 의미 화면 하단에 두 개의 수출 버튼이있다.

이러한 기능은 하나의 조건을 제외하고는 정상적으로 작동합니다. 값이 데이터베이스에서 가져온 화면에는 하나의 열 이름이입니다. 이름이 인 열이 & 인 경우 내보내기 기능이 작동하지 않습니다. 예를를 들어

: - 이름 "BOWOG BEHEER B.V."에 대한

는, 수출은 PDF 및 XLS 모두 잘 작동한다.

"BOWOG & BEHEER B.V."라는 이름의 경우 작동이 중지되었습니다. 내보내기 버튼을 클릭하면 pdf 및 xls이 빈 페이지로 표시됩니다.

아무도 도와 줄 수 있습니까?

다음은 코드의 조각이다 : - (안 전체 코드)

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();  
    } 

내가 지금 몇 가지 아이디어가 있습니다. 실제로 문제는 vm (속도 템플릿)에 있습니다. "이름"열은 VM 파일에서 인출하고 코드는 다음과 같은 것입니다 : -

$는 {result.counterpartyName은}

이 여러 레코드에 대한 각 루프에서입니다. 누구나 어떻게 vm 파일 자체에서 특수 문자를 무시할 수 있는지 제안 해주십시오. "이름"열에 "&"또는 "-"등 특수 문자가있는 경우에도 올바르게 내보낼 수 있습니다.

+3

몇 가지 코드를 공유 할 수 있습니까? 작은 세부 사항으로 당신을 도울 수는 없습니다. – Mureinik

+1

디버깅 도움말 ("이 코드가 작동하지 않는 이유는 무엇입니까?")에는 원하는 동작, 특정 문제 또는 오류 및 질문 자체에서이를 재현하는 데 필요한 가장 짧은 코드가 포함되어야합니다. 분명한 문제 설명이없는 질문은 다른 독자에게 유용하지 않습니다. 참조 : [최소한의 완전하고 검증 가능한 예제를 만드는 방법] (http://stackoverflow.com/help/mcve). – immibis

+0

코드 조각은 다음과 같습니다. - – user2326831

답변

2

XML 변환 서비스를 사용중인 코드를 기반으로 한 것처럼 보입니다.

나는 아마 & 기호가 포함 된 매개 변수의 데이터라고 말할 수 있습니다. 유효한 XML 변환을 위해 &&이어야합니다. 그러나 주어진 코드를 기반으로 XML 데이터가 어디에서 왔는지 말할 수는 없습니다. 당신은 그것이 데이터베이스에서오고 있다고 말합니다. 그래서 으로 추측합니다. 문제는 데이터베이스의 데이터를 수정해야합니다.

편집 :

내가 부분적으로 옳았다 보이지만, 데이터베이스가 XML을 포함하지 않는 -이 올바르게 데이터는 원시 테이블 형식의 데이터로 데이터베이스에서 오는 가지고있는 경우, 그러나 속도를 사용하여 XML로 포맷 템플릿. 그렇다면 XML 이스케이프는 속도 템플릿 like this에서 사용해야합니다.

+0

나는 지금 어떤 생각을 가지고있다. 실제로 문제는 vm (속도 템플릿)에 있습니다. "name"열은 VM 파일에서 가져오고 코드는 다음과 같습니다. - $! {result.counterpartyName} 이것은 여러 레코드의 각 루프에 있습니다. 누구나 어떻게 vm 파일 자체에서 특수 문자를 무시할 수 있는지 제안 해주십시오. "이름"열에 "&"또는 "-"등의 특수 문자가있는 경우에도 올바르게 내보낼 수 있습니다. – user2326831

+0

@ user2326831 당신이 그 문제는 PDF와 XLS로 내보내는 문제입니다. 속도 템플릿을 사용하여 PDF로 내보낼 수 있습니까? 그것은 믿기 어려워 보입니다. – eis

+0

예, 속도 템플릿을 사용하고 있습니다. 내 클라이언트가 사용하고있는 것입니다. 너 좀 도와 줄 수있어? – user2326831

관련 문제