Servlet简介

**

Servlet -Web动态资源开发

**
以下以tomcat服务器为背景。
servlet本质是一个java文件,由sun公司提供的进行Web动态资源开发技术;使用时将编译后的*.class* 文件放入专有位置——servlet容器。
servlet容器:存储并运行servlet的环境——tomcat;
web容器:存储并运行web资源的环境——tomcat;
一个类实现servlet接口即成为一个servlet文件。

.class文件的专有存放位置
web应用中如果存在动态资源,则必须有完整的WEB-INF目录

Web应用
***|—x.html x.css 等静态资源
***|—WEB-INF
********|—静态资源(此处可有可无,用户无法正常访问)
********|—lib (存储当前web应用运行时所需jar包)
********|—classes(存储当前web应用中的所有动态资源)
********|—web.xml (servlet映射配置,过滤器,监听器,缺省主页配置)
将编译后的.class存放于classes目录下,并在web.xml中配置调用。

配置缺省主页
缺省主页即在地址栏中无需书写主页名即可作为默认主页访问。
在 welcome-file-list 标签中配置,由上往下依次优先加载。

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app 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_3_0.xsd" 
 version="3.0"> 
     <welcome-file-list>  
           <welcome-file>1.html</welcome-file>    
           <welcome-file>index.htm</welcome-file>    
           <welcome-file>index.jsp</welcome-file>  
     </welcome-file-list>
</web-app>

配置servlet映射
在当前web应用中配置web.xml

 <servlet> 
    <servlet-name>FirstServlet</servlet-name> 
  	<servlet-class>cn.tedu.servlet.FirstServlet</servlet-class> 
  </servlet> 
  <servlet-mapping>  
     <servlet-name>FirstServlet</servlet-name>  
     <url-pattern>/servlet/FirstServlet</url-pattern> 
  </servlet-mapping> 

注册servlet标签
servlet映射标签
如果有大量相似的路径都映射到同一个servlet身上,多次重写servlet-mapping配置 代码量仍然很大,这是可以使用servlet映射中通配的形式来定义url-pattern。

通配两种方式:
a *.后缀

b /…/*

url-pattern与通配的匹配程度越高越优先加载;*.do匹配级别永远最低。

Servlet调用过程和生命周期***

1 确认ip地址对应的服务器
2 确认服务器中的虚拟主机名称
3 确认虚拟主机中对应的web应用
4 确认web应用中的资源虚拟路径。
5 根据web.xml文件寻找对应的真实Servlet。
6 servlet执行生命周期的过程。
7 servlet中的service方法提供服务,将所有数据写入 response缓冲区
8 服务器将response缓冲区中的数据组织成一定结构后响应给浏览器

生命周期:
在首次访问到servlet时,servlet会创建一个对象保存在tomcat内存中,这个对象会一直驻留内存提供服务。servlet创建对象之后会立刻调用init方法执行一些初始化操作。创建出来的servlet对象利用身上的service方法提供服务,用户每次访问servlet都是调用service方法。在web应用移除或servlet容器关闭时servlet对象销毁,销毁前调用destory()方法执行一些善后操作。
init方法和destory方法通常自动调用,开发人员只需重写service方法。

Servlet继承结构:
Servlet ——包含五个基本方法 init() destory() service()
|——GenericServlet --service() 通用Servlet
|——HttpServlet 在通用Servlet基础上,添加了大量和HTTP协议相关的方法。

**注意:**所有的静态资源都是由缺省servlet–defaultServlet加载而来。

request对象和response对象
1、接口为什么可以创建对象?
HttpServletRequest是一个接口,为什么request对象依然可以用来发送请求数据?
HttpServletResponse是一个接口,为什么response对象依然可以用来发送响 应数据?
**原因:**真正创建对象的并不是这两个接口而是这两个接口下的子实现类。HttpServletReqeuestWrapper、HttpServletResponseWrapper两个子实现 类创建了request和response对象。
2、request对象和response对象何时创建
servlet完成初始化操作之后,service方法身上的request和response对象也会被创建出来

load-on-startup标签

<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>false</param-value>
      </init-param>   
      <load-on-startup>1</load-on-startup> 
  </servlet>

如果一个servlet标签中配置了load-on-startup标签,则在tomcat服务器启动的 时候就会自动访问一次这个servlet,让这个servlet的对象驻留在内存中一 份,为后边的请求提供访问。

load-on-startup标签中间可以配置一个数字,这个数字可以采用0及其以上 的数字,一般采用1及其以上的数字。这个数字越小,则优先级越高。

注意:尽管各个servlet之间存在优先级关系,但是仍然都是随着tomcat服务器的启动而加载。

缺省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。

当访问Tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问这个缺省 Servlet。

如果访问的资源虚拟路径不存在,依然是交给缺省servlet处理。

servlet多线程并发安全

在面对局部变量的时候,所有线程操作的都是各自独立的变量,这些变量之间是没有联系的,相互不产生影响。

面对全局变量的时候存在线程并发安全问题,这个问题可以通过加锁来解决,但 是添加锁的时候要注意:锁对象一定要统一。锁住部分的代码一定尽可能的少, 只锁住必要部分代码,如果锁住过多的代码则会导致程序的运行效率。

弃用sun公司提供的SingThreadModel 接口解决多线程并发安全问题。

解决线程安全问题:
1、 加锁:合理添加锁,锁住关键部分代码,尽可能少的降低代码的执行效率。
2、 尽可能多定义局部变量少定义全局变量,因为全局变量不可避免的会出现多线程并发安全问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值