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!

 
    
