Servlet - 1part

1. Servlet 简介

   Servlet(server applet)是运行在服务器端的小程序,其实就是一个接口,定义了 Java 类被浏览器访问到(Tomcat 识别)的规则,我们可以自己定义一个类,来实现 Servlet 接口,复写方法。

   作用:实现在网上实现 聊天、发帖、这样一些的交互功能

   注:须补充 HTTP知识点

2. JAVAWEB 目录结构

在这里插入图片描述
以上图说明:

  • bbs目录代表一个web应用
  • bbs目录下的html,jsp文件可以直接被浏览器访问
  • WEB-INF目录下的资源是不能直接被浏览器访问的
  • web.xml文件是web程序的主要配置文件
  • 所有的classes文件都放在classes目录下
  • jar文件放在lib目录下

3. Servlet 实例

3.1 创建JavaEE WEB项目

具体参考本链接的 6 IDEA部署Tomcat项目

3.2 定义类myServlet

实现 Servlet 接口,实现接口中的抽象方法。

有5个方法需要重写,有init【初始化】,destroy【销毁】,service【服务】,ServletConfig【Servlet配置】,getServletInfo【Servlet信息】。

import javax.servlet.*;
import java.io.IOException;

public class myServlet implements Servlet {
    /**
     * 初始化方法
     * 在Servlet被创建是执行,只会执行一次
     */
     @Override
    public void init(ServletConfig servletConfig) throws ServletException {
         System.out.println("初始化");
    }

    /**
     * 获取ServletConfig配置对象
     * @return
     */
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    /**
     * 提供服务的方法
     * 每次Servlet被访问的时候执行,可执行多次
     * @return
     */
     @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
         servletResponse.getWriter().write("helloworld");
         System.out.println("我被访问了!");
    }

    /**
     * 获取Servlet信息,如作者、版本等
     * @return
    */
    @Override
    public String getServletInfo() {
        return null;
    }

    /**
     * 销毁方法
     * 在服务器正常关闭的时候执行,执行一次
     */
    @Override
    public void destroy() {
        System.out.println("销毁");
    }
}

3.3 配置 Servlet

在 web.xml 文件里面进行配置,在根标签里面加入如下配置。

当浏览器输入http://http://localhost:8080/myServlet 执行:

  1. 解析请求的URL路径, 查找映射路径
    <url-pattern>/myServlet</url-pattern>
  2. 通过映射路径的名字找到配置Servlet的名字
    <servlet-name>myServlet</servlet-name>
  3. 通过Servlet的名字找到class文件的存放位置
    <servlet-class>myServlet</servlet-class>
  4. 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>
        <!-- 为myServlet去一个名字(一般和类名一致)-->
        <servlet-name>myServlet</servlet-name>
        <!-- 类的存放位置,要填写完整路径(包名) -->
        <servlet-class>myServlet</servlet-class>
    </servlet>
    <!-- 配置映射路径 -->
    <servlet-mapping>
        <servlet-name>myServlet</servlet-name>
        <!-- 外界访问myServlet的路径 -->
        <url-pattern>/myServlet</url-pattern>
    </servlet-mapping>
</web-app>

3.4 运行结果

在这里插入图片描述


4. Servlet 生命周期

4.1 实践步骤

  1. 第一次访问Servlet,init()和service()都被调用了
    在这里插入图片描述
  2. 第二次、第三次访问Servlet,service()被调用了
    在这里插入图片描述
  3. 当关闭Tomcat服务器的时候,destroy()被调用了!
    在这里插入图片描述

4.2 生命周期

  1. 加载Servlet:当Tomcat第一次访问Servlet的时候,Tomcat会负责创建Servlet的实例。
  2. 初始化:当Servlet被实例化后,Tomcat会调用init()方法初始化这个对象,只执行一次
  3. 处理服务:当浏览器访问Servlet的时候,Servlet 会调用service()方法处理请求
  4. 销毁:当Tomcat关闭时或者检测到Servlet要从Tomcat删除的时候会自动调用destroy()方法,让该实例释放掉所占的资源。一个Servlet如果长时间不被使用的话,也会被Tomcat自动销毁。

总结:只要访问Servlet,service()就会被调用。init()只有第一次访问Servlet的时候才会被调用。destroy()只有在Tomcat关闭的时候才会被调用。


5. 继承HttpServlet类

  HttpServlet类已经实现了Servlet接口的所有方法,编写Servlet时,只需要继承HttpServlet,重写你需要的方法即可,并且它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。

  • 一般都是重写doGet()doPost()方法的。对于idea而言,创建Servlet的时候已经帮你重写好了。
  • 对于开发而言,一般只有getpost方式提交数据给服务器,这两个处理数据的方式是一样的,所以在doGet()方法里,可以调用doPost()方法进行处理。
public class demo extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("hello demo");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }
}
  • 执行效果如下
    -

6. Servlet 知识点

6.1 Servlet 映射的 URL 通配符的使用

  • *.拓展名
<servlet>
    <servlet-name>myServlet</servlet-name>
    <servlet-class>myServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>myServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

在这里插入图片描述

  • 斜杠(/)开头并以 /*结尾
<servlet>
    <servlet-name>demo</servlet-name>
    <servlet-class>demo</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>demo</servlet-name>
    <url-pattern>*.jsp</url-pattern>
</servlet-mapping>

在这里插入图片描述
如果.扩展名正斜杠(/)开头并以“/”结尾两种通配符同时出现,匹配优先级:

  1. 看谁的匹配度高,谁就被选择
  2. *.扩展名的优先级最低

6.2 Servlet 是单例的

  浏览器多次对Servlet的请求,一般情况下,服务器只创建一个Servlet对象,也就是说,Servlet对象一旦创建了,就会驻留在内存中,为后续的请求做服务,直到服务器关闭

6.3 每次访问请求对象和响应对象都是新的

  对于每次访问请求,Servlet 引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。
  request对象代表http请求,那么我们获取浏览器提交过来的数据,找request对象即可。
  response对象代表http响应,那么我们向浏览器输出数据,找response对象即可。

6.4 load-on-startup

  如果在元素中配置了一个元素,那么WEB应用程序在启动时,就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法。

  1. 在web.xml添加load
<servlet>
    <servlet-name>demo</servlet-name>
    <servlet-class>demo</servlet-class>
    
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>demo</servlet-name>
    <url-pattern>/demo</url-pattern>
</servlet-mapping>
  1. demo.java文件中创建init()初始化方法
@Override
public void init() throws ServletException {
    super.init();
    System.out.println("我被调用了!!");
}
  1. 在程序启动时,便会调用init()初始化方法
    在这里插入图片描述

6.5 在web访问任何资源都是在访问Servlet

当你启动Tomcat,你在网址上输入http://localhost:8080。为什么会出现Tomcat小猫的页面?
由缺省Servlet为你服务的!

  1. 在Tomcat安装目录下 的 conf > web.xml里面配置着缺省Servlet:
<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>listings</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
     <servlet-name>default</servlet-name>
     <url-pattern>/</url-pattern>
</servlet-mapping>
  1. 缺省Servlet : 凡是在web.xml文件中找不到匹配的元素的URL,它们的访问请求都将交给缺省Servlet处理。
  2. 访问静态资源【本地图片,本地HTML文件】也是在访问 缺省Servlet。
    例:在项目的web文件下添加1.jpg,输入网址http://localhost:8080/1.jpg,能访问该静态资源。
    在这里插入图片描述
    注:可自行配置缺省Servlet,覆盖掉web.xml配置的缺省Servlet。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值