**
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、 尽可能多定义局部变量少定义全局变量,因为全局变量不可避免的会出现多线程并发安全问题。