【JavaWeb】Servlet 系列——模板方法设计模式、HttpServlet 源码分析、Web 站点的欢迎页面、关于 WEB-INF 目录
19 模板方法设计模式
19.1 什么是设计模式?
某个问题的固定的解决方案。(可以被重复使用。)
19.2 你知道哪些设计模式?
GoF 设计模式:
通常我们所说的 23 种设计模式。(Gang of Four:4 人组提出的设计模式)
单例模式
工厂模式
代理模式
门面模式
责任链设计模式
观察者模式
模板方法设计模式
.....
JavaEE 设计模式:
DAO
DTO
VO
PO
pojo
....
19.3 什么是模板方法设计模式?
在模板类的模板方法当中定义核心算法骨架,具体的实现步骤可以延迟到子类当中完成。
模板类通常是一个抽象类,模板类当中的模板方法定义核心算法,这个方法通常是 final 的(但也可以不是 final 的)
模板类当中的抽象方法就是不确定实现的方法,这个不确定怎么实现的事儿交给子类去做。
20 HttpServlet 源码分析
HttpServlet 类是专门为 HTTP 协议准备的。比 GenericServlet 更加适合 HTTP 协议下的开发。
20.1 HttpServlet 在哪个包下?
jakarta.servlet.http.HttpServlet
20.2 到目前为止我们接触了 servlet 规范中哪些接口?
jakarta.servlet.Servlet 核心接口(接口)
jakarta.servlet.ServletConfig Servlet 配置信息接口(接口)
jakarta.servlet.ServletContext Servlet 上下文接口(接口)
jakarta.servlet.ServletRequest Servlet 请求接口(接口)
jakarta.servlet.ServletResponse Servlet 响应接口(接口)
jakarta.servlet.ServletException Servlet 异常(类)
jakarta.servlet.GenericServlet 标准通用的 Servlet 类(抽象类)
20.3 http 包下都有哪些类和接口呢?
jakarta.servlet.http.*;
jakarta.servlet.http.HttpServlet (HTTP 协议专用的 Servlet 类,抽象类)
jakarta.servlet.http.HttpServletRequest (HTTP 协议专用的请求对象)
jakarta.servlet.http.HttpServletResponse (HTTP 协议专用的响应对象)
20.4 HttpServletRequest 对象中封装了什么信息?
HttpServletRequest,简称 request 对象。
HttpServletRequest 中封装了请求协议的全部内容。
Tomcat 服务器(WEB 服务器)将“请求协议”中的数据全部解析出来,然后将这些数据全部封装到 request 对象当中了。
也就是说,我们只要面向 HttpServletRequest,就可以获取请求协议中的数据。
HttpServletResponse 对象是专门用来响应 HTTP 协议到浏览器的。
20.5 Servlet 生命周期
用户第一次请求
Tomcat 服务器通过反射机制,调用无参数构造方法。创建 Servlet 对象。(web.xml 文件中配置的 Servlet 类对应的对象。)
Tomcat 服务器调用 Servlet 对象的 init 方法完成初始化。
Tomcat 服务器调用 Servlet 对象的 service 方法处理请求。
用户第二次请求
Tomcat 服务器调用 Servlet 对象的 service 方法处理请求。
用户第三次请求
Tomcat 服务器调用 Servlet 对象的 service 方法处理请求。
....
Tomcat 服务器调用 Servlet 对象的 service 方法处理请求。
服务器关闭
Tomcat 服务器调用 Servlet 对象的 destroy 方法,做销毁之前的准备工作。
Tomcat 服务器销毁 Servlet 对象。
20.6 HttpServlet 源码分析:
通过以上源代码分析:假设前端发送的请求是 get 请求,后端程序员重写的方法是 doPost,假设前端发送的请求是 post 请求,后端程序员重写的方法是 doGet,会发生什么呢?发生 405 这样的一个错误。405 表示前端的错误,发送的请求方式不对。和服务器不一致。不是服务器需要的请求方式。
通过以上源代码可以知道:只要 HttpServlet 类中的 doGet 方法或 doPost 方法执行了,必然 405.
怎么避免 405 的错误呢?后端重写了 doGet 方法,前端一定要发 get 请求。后端重写了 doPost 方法,前端一定要发 post 请求。这样可以避免 405 错误。
这种前端到底需要发什么样的请求,其实应该后端说了算。后端让发什么方式,前端就得发什么方式。 有的人,你会看到为了避免 405 错误,在 Servlet 类当中,将 doGet 和 doPost 方法都进行了重写。这样确实可以避免 405 的发生,但是不建议,405 错误还是有用的。该报错的时候就应该让他报错。如果你要是同时重写了 doGet 和 doPost,那还不如你直接重写 service 方法好了。这样代码还能少写一点。
20.7 我们编写的 HelloServlet 直接继承 HttpServlet,直接重写 HttpServlet 类中的 service()方法行吗?
可以,只不过你享受不到 405 错误。享受不到 HTTP 协议专属的东西。
20.8 最终的一个 Servlet 类的开发步骤:
第一步:编写一个 Servlet 类,直接继承 HttpServlet
第二步:重写 doGet 方法或者重写 doPost 方法,到底重写谁,javaweb 程序员说了算。
第三步:将 Servlet 类配置到 web.xml 文件当中。
第四步:准备前端的页面(form 表单),html 页面当中的 action 值为“/项目名/路径”,form 表单中指定请求路径即可。
21 关于一个 web 站点的欢迎页面
21.1 什么是一个 web 站点的欢迎页面?
对于一个 webapp 来说,我们是可以设置它的欢迎页面的。设置了欢迎页面之后,当你访问这个 webapp 的时候,或者访问这个 web 站点的时候,没有指定任何“资源路径”,这个时候会默认访问你的欢迎页面。
我们一般的访问方式是:
http://localhost:8080/servlet06/login.html 这种方式是指定了要访问的就是 login.html 资源。
如果我们访问的方式是:
http://localhost:8080/servlet06 如果我们访问的就是这个站点,没有指定具体的资源路径。它默认会访问你设置的欢迎页面。
21.2 怎么设置欢迎页面呢?
第一步:我在 IDEA 工具的 web 目录下新建了一个文件 login.html
第二步:在 web.xml 文件中进行了以下的配置
注意:路径不需要以“/”开始,并且路径默认从 webapp 的根下开始找。
21.4 一个 webapp 是可以设置多个欢迎页面的
Tomcat 服务器的全局欢迎页面是:index.html index.htm index.jsp。如果你一个 web 站点没有设置局部的欢迎页面,Tomcat 服务器就会以 index.html index.htm index.jsp 作为一个 web 站点的欢迎页面。
注意原则:局部优先原则。(就近原则)
21.6 欢迎页可以是一个 Servlet 吗?
当然可以。
你不要多想,欢迎页就是一个资源,既然是一个资源,那么可以是静态资源,也可以是动态资源。
静态资源:index.html welcome.html .....
动态资源:Servlet 类。
步骤:
第一步:写一个 Servlet
第三步:在 web.xml 文件中配置欢迎页
版权声明: 本文为 InfoQ 作者【胖虎不秃头】的原创文章。
原文链接:【http://xie.infoq.cn/article/17da5ae3f26c39c2936d0bbc8】。文章转载请联系作者。
评论