【Servlet的细节知识点1-----一个Servlet映射到多个URL】

同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名。

如下:

[ 工程截图 ]

[ web.xml ]

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>HelloServlet</display-name> <servlet>
<servlet-name>ServletDemo01</servlet-name>
<servlet-class>com.Higgin.servlet.ServletDemo01</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>ServletDemo01</servlet-name>
<url-pattern>/higgin.html</url-pattern> <!--伪html-->
</servlet-mapping> <servlet-mapping>
<servlet-name>ServletDemo01</servlet-name>
<url-pattern>*.do</url-pattern> <!-- 匹配所有后缀为.do的URL -->
</servlet-mapping>
</web-app>

[ ServletDemo01.java ]

package com.Higgin.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; //@WebServlet("/ServletDemo01")
public class ServletDemo01 extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("ServletDemo01----doGet");
System.out.println(request.getRequestURL()); //获取客户端发出请求的URL
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
} }

[ 运行结果 ]

1.浏览器URL输入  http://localhost:8080/HelloServlet/higgin.html

2.浏览器URL输入http://localhost:8080/HelloServlet/adfcvsd.do (只要是.do后缀)

【Servlet的细节知识点2-----通配符*】

Servlet映射到url中可以使用*通配符,但是只能有两种固定的格式:

格式一: *.扩展名                                    例子:  *.do

