什么是 Servlet:
- Servlet 是一个 JavaEE的组件,也是 JavaEE中的一个规范
- Servlet是JavaEE 中的一个规范:服务器其实就是对 Servlet 的实现
- Servlet 是一个JavaEE 的组件 :Servlet 是一个程序(类),只不过必须要遵循 Servlet 的规范
要求类:必须实现 javax.servlet.Servlet接口
1、Servlet容器 : 能够发布和运行java web 应用的web服务器
2、Servlet规范 :对javaWeb应用作了如下定义:“javaWeb 应用由一组 Servlet/JSP 、HTML文件、相关 java 类,以及其他可以被绑定的资源构成,它可以在由各种应用厂商提供的符合 Servlet 规范的 Servlet 容器中运行
3、Web应用程序 指 提供浏览器访问的程序,通常也称为web应用
Tomcat目录结构
目录 | 描述 |
---|---|
/bin | 存放在window 平台及 Linux 平台上启动和关闭 Tomcat 的脚本文件 |
/conf | 存放 Tomcat 服务器的各种配置文件,其中最重要的配置文件是server.xml |
/lib | 存放 Tomcat 服务器及所有 Web 应用都可以访问的 JAR 文件 |
/webapps | 在Tomcat 上发布 javaWeb 应用时,默认把Web 应用文件放于此目录下 |
/work | Tomcat的工作目录,Tomcat在运行时把生成的一些工作文件放于此目录下 |
JavaWeb 应用的 lib 子目录:存放的JAR 文件只能被当前 javaWeb 应用访问。
Tomcat的类加载器负责为 Tomcat 本身 及 javaWeb应用加载相关的类。
假如 Tomcat的类加载器要为一个 javaWeb 应用加载一个名为 Sample 的类,则类加载器会按照如下顺序到各个目录去查找 Sample 类的.class 文件,知道找到为止,如都不存在则抛出异常:
- JavaWeb 应用的 WEB-INF/classes 目录下直接查找 Sample.class 文件
- JavaWeb 应用的 WEB-INF/lib 目录的JAR文件中查找 Sample.class 文件
- Tomcat 的 lib子目录下直接查找 Sample.class 文件
- Tomcat 的 lib子目录的JAR文件中查找 Sample.class 文件
Web应用目录结构 (假设有一个helloapp的web程序)
/helloapp ————Web应用的根目录,所有JSP和html文件都存放此目录(根目录文件外界可访问)
|
|——JSP、HTML、css、JavaScript文件等
|
|——/WEB-INF (该目录下的文件外界无法直接访问,由Web服务器调用)
|
|——/classes (存放各种 .class 文件),Servlet类的.class 文件也放与此目录
|——/lib (存放 web应用所需要的各种 jar 文件)
|——web.xml (web应用的配置文件)
- 在 WEB-INF 目录的 classes 及 lib子目录下,都可以存放 java类文件
- 在运行时,Servlet 容器(Tomcat)的类加载器
- 先 加载 classes 目录下的类,
- 再加载lib目录下的 JAR 文件(java 类库的打包文件)中的类。
- 因此,如果两个目录下存在同名的类,classes 目录下的类具有优先权
Web 组件的 URL
-
Web 应用的默认 URL 入口都是 Web 应用的根目录名,例如上面的 helloapp应用,它的URL 入口为/helloapp
-
假设有一个 helloapp / dir1/dir2/hello.jsp 文件
那么它的 URL 为http://localhost/helloapp/dir1/dir2/hello.jsp
可以在 web.xml 文件中对其映射 URL ,(简短访问的URL)
对于 Servlet,需要在 web.xml 文件中对其映射URL。
Servlet的URL由web.xml文件中的 元素来指定.如下
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>mypack.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/dispatcher</url-pattern>
</servlet-mapping>
<!-- 这些元素都是在根<web-app>中 -->
以上元素的值为“/dispatcher”,因此访问 mypack.DispatcherServlet 类的 URL
为 http://loacalhost/helloapp/dispatcher
。
当浏览器端首次访问通过该 URL 请求访问 DispatcherServlet 时,Tomcat 需要先找到文件系统中的 DispatcherServlet.class 文件,从而加载 DispatcherServlet 类。Tomcat 查找 DispatcherServlet.class 文件的步骤如下:
-
参考 helloapp 应用的 web.xml 文件,找到 子元素的值为 "/dispatcher"的 元素
-
读取 元素的子元素的值,由此确定 Servlet 的名字为 “dispatcher”。
-
找到 子元素的值为 “disptcher” 的 元素.
-
读取元素的 子元素的值,由此确定 Servlet 的类名为 “mypack.DispatcherServlet”
-
到当前应用的WEB-INF 目录下的 classes /mypack 包下查找 DispatcherServlet.class 文件
(如果在此目录中未找该.class 参考 Tomcat目录介绍最下面那个顺序加载类)
可以参考如下:Servlet的请求流程
部署Web项目的几种方式
1、直接把项目的 web根路径,拷贝到 Tomcat 根 / webapps 目录中
该方式不支持热部署。(代码变动之后,需要重新部署,重新部署的成本很大)
把所有的项目都部署在该路劲,启动越来越慢,若其中一个项目有问题,Tomcat是启动不了的
- 告诉 Tomcat 服务器,从指定的路径去部署项目
- 找到 Tomcat 根 / conf / servlet.xml 文件
- 在元素之间,编写 元素,如下
- path:指定访问 Web 应用的 URL 入口
- context还有一个 reloadable属性,该属性默认false
简单来说当该属性设置为 true 时,Tomcat服务器在运行状态会监视 WEB-INF/classes 和 WEB-INF/lib 目录下的class文件的改动,以及监视Web 应用的 WEB-INF/web.xml文件的改动,如果检测到改动,服务器会自动重新加载 Web应用 。
- Tomcat5.5开始推荐的另外一种方式部署项目:(本质和方式二相同)
步骤:- 找到 Tomcat 根/ conf /Catalina / localhost 新建一个 xml 文件: 比如 abc.xml(xml文件即可)
- 内容是:
此时该文件的名字,就相对于是第一种方式的 path 值(上下文名字)
访问:http: //localhost /abc/index.html