簡體   English   中英

從jsp頁面調用時找不到HTTPServlet

[英]HTTPServlet not found when calling from jsp page

我主要從事基於 jersey 的網絡服務,第一次嘗試使用 jsp + servlet 組合,並且在一些事情上掙扎了很多

以下是 tomcat webapp 文件夾中的目錄結構:

├── 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

網頁.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>

下載Servlet


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(應該調用下載 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>");
      }

我想要達到的目標:

本質上顯示文件列表並將它們傳遞給下載 servlet 以觸發下載。 到目前為止,我能夠讓用戶成功登錄,但是當a標簽被觸發,我最終得到404

如下

也嘗試了這個詳盡的答案:

Servlet 返回“HTTP 狀態 404 請求的資源 (/servlet) 不可用”

我嘗試使用 servlet 直接點擊瀏覽器,但仍然是 404。此外, href參數發送到~:8080/download時應該是~:8080/cti_dwnld/download/

任何指針/幫助表示贊賞!

<a> 標簽中使用 servlet url-pattern 時無需使用前導 '\\'。 如果您想使用 url-pattern /download調用您的 DownloadServlet,下面的代碼工作正常

<a href='download?file=sample.txt'>Download</a>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM