JavaWeb学习之Servlet(三)----Servlet的映射匹配问题、线程安全问题

【声明】

欢迎转载,但请保留文章原始出处→_→

文章来源:http://www.cnblogs.com/smyhvae/p/4140529.html

联系方式:[email protected]


一、Servlet映射匹配问题:

在第一篇文章中的第四段(MyEclipse及Tomcat的配置)已经讲到这个知识,现在再细化一下:

由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。

<servlet>元素用于注册Servlet,它包含有两个主要的子元素:<servlet-name>和<servlet-class>,分别用于设置Servlet的注册名称和Servlet的完整类名。

一个<servlet-mapping>元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素:<servlet-name>和<url-pattern>,分别用于指定Servlet的注册名称和Servlet的对外访问路径。例如:

    <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>com.vae.servlet.MyServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/servlet/MyServlet</url-pattern>
    </servlet-mapping>

需要注意的是:

1、一个<servlet>可以对应多个<serlvet-mapping>,从而一个Servlet可以有多个路径来访问

2、url-partten中的路径也可以使用*通配符,但是只能有两种固定的格式:一种格式是“*.扩展名”,另一种格式是以正斜杠(/)开头并以“/*”结尾。

由于*的引入,有可能一个路径被多个urlpartten匹配,这是优先级判断条件如下:

  • 哪个越精确找哪个
  • *.后缀的格式永远匹配级最低

【举例】

对于如下的一些映射关系:

  • Servlet1 映射到 /abc/*
  • Servlet2 映射到 /*    (表示任何路径都能匹配)
  • Servlet3 映射到 /abc
  • Servlet4 映射到 *.do

问题:

  • 当请求URL为“/abc/a.html”时,“/abc/*”和“/*”都匹配,哪个servlet响应?Servlet引擎将调用Servlet1。
  • 当请求URL为“/abc”时,“/abc/*”和“/abc”都匹配,哪个servlet响应?Servlet引擎将调用Servlet3。
  • 当请求URL为“/abc/a.do”时,“/abc/*”和“*.do”都匹配,哪个servlet响应?Servlet引擎将调用Servlet1。
  • 当请求URL为“/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应?Servlet引擎将调用Servlet2。
  • 当请求URL为“/xxx/yyy/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应?Servlet引擎将调用Servlet2。

3、可以在<serlvet>标签里配置<load-on-startup>可以用来指定启动顺序。Servlet默认是在第一次被访问的时候创建,如果配置了这个标签,就会随着Web应用的启动而创建。举例:

    <servlet>
        <servlet-name>Servlet2</servlet-name>
        <servlet-class>Servlet2</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>

第4行的int值表示多个serlvet的启动顺序。

4、缺省Servlet:

如果有一个Servlet的url-partten被配置为了一根正斜杠"/",这个Servlet就变成了缺省Serlvet.其他Servlet都不处理的请求,由缺省Servlet来处理.

其实对于静态资源的访问就是由缺省Servlet来执;设置404页面、500页面等提示页面也是由缺省Servlet来执行。通常我们不会自己去配置缺省Servlet

二、线程安全问题

Servlet引擎采用多线程模式运行,它为并发的每个访问请求都使用一个独立的线程来进行响应。

由于默认情况下Servlet在内存中只有一个对象,当多个浏览器并发访问Servlet时就有可能产生线程安全问题。

面试题目注意:Servlet线程不安全,自始至终只维护一个实例。

注:线程安全本质即:同一个资源被多个线程同时操作,可能会互相干扰。

解决方案:

1、SingleThreadModel接口(标记接口,单线程模型接口):不能真的防止线程安全问题(已过时)

Servlet实现了SingleThreadModel接口,那么Servlet引擎将以单线程模式来调用Servlet的service方法。对于实现了SingleThreadModel接口的Servlet,Servlet引擎仍然支持对该Servlet的多线程并发访问,其采用的方式是产生多个Servlet实例对象,并发的每个线程分别调用独立的一个Servlet实例对象

注:此接口在API 2.4中就已经过时,虽然解决了线程安全问题,但是消耗了大量性能(不同的客户端同时访问会创建不同的Servlet实例),所以此方法建议不用,实际开发中也不用。

2、使用同步代码块:效率降低

下列需要考虑线程安全问题:(多个线程同时访问数据时)

  • 访问成员变量时(所以,在Servlet中定义成员变量时,需要考虑线程安全问题)
  • 访问共享资源时

注:Servlet中尽量不要使用成员变量。

代码举例:访问成员变量时,要考虑线程安全问题

 1 public class MyServlet1 extends HttpServlet {
 2     private static final long serialVersionUID = 1L;
 3
 4     public int count = 10;// 在Servlet中定义成员变量,需要考虑线程安全问题
 5
 6     public MyServlet1() {
 7         super();
 8     }
 9
10     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
11         doPost(request, response);
12     }
13
14     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
15
16         synchronized (this) {
17             count ++;
18         }
19     }
20
21 }

最终解决方案:在Servlet中尽量少用类变量(成员变量),如果一定要用类变量则用锁来防止线程安全问题,但是要注意锁住内容应该是造成线程安全问题的核心代码,尽量的少锁主内容,减少等待时间提高servlet的响应速度。

时间: 2024-10-12 23:25:47

JavaWeb学习之Servlet(三)----Servlet的映射匹配问题、线程安全问题的相关文章

JavaWeb学习总结(三)—Servlet

1. 什么是Servlet * Servlet是JavaWeb三大组件之一(Servlet.Filter.Listener) ,Servlet是用来处理客户端请求的动态资源,按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet Servlet的任务有: 获取请求数据 处理请求 完成响应 Servlet接口的5个方法: 其中生命周期方法有三个: l  void init(ServletConfig): l  void service(ServletR

JavaWeb核心编程之(三)Servlet配置

Servlet配置 1.配置Serlvet加载时机 2.配置多映射 配置加载时机 新建项目config->创建包com.xiaoan.config->创建类FirstServlet implements Servlet(实现Servlet接口) ->创建类SoundServlet(也实现Servlet接口) 配置web.xml 先配置两个Servlet实现类的Servlet 1 <?xml version="1.0" encoding="UTF-8&q

javaweb学习总结二十三(servlet开发之线程安全问题)

一:servlet线程安全问题发生的条件 如果多个客户端访问同一个servlet时,发生线程安全问题,那么它们访问的是相同的资源.如果访问 的不是相同资源,则不存在线程安全问题. 实例1:不会产生线程安全问题,因为每个客户端发送请求,都会创建一个线程,都会创建一个count 不存在资源共享的问题. 1 public void doPost(HttpServletRequest request, HttpServletResponse response) 2 throws ServletExcep

JavaWeb学习总结第三篇--走进JSP页面元素

JavaWeb学习(三)—走进JSP页面元素 JSP:Java Server Pages,译为Java服务器页面.其脚本采用Java语言,继承了Java所有优点.JSP元素可以分为指令元素.脚本元素和动作元素三种类型.指令元素是针对JSP引擎设计的,它控制JSP引擎如何处理代码:脚本元素是嵌入到JSP页面的Java代码:而动作元素则负责连接所用到的组件.下面,我简单总结一下常用的指令元素和属性. 一:JSP指令元素 JSP指令元素主要用来和JSP引擎沟通,提供整个JSP网页相关的信息,并且用来设

javaweb学习总结(九)—— 通过Servlet生成验证码图片

一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下: 创建一个DrawImage Servlet,用来生成验证码图片 1 package gacl.response.study; 2 import java.awt.Color; 3 import java.awt.Font; 4 import java.awt.Graphics; 5 import java.awt.Graphics2D; 6 import java.awt.image.Buff

javaweb学习总结二十一(servlet开发入门、servlet生命周期以及调用过程)

一:servlet开发入门 servlet是sun公司一门开发动态web资源的技术,下面编写一个servlet入门程序: 1:在tomcat服务器webapps目录下新建firstServlet目录,在firstServlet目录下创建WEB-INF/classes目录 在classes目录下,写servlet程序. 类FirstServlet.java 1 /** 2 * 3 */ 4 package com.hlcui.servlet; 5 6 import java.io.IOExcept

