我在JSP页面上有一个excel文件列表,它们作为表存储在数据库中。它们是超链接。每当用户点击特定文件时,我都需要下载该文件。
我有以下代码。
JSP PAGE
<html>
<head>
<title></title>
</head>
<body>
<%
List<String> encrypted = (List<String>)session.getAttribute("encryptedlist");
List<String> original = (List<String>)session.getAttribute("originallist");
List<String> decrypted = (List<String>)session.getAttribute("decryptedlist");
%>
<table>
<tr>
<td style="font-weight: bold">Original Files</td>
<td style="font-weight: bold">Encrypted Files</td>
<td style="font-weight: bold">Decrypted Files</td>
</tr>
<%for(int i=0;i<size;i++) {%>
<tr>
<td><a href="DownloadServlet1?file=<%=original.get(i)%>"><%=original.get(i)%></a></td>
<td><a href="DownloadServlet1?file=<%=encrypted.get(i)%>"><%=encrypted.get(i)%></a></td>
<td><a href="DownloadServlet2?file=<%=decrypted.get(i)%>"><%=decrypted.get(i)%></a></td>
</tr>
<%}%>
</table>
</body>
</html>
SERVLET
public class DownloadServlet1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String file = request.getParameter("file");
System.out.println(file);
int columns = getCount(file);
System.out.println(columns);
List<String> columnNames = getColumnNames(file,columns);
System.out.println(columnNames);
saveFile(columnNames,columns,file,response);
response.sendRedirect("Login.jsp");
}
protected int getCount(String file){
//String sql = "select * from " + "`" + file + "`";
int col=0;
try {
Connection con = DBOperations.getConnection();
Statement st = con.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM " + file);
System.out.println("SELECT * FROM " + file);
ResultSetMetaData md = rs.getMetaData();
col = md.getColumnCount();
}catch (Exception ex)
{
System.out.println("getcount" + ex);
}
return col;
}
protected List<String> getColumnNames(String file, int columns)
{
List<String> columnNames = new ArrayList<>();
try {
Connection con = DBOperations.getConnection();
Statement st = con.createStatement();
String sql = "Select * from " + file;
System.out.println("getcolumnnames " + sql);
ResultSet rs = st.executeQuery(sql);
System.out.println("SELECT * FROM " + file);
ResultSetMetaData md = rs.getMetaData();
for (int i = 1; i <= columns; i++){
String col_name = md.getColumnName(i);
columnNames.add(col_name);
//System.out.println(col_name);
}
}catch (Exception ex)
{
System.out.println("get column names"+ex);
}
return columnNames;
}
protected void saveFile(List<String> columnNames,int columns,String file,HttpServletResponse response)
{
Connection con = DBOperations.getConnection();
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment; filename="+file+".xls");
String excelFileName = file;
String sheetName = "Sheet1";//name o sheet
XSSFWorkbook wb = new XSSFWorkbook();
XSSFSheet sheet = wb.createSheet(sheetName) ;
//iterating r number of rows
for (int r=0;r < 1; r++ )
{
XSSFRow row = sheet.createRow(r);
//iterating c number of columns
for (int c=0;c < columns; c++ )
{
XSSFCell cell = row.createCell(c);
cell.setCellValue(columnNames.get(c));
}
}
try
{
String sql = "Select * from " + file;
System.out.println(sql);
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(sql);
int r=1;
while(rs.next())
{
XSSFRow row = sheet.createRow(r);
for(int c=1;c<columns;c++)
{
XSSFCell cell = row.createCell(c);
cell.setCellValue(rs.getString(c));
}
r=r+1;
}
}catch (Exception ex)
{
System.out.println(ex);
}
try {
FileOutputStream fileOut = new FileOutputStream(excelFileName);
//write this workbook to an Outputstream.
wb.write(fileOut);
fileOut.flush();
fileOut.close();
}catch (Exception ex)
{
System.out.println(ex);
}
}
}
getCount函数从数据库返回数据库文件的列数。 getColumnNames获取所有列的名称。
这两个函数都返回正确的值,这表明访问数据库表没有问题
saveFile函数应该下载excel文件。
我在浏览器网页上收到此错误
The webpage at http://localhost:8084/DownloadServlet1?file=Hil_1566869_27_08_17_20_24_18 might be temporarily down or it may have moved permanently to a new web address.
可能是什么问题?
答案 0 :(得分:0)
将Excel文档直接写入HTTP响应:
wb.write(response.getOutputStream());
在服务器上本地保存Excel文档没有意义。
另外,请勿重定向到Login.jsp
,这可能会导致错误。