JavaWeb中的Servlet

JavaWeb技术是当今主流的互联网Web应用技术之一,而Servlet是JavaWeb技术的核心基础。

一、Servlet的层次结构

                

        实现Servlet有三种方式:

                实现Servlet接口;

                继承GenericServlet类;

                继承HttpServlet类(最佳选择)。

     二、Servlet的生命周期                                                                                                                  

        上图表示了Servlet的声明周期,但是其中的某些步骤是在什么时候执行的呢

        1、在Tomcat容器启动时,便会加载所有的Servlet。

        2、服务器 在创建Servlet实例有两种情况

                a、没有配置load-on-startup这个设置,在请求到达这个Servlet时服务器才会创建Servlet实例

                b、配置了load-on-startup这个选项大于等于0时,服务器会在Tomcat容器启动时创建Servlet的实例

        3、当Servlet收到请求时,便会调用service方法去处理请求

        4、当容器关闭时,Servlet会调用destory方法卸载Servlet

  三、Servlet的映射规则

        a、将/<URLName>为上下文路径的请求映射到某一Servlet类(/URLName)

<servlet>
     <servlet-name>ServletDemo</servletname>
     <servlet-class>project.ServletDemo</servlet-class>
</servlet>
<url-mapping>
     <servlet-name>ServletDemo</servlet-name>
     <url-pattern>/demo</url-pattern>
</url-mapping> 

        上述就是将以/demo的请求交给project.ServletDemo类来处理

        b、映射所有以<path>为上下文路径的请求到某一Servlet类(/path/*)

<servlet>
     <servlet-name>ServletDemo</servletname>
    <servlet-class>project.ServletDemo</servlet-class>
</servlet>
<url-mapping>
   <servlet-name>ServletDemo</servlet-name>
   <url-pattern>/demo/*</url-pattern>
</url-mapping> 

            上述就是将所有以/demo为起始路径的请求都交给project.ServletDemo类来处理

        c 、映射所有以.<ext>为扩展名的请求到某一Servlet类(*.ext)

<servlet>
     <servlet-name>ServletDemo</servletname>
     <servlet-class>project.ServletDemo</servlet-class>
</servlet>
<url-mapping>
     <servlet-name>ServletDemo</servlet-name>
     <url-pattern>*.do</url-pattern>
</url-mapping>

            上述就是将所有以*.do结尾的请求都交给project.servletDemo类处理

        d、/*和/

<servlet>
     <servlet-name>ServletDemo</servletname>
     <servlet-class>project.ServletDemo</servlet-class>
</servlet>
<url-mapping>
     <servlet-name>ServletDemo</servlet-name>
     <url-pattern>/</url-pattern>
</url-mapping>

        这两个是有区别的,/*会拦截所有的请求,因为/*可以匹配到所有的url路径。配置为/时,意为缺省匹配。即当所有url都匹配不到时,才会选中/,比如请求为.jsp结尾的。

        e、不支持如下映射

          <url-pattern>/*.do</url-pattern>

          <url-pattern>/bim/*.action</url-pattern>

        f、当使用Servlet3.0及以上是时

            Serlvet3.0以后,不用在web.xml中配置servlet和servlet-mapping,只需在类中添加:
            @WebServlet(displayName = "UserServlet", name = "UserServlet", 

            urlPatterns = { "/user" }, loadOnStartup = 1, //启动项

            initParams = { @WebInitParam(name = "username", value = "张三") })

    四、Servlet的域对象  

        Servlet三大域对象:

            ServletContext:范围最大,应用范围!

            HttpSession 会话范围!

            HttpServletRequest:请求范围!

   a、ServletContext的生命周期

                在容器启动时ServletContext就已经创建了

                当容器关闭时ServletContext会被卸载

                一个项目只有一个ServletContext对象

          b、ServletContext的获取

                通过ServletConfig的getServletContext,ServletConfig是init方法的参数,所以这种方式只能在init方法中获取

                GenericServlet代理了ServletConfig的所有方法。所以在GenericServlet的子类中可以使用如下方式获取:

                    this.getServletContext来获取

                    this.getServletConfig().getServletContext()来获取

                HttpSession也有getServletContext方法,所以也可以使用session.getServletContext获取ServletContext对象

         c、ServletContext对属性的操作

            void setAttribute(String name,Object value)来存储属性

            Object getAttribute(String name)来获取属性

            void removeAttribute(String name)来移除属性

    五、Servlet细节

            1、Servlet是单例的、并且是线程不安全的。所以尽可能的不创建成员变量。

            2、Servlet的创建默认是第一次请求时创建。配置load-on-startup大于等于0的整数时会在容器启动时创建。

            3、url-pattern可以使用*表示所以字符,但是不匹配/,使用要求为

                    a、要么在头,要么在尾。不能在中间

                    b、如果不使用通配符,必须使用/开头

                    c、如果一个请求路径匹配了多个url-pattern,那么匹配更加明确的哪一个。


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值