servlet详解

时间:2022-02-19作者:klpeng分类:Java技术浏览:325评论:0

servlet

serv let:server服务器 applet应用(小程序)
servlet表示服务器中的小程序。
普通的Java类和servlet的区别在哪儿:

  • 一个普通的Java类是不可以被访问的 只有servlet程序才可被访问。
  • servlet程序必须实现一个接口(Servlet)
  • Java类任何时候都可执行,servlet必须放在tomcat容器才可执行。

servlet2.5版本

  • 创建JavaEE的应用(JavaSE没有前台页面)JavaEE(WEB程序 含有前端页面)
  • 创建servlet并访问servlet
  • 创建类
  • 实现接口(servlet接口)
  • 编写其中的方法 service方法表示入口方法(访问时机:所有入口的执行时机都在页面上 什么时候访问即什么时候执行)
  • 在web.xml中编写访问service的路径。
    Java代码
/**
 * 如何让一个普通的java类变成一个servlet
 * 接口是规范
 * JAVAEE其中两套规范 : jsp  servlet
 * 规范必须有实现类: tomcat对jsp和servlet的实现
 *
 * 编写servlet的步骤
 * 1.创建java类
 * 2.必须实现一个接口 Servlet
 * 3.实现接口中的方法
 * 4.必须为每一个servlet至少提供一个访问入口 设置url-pattern
 * 在web.xml进行配置
 * <url-pattern>/hello</url-pattern> 提供访问入口
 *
 */
public class DemoServlet implements Servlet {


    /**
     * service 服务方法:等效以前的main函数   service是当前servlet被默认执行的方法
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("2.5 servlet 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() {

    }
}

web.xml配置

<!--
        只要项目启动(tomcat启动 tomcat将程序发布出去了)  tomcat默认读取我们项目中web.xml
        servlet必须对外提供访问路径
        <servlet> tomcat 明确 有一个特殊的程序(servlet)需要对外发布
            <servlet-class>类的全限定类名  包名.类名 <rvlet-class>

        <servlet-name></servlet-name> 维护两段配置的关系 随便写 只要唯一即可   input id="唯一"

        <servlet-mapping>  servlet的映射路径配置   mapping 映射
            <url-pattern>rvlet的访问路径</url-pattern>
    -->
    <servlet>
        <servlet-name>XXX</servlet-name>
        <servlet-class>com.llz.servlet.DemoServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>XXX</servlet-name>
        <url-pattern>/a</url-pattern>
        <url-pattern>/b</url-pattern>
        <url-pattern>/c</url-pattern>
    </servlet-mapping>

执行原理:
当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
查找web.xml文件,是否有对应的标签体内容。
如果有,则在找到对应的全类名
tomcat会将字节码文件加载进内存,并且创建其对象调用其方法

servlet3.0以后的版本

3.0版本支持2.5的开发
支持注解开发(注解:@单词)
注解是为了替换xml的
xml:配置清晰,配置麻烦
注解:配置简单,操作简便
(note:注解不能完全取代xml)

AnnoServlet开发

@WebServlet 用于将一个类声明为 Servlet,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为 Servlet。该注解具有下表给出的一些常用属性(以下所有属性均为可选属性,但是 vlaue 或者 urlPatterns 通常是必需的,且二者不能共存,如果同时指定,通常是忽略 value 的取值)

@WebServlet 主要属性列表
servlet详解

/**
 * Anno注解的缩写
 *  找到某个类 并且为这个类提供访问的入口
 *  注解可以写的位置 : 类上 方法上 构造上 属性上
 *  @WebServlet(urlPatterns  ="表示访问路径 可以设置多个"  )
 */
//java.lang.String[] urlPatterns() default {};
@WebServlet(urlPatterns = {"/aaa" , "b"} )
public class AnnoDemoServlet implements Servlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("AnnoDemoServlet 被执行了");
    }


    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }



    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

Servlet生命周期

从出生到死亡的过程
类初始化 类销毁了
servlet规范中定义类servlet的生命周期的方法
servlet详解
第一次执行servlet的时候 执行了两个方法 init service
第一次以后都只有service在执行
停止运行tomcat的时候 destroy 执行
init: 初始化方法 , 默认情况下 类第一次被调用的时候 执行初始化方法
service: 执行方法 , 以后每次执行当前servlet 都会执行service方法
destroy: 销毁方法 , 当服务器停止时 执行销毁方法
在整个执行的过程中servlet有且只有一个 , servlet只会被初始化一次 (这样的类 我们称之为单例对象: 这个类只被初始化一次 )

