Servlet2

作者: 原点_da4e | 来源:发表于2019-04-29 09:33 被阅读0次

    Servlet调用图

    image.png

    Servlet的细节

    一个已经注册的Servlet可以被多次映射


    image.png image.png

    Servlet映射的URL可以使用通配符

    通配符有两种格式:

    1..扩展名
    2.正斜杠(/)开头并以“/
    ”结尾。

    image.png

    如果.扩展名和正斜杠(/)开头并以“/”结尾两种通配符同时出现,匹配的是哪一个呢?

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

    Servlet映射的URL可以使用通配符和Servlet可以被映射到多个URL上的作用:
    1.隐藏网站是用什么编程语言写的【.php,.net,.asp实际上访问的都是同一个资源】
    2.用特定的后缀声明版权【公司缩写】

    
             <servlet>
                <servlet-name>Demo1</servlet-name>
                <servlet-class>zhongfucheng.web.Demo1</servlet-class>
            </servlet>
            <servlet-mapping>
                <servlet-name>Demo1</servlet-name>
                <url-pattern>*.jsp</url-pattern>
            </servlet-mapping>
            <servlet-mapping>
                <servlet-name>Demo1</servlet-name>
                <url-pattern>*.net</url-pattern>
            </servlet-mapping>
            <servlet-mapping>
                <servlet-name>Demo1</servlet-name>
                <url-pattern>*.asp</url-pattern>
            </servlet-mapping>
            <servlet-mapping>
                <servlet-name>Demo1</servlet-name>
                <url-pattern>*.php</url-pattern>
            </servlet-mapping>
    
    

    Servlet是单例的

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

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

    对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。

    线程安全问题

    当多个用户访问Servlet的时候,服务器会为每个用户创建一个线程。当多个用户并发访问Servlet共享资源的时候就会出现线程安全问题。

    原则:
    1.如果一个变量需要多个用户共享,则应当在访问该变量的时候,加同步机制synchronized(对象){}
    2.如果一个变量不需要共享,则直接在doGet()或者doPost()定义这样不会存在线程安全问题

    load-on-startup

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

    1.为web应用写一个InitServlet,这个servlet配置为启动时装载,为整个web应用创建必要的数据库表和数据
    2.完成一些定时的任务【定时写日志,定时备份数据】

    在Web访问任何资源都是在访问Servlet

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

    这是由缺省Servlet为你服务的
    ·什么叫做缺省Servlet?凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求
    ·既然我说了在web访问任何资源都是在访问Servlet,那么我访问静态资源【本地图片,本地HTML文件】也是在访问这个缺省Servlet【DefaultServlet】

    在没有手工配置缺省Servlet的时候 , 访问本地图片是可以访问得到的
    当配置一个缺省Servlet的时候,覆盖掉Web.xml配置的缺省Servlet

        <servlet>
            <servlet-name>Demo1</servlet-name>
            <servlet-class>zhongfucheng.web.Demo1</servlet-class>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>Demo1</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    

    当继续访问本地图片是,此时输出的是Demo1这个Servlet写上的内容
    总结:**
    无论在web中访问什么资源【包括JSP】,都是在访问Servlet。没有手工配置缺省Servlet的时候,你访问静态图片,静态网页,缺省Servlet会在你web站点中寻找该图片或网页,如果有就返回给浏览器,没有就报404错误**

    ServletConfig对象

    ServletConfig对象有什么用?

    通过此对象可以读取web.xml中配置的初始化参数。
    现在问题来了,为什么我们要把参数信息放到web.xml文件中呢?我们可以直接在程序中都可以定义参数信息,搞到web.xml文件中又有什么好处呢?

    好处就是:能够让你的程序更加灵活【更换需求,更改配置文件web.xml即可,程序代码不用改】

    在Servlet中获取ServletConfig对象,通过ServletConfig对象获取在web.xml文件配置的参数

    ServletContext对象

    什么是ServletContext对象

    Tomcat启动时,就会创建一个ServletContext对象,他代表当前web站点

    ServletContext 有什么用?

    1.ServletContext既然代表着当前web站点,那么所有Servlet都共享着一个ServletContext对象,所以Servlet之间可以通过ServletContext实现通讯。
    2.ServletConfig获取的是配置的是单个Servlet的参数信息,ServletContext可以获取的是配置整个web站点的参数信息
    3.利用ServletContext读取web站点的资源文件
    4.实现Servlet的转发【用ServletContext转发不多,主要用request转发】


    image.png

    获取WEB站点配置的信息

    如果我想要让所有的Servlet都能够获取到连接数据库的信息,不可能在web.xml文件中每个Servlet中都配置一下,这样代码量太大了!并且会显得非常啰嗦冗余。


    image.png image.png

    读取资源文件

    第一种方式:

    我们可以通过ServletContext读取就可以避免修改代码,因为ServletContext对象是根据当前web站点而生成的

    //获取到ServletContext对象
            ServletContext servletContext = this.getServletContext();
    
            //调用ServletContext方法获取到读取文件的流
            InputStream inputStream = servletContext.getResourceAsStream("/WEB-INF/classes/zhongfucheng/web/1.png");
    
    

    第二种方式:

    image.png

    第三种方式:

    image.png
    image.png

    如果文件太大,就不能用类加载资源的方式去读取,否则会导致内存溢出

    相关文章

      网友评论

          本文标题:Servlet2

          本文链接:https://www.haomeiwen.com/subject/ktdenqtx.html