I'm deploying JSF portlet on HCL Portal 9.5 that includes a servlet for PDF opened in a new tab. I don't know if that's a common behavior but when I click a download button in a newly opened tab, servlet is called again. Why? Can I avoid this?
servlet class:
public class PdfDownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
// za shranjevanje SNMP pasti
private static HashMap<SnmpNapakeEnum, Date> snmpMap = new HashMap<SnmpNapakeEnum, Date>();
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
processRequest(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
processRequest(req, resp);
}
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String param1 = ... // reading some url params
try {
writeOutputStream(response);
} catch (Exception e) {
LOG.error(e.getMessage(), e);
OutputStream os = null;
try {
os = response.getOutputStream();
os.write(e.getMessage().getBytes("UTF-8"));
} finally {
if (ObjectUtils.isNotEmpty(os)) {
os.close();
os = null;
}
}
}
}
private void writeOutputStream(HttpServletResponse response, String param1) throws IOException, ParseException {
OutputStream os = null;
try {
byte[] data = ... // calling some ejb method that returns byte array
response.setContentType("application/pdf");
response.setContentLength(data.length);
response.setHeader("Content-Disposition", "inline;filename=Sample.pdf");
os = response.getOutputStream();
os.write(data);
} finally {
if (ObjectUtils.isNotEmpty(os)) {
os.close();
os = null;
}
}
}
}
web.xml
<servlet>
<description>Pdf download</description>
<display-name>PdfDownloadServlet</display-name>
<servlet-name>PdfDownloadServlet</servlet-name>
<servlet-class>si.nijz.rizddz.portlet.skupno.servlets.ObvestiloOStDelavcaServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PdfDownloadServlet</servlet-name>
<url-pattern>/PdfDownloadServlet</url-pattern>
</servlet-mapping>
EDIT1:
I'm calling JS function (that calls servlet) from my backing bean.
action listener:
public void onBtnGeneratePdf() {
String date1AsStr = "2020-02-13";
PrimeFaces.current().executeScript("generatePdf('" + date1AsStr + "');");
}
JS function:
generatePdf : function(date1AsStr) {
try {
var path = $('[id$=hidContextPath]').val() + '/PdfDownloadServlet?date1AsStr=' + date1AsStr;
window.open(path);
} catch (e) {
...
}
return true;
}
button html:
<p:commandButton id="btnGenerate" icon="ui-icon-document" actionListener="#{myBean.onBtnGeneratePdf}" value="Generate" />