Servlet基础解析
创建第一个sevlet案例(通过黑窗口)
创建servlet(浏览器页面输入内容)
package com.hhxx.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloWorld extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01Transitional//EN\">"); out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>");
out.println("<font color=red>Hello World111</font>"); out.println(" </BODY>");
out.println("</HTML>"); out.flush();
out.close();
}
}
- 由于javax包是Tomcat提供的,因此需要使用命令进行导入,否则无法编译,会报错,servlet包位于tomcat的lib目录中
C:\java>javac -classpath "C:\java\Tomcat\apache-tomcat-9.0.34\lib\servlet-api.jar" HelloWorld.java
web.xml创建
- 什么是web.xml是项目部署描述文件,tomcat启动时会先解析该配置文件获得项目配置信息,因此必须有web.xml文件,来配置servle等技术
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>com.hhxx.servlet.HelloWorld</servlet-class> </servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
servlet-name:标签名(别名随意取)
servlet-class:全名(包名+类名)
servlet-mapping标签:用于url和servlet的映射(绑定)
需要注意的是url-pattern标签中url随便写,但一定要加/
servlet部署与访问
- servlet就相当于一个应用程序,而tomcat的webapps用于存放应用,但不是将文件直接拖入需要建立一个web工程进行部署(对应的文件包)
- helloworld即编译好的.class文件
- 完成上述文件夹的相应创建,就可以启动tomcat,启动完成,浏览器输入我们的URL:http://localhost:8080/servletdemo/hello
localhost:8080:这是访问tomcat地址
servletdemo:项目名
hello:这个项目下的hello
访问结果:
继承结构
sevlet生命周期
servlet生命周期是由容器管理的(tomcat),分别经历3个阶段
- inin():初始化
- service():服务
- destroy():销毁
当客户端浏览器第一次请求 Servlet 时,容器会实例化这个 Servlet,然后调用一次 init 方法(是在GenericServlet实现的),并在新的线程中执行 service 方法处理请求。service 方法执行完毕后容器不会销毁这 个 Servlet 而是做缓存处理,当客户端浏览器再次请求这个 Servlet 时,容器会从缓存中直接 找到这个 Servlet 对象,并再一次在新的线程中执行 Service 方法。当容器在销毁 Servlet 之 前对调用一次 destroy 方法(destory()方法)不是来销毁Servlet的,而是完成资源释放功能的。
sevlet处理请求的原理
当浏览器基于 get 方式请求我们创建 Servlet 时,我们自定义的 Servlet 中的 doGet 方法 会被执行。doGet 方法能够被执行并处理 get 请求的原因是,容器在启动时会解析 web 工程 中 WEB-INF 目录中的 web.xml 文件,在该文件中我们配置了 Servlet 与 URI 的绑定,容器通 过对请求的解析可以获取请求资源的 URI,然后找到与该 URI 绑定的 Servlet 并做实例化处理 (注意:只实例化一次,如果在缓存中能够找到这个 Servlet 就不会再做次实例化处理)。在实 例化时会使用 Servlet 接口类型作为引用类型的定义,并调用一次 init 方法,由于 HttpServlet 中重写了该方法所以最终执行的是 HttpServlet 中 init 方法(HttpServlet 中的 Init 方法是一个空 的方法体),然后在新的线程中调用 service 方法。由于在 HttpServlet 中重写了 Service 方法 所以最终执行的是 HttpServlet 中的 service 方法。在 service 方法中通过 request.getMethod() 获取到请求方式进行判断如果是 Get 方式请求就执行 doGet 方法,如果是 POST 请求就执行 doPost 方法。如果是基于 GET 方式提交的,并且在我们自定义的 Servlet 中又重写了 HttpServlet 中的 doGet 方法,那么最终会根据 Java 的多态特性转而执行我们自定义的 Servlet 中的 doGet 方法。
sevlet的作用
- 获取用户提交数据
- 获取浏览器附加信息
- 处理数据(访问数据库或调用接口)
- 给浏览器产生一个响应
- 在响应中添加附加信息