目录
1 Servlet简介
Servlet(Server Applet)是Java Servlet的简称,称为服务器端小程序。
Servlet是用Java编写的服务器端程序,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
(1)狭义的Servlet是指Java语言实现的一个接口
(2)广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。
Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
2 Servlet快速入门
快速入门环节十分简单,虽然可能不理解为什么这么做,但相信说到“执行流程”部分的时候就清晰多了。总体快速入门步骤如下(前提是这个web工程绑定了Tomcat):
(1)创建类,实现Servlet接口的实现类,重写里面的5个抽象方法(实际上只重写了1个)。
(2)编写核心配置文件(告诉tomcat你实现的类是哪个)
(3)访问url
step1: 创建一个Java Enterprise项目,并选中“Web Application”,创建包和类, 实现Servlet的接口,如下图所示:
/**
* servlet
* server applet 运行在服务器端的程序(必须在服务器Tomcat中运行)、
* 等待客户端连接,访问
* servlet技术,即客户端交互技术,用于处理来自客户端的请求和相应
* Sun公司,JavaEE平台上13个规范之一
* 定义了一个接口:javax.servlet.Servlet
*
* Servlet快速入门
* 1、创建类,实现Servlet接口的实现类
* 2、重写里面的5个抽象方法
* 3、编写核心配置文件(告诉tomcat你实现的类是哪个)
*
*/
public class QuickStart implements Servlet{
//接口中一共5个方法,先关注service方法,其他方法随后再说
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Servlet快速入门");
servletResponse.getWriter().write("hello");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
step2: 在web.xml中配置刚才写好的Servlet实现类
之所以要配置这个类,是因为要告诉Tomcat我们实现的Servlet接口到底是哪一个,后面Tomcat会拿这个实现类去做很多事情。
<?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_3_1.xsd"
version="3.1">
<!--配置我们自己的Servlet实现类信息-->
<servlet>
<!--定义Servlet的名字-->
<servlet-name>quickStart</servlet-name>
<!--实现类的全类名-->
<servlet-class>com.lmy.servlet.QuickStart</servlet-class>
</servlet>
<servlet-mapping>
<!--这个名字和上面的名字要一致-->
<servlet-name>quickStart</servlet-name>
<!--浏览器的访问路径-->
<url-pattern>/quick</url-pattern>
</servlet-mapping>
</web-app>
step3: 访问servlet
访问浏览器:http://localhost:8080/web01/quick
最终再浏览器中打印出“hello”,这是由于重写了Servlet接口中的service方法的原因。
但是,为什么在浏览器中会打印出“hello”呢,Tomcat、Servlet到底做了什么?整个过程的执行流程是怎样的呢?请往下看~
3 Servlet执行过程
(1)接受并解析客户端浏览器的请求 "/web01/quick"
(2)拿到web.xml中Servlet实现类的全类名
(3)反射技术创建Servlet类的对象
(4)创建2个对象 Request、Response
(5)调用对象中的方法 service, 传递参数 Request, Response
(6)数据写在了Reponse对象的缓冲区中
(7)service方法结束后,数据从Response对象的缓冲区取出,组装成HTTP的响应信息, 回传给浏览器
(8)浏览器显示
4 Servlet对象的生命周期
(1)对象创建
默认:在客户端第一次访问的时候,对象会被创建(配置web.xml后,可以让tomcat一启动就马上创建Servlet对象而不是等到有了访问才创建,但是这个功能一般不用)
Servlet中有方法init() 对象创建时会调用该方法
(2)客户端访问
客户端每次请求Servlet,都会执行方法service()
只要有一个请求,就会执行一次
(3)对象销毁
tomcat服务器关闭时销毁对象,调用方法destory()
另外一个方法也可以销毁对象,且不需要关闭Tomcat服务器,那就是把web项目从Webapp中移除(点Deployment中的“Undeploy”那个朝左的红绿色箭头)
/**
* Servlet 对象的生命周期
* 1、对象创建
* 默认:在客户端第一次访问的时候,对象会被创建(配置web.xml后,可以让tomcat一启动就马上创建Servlet对象而不是等到有了访问才创建,但是这个功能一般不用)
* Servlet中有方法init() 对象创建时会调用该方法
* 2、客户端访问
* 客户端每次请求Servlet,都会执行方法service
* 只要有一个请求,就会执行一次
* 3、对象销毁
* tomcat服务器关闭时销毁对象,调用方法destory()
* 另外一个方法也可以销毁对象,且不需要关闭Tomcat服务器,那就是把web项目从Webapp中移除(点Deployment中的“Undeploy”那个朝左的红绿色箭头)
*/
public class LifeServlet implements Servlet {
//创建Servlet对象时会调用该方法
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("Tomcat调用init方法,Servlet对象被创建");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
//浏览器请求时会调用该方法
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("客户端发请求了");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("关闭tomcat服务器时,Servlet对象被销毁");
}
}
如下:通过在web.xml 配置文件中新增一个标签: <load-on-startup>这是个常数,数字越小优先级越高</load-on-startup>
就可以控制Servlet对象的创建在启动Tomcat程序时就完成(而不是第一次客户端请求发来之后才创建Servlet对象)
<servlet>
<servlet-name>life</servlet-name>
<servlet-class>com.lmy.servlet.LifeServlet</servlet-class>
<!--标签:Tomcat一启动就马上创建Servlet对象,而不是等到有客户端发请求时才调用,(标签中写任意整数,整数越小,启动的优先级就越高)但是这个功能一般不用-->
<!--<load-on-startup>1</load-on-startup>-->
</servlet>
<servlet-mapping>
<servlet-name>life</servlet-name>
<url-pattern>/life</url-pattern>
</servlet-mapping>
5 Servlet的访问路径配置
关于Servlet的访问路径(url)问题,之前只是简单的在代码中一笔带过,然而实际上关于访问路径还有一些可以了解的小知识。
<url-pattern></url-pattern>这个标签用于配置浏览器的访问路径,具体规则如下代码:
<servlet>
<servlet-name>config</servlet-name>
<servlet-class>com.lmy.servlet.ConfigServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>config</servlet-name>
<!--
<url-pattern></url-pattern>配置浏览器的访问路径(虚拟路径)
1、完全匹配方式,绝对匹配 “/路径”这是Servlet的最常用配置
2、目录匹配 /aaa/bbb/* 只要前面aaa、bbb对上了,最后这个*写啥都行,但是这个方法不常用
3、后缀名匹配 *.qqq 浏览器输入前面随意,最后必须是“.qqq”,这个也不常用
注意:目录匹配和后缀名匹配不能同时使用
其实在这里,对于servlet的配置,只要看“完全匹配”就可以了。
-->
<url-pattern>/config</url-pattern>
</servlet-mapping>
6 IDEA工具帮忙创建Servlet时的注意事项
前面介绍了浏览器与服务器的请求与响应过程中,Servlet充当的角色,以及Servlet的生命周期问题,然而这些与Servlet相关的程序代码都是我们自己通过实现Servlet接口来自己写的。
比如我想在浏览器上打印一句话“hello”
我需要先写一个类来实现Servlet接口(在service方法中写:servletResponse.getWriter().write("hello"); ),然后在web.xml文件中进行相关的配置来保证程序能找到之前写的那个实现类。
这样才能完成了上面的目的。然而这些操作,IDEA也可以帮我们来完成一部分。
总而言之,上述内容无非两点:
(1)Servlet接口的实现
(2)接口实现类在配置文件中要有体现
通过IDEA可以完成上述操作:
上述的操作完成后,会自动地创建一个Servlet实现类 以及该实现类在配置文件中的信息。
注意如下:
(1)IDEA对于配置文件的创建,只会创建“一半”,另外一个mapping需要自己写,而且IDEA自动创建的配置文件的位置不太友好,需要自己调整
(2)关于实现类的创建,如下图;关于实现类模板的修改方式,如下图的下图。
(3)最后,我感觉这个功能虽说挺有些用,但是目前我还是觉得有点鸡肋。。。
/**
* IDEA工具帮忙创建的Servlet
* 包含两个方法,一个是doPost(处理Post请求)、另一个是doGet(处理Get请求)
*
* Servlet接口,是Sun公司标准
* 标准操作:web.xml文件中配置过后,Tomcat引擎调用该接口实现类方法service,接着去处理请求信息(展示页面什么的)
*
* 结论:当客户端请求服务器时,Tomcat引擎会创建MyHttpServlet对象,调用方法service(),而service方法是它的父类HttpServlet实现的,
* 然而在实现过程中,这个父类中的service方法又调用到了子类中的方法(doGet、doPost)
*
* 无论什么请求方式,都用一个方法来处理
*/
public class MyHttpServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//调用doGet()
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("GET");
}
}