1 Servlet 配置详解

  ①  由于客户端在浏览器只能通过URL访问web服务器的资源,所以Servlet程序若想被外界访问,必须把Servlet 程序映射到一个URL 地址上,这个工作在项目web.xml 完成。

  ② web.xml 的 <servlet>元素用于注册Servlet,它主要包含2个元素:<servlet-name>与<servlet-class>,分别用于注册Servlet 名称和设置Servlet 完整类名。

   <servlet>
<!-- 注册Servlet -->
<servlet-name>FirstServlet</servlet-name>
<!-- 类的全路径 -->
<servlet-class>com.latiny.servlet.FirstServlet</servlet-class>
</servlet>

③ <servlet-mapping> 元素用于映射一个已经注册的Servlet对外的访问路径,它包含2个子元素:<servlet-name>与<url-pattern>,分别用于指定Servlet 注册名对应的对外访问路径。

  <servlet-mapping>
<!--Servlet的注册名 -->
<servlet-name>FirstServlet</servlet-name>
<!--Servlet对外的访问路径 -->
<url-pattern>/FirstServlet</url-pattern>
</servlet-mapping>

  

  ④ 一个注册的Servlet可以映射为多个URL,且每个URL都可以被外部访问

  ⑤ 对Servlet映射时,可以使用通配符,有两种格式

第一种格式 *.扩展名,例如*.do,*.html

