I have mostly worked on jersey based webservices, trying my hand on jsp + servlet combo for the first time and struggling a lot with few things
here is what the directory structures looks likes in tomcat webapp folder:
├── 403.jsp
├── META-INF
│ ├── MANIFEST.MF
│ ├── maven
│ │ └── com.csx.cti <-----package
│ │ └── cti_dwnld <-----project name
│ │ ├── pom.properties
│ │ └── pom.xml
│ └── war-tracker
├── WEB-INF
│ ├── classes
│ │ └── com
│ │ └── csx
│ │ └── cti
│ │ └── servlet
│ │ └── DownloadServlet.class. <----- servlet in question
│ ├── lib
│ │ ├── javax.servlet-api-3.0.1.jar
│ │ └── javax.ws.rs-api-2.1.1.jar
│ └── web.xml
├── error.jsp
├── index.jsp
├── login.jsp
└── logout.jsp
web.xml
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>Login Demo Using j_security_check</display-name>
<!--Defines Security Constraint -->
<security-constraint>
<display-name>JSP Demo Constraint</display-name>
<web-resource-collection>
<web-resource-name>cp</web-resource-name>
<description/>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<description/>
<role-name>file-user</role-name>
</auth-constraint>
</security-constraint>
<!--Defines Login Config -->
<login-config>
<auth-method>FORM</auth-method>
<realm-name>cti file user realm</realm-name>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/403.jsp</form-error-page>
</form-login-config>
</login-config>
<!--Defines Security Role -->
<security-role>
<description/>
<role-name>file-user</role-name>
</security-role>
<error-page>
<error-code>403</error-code>
<location>/403.jsp</location>
</error-page>
</web-app>
DownloadServlet
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/download")
public class DownloadServlet extends HttpServlet {
// private static final long serialVersionUID = 1L;
private static final long serialVersionUID = 102831973239L;
private static final int BYTES_DOWNLOAD = 1024;
public DownloadServlet() {
super();
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
// skip url params and use hardcode for now
response.setContentType("text/plain");
response.setHeader("Content-Disposition", "attachment;filename=sample.txt");
ServletContext ctx = getServletContext();
InputStream is = ctx.getResourceAsStream("sample.txt");
int read = 0;
byte[] bytes = new byte[BYTES_DOWNLOAD];
OutputStream os = response.getOutputStream();
while ((read = is.read(bytes)) != -1) {
os.write(bytes, 0, read);
}
os.flush();
os.close();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
index.jsp ( part which is supposed to call the download servlet )
// l_Files is list of all files in the folder
for (int a = 0; a < l_Files.size(); a++) {
// have tried:
// href='./download'
// href='/download'
// href='download'
// href='/cti_dwnld/download'
out.println("<a href='/download?file=sample.txt'>" + l_Files.elementAt(a).toString() + "</a><br>");
}
What i am trying to achieve:
Essentially show a list of files and pass them to download servlet to trigger a download.
So far i am able to get user successfully logged in but when a
tag is triggered, i end up getting 404
tried this exhaustive answer as well:
Servlet returns "HTTP Status 404 The requested resource (/servlet) is not available"
I tried directly hitting the browser with servlet but still 404.
Also, the href
param is sending to ~:8080/download
when it should have been ~:8080/cti_dwnld/download/
any pointers / help is appreciated!