格式二: 正斜杠“/”开头并以"/*"结尾             例子: /action/*

【Servlet的细节知识点3-----在修改web.xml时,无需重启TomCat的原因】

我们打开Tomcat服务器所在的conf/context.xml

<WatchedResource>WEB-INF/web.xml</WatchedResource>这句配置保证JavaWeb工程在web.xml被修改时,tomcat服务器会自动加载修改后的web.xml。

【Servlet的细节知识点4-----关于映射关系再深入】

【Servlet的细节知识点5-----Servlet内各个方法调用细节】

Servlet是一个供其它java程序(Servlet引擎)调用的Java类,它不能独立运行,它的运行由Servlet引擎来控制和调度。

  针对客户端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至web容器退出,Servlet实例对象才会被销毁。

  在Servlet的整个生命周期内,Servlet的init方法只被调用一次。

  而对于一个Servlet的每次访问请求都导致Servlet引擎调用一次Servlet的service()方法。

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

【Servlet的细节知识点6-----Servlet创建的时间改变<load-on-startup>】

  默认情况下,第一次访问Servlet时创建Servlet对象,创建对象的时候会电泳构造方法和init方法。如果init方法的业务逻辑需要消耗比较长的时间,导致用户第一次访问Servlet时需要等待较长的时间。因此我们需要改变Servlet对象创建的时间:在TomCat服务器启动的时候就创建Servlet对象。

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

如下所示:(注意:值为正整数,数值越小,优先级越高!)

<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>com.Higgin.servlet.FirstServlet</servlet-class>
<load-on-startup></load-on-startup>
</servlet>

用途:为Web应用写一个InitServlet,这个Servlet部署在TomCat服务器启动时装载,可以用来为整个Web应用创建必要的数据库表和数据。

【Servlet的细节知识点7-----缺省Servlet】

* 如果某个Servlet的映射路径仅仅为一个正斜杠( / ),那么这个Servlet就称为当前Web应用程序的缺省Servlet。

* 凡是在web.xml中找不到撇皮的<servlet-mapping>元素的URL,他们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其它Servlet都处理的访问请求。

* 在Tomcat安装目录下的conf/web.xml文件中,注册了一个类名为org.apache.catalina.servlets.DefaultServlet的Servlet,并且将这个Servlet设为缺省Servlet。

* 当访问Tocat服务器中的某个静态HTML和图片时,实际上访问的就是这个缺省的Servlet。

默认的Servlet的作用:用于解析Web应用下的静态资源。

[ 浏览器输入一个资源名称的时,查找资源的顺序 ]

1.首先,在当前web应用下的web.xml文件中查找是否有匹配的url-pattern。

2.如果匹配到了,执行对应的Servlet(动态资源)。

3.如果没有匹配到,就交给TomCat服务器默认的Servlet去处理。

4.默认Servlet回到当前的web.xml应用下读取对应的名称的静态资源文件。

5.如果读到对应的静态资源文件,就把内容返回给浏览器。

6.如果没有读到对应的静态资源文件,就返回404的错误页面。

结论:先找动态资源,在去找静态资源!

【Servlet的细节知识点7-----Servlet线程安全问题】

[引发的原因]

当多个客户端并发访问同一个Servlet时,Web服务器会为每一个客户端的访问请求创建一个线程,并在这个线程上调用Servlet的service方法,因此service方法内如果访问了同一个资源的话,很有可能引发线程安全问题。

[避免Servlet并发问题建议]

1.尽量不要在Servlet类中使用成员变量

2.如果要使用成员变量,那么就要给成员变量的代码块加上代码锁,尽量缩小同步锁的范围,以避免因为同步代码并发执行效率的降低。

【Servlet的细节知识点8-----关于init方法】

在GenericServlet中,有两个init方法。

  有参数的init方法:该方法是servlet的四个生命周期方法中的一个。由Tomcat服务器默认调用的初始化方法。在GenericServlet的实现中,该方法会调用无参数的init方法。

  无参数的init方法:该方法是给我们开发者去覆盖的,用于实现初始化逻辑的方法。

结论:如果要编写Servlet的初始化逻辑,只需要覆盖无参数的init方法即可。

11_Servlet的一些细节知识点的更多相关文章

  1. 你所不了解的javascript操作DOM的细节知识点(一)

    你所不了解的javascript操作DOM的细节知识点(一) 一:Node类型 DOM1级定义了一个Node接口,该接口是由DOM中的所有节点类型实现.每个节点都有一个nodeType属性,用于表明节 ...

  2. 前端开发概述+JS基础细节知识点

    一 前端开发概述 html页面:html css javascript 拿到UI设计图纸:切图-->html+css静态布局-->用JS写一写动态效果-->ajax和后台进行交互,把 ...

  3. Django学习笔记(19)——BBS+Blog项目开发(3)细节知识点补充

    本文将BBS+Blog项目开发中所需要的细节知识点进行补充,其中内容包括KindEditor编辑器的使用,BeautifulSoup 模块及其防XSS攻击,Django中admin管理工具的使用,me ...

  4. Swift开发UITableView常用的一些细节知识点介绍

    <code class="objectivec"><strong><span style="font-size:18px;"> ...

  5. nginx一些细节知识点补充

    1.upstream 配置代理 upstream local_tomcat { server localhost:8080; } server{ location / { proxy_pass htt ...

  6. C++中细节知识点

    C++中常识小知识: 1.在C++的类中成员变量与成员函数默认为私有的,结构体中的成员变量与成员函数默认为公有的. 2.C++中this关键字是指针,指向当前对象. 3.在C++中一般类的成员变量与成 ...

  7. python 常见细节知识点

    1. a[::-1]翻转 设有一个元组或者列表 a = (1,2,3,4) b = [1,2,3,4] 则a[::-1]和b[::-1]的含义是将元组或列表的内容翻转 a[::-1] # 结果为(4, ...

  8. JavaScript高级程序设计中第2、3章中细节知识点

    第2章 1.<script src='script.js' type='text/javascript'></script>中,只要不包含defer和async属性,浏览器都会 ...

  9. React Native细节知识点总结<二>

    1.关于React Native导出组件的export default和export的问题: 一个文件只能有一个export default,可以有多个export export class Temp ...

随机推荐

  1. 第1组UI组件:布局管理器

    1 布局管理的来源 为了让UI在不同的手机屏幕上都能运行良好----不同手机屏幕的分辨率/尺寸并不完全相同,如果让程序手动控制每个组件的大小.位置,会给编程带来巨大的麻烦.为了解决这个问题.andro ...

  2. home_work--用户登陆

    前提: 根据文本中的已有用户和密码,实现登陆的交互:在用户输入用户名后,会有一个检测用户是否被锁定的环节:如果用户三次密码输入错误,则该用户则会被添加到锁定文件中,无法登陆. 涉及到的知识点: 1.p ...

  3. Winform- IrisSkin.dll轻松实现窗体换肤功能

    IrisSkin2.dll是一款很不错的免费皮肤控件,利用它可以轻松的实现winForm窗体换肤 然而IrisSkin2.dll只能在.NET Faremwork 4.0以及之前的版本使用,所以要在V ...

  4. OO ALV 学习参考

      http://blog.csdn.net/sapliumeng/article/details/18653491 一.ALV介绍 The ALV Grid Control (ALV = SAPLi ...

  5. mac下烦人的eclipse安装svn插件

    eclipse作为一个鸡肋般的java ide,颇有食之无味弃之可惜之感.最近公司统一对电脑做了一些处理,搞的我的eclipse都不能用了.重新安装了一下,各种maven.svn,代码格式什么的依赖神 ...

  6. java 实现视频转换通用工具类:视频相互转换-Ffmpeg(三)

    java 实现视频转换通用工具类:获取视频元数据信息(一) java 实现视频转换通用工具类:视频相互转换-总方法及Mencoder(二) 这节主要是ffmpeg的相关方法封装,在实际调用中主要使用f ...

  7. hdu 2844 Coins (多重背包)

    题意是给你几个数,再给你这几个数的可以用的个数,然后随机找几个数来累加, 让我算可以累加得到的数的种数! 解题思路:先将背包初始化为-1,再用多重背包计算,最后检索,若bb[i]==i,则说明i这个数 ...

  8. 网络子系统55_ip协议分片重组_加入ipq

    //ip分片加入到正确的ipq结构 //调用路径:ip_defrag->ip_frag_queue // 处理过程: // 1.正在被释放的ipq,不处理新加入的分片(ipq正在被释放由last ...

  9. [Bootstrap] 1. container & container-fluid

    Container: 居中 <!DOCTYPE html> <html> <head> <title>Blasting Off With Bootstr ...

  10. wcf-2

    1.前言 上一篇,我 们通过VS自带的模板引擎自动生成了一个wcf程序,接下来我们将手动实现一个wcf程序.由于应用程序开发中一般都会涉及到大量的增删改查业务,所以这 个程序将简单演示如何在wcf中构 ...