servlet简述

来源:互联网 发布:c语言调用大漠插件 编辑:程序博客网 时间:2024/06/06 01:05
1、Servlet是什么?执行流程
    Servlet是一个服务器的小程序。
    作用:处理相关的业务逻辑

    特点:
        Servlet的执行:只需要访问对应的URL路径即可
        Servlet就是一个普通的java类,
        Servlet的java类继承了HttpServlet->GenericServlet->Servlet(接口)
        这个Servlet执行的是doGet方法---(处理get请求的)
        Servlet没有main方法,没有junit测试方法,由服务器调用


    Servlet是如何执行的呢?如何访问对应URL路径,就能执行对应的Servlet

        一定是被服务器(tomcat)执行。
        
        在web.xml中发现:
        <servlet>
        <servlet-name>HelloWorldExample</servlet-name>
        <servlet-class>HelloWorldExample</servlet-class>
        </servlet>

        <servlet-mapping>

       <servlet-name>HelloWorldExample</servlet-name>                                                           、

       <url-pattern>/servlets/servlet/HelloWorldExample</url-pattern>

   </servlet-mapping>

猜测,url-pattern就是 执行Servlet的路径

servlet-class 是字节码文件位置。 反射调用

2.eclipse中创建Servlet时的注意事项:                
注意:  ①方法的修饰符改为public
              ②web.xml中不要出现注释,否则要么注释消失,要么配置都出现在注释中


2.1、如何从请求中提取表单数据
        
        Post方式如何对应Servlet?
        doPost专门处理post请求
        doGet专门处理get请求


        get方式:参数列表   请求行上
        post方式:参数列表   请求体上

        http请求信息-http响应信息传递时是使用 二进制数据
        服务器可以将http请求信息 二进制数据获取到(字节流),
        封装成对象。
        请求信息全部被封装成了request对象。

Request对象方法
request.getParameter(String 参数名);    返回一个String的参数值。
解析字节流,返回对应的字符串
注意:如果找不到对应参数值,返回null

2.2生命周期

创建:一般是第一次访问时创建实例对象(特殊:设置了预加载标签,会在服务器启动时创建实例);
                init()调用一次
工作:每次调用Service方法一次。
销毁:服务器关闭时销毁
                调用用一次destroy()方法
Servlet在内存中单例形式存在,其会对ServeltContext对象 调用instanceof servlet的全类名查看是否是其的对象,是就直接调用,否就创建一个新的。

2.3url-pattern:就是某个Servlet的访问路径

url-pattern三种写法:

完全匹配:必须以”/”,路径完全相等才能正常匹配
            例如:url-pattern  =   /hehe
                  访问路径必须为:http://域名:端口号/项目名/hehe

            /就可以理解为当前项目
            注意:/如果忽略,会报异常,LifecycleException

目录匹配:必须以”/”开头, 最后必须以”*”结尾。
            只要路径名等于目录名,就可以正常匹配
            例如:url-pattern =  /hehe/*
                    访问路径必须为:http://域名:端口号/项目名/hehe/任意字符

            注意:/如果忽略,会报异常,LifecycleException
                如果*号忽略,就变成了完全匹配

扩展名匹配: 必须以*开头,后面以对应的扩展名结束
                只要路径名和 扩展名一致,就可以正常匹配
            例如:url-pattern =  *.hehe
                    访问路径必须为:http://域名:端口号/项目名/任意字符.hehe

            注意:如果加入/,会报异常,LifecycleException
一个Servlet可以设置多个url-pattern么?
可以。无上限

以上三种匹配方式有一个优先级顺序的:

任意一个请求路径,最终会进行如下的匹配

If(完全匹配){
    //进行完全匹配
}else if(目录匹配){
    //进行目录匹配
}else if(扩展名匹配){
    //进行扩展名匹配
}else{
    //缺省/默认Servlet的匹配
}

以上任意一种匹配方式,都会先匹配本项目内部的,再匹配tomcat的web.xml
If(本项目web.xml){
    //本项目
}else{
    //tomcat的web.xml
}

tomcat缺省Servlet:
1、首先尝试根据请求路径  能在发布目录中 获取对应的资源文件。 (IO流)
2 、就会把对应资源文件以流的形式写入到响应体中。发送给浏览器

如果根据请求路径,获取不到对应的资源文件,直接抛出IOException给服务器,服务器就会写异常信息给浏览器看

    缺省Servlet作用:就是用来读取对应的资源文件,发送给浏览器浏览


2.4路径相关问题

建议使用绝对路径。如果不需要跳转外网,两种绝对路径都可以,如果要跳转外网资源,只能使用带协议的绝对路径。
客户端的路径:
                请求路径是从客户端(浏览器)发出的
                相对路径:引入者和资源在同一目录下
                        问题:引入者位置改变,代码就需要变
                绝对路径:
                        带协议的绝对路径:外网和内网
                        不带协议的绝对路径:内网
                        只要资源位置不动,代码就不用变
                建议使用绝对路径。如果不需要跳转外网,两种绝对路径都可以,如果要跳转外网资源,只能使用带协议的绝对路径。
    服务器端的路径:(请求转发会用到)
                请求路径是从服务器端内部发出的

2.5servlet体系结构树状图

顶层:Servlet接口
        规范。
        作用:Servlet接口规定了,只有实现了该接口中的所有方法,才能是一个基本的Servlet

Servlet在内存中只有一个实例对象。单例

    Servlet接口中,定义了Servlet生命周期的相关方法
        Init(): 初始化方法。 一般是Servlet第一次访问的时候(特殊:服务器启动时),服务器反射实例化对应Servlet,实例化完成后,调用init方法
        Service(): 每次访问时都会调用该方法一次。(不论是get还是post)
        Destroy(): 服务器关闭时,销毁实例对象,销毁实例对象时才会调用该方法一次

    如果每次书写Servlet都去实现servlet接口,实现会特别麻烦,因为我只关注service方法。


抽象类:
    GenericServlet     通用的Servlet
    这个通用的Servlet将其他方法都进行了简单实现,只为我预留了Service方法。

    只需要继承这个抽象类,重写servcie方法即可。

    浏览器和服务器之间进行信息传递,使用http协议。
    Get请求、post请求

    GenericServlet是无法为我区分http协议内容。


抽象类:
    HttpServlet      专门用来处理 http协议的Servlet

    重写了Service方法,对http协议进行了处理。

    以后就会使用HttpServlet的子类作为Servlet使用。

2.6servlet预加载解决第一次访问速度缓慢问题

某个Servlet代码量非常大,实例化速度就会越慢。
一般情况下,Servlet会在第一次访问时才加载实例化。

需求:需要让Servlet实例化过程提前。
<Servlet>的标签下,有一个子标签<load-on-startup>标签。是预加载标签。
当服务器启动时,加载并实例化对应的Servlet
其中<load-on-startup>标签中,必须填写的是正整数。 大于0
整数越小,优先级越高。
注意:尽量填写的Servlet的加载优先级,在3或者3以后
只要对应的Servlet加入该标签,Servlet就会在服务器启动时加载实例化


0 0
原创粉丝点击