🍉四.编写代码
点击Java创建一个类
创建一个类 HelloServlet , 继承自 HttpServletAlt+Enter导入import javax.servlet.http.HttpServlet包
●在这个类上方加上 @WebServlet(“/hello”) 注解, 表示 Tomcat 收到的请求中, 路径为 /hello的请求才会调用 HelloServlet 这个类的代码. (这个路径未包含 Context Path)
●重写 doGet 方法. doGet 的参数有两个, 分别表示收到的 HTTP 请求 和要构造的 HTTP 响应. 这个方法会在 Tomcat 收到 GET 请求时触发
●HttpServletRequest 表示 HTTP 请求. Tomcat 按照 HTTP 请求的格式把 字符串 格式的请求转成了一个 HttpServletRequest 对象. 后续想获取请求中的信息(方法, url, header, body 等) 都是通过这个对象来获取.
●HttpServletResponse 表示 HTTP 响应. 代码中把响应对象构造好(构造响应的状态码, header,body 等)
●resp.getWriter() 会获取到一个流对象, 通过这个流对象就可以写入一些数据, 写入的数据会被构造成一个 HTTP 响应的 body 部分, Tomcat 会把整个响应转成字符串, 通过 socket 写回给浏览器.
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * Created with InteliJ IDEA. * /Description: * User:PANJIAPENG * Date:2022-11-09 * Time:19:32 */ @WebServlet("/hello") public class ServletHello extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("hello servlet"); resp.getWriter().write("hello Servlet"); } }
这个代码虽然只有寥寥几行, 但是包含的信息量是巨大的
(1) 我们的代码不是通过 main 方法作为入口了. main 方法已经被包含在 Tomcat 里, 我们写的代码会被Tomcat 在合适的时机调用起来.
此时我们写的代码并不是一个完整的程序, 而是 Tomcat 这个程序的一小部分逻辑.
(2) 我们随便写个类都能被 Tomcat 调用嘛? 满足啥样条件才能被调用呢?
主要满足三个条件:
● 创建的类需要继承自 HTTP Servlet
● 这个类需要使用 @WebServlet 注解关联上一个 HTTP 的路径
● 这个类需要实现 doXXX 方法
当这三个条件都满足之后, Tomcat 就可以找到这个类, 并且在合适的时机进行调用
🍉五.打包/部署/运行
打包:
war 包和 jar 包的区别
●jar 包是普通的 java 程序打包的结果,也是默认打包格式. 里面会包含一些 .class 文件.
●war 包是 java web 的程序, 里面除了会包含 .class 文件之外, 还会包含 HTML, CSS, JavaScript, 图片, 以及其他的 jar 包. 打成 war 包格式才能被 Tomcat 识别.
点击运行进行打包/部署
检验程序:
输入127.0.0.1:8080/Servlet/hello
注意:这是根据自己设置的文件路径进行查找的
🍒2.3 Servlet程序运行常见错误
出现 404
404 表示用户访问的资源不存在. 大概率是 URL 的路径写的不正确
●错误实例1: 少写了 Context Path
通过 /hello 访问服务器
●错误实例2: 少写了 Servlet Path
通过 /Servlet 访问服务器
●错误实例3: Servlet Path 写的和 URL 不匹配
修改 @WebServlet 注解的路径
●错误实例4: web.xml 写错了
清除 web.xml 中的内容
出现405
405 表示对应的 HTTP 请求方法没有实现.
错误实例: 没有实现 doGet 方法.
@WebServlet("/hello") public class HelloServlet extends HttpServlet { }
出现 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()); } }
出现 “空白页面”
错误实例:
修改代码, 去掉 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"); } }
出现 “无法访问此网站”
一般是 Tomcat 启动就失败了.
错误实例: Servlet Path 写错了又肯没有加"/"
🍒2.4总结
初学 Servlet, 遇到的这类问题会非常多. 我们不光要学习 Servlet 代码的基本写法, 也要学习排查错误的思路.
程序猿调试 BUG 如同医生诊病.
一个有经验的程序猿和一个新手程序猿相比, 最大的优势往往不是代码写的多好, 而是调试效率有多高. 同一个问题可能新手花了几天都无法解决的, 但是有经验的程序猿可能几分钟就搞定了.
你还觉得 “程序猿是吃青春饭” 嘛?
熟悉 HTTP 协议能够让我们调试问题事半功倍.
●4xx 的状态码表示路径不存在, 往往需要检查 URL 是否正确, 和代码中设定的 Context Path 以及Servlet Path 是否一致.
●5xx 的状态码表示服务器出现错误,或者代码写错, 往往需要观察页面提示的内容和 Tomcat 自身的日志, 观察是否存在报错.
●出现连接失败往往意味着 Tomcat 没有正确启动, 也需要观察 Tomcat 的自身日志是否有错误提示.
●空白页面这种情况则需要我们使用抓包工具来分析 HTTP 请求响应的具体交互过程.
●观察日志是调试程序的重要途径. Tomcat 的日志往往很多, 需要同学们耐心阅读, 经常阅读, 熟练了就能更快速的找到问题了.
舞台在大,你不登场,永远都是观众.平台再好,你不参加永远都是局外人.能力再大,你若不行动,没人能看到你的成功.我们一起加油屏幕前的陌生人!