一、实现Servlet接口
通过实现Servlet接口来了解Servlet的生命周期
(1)以规范的形式创建一个web应用(即在webapps目录下创建一个web应用)
创建web应用
(2)classes目录下创建一个.java(该java文件为实现Servlet接口)
创建文件夹MyFirstServlet.java
代码如下:
package com.focus;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class MyFirstServlet implements Servlet
{
//Servlet引擎会在Servlet实例化之后,置入服务之前精确地调用init方法。(初始化servlet,把servlet装载到内存中)
//该函数只会被调用一次
public void init(ServletConfig config) throws ServletException{
}
//Servlet引擎调用这个方法以允许Servlet响应请求。这个方法在Servlet未成功初始化之前无法调用。(业务逻辑代码都将写在这个函数中)
//在被卸载后,还没初始化时,service不被调用,其余可重复调用
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException{
System.out.println("Hello World!");
response.getWriter().println("Hello World!"+new java.util.Date());
}
//卸载servlet
public void destroy(){
}
//得到servlet的配置信息
public ServletConfig getServletConfig(){
return null;
}
//纯文本的servlet信息
public String getServletInfo(){
return null;
}
}
编译后出现错误,导入的程序包找不到。
PS:使用dos编译时,该Java有包是 需要输入的命令行格式为
Javac -d . name.java
(3)配置CLASSPATH 即指定到tomcat的lib目录下的servlet-api.jar(其中有servlet-api.jar就是上面所引入的javax.servlet.*;
javax.servlet.http.*;)。
在配置CLASSPATH时得指定到特定.jar
不能设置*.jar ,只能一个个写,所以一般大的工程会配置一个启动脚本,专门计算出所有的jar包,然后导入启动环境中...
重启cmd.exe,再重新编译。即可
(4)配置与部署Servlet
<servlet>
<servlet-name>MyFirstServlet</servlet-name>
<display-name>MyFirstServlet</display-name>
<servlet-class>com.focus.MyFirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyFirstServlet</servlet-name>
<url-pattern>/My</url-pattern>
</servlet-mapping>
(5)最后效果:
补充:当Tomcat启动的时候首先会启动一个server.xml,当servlet映射找不到对应的,tomcat启动直接就报错。
二、配置与部署Servlet
由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上。
<servlet>
//<servlet-name>注册名、自定义一个servlet的名字
<servlet-name>MyFirstServlet</servlet-name>
<display-name>MyFirstServlet</display-name>
//</servlet-class>指定该servlet类放在哪个包中 形式 包/包/.../类(包名+类名)
<servlet-class>com.focus.MyFirstServlet</servlet-class>
</servlet>
//<servlet-mapping>servlet的映射(对一个已经注册)
<servlet-mapping>
//<servlet-name>自定义一个servlet的名字,但这个名字就代表当浏览器输入/My这个web资源的时候,该名字就映射到与之对应的名字,找到该servlet所在的class
<servlet-name>MyFirstServlet</servlet-name>
//<url-pattern>浏览器所输入的Web资源名
<url-pattern>/My</url-pattern>
</servlet-mapping>
一个注册好了的servlet可以被多次映射
如:<servlet>
<servlet-name>1</servlet-name>
<display-name>1</display-name>
<servlet-class>com.focus.MyFirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>1</servlet-name>
<url-pattern>/My</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>1</servlet-name>
<url-pattern>/Servlet/My</url-pattern>
</servlet-mapping>
<servlet-name>1</servlet-name>
<url-pattern>/Servlet/My.html</url-pattern>
</servlet-mapping>
即输入的Web资源不管是/My
或 /Servlet/My或/Servlet/My.html都可以访问到com.focus.MyFirstServlet这个类
当映射一个servlet时候,可以是多层,后缀名为html不一定就是html文件。
进行Servlet映射时,可使用通配符
有两种格式:
第一种格式 *.扩展名 如:*.html *.abc
第二种格式 以“/“开头 同时以”/*“结尾 如:/abc/* /*
例:1. <url-pattern>/*</url-pattern>
2. <url-pattern>/abc</url-pattern>
3. <url-pattern>/abc/*</url-pattern>
4. <url-pattern>*.gogo</url-pattern>
当浏览器的URL的servlet名 输入/abc时
匹配 2
当浏览器的URL的servlet名 输入/hellobaby时
匹配 1
当浏览器的URL的servlet名 输入/abc/hellobaby时
匹配 3
当浏览器的URL的servlet名 输入/hello.gogo时
匹配 1
匹配标准:
(1)匹配度高的选择映射那个
(2)*.扩展名 的优先级最低
load-on-startup元素标记
<servlet>
<servlet-name>1</servlet-name>
<display-name>1</display-name>
<servlet-class>com.focus.MyFirstServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
1)load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。
2)它的值必须是一个整数,表示servlet应该被载入的顺序
2)当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;
3)当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。
4)正数的值越小,该servlet的优先级越高,应用启动时就越先加载。
5)当值相同时,容器就会自己选择顺序来加载。
所以,<load-on-startup>x</load-on-startup>,中x的取值1,2,3,4,5代表的是优先级,而非启动延迟时间。
补充:怎样更好的管理tomcat中的web应用,即进入tomcat
Manager
Reload:即重载的意思,重新装载该web应用。
Stop:停止该web应用
好处:单独对某个web应用做相应的处理,不用对整个服务器进行操作