JavaWeb学习笔记(一):初识 Servlet

好记性不如烂笔头,记录学习的过程和内容,望与君共勉!

概述:

Servlet:server applet,运行在服务器的小程序。Servlet 是一个接口,定义了 Java 类被浏览器访问(Tomcat识别)到的的规则。我们需要自定义一个类,实现 Servlet 接口,重写方法。

代码实现:

1、创建 JavaEE 项目
2、定义一个类,实现 Servlet 接口

public class ServletDemo1 implements Servlet

3、实现接口中的抽象方法
4、配置 Servlet
在 web.xml 中配置:

<servlet>
	<servlet-name>demo1servlet-name>
	<servlet-class>org.it.web.servlet.ServletDemo1servlet-class>
servlet>
<servlet-mapping>
	<servlet-name>demo1servlet-name>
	<url-pattern>/demo1url-pattern>
servlet-mapping>

Java 代码:

public class ServletDemo1 implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("hello servlet!");
    }
    @Override
    public String getServletInfo() {
        return null;
    }
    @Override
    public void destroy() {

    }
}

通过上面配置好的路径访问时,每次刷新一次页面都会在控制台输出一句 service() 方法中的代码。

执行原理

JavaWeb学习笔记(一):初识 Servlet_第1张图片

1、当 web 服务器接收到客户端浏览器的请求后,会解析请求 URL 路径,获取访问的 Servlet 的资源路径
2、查找 web.xml 文件,是否有对应的 url-pattern 标签体内容
3、如果有,则会找到对应的 servlet-class 全类名
4、tomcat 会将字节码文件加载进内存,并且创建其对象
5、调用其中的方法

Servlet 生命周期

1、被创建:执行 init 方法,只执行一次

Servlet 什么时候被创建?
默认情况下,第一次访问时,Servlet 被创建,也可以通过 Servlet 标签下的配置配置来改变 Servlet 的创建时机:
第一次访问时创建:load-on-startup标签 为负值
服务器启动时创建:load-on-startup标签 为0或正整数

2、提供服务:执行 service 方法,执行多次
3、被销毁:执行 destroy 方法,只执行一次

只有服务器正常关闭时,destroy 方法才能被执行,在 Servlet 被销毁之前执行。

注解配置

在 Servlet 3.0 之后的版本,支持注解的配置,也就是可以不再需要 web.xml 了。
操作步骤:
1、创建 JavaEE 项目

Versions 3.0 以上,可以不勾选创建 web.xml 。

JavaWeb学习笔记(一):初识 Servlet_第2张图片

2、定义一个类,实现 Servlet 接口
3、实现接口中的抽象方法
4、在类上使用 @WebServlet 注解,配置 Servlet
在创建好的类前面添加注解:

@WebServlet(urlPatterns = "/ServletDemo2")

由于注解里有一个属性 value,表示最重要的属性,而 value 又可以省略不写,故注解可以简写为:

// @WebServlet("资源路径")
@WebServlet("/ServletDemo2")

体系结构

Servlet(接口):有两个实现类,GenericServlet(儿子) 和 HttpServlet(孙子)。
1、GenericServlet(抽象类):将 Servlet 接口中其他的方法做了默认空实现,只将 service() 方法作为抽象,那么我们再次定义 Servlet 时,可以继承 GenericServlet,重写 service() 方法即可。

@WebServlet("/ServletDemo3")
public class ServletDemo3 extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
		
    }
}

2、HttpServlet(抽象类):
该类是对 HTTP 协议的一种封装,可以简化操作。
步骤:
①继承 HttpServlet 类
②重写 doGet / doPost 方法

@WebServlet("/ServletDemo4")
public class ServletDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost");
    }
}

通过浏览器直接访问是 get 方式,每次访问都可以看到在控制台打印 doGet。
我们可以通过表单的方式,指定其提交方式为 post,每次提交都可以看到在控制台打印出 doPost。

<body>
    <form action="ServletDemo4" method="post">
        <input type="text">
        <button type="submit">提交button>
    form>
body>

urlPatterns 配置

urlPatterns:指定 Servlet 资源的访问路径
1、urlPatterns 是一个数组,一个 Servlet 可以定义多个访问路径:

@WebServlet({"/ServletDemo4", "/demo4", "/d4"})

将注解改为以上代码,通过浏览器访问时,ServletDemo4、demo4、d4 均可访问到同一个资源。
2、路径定义规则:
① /xxx
② /xxx/xxx:多层路径,目录结构

@WebServlet("/ServletDemo4/demo4")

通过浏览器访问时要通过这两层路径才能访问到。
③ * . 后缀名:拓展名匹配

@WebServlet("*.do")

这里定义了后缀名为 do(可以随便定义),* 是通配符,那么通过浏览器访问时要通过 任意名字.do 才能访问到。

我是快斗,请多多指教!

你可能感兴趣的:(Java,java,servlet)