Servlet 404错误求助:照搬书本示例代码仍无法访问
先看你代码里的明显语法错误:
- 第3行
importjava.io.PrintWriter; 里多了一个反引号,这会导致代码编译失败,Servlet无法被容器加载,直接引发404。先把这个反引号删掉,修正后的import行是:import java.io.PrintWriter;
解决完代码错误后,再按以下步骤排查部署和访问问题:
确认项目是否成功部署到服务器
打开Tomcat的webapps目录,检查是否有你的项目文件夹;或者在IDE的服务器部署列表里,确认你的项目已被添加并启动。检查访问路径是否正确
你的Servlet用@WebServlet("/SampleServlet2")注解,完整访问路径应该是:http://localhost:8080/[你的项目上下文路径]/SampleServlet2
比如你的项目名为LuckServlet,那路径就是http://localhost:8080/LuckServlet/SampleServlet2。注意上下文路径是你项目的名称,IDE里通常会默认用项目名作为上下文路径。检查服务器启动状态
查看Tomcat控制台输出,确认没有端口占用、类加载失败等报错。如果服务器启动失败,Servlet自然无法访问。验证Servlet类是否被正确编译
检查项目的WEB-INF/classes目录下,是否存在servlet/SampleServlet2.class文件。如果没有,说明IDE的编译输出路径配置有问题,或者编译过程出错。确认Servlet版本与容器兼容
@WebServlet是Servlet 3.0及以上的特性,确保你使用的Tomcat版本是7.0及以上,且如果有web.xml文件,其版本要设置为3.0或更高(比如<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="3.0">)。
修正后的完整代码:
package servlet; import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class SampleServlet2 */ @WebServlet("/SampleServlet2") public class SampleServlet2 extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String[] luckArray = {"超スッキリ","スッキリ","最悪"}; int index = (int) (Math.random()*3); String luck=luckArray[index]; Date date= new Date(); SimpleDateFormat sdf=new SimpleDateFormat("MM月dd日"); String today=sdf.format(date); // 注意:先设置ContentType再获取Writer,避免编码问题 response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>スッキリ占い</title>"); out.println("</head>"); out.println("<body>"); out.println("<p>"+today+"の運勢は「"+luck+"」です</p>"); out.println("</body>"); out.println("</html>"); } }
另外补充:原代码里先调用了response.getWriter().append(...),之后才设置ContentType,这可能导致编码异常,建议先设置ContentType再获取输出流,修正后的代码已经调整了这个顺序。
内容的提问来源于stack exchange,提问作者wdwad dwad