Servlet执行过程

1.浏览器请求服务器
servlet详解
浏览器向服务器请求时,服务器不会直接执行我们的类,而是到web.xml里寻找路径名
第一步,浏览器输入访问路径后,携带了请求行,头,体
第二步,根据访问路径找到已注册的servlet名称,既图中的demo
第三步,根据映射找到对应的servlet名
第四步,根据根据servlet名找到我们全限定类名,既我们自己写的类
2.服务器创建对象
servlet详解
3.调用init方法
4.调用server方法
5.响应浏览器
如果创建类 实现接口的时候没有servlet接口解决方案
servlet详解
servlet详解

Servlet体系结构

idea快捷键 选中类名ctrl+h 查看结果
servlet详解
实现servlet方案
1.实现servlet接口
2.继承GenericServlet
servlet详解
3.继承HttpServlet
注意:我们编写类继承HttpServlet以后,只需要重写doget或者dopost方法。
405异常 表示服务器的方法没有找到 -> 没有复写doget或者dopost
因为本身生命周期是service 但是由于父类处理之后 最终其实可以认为 doget和dopost变成了生命周期
servlet详解

public abstract class GenericServlet implements Servlet
public abstract class HttpServlet extends GenericServlet
public interface Servlet

关心的生命周期三个方法
ctrl+f12可以查看类下的方法 构造 字段
servlet详解
idea设置分割线
servlet详解

servlet细节配置

允许一个servlet配置多个路径

<servlet-mapping>
    <servlet-name>Demo4Servlet</servlet-name>
    <url-pattern>/demo4</url-pattern>
    <url-pattern>/demo5</url-pattern>
    <url-pattern>/demo6</url-pattern>
    <url-pattern>/demo7</url-pattern>
</servlet-mapping>

url-pattern的书写方式 四种书写方式
​ 1.绝对匹配(完全匹配): /xxx /a/b/c/xxx 必须一模一样 常用第一种
​ 2.不完全匹配(目录匹配): 表示通配符 书写如下:
​ /a/b/c/
只需要满足前缀就可以访问
​ 3.后缀名匹配: *表示通配符 书写如下
​ *.abc *.aaa 只需要满足后缀即可访问 注意 前面没有/
​ 4.缺省匹配: 以上三种都没有执行的情况下 执行缺省匹配 /
​ DefaultServlet 中间抛出了404 表示页面没有找到

tomcat自己在用
servlet详解

load-on-starup

默认的情况:servlet初始化的时机: 第一次访问servlet的时候执行
什么时候访问servlet什么时候初始化servlet对象
需要tomcat启动就初始化servlet对象
servlet对象是由tomcat创建的 , 只需要通知tomcat , 启动的时候 直接将servlet初始化
我们能够跟tomcat交互的地方就只有一个 web.xml

<servlet>
    <servlet-name>Demo4Servlet</servlet-name>
    <servlet-class>com.itllz.structural.Demo4Servlet</servlet-class>
    <!--
        load 加载 startup 启动 on 在xxx时候
        取值: 数字   , 数字的取值 跟加载servlet顺序有关
         <load-on-startup>5</load-on-startup>
         <load-on-startup>3</load-on-startup>
         <load-on-startup>1</load-on-startup>
         多个servlet同时配置<load-on-startup>1</load-on-startup>
         数字越小 加载的优先级越高
    -->
    <load-on-startup>5</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Demo4Servlet</servlet-name>
    <url-pattern>/demo4</url-pattern>
</servlet-mapping>

servlet的访问路径

<a href="http://localhost:8080/day02/demo4">访问demo4 绝对路径访问 带协议的路径</a><br/>
<!--绝对路径访问 相对路径的另一种写些 :相对于tomcat下 -->
<a href="/day02/demo4">访问demo4 绝对路径访问 不带协议的路径</a><br/>

<!--  <url-pattern>/a/b/c/d  -->
<!--  <a href="a/b/c/d">  -->
<!--相对路径的时候 不需要写/-->
<!--相对路径 找到都是web.xml中的url-pattern的配置 -->
<a href="demo4">访问demo4 相对路径(相对于项目而言)</a><br/>

总结http协议的响应:

200 :响应成功
404 :资源没有找到
500 : 服务器代码书写错误
405 :get或者post方法没有找到

打赏
文章版权声明:除非注明,否则均为彭超的博客原创文章,转载或复制请以超链接形式并注明出处。
相关推荐

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

猜你喜欢