title: How to write to a HttpServletResponse response object?
body: <p>I have this action class, this class takes care of my response</p>
  
  <p><strong>Update</strong> now passing response from <code>DownloadStatus</code> class, but it looks like it is null</p>
  
  <pre><code>public final class DownloadStatus extends ActionSupport implements ServletRequestAware,ServletResponseAware
  {
      static Logger logger = Logger.getLogger(DownloadStatus.class);
      private HttpServletRequest request;
      private HttpServletResponse response;
      private File cfile;
      private String cfileFileName;
  
      @Override
      public String execute() 
      {
  
          logger.debug("Inside DownloadStatus.execute method")
  
          try {
              ChainsInvoker invoker = new ChainsInvoker()
              def executionResponse = invoker.invoke(request, MYChains.download, cfile, cfileFileName)
              if(executionResponse == null || ErrorHandler.checkIfError(executionResponse))
              {
                  return ERROR
              }
              response.setContentType("APPLICATION/xml")
  
              logger.debug("filename: $cfileFileName")
  
              response.addHeader("Content-Disposition", "attachment; filename=\""+cfileFileName+"\"")
              response.getWriter().print(executionResponse)
              logger.debug("executionResponse :" + executionResponse)
              invoker.invoke(MYChains.clean)
          }catch (Exception exp) {
  
              logger.error("Exception while Creating Status ")
              logger.error(exp.printStackTrace())
  
          }
          return NONE
      }
  
      @Override
      public void setServletRequest(HttpServletRequest request) {     this.request = request; }
  
      @Override
      public void setServletResponse(HttpServletResponse response) {      this.response = response;   }
  
      public File getcfile()  {       cfile   }
  
      public void setcfile(File cfile)    {       this.cfile = cfile  }
  
      public String getcfileFileName()    {       cfileFileName   }
  
      public void setcfileFileName(String cfileFileName){     this.cfileFileName = cfileFileName  }
  }
  </code></pre>
  
  <p>and below class to write stream into response</p>
  
  <pre><code>class DownloadStatusResponse implements Command {   
  
  static Logger logger = Logger.getLogger(DownloadStatusResponse.class);
  @Override
  public boolean execute(Context ctx) throws Exception 
  {
      logger.debug("Inside DownloadStatusResponse.execute() method")
      OutputStream response = null;
  
      if(ctx.get(ContextParams.absFileName) != null &amp;&amp; ctx.get(ContextParams.absFileName).toString().trim().length() != 0 )
      {
  HttpServletResponse resp = ctx.get(ContextParams.response)
  /*I am trying to get Response here*/
  
          response=downloadStatusFile(ctx.get(ContextParams.absFileName).toString(),resp)
      }
  
      logger.debug("Response: " + response)
      ctx.put(ContextParams.response,response);   /*ContextParams is a enum of keywords, having response*/
      return false;
  }
  
  private OutputStream downloadStatusFile(String filename,HttpServletResponse resp)
  {
      logger.info("Inside downloadStatusFile() method")
  
      File fname = new File(filename)
      if(!fname.exists())
      {   
          logger.info("$filename does not exists")
          return null
      }
      else
      {
  
          resp.setContentType("APPLICATION/xml")
  /*Exception: cannot setContentType on null object*/
  
          resp.addHeader("Content-Disposition", "attachment; filename=\""+fname.getName()+"\"")
  
          FileInputStream istr = new FileInputStream(fname)
          OutputStream ostr = resp.getOutputStream()
          /*I need to use resp.getOutputStream() for ostr*/
  
          int curByte=-1;
  
          while( (curByte=istr.read()) !=-1)
              ostr.write(curByte)
  
          ostr.flush();           
      }               
      return ostr
  }
  
  }
  </code></pre>
  
  <p>My question is how can <code>ostr</code> be returned to the <code>response</code> in <code>DownloadStatus</code> class?</p>
  
  <p><strong>Update (working test servlet)</strong></p>
  
  <p>I have this below servlet which does the job of getting file content into a stream and giving it back to the HttpServletResponse, but i want to use it in above code</p>
  
  <pre><code>    public class DownloadServlet extends HttpServlet {
  
  
  public void doGet(HttpServletRequest req, HttpServletResponse resp)
  throws ServletException, IOException {
  
      String fileName = req.getParameter("zipFile");
  
      if(fileName == null)      return;
  
          File fname = new File(fileName);
          System.out.println("filename"); 
          if(!fname.exists())  {System.out.println("Does not exists");            return;}
  
          FileInputStream istr = null;
          OutputStream ostr = null;
          //resp.setContentType("application/x-download");
          resp.setContentType("APPLICATION/ZIP"); 
          resp.addHeader("Content-Disposition", "attachment; filename=\""+fname.getName()+"\"");
          System.out.println(fname.getName()); 
          try {  
            istr = new FileInputStream(fname);
            ostr = resp.getOutputStream();
            int curByte=-1;
  
                  while( (curByte=istr.read()) !=-1)
                      ostr.write(curByte);
  
            ostr.flush();
          } catch(Exception ex){
            ex.printStackTrace(System.out);
          } finally{
            try {
              if(istr!=null)  istr.close();
              if(ostr!=null)  ostr.close();
            } catch(Exception ex){
  
                ex.printStackTrace();
              System.out.println(ex.getMessage());
            }
          }  
          try {
              resp.flushBuffer();
          } catch(Exception ex){
              ex.printStackTrace();
              System.out.println(ex.getMessage());
          }
      }
   }
  </code></pre>