Java服务器端编程程序员Java学习笔记

理解Servlet

2017-07-03  本文已影响114人  多了去的YangXuLei

搞Java开发不可避免要用到Servlet,知其然知其所以然,它是什么呢?可以看我前面写的1-Java的认识扫盲,更详细的就要好好了解Tomcat了,可以看看这位老哥的Tomcat系列之Java技术详解
,很好理解吧,这篇文章会着重在技术上说一说Servlet。

一、如何开发一个Servlet(面试会问到的哦)

<!-- 配置一个servlet -->
  <!-- servlet的配置 -->
  <servlet>
    <!-- servlet的内部名称,自定义。尽量有意义 -->
    <servlet-name>FirstServlet</servlet-name>
    <!-- servlet的类全名: 包名+简单类名 -->
    <servlet-class>yxl.com.FirstServlet</servlet-class>
  </servlet>
  
  
  <!-- servlet的映射配置 -->
  <servlet-mapping>
    <!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
    <servlet-name>FirstServlet</servlet-name>
    <!-- servlet的映射路径(访问servlet的名称) -->
    <url-pattern>/first</url-pattern>
  </servlet-mapping>

这个就算配置好了,然后就可以访问了 http://localhost:8080/demo/first ,这个过程是怎么样呢?

二、理解上面的再看看映射路径就是demo/ 后面的东东

在servlet中会有个映射配置,看注释里面写的很清楚

  <!-- servlet的映射配置 -->
  <servlet-mapping>
    <!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
    <servlet-name>FirstServlet</servlet-name>
    <!-- servlet的映射路径(访问servlet的名称) -->
    <url-pattern>/first</url-pattern>
  </servlet-mapping>

它提供了我们精准和模糊两种匹配

<url-pattern>*.后缀名</url-pattern> 浏览器输入: http://localhost:8080/demo/任意路径.do

还有一个内容就是 servlet的缺省路径(<url-pattern>/</url-pattern>)是在tomcat服务器内置的一个路径。该路径对应的是一个DefaultServlet(缺省Servlet)。这个缺省的Servlet的作用是用于解析web应用的静态资源文件;如果没有匹配的url-pattern,则交给tomcat的内置的DefaultServlet处,DefaultServlet程序到应用的根目录下查找是存在一个名称为index.html的静态文件;如果找到该文件,则读取该文件内容,返回给浏览器;如果找不到该文件,则返回404错误页面。

三、Servlet的生命周期

Servlet的生命周期: servlet类对象什么时候创建?什么时候调用什么方法?什么时候销毁?
请先记住这个句话:Servlet程序的生命周期由tomcat服务器控制的!!!!!!!!!!!!!!!!!!!

四大生命周期:

这是是不是很烦躁,接下来就是show code time

//Tomtcat内部代码运行:
            //通过映射找到到servlet-class的内容,字符串: yxl.com.FirstServlet
             //通过反射构造FirstServlet对象
                    //1 得到字节码对象
                    Class clazz = class.forName("yxl.com.FirstServlet");
                    //2 调用无参数的构造方法来构造对象
                    Object obj = clazz.newInstance();     //---1.servlet的构造方法被调用
         //创建ServletConfig对象,通过反射调用init方法
                    //1 得到方法对象
                    Method m = clazz.getDeclareMethod("init",ServletConfig.class);
                    //2 调用方法
                    m.invoke(obj,config);            // --2.servlet的init方法被调用
            //创建request,response对象,通过反射调用service方法
                    //1 得到方法对象
                    Methodm m =clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);
                    //2 调用方法
                    m.invoke(obj,request,response);  //--3.servlet的service方法被调用
            //当tomcat服务器停止或web应用重新部署,通过反射调用destroy方法
                    //1 得到方法对象
                    Method m = clazz.getDeclareMethod("destroy",null);
                    //2 调用方法
                    m.invoke(obj,null);            //--4.servlet的destroy方法被调用

四、自动加载

默认情况下,第一次访问servlet的时候创建servlet对象。如果servlet的构造方法或init方法中执行了比较多的逻辑代码,那么导致用户第一次访问sevrlet的时候比较慢。

改变servlet创建对象的时机: 提前到加载web应用的时候!!!

在servlet的配置信息中,加上一个<load-on-startup>即可!!

<servlet>
    <servlet-name>LifeDemo</servlet-name>
    <servlet-class>yxl.com.LifeDemo</servlet-class>
    <!-- 让servlet对象自动加载 -->
    <load-on-startup>1</load-on-startup>  //注意: 整数值越大,创建优先级越低!!
  </servlet>

五、 有参的init方法和无参的init方法

学习ing,稍带补充

六、Servlet的多线程并发问题

学习ing,稍带补充

七、 ServletConfig对象

学习ing,稍带补充

八、ServletContext对象

学习ing,稍带补充

上一篇 下一篇

猜你喜欢

热点阅读