-1

I'm running a page trying to export an Excel file through a Java Servlet. A rundown of the structure: downloadreports.jsp is where the button is that is supposed to call the file. The button calls ReportsServlet.java, which is just the download and that in turn calls ExcelCreatorBanned.java, which calls the database and creates the Excel file.

The problem is that 1) when I try to click on downloadreports.jsp when running the full site, it automatically goes to the ReportsServlet instead of displaying the page (turning up a 404 error for /Reports) and 2) I've been messing with this for days and it's just not working. Not sure what I'm doing wrong, but any help would be very appreciated!

downloadreports.jsp

<div align="center">
<form id="downloadBanned" action="../Reports" method="post">`
<input class="btn btn-lg btn-red" type="submit" value="Download Banned Student List"><br>            `
</form>`

ReportsServlet.java

package controllers;

import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import helpers.ExcelCreatorBanned;

/**
 * Servlet implementation class ReportsServlet
 */
@WebServlet({ "/ReportsServlet", "/Reports" })
    public class ReportsServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private HttpSession session;
    private String url;   

/**
 * @see HttpServlet#HttpServlet()
 */
public ReportsServlet() {
    super();
    // TODO Auto-generated constructor stub
}

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request, response);
}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    this.session = request.getSession(false);

    ExcelCreatorBanned ecb = new ExcelCreatorBanned();
    ecb.downloadExcel();

    url = "admin/downloadreports.jsp";

    RequestDispatcher dispatcher = request.getRequestDispatcher(url);
    dispatcher.forward(request, response);

}

private Object getOutputStream() {
    // TODO Auto-generated method stub
    return null;
}

}

ExcelCreatorBanned.java (The reference to DbConnect.java is the credentials to the server, and it definitely works because it works on the other pages)

package helpers;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;

import javax.servlet.ServletOutputStream;


import model.DbConnect;

import java.sql.Statement;

public class ExcelCreatorBanned {

      public String downloadExcel( ) { //ServletOutputStream out){

        String outFileName = "BannedStudents.csv";
        int nRow = 1;
        String strQuery = null;
        Connection con = null;

        try {

            // Getting connection here for mySQL database 
              Class.forName("com.mysql.jdbc.Driver").newInstance();
              con = DbConnect.devCredentials();
              System.out.println(con);

              if(con==null)
                  return "Connection Failed";

              // Database Query               
              strQuery = "select * from banned";
              Statement stmt=con.createStatement();

              ResultSet rs=stmt.executeQuery(strQuery);

              File file = new File(outFileName);
              FileWriter fstream = new FileWriter(file);
              BufferedWriter out = new BufferedWriter(fstream);

              //Get Titles
              String titleLine = "BannedID" + "," + "UserID" + "," + "AdminID"         
                   + "," + "Ban Start Date" + "," + 
                       "Ban End Date" + "," + "Penalty Count" + "," + 
                   "Description" + "," + "Status" + "\n";
              out.write(titleLine);

              //stmt = conn.createStatement();


              while (rs.next()) {
                  int BannedId = rs.getInt(1);
                  int UserID = rs.getInt(2); 
                  int AdminID = rs.getInt(3); 
                  String BanStartDate = rs.getString(4); 
                  String BanEndDate = rs.getString(5); 
                  int PenaltyCount = rs.getInt(6); 
                  String Description = rs.getString(7);                 
                  String Status = rs.getString(8);

                  String outline = BannedId + "," + UserID + "," + AdminID + 
                      "," + BanStartDate + "," + 
                      BanEndDate + "," + PenaltyCount + "," + Description +
                      "," + Status + "\n";

                  out.write(outline);

              } //end of while
              out.close();

      } catch (Exception e) {
          System.err.println("Got an exception!");
          System.err.println(e.getMessage());
      }
        return outFileName;
 }
}
Norsk
  • 622
  • 1
  • 10
  • 22

1 Answers1

0

I don't like the look of the action="../Reports" attribute in the line

<form id="downloadBanned" action="../Reports" method="post">

Try the following instead:

<form id="downloadBanned" action="${pageContext.request.contextPath}/Reports" method="post">

See this question for a discussion about what ${pageContext.request.contextPath} is.

Community
  • 1
  • 1
Luke Woodward
  • 63,336
  • 16
  • 89
  • 104