文章目录
- 更方便的部署方式
- 安装 Smart Tomcat 插件
- 配置 Smart Tomcat 插件
 
- 访问出错怎么办
- 出现 404
- 出现 405
- 出现 500
- 出现 "空白页面"
- 出现 "无法访问此网站"
 
- 小结
更方便的部署方式
手动拷贝 war 包到 Tomcat 的过程比较麻烦. 我们还有更方便的办法.
 此处我们使用 IDEA 中的 Smart Tomcat 插件完成这个工作.
安装 Smart Tomcat 插件
- 菜单 -> 文件 -> Settings

 2. 选择 Plugins, 选择 Marketplace, 搜索 “tomcat”, 点击 “Install”.

 3. 安装完毕之后, 会提示 “重启 IDEA”
 
配置 Smart Tomcat 插件
- 点击右上角的 “Add Configuration”

 2. 选择左侧的 “Smart Tomcat”

 3. 在 Name 这一栏填写一个名字(可以随便写)
 在 Tomcat Server 这一栏选择 Tomcat 所在的目录. 其他的选项不必做出修改.
 
 其中 Context Path 默认填写的值是项目名称. 这会影响到后面咱们的访问页面.
这会影响到后面咱们的访问页面.
-  点击 OK 之后, 右上角变成了 
  
 点击绿色的三角号, IDEA 就会自动进行编译, 部署, 启动 Tomcat 的过程
  
 此时 Tomcat 日志就会输出在 IDEA 的控制台中, 可以看到现在就不再乱码了.
-  访问页面. 
 在浏览器中使用 http://127.0.0.1:8080/ServletHelloWorld/hello 访问页面.
  
注意路径的对应关系
 
 使用 Smart Tomcat 部署的时候, 我们发现 Tomcat 的 webapps 内部并没有被拷贝一个 war 包,也没有看到解压缩的内容.
 Smart Tomcat 相当于是在 Tomcat 启动的时候直接引用了项目中的 webapp 和 target 目录.
 
访问出错怎么办
出现 404
404 表示用户访问的资源不存在. 大概率是 URL 的路径写的不正确.
 错误实例1: 少写了 Context Path
 通过 /hello 访问服务器
 
 错误实例2: 少写了 Servlet Path
 通过 /ServletHelloWorld 访问服务器
 
 错误实例3: Servlet Path 写的和 URL 不匹配
 修改 @WebServlet 注解的路径
 
 重启 Tomcat 服务器.
 URL 中的路径写作 “/hello” , 而代码中写作的 Servlet Path 为 “/helloServlet”, 两者不匹配.
 
 错误实例4: web.xml 写错了
 清除 web.xml 中的内容
 
 重启 Tomcat 服务器.
 通过浏览器访问 URL, 可以看到:
 
出现 405
405 表示对应的 HTTP 请求方法没有实现.
 错误实例: 没有实现 doGet 方法.
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
}
重启 Tomcat 服务器.
 在浏览器中访问, 可以看到
 
 在浏览器地址栏直接输入 URL , 会发送一个 HTTP GET 请求.
 此时就会根据 /ServletHelloWorld/hello 这个路径找到 HelloServlet 这个类. 并且尝试调用HelloServlet 的 doGet 方法.
 但是如果没有实现 doGet 方法, 就会出现上述现象
出现 500
往往是 Servlet 代码中抛出异常导致的.
 错误实例:
 修改代码
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String s = null;
resp.getWriter().write(s.length());
}
}
重启 Tomcat 服务器.
 重新访问页面, 可以看到:
 
 在页面上已经有具体的异常调用栈.
异常信息里已经提示了出现异常的代码是 HelloServlet.java 的第 13 行.
resp.getWriter().write(s.length());
仔细检查这里的代码就可以看到空指针异常.
出现 “空白页面”
错误实例:
 修改代码, 去掉 resp.getWritter().write() 操作
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("hello");
}
}
重启服务器,
 访问服务器, 可以看到一个空白页面
 
 抓包可以看到, 响应 body 中的内容就是 “空数据”
出现 “无法访问此网站”
一般是 Tomcat 启动就失败了.
 错误实例: Servlet Path 写错了
 
 应该写作 “/hello”, Tomcat 在启动的时候已经提示了相关的错误.
 Tomcat 启动的日志里面报错信息可能比较多, 需要耐心观察, 找到关键的提示
看到的现象
 
小结
初学 Servlet, 遇到的这类问题会非常多. 我们不光要学习 Servlet 代码的基本写法, 也要学习排查错误的思路.
 程序猿调试 BUG 如同医生诊病.
 一个有经验的程序猿和一个新手程序猿相比, 最大的优势往往不是代码写的多好, 而是调试效率有多高. 同一个问题可能新手花了几天都无法解决的, 但是有经验的程序猿可能几分钟就搞定了.
熟悉 HTTP 协议能够让我们调试问题事半功倍.
- 4xx 的状态码表示路径不存在, 往往需要检查 URL 是否正确, 和代码中设定的 Context Path 以及Servlet Path 是否一致.
- 5xx 的状态码表示服务器出现错误, 往往需要观察页面提示的内容和 Tomcat 自身的日志, 观察是否存在报错.
- 出现连接失败往往意味着 Tomcat 没有正确启动, 也需要观察 Tomcat 的自身日志是否有错误提示.
- 空白页面这种情况则需要我们使用抓包工具来分析 HTTP 请求响应的具体交互过程.
 观察日志是调试程序的重要途径. Tomcat 的日志往往很多, 需要耐心阅读, 经常阅读, 熟练了就能更快速的找到问题了.