Servlet
Servlet Servlet(Server Applet),即服务程序。Servlet是一种用Java技术构建的动态Web应用服务程序,运行在容器中(如Tomcat、Jetty服务器等),容器提供了执行Servlet的运行时环境和支持,负责接收HTTP请求,根据请求路径将其分配给对应的Servlet进行处理,并将响应发送回客户端。这样就实现了动态的页面内容。
以下从请求到响应来梳理整个Servlet执行流程和生命周期。
1.Servlet执行流程
1.1 客户端发送Http请求
客户端发送Http请求消息,如用户可以在浏览器地址栏输入URL,按下回车发送GET请求(从服务端获取资源),或者以提交表单的方式发送POST请求(服务端发送数据)。
1.2 加载和初始化
当Servlet容器收到请求,会根据请求的URL找到对应的Servlet对象(由容器创建),并调用servlet中的init()方法进行初始化操作,如数据连接创建、加载配置文件等。其实初始化操作可以在开启服务器时,在请求到来之前进行,这样可以降低响应的时间。
1.3 请求处理
初始化后容器可以调用对象中的service()方法进行http请求的处理了。每次请求Servlet时,容器都会调用Servlet中的service()方法对请求进行处理,在service()方法中再根据请求的类型(GET、POST、PUT等)调用doGet()、doPost()等方法接收请求对象,这些方法是就是我们用来处理具体的业务逻辑。我们可以从HttpServletRequest请求对象中获取请求的参数、Cookie、会话(Session)等信息,并在方法中通过HttpServletResponse对象生成响应内容传出给客户端。
1.4 服务终止,结束流程
当该连接下所有的请求和响应都处理之后,关闭容器时,Servlet容器就会调用servlet对象中的destroy()方法进行清理操作(destroy()也可以显式调用),释放资源,如关闭数据库连接、删除文件并销毁Servlet实例等,实例随后被垃圾收集器回收。
需要注意的一点是,Servlet容器会在第一次请求时加载Servlet对象,并在以后的请求中复用已加载的Servlet对象,以提高性能和效率。其次是每个请求都由一个独立的线程来处理,多个请求可能是同一个对象来处理,所以Servlet开发必须注意线程安全的。
2.Servlet生命周期
根据执行流程就可以知道Servlet的生命周期,包括由容器加载和实例化,初始化配置信息,处理客户端的请求,销毁。所有可以知道每个Servlet实例通常只有一个init()方法调用,一个destroy()方法调用,但service()方法可能会被多次调用处理不同的请求(service()再根据请求的类型内部调用GET、POST或者PUT等请求)。
3.编写一个Servlet
讲完大概的流程后,如何写一个Servlet,可以发送请求得到想要的响应呢?
要编写一个Servlet,可以按照以下步骤进行:
3.1 项目创建和基础的修改和配置
这里我用IDEA创建Maven项目的方式构建web应用程序。
这里设置项目的名称以及项目坐标的GAV(保证项目唯一性),测试用坐标不配也行。
这里我已经在本地下载了maven并创建了本地仓库,用IDEA上自带的也行。
在main目录下创建以下两个资源目录
将pom.xml文件删改为以下模板
修改WEB-IN文件下的web.xml配置为最新版
3.2 导入依赖
在maven仓库中搜索Servlet依赖,选择使用最多的版本,复制对应的坐标到pom.xml文件中的依赖
然后点击右上角的刷新,将依赖导入到maven中
3.3 编写Servlet
在Java源文件下编写一个普通类,实现Servlet接口,这里我们直接继承HttpServlet。因为Sun公司有两个默认的实现类HttpServlet,GenericServletSerlvet实现了Servlet接口。实现和继承关系为Servlet
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//一般在Servlet中,习惯性的会首先设置请求以及响应的内容类型以及编码方式:
resp.setContentType("text/html;");
req.setCharacterEncoding("UTF-8");
//用打印流简单的响应一个信息
PrintWriter writer = resp.getWriter();
writer.println("Hello Servlet!");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
3.4 在web.xml中添加Servlet配置信息
当启动一个WEB项目时,容器首先会读取项目web.xml配置文件里的配置,包括servlet,mapping,pattern,过滤器等,其实就是配置后台Servlet信息,以及一些参数初始化配置,便于服务器读取配置参数对应的信息数据,当这一步骤没有出错并且完成之后,项目才能正常地被启动起来。因为只有一个Servlet,所有以下简单注册写好的Servlet类,以及对应请求路径。
helloServlet
HelloServlet
helloServlet
/hello
3.5 配置Tomcat部署项目
在IDEA中配置Tomcat服务器,这里我已经在本地下好了Tomcat,因为Tomcat是Java写的,运行Tomcat需要Java环境,注意配置好Java环境变量,否则Tomcat启动失败。
点击Configure配置好Tomcat路径
然后点击部署项目,我们选择已经创建好的ServletDemo项目的wa包r。
注意更改项目发布的上下文路径,tomcat服务器在接收到请求后就会从http:localhost:8080/s1/对应的docBase路径去调用资源或者调用某个class用来处理请求。不改也行,访问的时候url不要忘了加上就行。本项目Servlet访问路径为http:localhost:8080/s1/hello。
3.6 项目启动
然后就可以启动测试了!如下成功响应我们想要的内容。