第二中格式 以 / 开头,同时以 /* 结尾 例如 /* 或者 /news/*

第三如果一个URL被映射成多种格式,匹配标准如下:

  • 谁的匹配度高,谁先被选择
  • *.do 优先级最低

  案例:

  ① 如果在上面的<servlet-mapping> 元素里,FirstServlet 被映射成 *.html,那么在浏览器输入任何以html 结尾的地址都可以访问到该 Servlet

  http://localhost:8080/TestWeb/abc.html,其中abc 可以换成任意字符都可以访问到该Servlet。

  ② 如果在上面的<servlet-mapping> 元素里,FirstServlet 被映射成 /*,那么在浏览器输入任何字符或者不输字符都可以访问到FirstServlet,如下面的地址都可以访问到:

  http://localhost:8080/ServletProject/

  http://localhost:8080/ServletProject/a

  http://localhost:8080/ServletProject/.html

  

  2 Servlet 单例问题

当Servlet第一次被访问后,就被加载到内存,以后该实例对各个请求服务,Servlet在使用中是单例的,因为Servlet是单例,因此会出现线程安全问题。比如:售票系统,不加同步机制,则会出现问题。

① 解决方案:

如果一个变量或者一段代码,可能会有多个用户共享,则应该在访问时加同步机制:

 synchronized(对象)
{ }

  

  如果一个变量不需要共享,则直接在doPost或doGet定义。

  

  3 Servlet中的<servlet-on-startup> 配置

  当我们启动网站的时候,可能会要求初始化一些数据,比如创建临时表、完成一些网站要求定时完成的任务如:定时写日志,定时备份数据库,定时发送邮件等。

  解决方案:可以通过<load-on-startup>配合线程解决

  ① 通过配置<load-on-startup> 可以指定某个Servlet 自动启动

  ② 创建一个简单的线程:

 public class SendEmail extends Thread
{
public void run()
{
int i=0;
try
{
while(true)
{
//每休息10秒,就去扫描sendmail表,看看哪份email应该发出
Thread.sleep(60*1000);
System.out.println("发出第"+(++i)+"邮件");
}
}
catch(Exception e)
{ }
} }

  ③ 创建一个简单的Servlet:FirstServlet,然后在该Servlet里创建SendEmail 线程并启动

 public class FirstServlet extends HttpServlet {

     public void init() throws ServletException {
//完成一些初始化任务
System.out.println("FirstServlet is called");
SendEmail email = new SendEmail();
email.start(); } public void destroy() {
super.destroy(); }
.......

  ④ 在项目的web.xml配置该Servlet,随着网站启动时一起启动

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

  

  ⑤ 部署该项目,然后启动Tomcat,启动之后我们可以在后台看到,每隔10秒就会输出一条信息

 一月 27, 2018 4:39:51 下午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["ajp-apr-8009"]
一月 27, 2018 4:39:51 下午 org.apache.catalina.startup.Catalina start
信息: Server startup in 5818 ms
发出第1邮件
发出第2邮件
发出第3邮件
发出第4邮件
发出第5邮件
发出第6邮件
发出第7邮件

  以上只是简单的模拟了<load-on-startup> 配置Servlet 在项目启动时跟着一起启动的案例。

  3 SerlvetConfig 对象

  ServletConfig 对象主要用于读取Servlet的配置信息,要在项目中使用该对象来工作,需要做如下操作:

  ① 在web.xml 中给对应的Servlet 配置ServletConfig 信息,注意这个配置信息只能供该Servlet 访问,其他Servlet无法访问

 <servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>com.latiny.servlet.FirstServlet</servlet-class> <!-- Servlet 配置信息,此处配置信息只能被该Servlet读取 -->
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param> <init-param>
<param-name>name</param-name>
<param-value>latiny</param-value>
</init-param> <init-param>
<param-name>gender</param-name>
<param-value>male</param-value>
</init-param> </servlet>

  ② 获取使用

         String encoding = this.getServletConfig().getInitParameter("encoding");
String name = this.getServletConfig().getInitParameter("name");
String gender = this.getServletConfig().getInitParameter("gender");

  这种配置方式只能被某个Serlvet独立使用,如果希望所有Servlet都能读取到某个配置参数,则需要配置参数<context-param>

 <context-param>
<param-name>contextName</param-name>
<param-value>Hello context config</param-value>
</context-param>

  该项目任何Servlet 都可以通过以下代码获取<context-param> 中的配置

 String contextName = this.getServletContext().getInitParameter("contextName");

4 修改Servlet的配置模板

MyEclipse提供的Servlet 模板有时候不一定适合项目的开发,为了方便我们可以按照实际需要修改模板

  ① 找到MyEclipse安装目录下的 \Common\plugins文件夹:

  D:\Program Files\AppData\Local\MyEclipse\Common\plugins

  ② 然后找到com.genuitec.eclipse.wizards_9.0.0.me201211011550.jar这个jar文件

  ③ 用压缩工具打开,注意是打开不是解压这个jar包

④ 打开com.genuitec.eclipse.wizards_9.0.0.me201211011550.jar这个jar文件后,可以看到里面有一个templates文件夹,进入templates文件夹,可以看到里面有一个Servlet.java文件,然后打开按照自己的需求修改即可

2 Servlet 细节的更多相关文章

  1. Servlet细节

    Servlet细节 线程不安全的做法: * 不要在Servlet中创建成员!创建局部变量即可! * 可以创建无状态成员! * 可以创建有状态的成员,但状态必须为只读的!(不提供set方法) 1.Ser ...

  2. HTTP协议 Servlet入门 Servlet工作原理和生命周期 Servlet细节 ServletConfig对象

    1 HTTP协议特点   1)客户端->服务端(请求request)有三部份     a)请求行--请求行用于描述客户端的请求方式.请求的资源名称,以及使用的HTTP协议版本号 请求行中的GET ...

  3. 2016-2-1 Servlet细节

    Servlet的一些细节(韩顺平老师视频讲解)(1)由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序想要被外界访问,必须把servlet程序映射到一个URL地址上.这个工作在 ...

  4. Servlet第二篇【Servlet调用图、Servlet细节、ServletConfig、ServletContext】

    Servlet的调用图 前面我们已经学过了Servlet的生命周期了,我们根据Servlet的生命周期画出Servlet的调用图加深理解 Servlet的细节 一个已经注册的Servlet可以被多次映 ...

  5. Servlet细节整合

    最近在复习Servlet,发现其中有很多细节方面的东西都没有接触到,只是学了大概 1.请求转发和请求重定向的区别 2.输入参数为中文时候的乱码问题 3.Web工程中的目录写法 下面分别阐述 1.请求转 ...

  6. Servlet细节处理

    1.Servlet的线程安全问题 尽管servlet的工作效率高,但是线程也是不安全的,因为一个类型的Servlet只有一个实例对象,那么就有可能会出现一个Servlet同时处理多个请求 解决方案:所 ...

  7. Servlet技术之——概述、实现、细节、获取资源、ServletConfig、ServletContext

    Servlet概述.实现.细节.获取资源.ServletConfig.ServletContext (一) Setvlet基本概述 (1) 什么是Servlet ? Servlet(Server Ap ...

  8. javaweb之servlet 全解

    ①Servlet概述 ⑴什么是Servlet Servlet是JavaWeb的三大组件之一,它属于动态资源.Servlet的作用是处理请求, 服务器会把接收到的请求交给Servlet来处理,在Serv ...

  9. 初学Java Web(4)——Servlet学习总结

    经过一段时间的学习,对于Servlet有了新的不一样的见解,在这里做一下总结,将近来学习到的知识总结一下. Servlet 的请求流程 浏览器发出请求:http://localhost:80/xxx1 ...

随机推荐

  1. 团队作业——UML设计

    Deadline:2017-10-29 20:00(课堂作业) 导言 同学们已经做了需求的分析,也做了详细的系统设计,画过了一些小小的类图/用例图,对自己要做什么应该有比较清晰的认识了.接下来,我们要 ...

  2. maven中可以直接引用的java系统属性和环境变量属性

    一.查看命令: 1 mvn help :system 二.引用 在pom文件中通过 ${变量名}来引用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...

  3. Django-rest-framework 接口实现 rest_framework 中有已经定义好的 工具类 mixins generics viewsets

    rest_framework.mixins 请求业务 的 5 种实现 ​ mixin(混合类):不能单独使用,和其它类搭配起来使用(利用了Python支持多继承) rest_framework.mix ...

  4. 引用变量 php面试总结1

    (1)PHP引用变量 概念:不同的变量名,访问同一个变量内容,使用& 知识点: 使用php函数 (a)memory_get_usage() 查看内存使用情况 eg // 定义一个变量 $a = ...

  5. LDAP安装配置(windows)

    目录 概述 测试环境 安装过程 配置启动 客户端介绍 多级DC的ldif文件的配置 [一].概述 什么叫LDAP呢,概念的东西这里就不多讲了,网上搜索下有很多,本文的重点是介绍如何在windows平台 ...

  6. 深度学习之Attention Model(注意力模型)

    1.Attention Model 概述 深度学习里的Attention model其实模拟的是人脑的注意力模型,举个例子来说,当我们观赏一幅画时,虽然我们可以看到整幅画的全貌,但是在我们深入仔细地观 ...

  7. fuser - 查看文件/网络端口等被什么进程占用

    前提 linux环境下,当使用umount命令卸载挂载点时,会遇到“device is busy”提示,这时fuser就能查出谁在使用这个资源;当然umount –lf  [挂载点] 也可以强制卸载 ...

  8. 输出 1-100 内的奇数和偶数,并对其分别求和(while嵌套if-else循环)

    package com.summer.cn; /** * @author Summer * 输出 1-100 内的奇数和偶数,并对其分别求和 * while嵌套if-else循环 */ public ...

  9. LeetCode264:Ugly Number II

    自己的做法超时了.主要是每次生成一个数据,保存到list中,然后对List重新排序.排序太耗费时间 记录下讨论组里的写法 public int NthUglyNumber(int n) { int[] ...

  10. Spring Boot 之日志记录

    Spring Boot 之日志记录 Spring Boot 支持集成 Java 世界主流的日志库. 如果对于 Java 日志库不熟悉,可以参考:细说 Java 主流日志工具库 关键词: log4j, ...