Servlet 运行在服务器上的 java 类;
Servlet 容器为 javaWeb 应用提供运行时环境,负责管理 servlet 和 jsp 生命周期,以及管理他们的共享数据。
现在我们知道了 Servlet 是运行在服务器上的 Java 类,那么什么是服务器?我们平常最常用的服务器都有哪些呢?
服务器是一种被动程序:只有当Internet上运行其他计算机中的浏览器发出的请求时,服务器才会响应;
最常用的Web服务器是Apache和Microsoft的Internet信息服务器。
对于现在大多数 Javaweb 学习者大多数使用的是 Apache 服务器,所以我们今天也就从 Tomact 服务器开始。
Tomact 服务器的安装和配置
首先从官网上下载 Tomact 压缩包到本地,然后解压到你想要解压到的目录,会得到一个解压后的目录如下
--bin 存放启动和关闭 Tomact 的脚本文件
-- conf 存放 Tomact 服务器的各种配置文件
-- lib 存放第三方依赖 jar 包
-- logs 存放日志文件
-- temp 存放 Tomact 运行时产生的临时文件
-- webapp 发布 web 应用时,通常把 web 应用的目录和文件放到这个目录下
-- work 存放 jsp 被翻译为 Servlet 后编译的 class 文件
启动 Tomact 服务器
点击 bin/startup.bat 启动服务器;如果你点击之后只是闪了一下那么你可以查看日志文件查看错误信息,或者在 cmd 命令行下切换到 Tomact/bin 目录下,输入 startup 将会显示错误信息,而不是闪一下,找到错误信息之后发现它需要我们配置 JAVA_HOME(jdk 安装根目录) 或 JRE_HOME(jre 安装根目录) 中任何一个环境变量。
配置完成后再次点击便会成功启动服务器。
启动后在浏览器地址栏输入 localhost:8080(Apache 默认的端口号为 8080),如果出现 Apache 页面便说明启动成功(Tomcat 服务器只可以启动一个,如果你去启动第二个便会提示你端口被占用的错误信息)
我们如果每次启动服务器在命令行中的任意目录去启动而不需要在特定的目录该多方便?那么该如何实现呢?首先我们需要知道 PATH 环境变量,安装和配置 Java 时也会用到;
PATH是路径的意思,PATH环境变量中存放的值,就是一连串的路径。不同的路径之间,用英文的分号(;)分隔开。系统执行用户命令时,若用户未给出绝对路径,则首先在当前目录下寻找相应的可执行文件、批处理文件(另外一种可以执行的文件)等。若找不到,再依次在PATH保存的这些路径中寻找相应的可执行的程序文件。
如上面所述,我们把 bin 目录配置到系统环境变量 path 下,这样便不会出现错误信息(xxx 不是内部命令或外部命令,也不是可运行程序或批处理文件),但是会提示另一个错误,需要我们设置另外一个环境变量(CATALINA_HOME,Tomact 解压的根目录),同上我们去设置 CATALINA 环境变量。
设置成功后我们可以试着在任意目录下去输入 startup 来开启 Tomact。这时便可以正常启动服务器,你还可以在命令行中输入 catalina,查看 catalina 命令帮助,其中 catalina run 可以在当前窗口开启服务器,而不像 startup 那样开启另外一个窗口。开启之后可以按下 Ctrl + C 关闭服务器。
服务器介绍完毕,开始我们的正题 ---- Servlet。
1. 新建 web 工程,并新建一个类继承 Servlet 接口并实现其所有方法
2. 在 web 工程队的 web.xml 中映射 servlet 类,如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 5 version="3.1"> 6 <servlet> 7 <!--Servlet 注册的名字--> 8 <servlet-name>helloServlet</servlet-name> 9 <!--Servlet 的全类名--> 10 <servlet-class>com.javaweb.firstServlet.HelloServlet</servlet-class> 11 </servlet> 12 <servlet-mapping> 13 <!--同上一致--> 14 <servlet-name>helloServlet</servlet-name> 15 <!--映射访问的具体路径,/ 表示根目录--> 16 <url-pattern>/hello</url-pattern> 17 </servlet-mapping> 18 </web-app>
3. 我们继承 Servlet 接口的类如下,我们可以在 web 项目下的 jsp 文件中写一个超链接连接到 Servlet 的 URL,运行 web 项目执行 servlet,不断刷新页面,并在最后关闭服务器,我们可以看到控制台打印的消息,由此可知 servlet 执行顺序为(构造器-init 方法-service 方法 -----service 方法 – 关闭服务器调用 destroy 方法)
1. 构造器(只有第一次请求 Servlet 时创建 Servlet 实例调用构造器,说明 Servlet 是单实例,所以不可以写全局变量)
2. init(只被调用一次,在创建好实例后立即被调用,用于初始化当前 Servlet,构造器也可以初始化,但是 init 方法传入了构造器所没有的参数,所以使用 init 初始化 Servlet)
3. service(被调用多次,每次请求都会调用 Service 方法,被用于响应请求)
4. destroy(只被调用一次,在当前 Servlet 所在的 WEB 应用被卸载前调用,用于释放 Servlet 所占用的资源)
1 package com.javaweb.firstServlet; 2 3 import javax.servlet.*; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.util.Enumeration; 7 8 public class HelloServlet implements Servlet{ 9 10 @Override 11 public void init(ServletConfig servletConfig) throws ServletException { 12 13 System.out.println("init"); 14 } 15 16 @Override 17 public ServletConfig getServletConfig() { 18 System.out.println("getServletConfig"); 19 return null; 20 } 21 22 @Override 23 public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { 24 System.out.println("service"); 25 } 26 27 @Override 28 public String getServletInfo() { 29 System.out.println("servletInfo"); 30 return null; 31 } 32 33 @Override 34 public void destroy() { 35 System.out.println("destroy"); 36 } 37 38 public HelloServlet() { 39 System.out.println("HelloServlet"); 40 } 41 }