在我的项目(JSF + MAVEN)中,我想使用servlet从我的数据库下载PDF文件,(比我点击按钮,servlet必须从数据库下载文件)但是我在JSF中编写的所有内容'commandButton'don' t work.CommandButton看不到servlet。
这是在content.xhtml中使用'commandButton'的表单
<h:form>
<h:commandButton action="/DownloadFile" value="#{msg.download}"styleClass="download-Button">
<f:param name="file_id=#{b.id} "/>
</h:commandButton>
</h:form>
这是'Downloadfile'servlet,它从DB下载PDF文件。 PDF文件将DB中的“内容”列保存为相对路径。
public class DownloadFile extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
private String content;
private String name;
private Connection conn;
private PreparedStatement ps;
private ResultSet rs;
private void getFileFromDb(HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException {
try {
Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
int selectedFileID = Integer.valueOf(params.get("file_id"));
System.out.println("Id====" + selectedFileID);
conn = DataBase.getConnection();
ps = conn.prepareStatement("SELECT content,name FROM book WHERE id= "+ selectedFileID);
rs = ps.executeQuery();
while (rs.next()){
content = rs.getString("content");
name = rs.getString("name");
}
} catch (SQLException e) {
e.printStackTrace();
}
String contextPath = "D:\\IdeaProjects\\Books\\";
File pdfFile = new File(contextPath + content);
response.setContentType("application/pdf");
response.addHeader("Content-Disposition", "attachment; filename=" + name+".pdf");
response.setContentLength((int) pdfFile.length());
FileInputStream fileInputStream = new FileInputStream(pdfFile);
OutputStream responseOutputStream = response.getOutputStream();
int bytes;
while ((bytes = fileInputStream.read()) != -1) {
responseOutputStream.write(bytes);
}
}
}
这是我的项目结构。 Project structure
如何正确编写导航到此servlet?我已经尝试了很多方法,但它们也没有用。感谢所有答案。
答案 0 :(得分:1)
对于创建servlet,您不需要实现仅扩展的Servelet。
public class HelloWorld extends HttpServlet {}
将您的方法名称更改为doGet
,并将public
更改为非私有。
然后用这种简单的方式调用Servlet,别忘了添加target="_blank"
<h:outputLink value="/DownloadFile?param=param_value" target="_blank">
<f:param name="param1" value="value1" />
</h:outputLink>
或纯HTML:
<a href="/DownloadFile?param=" target="_blank">
#{node.reportName}
</a>