2011-01-07 5 views
41

मैंने कोड लिखा है जो आरईएसटी जेएक्स-आरएस का उपयोग कर एक्सेल फ़ाइल उत्पन्न करता है और मैंने पुष्टि की है कि उत्पन्न एक्सेल फ़ाइल ग्लासफ़िश सर्वर निर्देशिका में है।जेएक्स-आरएस में प्रतिक्रिया शीर्षलेख कैसे सेट करें ताकि उपयोगकर्ता एक्सेल के लिए पॉपअप डाउनलोड देख सके?

लेकिन मेरा लक्ष्य है जब बटन पर उपयोगकर्ता क्लिक (जो एक्सेल .xls उत्पन्न), मैं डाउनलोड पॉपअप उपयोगकर्ता पूछ बचाने या बस किसी भी अन्य वेब सेवाओं को किसी भी डाउनलोड करने के लिए कर रही है की तरह .xls फ़ाइल को खोलने के लिए है कि क्या दिखाना चाहते हैं फाइलों का प्रकार

मेरे खोज के अनुसार, कदम है:

  1. एक्सेल .xls (किया)

  2. एक्सेल लिखने

  3. JAX-आरएस फ़ाइल में

    , सेट प्रतिक्रिया स्ट्रीम करने के लिए उत्पन्न कुछ हद तक हेडर,

    स्ट्रिंग फ़ाइल नाम = "Blah_Report.xls"; response.setHeader ("सामग्री-विस्थापन", "अनुलग्नक; फ़ाइल नाम =" + फ़ाइल नाम);

मेरा प्रश्न मैं JAX-RS फाइल में यह सब कर रहा हूँ और मैं HttpServletResponse नहीं है वस्तु उपलब्ध।

से Add Response Header to JAX-RS Webservice

जवाब के अनुसार वह कहता है:

आप अपने वेब सेवा में @Context टिप्पणी द्वारा वास्तविक HttpServletResponse के लिए एक संदर्भ इंजेक्षन और addHeader उपयोग कर सकते हैं() आदि अपने शीर्षलेख जोड़ने के लिए।

मैं सच में समझ नहीं सकता कि वास्तव में क्या है कि नमूना कोड के बिना मतलब है ..

उत्तर

73

आपको प्रतिक्रिया पर शीर्षलेख सेट करने के लिए HttpServletResponse की आवश्यकता नहीं है। आप इसे javax.ws.rs.core.Response का उपयोग करके कर सकते हैं।

: आप अभी भी HttpServletResponse उपयोग करने के लिए आप इसे किसी वर्ग क्षेत्रों में से एक के लिए इंजेक्शन प्राप्त कर सकते हैं, या संपत्ति का उपयोग कर, या विधि पैरामीटर चाहते हैं

return Response.ok(entity).header("Content-Disposition", "attachment; filename=" + fileName).build() 

: बस इकाई के बजाय प्रतिक्रिया वापस जाने के लिए अपने विधि बनाने के

@Path("/resource") 
class MyResource { 

    // one way to get HttpServletResponse 
    @Context 
    private HttpServletResponse anotherServletResponse; 

    // another way 
    Response myMethod(@Context HttpServletResponse servletResponse) { 
     // ... code 
    } 
} 
+0

@GarretWilson क्यों नहीं? आपको क्या भ्रमित करता है? यह एक साधारण हेडर है। – Tarlog

+0

क्योंकि सिंगलटन 'माइक्रोसॉर्स' में 'myMethod()' एक साथ कई धागे द्वारा बुलाया जाएगा। प्रत्येक थ्रेड में 'HttpServletResponse' का एक अलग उदाहरण होगा, फिर भी सिंगलटन' elseServletResponse' सदस्य चर केवल एक ही मूल्य को एक ही समय में रख सकता है। यह काम करने का एकमात्र तरीका यह है कि अगर किसी अन्य थ्रेड-सुरक्षित प्रॉक्सी के साथ 'elseServletResponse' इंजेक्शन दिया गया था जो वर्तमान थ्रेड के वास्तविक 'HttpServletResponse' उदाहरण को निर्धारित करने के लिए थ्रेड स्थानीय या कुछ ऐसे का उपयोग करता है। –

+0

जहां तक ​​मुझे याद है HttpServletRequestWrapper इंजेक्शन दिया गया है; इसका कार्यान्वयन टीएलएस से वास्तविक HttpServletRequest लेता है। तो आपका अनुमान कम या ज्यादा सही है। – Tarlog

0

