`
原来我就是麦兜
  • 浏览: 9799 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

[Servlet]深入掌握Servlet

 
阅读更多

Servlet的线程安全

在Servlet的整个生命周期中,构造方法只被执行一次。也就是说,在Servlet的整个生命周期中,只存在一个Servlet实例对象。这说明Servlet是单例多线程的,可能会引起线程安全问题。

所谓线程安全就是一个Servlet实例对象会同时处理多个请求,这样的Servlet工作效率的确很高。但如果Servlet中包含成员变量的话,可能一个线程对该成员变量进行写操作,而另一个线程对该成员变量进行读操作。所以,单例多线程的Servlet不能创建成员变量。

服务器启动创建Servlet

通过之前的测试操作,我们发现Servlet并不是在Tomcat服务器启动时创建实例对象,而是在第一次请求之后才一并创建实例对象、初始化并处理逻辑的。Servlet又是单例的,在整个生命周期中只创建一个Servlet实例对象。如果可以在Tomcat服务器启动时,进行创建实例对象并完成初始化工作,在请求之后只调用service()方法处理请求逻辑即可。

可以在web.xml配置文件增加相关配置即可,具体增加内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <servlet>
    <servlet-name>LifeServlet</servlet-name>
    <servlet-class>app.java.servlet.LifeServlet</servlet-class>
    <!-- 
        load-on-startup标签:配置当前Servlet在启动时创建实例对象
         * 标签中的数字,表示级别(0-9级),一般设置为0即可.
     -->
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>LifeServlet</servlet-name>
    <url-pattern>/servlet/LifeServlet</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

增加配置信息之后,重新启动Tomcat服务器,查看控制台信息如下:

这里写图片描述

通过查看控制台打印的信息,可以看出在启动Tomcat服务器时,已经创建并初始化了Servlet实例对象。

url-pattern的三种配置

在web.xml配置文件中配置有关Servlet的时候,标签是用于配置当前Servlet拦截的路径,也就是说,客户端浏览器访问标签配置的路径才能访问对应Servlet内容。

关于拦截路径的配置方式其实有三种方式:

  • 完全路径匹配:是以“/”开始,路径中间不能包含通配符“*”,例如:/firstServclet,表示访问路径为http://localhost:8080/08_servlet/firstServlet
  • 目录匹配:是以“/”开始,以“/”结尾的,例如:/firstServlet/,表示访问路径为http://localhost:8080/08_servlet/firstServlet路径下任意内容。
  • 扩展名匹配:是以“”开始,不能以“/”开始,以“.xxx”结尾,例如:.do,表示访问路径为所有扩展名为“.do”的路径。

值得注意的问题:

  • 在一个标签中,可以配置多个标签。也就是说,一个Servlet可以拦截多个不同路径的访问。
  • 上述三种配置路径方式具有优先级:完全路径匹配 -> 目录匹配 -> 扩展名匹配。

下面通过一些测试,来看看路径配置的三种方式:

  • 如下有一些映射关系:
    • Servlet1 映射到 /abc/*
    • Servlet2 映射到 /*
    • Servlet3 映射到 /abc
    • Servlet4 映射到 *.do
  • 问题:
    • 当请求URL为“/abc/a.html”,“/abc/”和“/”都匹配,哪个servlet响应?Servlet1
    • 当请求URL为“/abc”时,“/abc/*”和“/abc”都匹配,哪个servlet响应?Servlet3
    • 当请求URL为“/abc/a.do”时,“/abc/”和“.do”都匹配,哪个servlet响应?Servlet1
    • 当请求URL为“/a.do”时,“/”和“.do”都匹配,哪个servlet响应?Servlet2
    • 当请求URL为“/xxx/yyy/a.do”时,“/”和“.do”都匹配,哪个servlet响应?Servlet2

如果客户端浏览器请求的路径是错误时,页面会显示404错误内容。这是因为所有发布到Tomcat服务器的Web应用程序的web.xml文件都继承了Tomcat服务器安装目录中conf目录中的web.xml文件。当访问路径是错误的,或者对应Servlet没有配置,实际上会执行Tomcat服务器中的web.xml的相关配置,具体内容如下:

<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>listings</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

转载说明:请注明作者及原文链接,谢谢!

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    深入掌握J2EE编程技术

    《深入掌握J2EE编程技术》全面介绍了JSP层,EJB层和EIS层的设计思想与编程技术,涉及的内容包括:JDBC,JNDI,LDAP,Servlet,JSP,Taglib,EJB,J2EE,Connector,SAX与DOM,RMI,CORBA,JavaMail和JMS。...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    Servlet与JSP核心编程

    《Servlet与JSP核心编程(第2卷 第2版)》在第l卷的基础上,广泛涉及自定义标签库、过滤器、声明式安全、JSTL和Struts等主题...此外,《Servlet与JSP核心编程(第2卷 第2版)》还用较多篇幅深入介绍了Jakarta Struts框架。

    Java Web开发详解:XML+DTD+XML Schema+XSLT+Servlet3.0+JSP2.2深入剖析与实例应用/孙鑫编著

    鑫编写的《Java Web开发详解——XML+DTD+XML Schema+XSLT+Servlet3.0+JSP2.2深入剖析与实例应用》共分4篇,从XML、XML Schema、XSLT、Servlet、JSP和应用的角度向读者展示了Java Web开发中各种技术的应用,循序渐进...

    深入学习:Java Servlet开发与实例

    深入介绍Java Servlet,j2ee技术,对java基础掌握较好的人可以当作学习的很好的教程,里面有很多实例初学也可以学习参考

    深入掌握J2EE编程技术(卷一)

    本书全面深入地介绍了当今最热门的...为分开压缩的,必须两个都下载才能解压缩,上传大小的限制,不要怨我,呵呵,深入掌握J2EE编程技术(卷二) ,看我的其它资源里有,下载地址http://download.csdn.net/source/2242179

    深入掌握J2EE编程技术(卷二)

    本书全面深入地介绍了当今最热门的...为分开压缩的,必须两个都下载才能解压缩,上传大小的限制,不要怨我,呵呵,深入掌握J2EE编程技术(卷一) ,看我的其它资源里有,下载地址http://download.csdn.net/source/2242132

    基于Jsp+Servlet+SQLServer实现MVC架构(源码).rar

    JSP和Servlet编程:学习如何使用JSP和Servlet进行Web页面的设计和后端逻辑的处理,掌握JSP页面的动态生成和Servlet的请求处理。 SQL Server数据库操作:学习如何使用SQL Server进行数据库设计和操作,包括创建表、...

    深入浅出Servlets and JSP(第二版).rar

    你会通过不寻常的方式同Servlet和JSP打交道,学得更深入、更快,而且最重要的是,你能真正地学以致用。你可以看看为什么那么多评论者说这本书让他们"手不释卷"。我们不会为了通过考试而让你昏昏入睡,更不会让你第二...

    Java Servlet开发与实例

    Java Servlet开发与实例 深入介绍Java Servlet,j2ee技术,对java基础掌握较好的人可以当作学习的很好的教程,里面有很多实例初学也可以学习参考。如果是你需要的,给个好评!

    共创在线考试系统(JSP+SERVLET).rar

    这个压缩包“共创在线考试系统(JSP+SERVLET).rar”是一款基于Java服务器页面(JSP)和Servlet技术的在线考试...总之,这个在线考试系统的源码包是一个实用的学习和开发工具,适合那些希望深入了解JSP和Servlet技术,或

    博客系统网站(JSP+SERVLET+MYSQL)130222.rar

    此资料包是一套学习和实践Web开发的好材料,尤其适合那些想要深入学习JSP、Servlet和数据库交互技术的学习者。通过分析和运行这些源码,学习者可以了解Web应用的开发流程,掌握如何在Java Web环境中使用MVC设计模式...

Global site tag (gtag.js) - Google Analytics