- 一、Servlet
- 1.1 Servlet简介
- 1.1.1 Servlet是什么?
- 1.1.2 Servlet 工作
- 1.1.3 Servlet 任务
- 1.2 快速入门
- 1.2.1 创建项目
- 1.2.2 pom.xml
- 1.2.3 web.xml
- 1.2.4 编写java类
- 1.2.5 填写web.xml映射
- 1.2.6 配置Tomcat
- 1.3 Servlet原理
- 1.3.1 工作流程
- 1.3.2 处理请求流程
- 1.3.3 工作原理
- 1.3.4 生命周期
- 1.4 Mapping问题
- 1.4.1 映射路径
- 1.4.2 优先级问题
学习视频来自于:秦疆(遇见狂神说)Bilibili地址
他的自学网站:kuangstudy
我们缺乏的不是知识,而是学而不厌的态度
一、Servlet 1.1 Servlet简介 1.1.1 Servlet是什么?
- Servlet就是sun公司开发动态web的一门技术。
- Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
- Sun在这些APi中提供一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤
- 编写一个类,实现Serlet接口。
- 把开发好java类部署到web服务器中。
- 把实现了Servlet接口的Java程序叫做,Servlet。
- 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
- 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
- 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
- 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
- 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。
- IDEA新建项目。
- 选Maven Archetype 。
- Archetype选:org.apache.maven.archetypes:maven-archetype-webapp。
- 高级设置:组ID(com.公司名)、工件ID(项目名)、版本。
- 创建。
将JDK改为项目运行的版本,这里是jdk1.8。
UTF-8 1.8 1.8
需要Servlet包,索性jsp包也导入,使用maven导入。
1.2.3 web.xmljavax.servlet.jsp javax.servlet.jsp-api 2.3.1 provided javax.servlet javax.servlet-api 3.1.0 provided
- WEB-INF文件夹内。
- 表头直接到Tomcat文件夹-webapps找一个自带的文档项目复制web.xml的表头。
1.2.4 编写java类
- 在src–>main–>java右键创建软件包com.tianyu.servlet–>创建HelloServlet.java类。
- HelloServlet 继承 HttpServlet 重写 doGet(HttpServletRequest req, HttpServletResponse resp)和 doPost(HttpServletRequest req, HttpServletResponse resp)方法。
// get和post只是请求实现的不同的方式,可以相互调用,业务逻辑都一样。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().println("hello servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
1.2.5 填写web.xml映射
为什么要写:我们写的是java程序,但是通过浏览器访问,而浏览器需要连接web服务器,所以我们要web服务中注册我们写的Servlet,还需要给它一个浏览器能够访问的路径。
1.2.6 配置Tomcathello com.tianyu.servlet.HelloServlet hello /hello
- IDEA左上角–> 编辑配置 -->点+(添加新配置Tomcat)。
- 设置名称、选择应用服务器、配置打开浏览器、URL。
- 配置jre地址。
- 部署–>点击+(把要运行的项目放入)。
- 浏览器访问:http://localhost:8080/项目名/程序名。
JAVAschool:http://www.51gjie.com/javaweb/848.html
1.3.1 工作流程Servlet是由Web服务器调用,web服务器在收到浏览器请求之后,会:
- Web Client 向Servlet容器(Tomcat)发出Http请求。
- Servlet容器接收Web Client的请求。
- Servlet容器创建一个HttpRequest对象,将Web Client请求的信息封装到这个对象中。
- Servlet容器创建一个HttpResponse对象。
- Servlet容器调用HttpServlet对象的service方法,把HttpRequest对象与HttpResponse对象作为参数传给 HttpServlet 对象。
- HttpServlet调用HttpRequest对象的有关方法,获取Http请求信息。
- HttpServlet调用HttpResponse对象的有关方法,生成响应数据。
- Servlet容器把HttpServlet的响应结果传给Web Client。
- 用户点击一个链接,指向了一个servlet而不是一个静态页面。
- 容器“看出”这个请求是一个Servlet,所以它创建了两个对象HttpServletRequest和HttpServletResponse。
- 容器根据请求中的URL找到正确的Servlet,为这个请求创建或分配一个线程,并把请求和响应对象传递给这个Servlet线程。
- doGet()方法生成动态页面,并把这个页面“塞到”响应对象里,需要注意的是,容器还有响应对象的一个引用!
- 线程结束,容器把响应对象转换为一个HTTP响应,并把它发回给客户,然后删除请求和响应对象。
- 首先简单解释一下Servlet接收和响应客户请求的过程,首先客户发送一个请求,Servlet是调用service()方法对请求进行响应的,通过源代码可见,service()方法中对请求的方式进行了匹配,选择调用doGet,doPost等这些方法,然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应。在Servlet接口和GenericServlet中是没有doGet()、doPost()等等这些方法的,HttpServlet中定义了这些方法,但是都是返回error信息,所以,我们每次定义一个Servlet的时候,都必须实现doGet或doPost等这些方法。
- 每一个自定义的Servlet都必须实现Servlet的接口,Servlet接口中定义了五个方法,其中比较重要的三个方法涉及到Servlet的生命周期,分别是上文提到的init(),service(),**destroy()**方法。GenericServlet是一个通用的,不特定于任何协议的Servlet,它实现了Servlet接口。而HttpServlet继承于GenericServlet,因此HttpServlet也实现了Servlet接口。所以我们定义Servlet的时候只需要继承HttpServlet即可。
- Servlet接口和GenericServlet是不特定于任何协议的,而HttpServlet是特定于HTTP协议的类,所以HttpServlet中实现了service()方法,并将请求ServletRequest、ServletResponse 强转为HttpRequest 和 HttpResponse。
1. 加载和实例化
如果Servlet容器还没实例化一个Servlet对象,此时容器装载和实例化一个 Servlet。创建出该 Servlet 类的一个实例。如果已经存在一个Servlet对象,此时不再创建新实例。
2. 初始化
在产生 Servlet 实例后,容器负责调用该 Servlet 实例的 init() 方法,在处理用户请求之前,来做一些额外的初始化工作。
3. 处理请求
当 Servlet 容器接收到一个 Servlet 请求时,便运行与之对应的 Servlet 实例的 service() 方法,service() 方法根据用户的请求调用相对应的doGet或doPost 方法来处理用户请求。然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应。
4. 销毁
当 Servlet 容器决定将一个 Servlet 从服务器中移除时 ( 如 Servlet 文件被更新 ),便调用该 Servlet 实例的 destroy() 方法,在销毁该 Servlet 实例之前,来做一些其他的工作。
注意:(1)(2)(4) 在Servlet的整个生命周期中只会被执行一次,(3)可以被浏览器反复请求。
- 一个Servlet可以指定一个映射路径
hello /hello
- 一个Servlet可以指定多个映射路径
hello /hello1 hello /hello2 hello /hello3 hello /hello4
- 一个Servlet可以指定通用映射路径
hello /hello/*
- 默认请求路径
hello /*
- 指定一些后缀或者前缀等等…
1.4.2 优先级问题hello *.tianyu
指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求。
error com.tianyu.servlet.ErrorServlet error /*