मैं HTTP प्रतिक्रिया हेडर सेट और मानक सर्वलेट के माध्यम से ब्राउज़र में डाउनलोड-पॉपअप प्रदर्शित करने स्ट्रीम करने के लिए लगा। नोट: मैं एक्सेल, एक्सेल आउटपुट एपीआई का उपयोग कर रहा हूँ।

package local.test.servlet; 

import java.io.IOException; 
import java.net.URL; 
import java.net.URLDecoder; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import local.test.jaxrs.ExcellaTestResource; 
import org.apache.poi.ss.usermodel.Workbook; 
import org.bbreak.excella.core.BookData; 
import org.bbreak.excella.core.exception.ExportException; 
import org.bbreak.excella.reports.exporter.ExcelExporter; 
import org.bbreak.excella.reports.exporter.ReportBookExporter; 
import org.bbreak.excella.reports.model.ConvertConfiguration; 
import org.bbreak.excella.reports.model.ReportBook; 
import org.bbreak.excella.reports.model.ReportSheet; 
import org.bbreak.excella.reports.processor.ReportProcessor; 

@WebServlet(name="ExcelServlet", urlPatterns={"/ExcelServlet"}) 
public class ExcelServlet extends HttpServlet { 

    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 


     try { 

      URL templateFileUrl = ExcellaTestResource.class.getResource("myTemplate.xls"); 
      // /C:/Users/m-hugohugo/Documents/NetBeansProjects/KogaAlpha/build/web/WEB-INF/classes/local/test/jaxrs/myTemplate.xls 
      System.out.println(templateFileUrl.getPath()); 
      String templateFilePath = URLDecoder.decode(templateFileUrl.getPath(), "UTF-8"); 
      String outputFileDir = "MasatoExcelHorizontalOutput"; 

      ReportProcessor reportProcessor = new ReportProcessor(); 
      ReportBook outputBook = new ReportBook(templateFilePath, outputFileDir, ExcelExporter.FORMAT_TYPE); 

      ReportSheet outputSheet = new ReportSheet("MySheet"); 
      outputBook.addReportSheet(outputSheet); 

      reportProcessor.addReportBookExporter(new OutputStreamExporter(response)); 
      System.out.println("wtf???"); 
      reportProcessor.process(outputBook); 


      System.out.println("done!!"); 
     } 
     catch(Exception e) { 
      System.out.println(e); 
     } 

    } //end doGet() 

    @Override 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    } 

}//end class 



class OutputStreamExporter extends ReportBookExporter { 

    private HttpServletResponse response; 

    public OutputStreamExporter(HttpServletResponse response) { 
     this.response = response; 
    } 

    @Override 
    public String getExtention() { 
     return null; 
    } 

    @Override 
    public String getFormatType() { 
     return ExcelExporter.FORMAT_TYPE; 
    } 

    @Override 
    public void output(Workbook book, BookData bookdata, ConvertConfiguration configuration) throws ExportException { 

     System.out.println(book.getFirstVisibleTab()); 
     System.out.println(book.getSheetName(0)); 

     //TODO write to stream 
     try { 
      response.setContentType("application/vnd.ms-excel"); 
      response.setHeader("Content-Disposition", "attachment; filename=masatoExample.xls"); 
      book.write(response.getOutputStream()); 
      response.getOutputStream().close(); 
      System.out.println("booya!!"); 
     } 
     catch(Exception e) { 
      System.out.println(e); 
     } 
    } 
}//end class 
14
@Context ServletContext ctx; 
@Context private HttpServletResponse response; 

@GET 
@Produces(MediaType.APPLICATION_OCTET_STREAM) 
@Path("/download/{filename}") 
public StreamingOutput download(@PathParam("filename") String fileName) throws Exception { 
    final File file = new File(ctx.getInitParameter("file_save_directory") + "/", fileName); 
    response.setHeader("Content-Length", String.valueOf(file.length())); 
    response.setHeader("Content-Disposition", "attachment; filename=\""+ file.getName() + "\""); 
    return new StreamingOutput() { 
     @Override 
     public void write(OutputStream output) throws IOException, 
       WebApplicationException { 
      Utils.writeBuffer(new BufferedInputStream(new FileInputStream(file)), new BufferedOutputStream(output)); 
     } 
    }; 
} 
+0

सामग्री-लेनगेट सेट करने की कोई आवश्यकता नहीं है, यह किसी भी तरह जावाई प्लेटफ़ॉर्म में गणना की जाती है ;-) –

संबंधित मुद्दे

 संबंधित मुद्दे