从JSP页面调用HttpServlet时出现404资源未找到问题
解决方案与排查思路
1. 解决Servlet注册失效问题
你当前使用@WebServlet注解注册Servlet,web.xml 3.1版本默认支持该注解,但如果没有显式开启注解扫描,或者注解被拦截,就会出现404。优先采用更稳妥的手动注册方式,在你的web.xml中新增以下配置:
<servlet> <servlet-name>DownloadServlet</servlet-name> <servlet-class>com.csx.cti.servlet.DownloadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>DownloadServlet</servlet-name> <url-pattern>/download</url-pattern> </servlet-mapping>
如果仍想使用注解,只需修改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" metadata-complete="false">
2. 修正前端跳转路径
你写的href='/download'是站点根路径绝对路径,会直接拼接在域名后,忽略项目上下文路径/cti_dwnld,直接改成动态获取上下文路径的写法即可,不需要硬编码项目名:
out.println("<a href='" + request.getContextPath() + "/download?file=sample.txt'>" + l_Files.elementAt(a).toString() + "</a><br>");
request.getContextPath()会自动返回当前项目的上下文路径,最终拼接出来的地址就是你预期的/cti_dwnld/download。
3. 额外排查点
- 重启Tomcat后先直接访问
http://你的服务地址:8080/cti_dwnld/download,如果可以正常下载,说明Servlet注册成功,仅需调整前端路径即可 - 检查Tomcat启动日志,是否有
DownloadServlet类加载失败的报错,排查是否存在jar包冲突、类路径写错的问题 - 后续可以给
InputStream is = ctx.getResourceAsStream("sample.txt")加非空判断,避免文件不存在时抛出空指针异常导致500错误
内容的提问来源于stack exchange,提问作者NoobEditor
相关产品推荐
相关产品推荐

