Dove è posizionato il file rispetto alla web application?
La soluzione è avere un'altra servlet che si occupa del download del file. Il principio basilare è che basta ottenere un InputStream del file e poi leggere a blocchi di byte e buttarli pari-pari sul OutputStream (il ServletOutputStream della response, che è-un OutputStream).
Però bisogna anche settare degli header in modo appropriato. Sicuramente il Content-Type affinché un client possa dedurre come trattare il documento. Se vuoi che qualunque browser faccia il download senza sapere altro, si può usare il content type "application/octet-stream".
Poi visto che è un file e sai a priori la lunghezza, sarebbe anche utile ed appropriato impostare il header Content-Length.
Si può anche impostare il Content-Disposition per indicare che è un attachment con un certo nome specifico.
Poi si possono facoltativamente impostare altri header per permettere o impedire il caching.
Per lo streaming si possono anche usare metodi di librerie apposite come la Apache Commons IO che ha una classe FileUtils con un comodissimo metodo public static long copyFile(File input, OutputStream output)