JavaWeb核心编程之(三)Servlet Context 配置

ServletContextServlet引擎为每个Web应用程序都创建一个对应的ServletContext对象, ServletContext对象被包含在ServletConfig对象中, 调用ServletConfig.getServletContext方法可以返回ServletContext对象的引用.由于一个WEB应用程序中的所有Servlet都共享同一个ServletCOntext对象, 所以ServletContext对象被称之为application对象(Web应用程序对象).功

JavaWeb学习之什么是Servlet、如何使用servlet、为什么这样使用、servlet的虚拟路径(2)

1.什么是Servlet? * 服务器端Java程序,servlet需要交给服务器来运行. * 与javax.servlet.Servlet接口有关的java程序 2.如何使用servlet?[必须] * 创建web项目 * 创建一个类,并实现Servlet接口 * 交给服务器运行 /WEB-INF/web.xml <!-- 注册servlet <servlet>标签:进行servlet注册 <servlet-class>标签:确定servlet类所在位置 * 内容:需要注册

JavaWeb学习(5.5)---在Servlet使用getServletContext()获取ServletContext对象出现java.lang.NullPointerException(空指针)异常的解决办法

本文整理自孤傲苍狼大大的博客,,, 在servlet的service方法中获取ServletContext对象也行出现java.lang.NullPointerException(空指针)异常,代码如下: 1 //获取ServletContext对象 2 ServletContext servletContext = this.getServletContext(); 原来是重写了 init(ServletConfig)方法,但重写的init方法内部没有调用super.init(config);

JavaWeb 学习001-登录页面-Servlet

那什么是Servlet呢? 我理解的Servlet 就是一个中间媒介,jsp页面原本需要一些操作,但是现在让jsp页面只是显示就好,把操作的工程转移给Servlet中. 使用Servlet时候有个固定套路: 1.页面有值传给Servlet吗? 2.Servlet有值传给页面吗? 3.如何与biz发生交互(连接数据库)? 4.如何跳转一个页面?