Servlet(2)

更方便的部署方式

手动拷贝 war 包到 Tomcat 的过程比较麻烦. 我们还有更方便的办法.
此处我们使用 IDEA 中的 Smart Tomcat 插件完成这个工作.

安装 Smart Tomcat 插件

  1. 菜单 -> 文件 -> Settings

在这里插入图片描述
2. 选择 Plugins, 选择 Marketplace, 搜索 “tomcat”, 点击 “Install”.

在这里插入图片描述
3. 安装完毕之后, 会提示 “重启 IDEA”
在这里插入图片描述

配置 Smart Tomcat 插件

  1. 点击右上角的 “Add Configuration”

在这里插入图片描述
2. 选择左侧的 “Smart Tomcat”

在这里插入图片描述
3. 在 Name 这一栏填写一个名字(可以随便写)
在 Tomcat Server 这一栏选择 Tomcat 所在的目录. 其他的选项不必做出修改.
在这里插入图片描述
其中 Context Path 默认填写的值是项目名称.在这里插入图片描述这会影响到后面咱们的访问页面.

  1. 点击 OK 之后, 右上角变成了
    在这里插入图片描述
    点击绿色的三角号, IDEA 就会自动进行编译, 部署, 启动 Tomcat 的过程
    在这里插入图片描述
    此时 Tomcat 日志就会输出在 IDEA 的控制台中, 可以看到现在就不再乱码了.

  2. 访问页面.
    在浏览器中使用 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 协议能够让我们调试问题事半功倍.

  1. 4xx 的状态码表示路径不存在, 往往需要检查 URL 是否正确, 和代码中设定的 Context Path 以及Servlet Path 是否一致.
  2. 5xx 的状态码表示服务器出现错误, 往往需要观察页面提示的内容和 Tomcat 自身的日志, 观察是否存在报错.
  3. 出现连接失败往往意味着 Tomcat 没有正确启动, 也需要观察 Tomcat 的自身日志是否有错误提示.
  4. 空白页面这种情况则需要我们使用抓包工具来分析 HTTP 请求响应的具体交互过程.
    观察日志是调试程序的重要途径. Tomcat 的日志往往很多, 需要耐心阅读, 经常阅读, 熟练了就能更快速的找到问题了.
  • 29
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mang go

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值