Servlet : Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。
它是和平台无关的服务器端组件,运行在servlet容器中,用来处理用户的请求与服务器的交互,通过调用servlet的方法,来实现用户的请求,大体模式如下图所示:
一、servlet的生命周期
那么废话不多说,我们先来创建一个servlet,在eclipse中创建web应用就不提了,这里我们建立一个java类来实现servlet接口,最本质的servlet
1 package com.servlet; 2 3 import java.io.IOException; 4 5 import javax.servlet.Servlet; 6 import javax.servlet.ServletConfig; 7 import javax.servlet.ServletException; 8 import javax.servlet.ServletRequest; 9 import javax.servlet.ServletResponse;10 11 public class HelloServlet implements Servlet{12 13 @Override14 public void destroy() {15 // TODO Auto-generated method stub16 System.out.println("服务器关闭了???");17 System.out.println("我被销毁了。。。。");18 }19 20 @Override21 public ServletConfig getServletConfig() {22 // TODO Auto-generated method stub23 return null;24 }25 26 @Override27 public String getServletInfo() {28 // TODO Auto-generated method stub29 return null;30 }31 32 @Override33 //servlet初始化34 public void init(ServletConfig arg0) throws ServletException {35 System.out.println("在这里初始化....");36 37 }38 39 @Override40 //每执行一次请求都会调用这个方法41 public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {42 // TODO Auto-generated method stub43 System.out.println("只要向浏览器发送请求就会调用我....");44 }45 46 }
在相应的web.xml中配置当前servlet信息
1 23 webdemo01 4 56 9 10helloServlet 7com.servlet.HelloServlet 811 14helloServlet 12/huha 13
OK,接下来我们就启动tomcat服务器看看servlet的整个运行
我们在浏览器里输入请求地址,huha就是<url-pattern>/huha</url-pattern>的内容,然后我们看servlet方法调用的情况,看控制台:
可以看到,第一次请求时先是调用了init()方法,其实在调用init()之前应该最先被调用的是默认的构造方法,因为毕竟servlet要被创建嘛
然后会调用service()方法,而且每请求一次,就会调用一次。不断的刷新页面,就可以看到下图的效果。
接下来就关闭服务器,看看会怎样,不过这里有一个很蛋疼的问题,就是直接在eclipse里关闭服务器,并不会显示调用destory()方法,我是通过如下方式关闭才验证的,shutdown命令执行完成以后,控制台就会输出如下:
整个上面就验证了servlet的完整的生命周期,创建之后第一次请求时即被初始化,请求就会不断执行service(),关闭服务器就会被destory掉。
二、我们看看init()的时候都会有哪些操作?
(1)获取当前servlet里的初始化参数以及对应的值,首先要做的就是在web.xml里配置当前servlet方法时,就要配置初始化参数。如下所示:
12 15helloServlet 3com.servlet.HelloServlet 4 56 9username 7yao 810 13 14pwd 11123456 1216 helloServlet 17/huha 18
获取初始化参数的代码如下所示:
1 public void init(ServletConfig servletConfig) throws ServletException { 2 System.out.println("在这里初始化...."); 3 // 获取当前servlet的初始化参数,方法一 4 String username = servletConfig.getInitParameter("username"); 5 System.out.println("username:" + username); 6 String password = servletConfig.getInitParameter("pwd"); 7 System.out.println("password:" + password); 8 // 接下来是方法二,使用枚举 Enumerationparams = servletConfig.getInitParameterNames(); while (params.hasMoreElements()) { String name = (String) params.nextElement(); String value = servletConfig.getInitParameter(name); System.out.println("-->" + name + ":" + value); 9 System.out.println("====================="); 10 }11
结果如下图所示:
(2)获取servletContext对象,这个很重要,而且使用servletContext的时候要多于servletConfig,所以看看init()的时候还可以干些什么事;servletContext对象,它是整个web应用程序的“大管家”。
每个应用都会有一个对象与之关联,当容器分布在在多个上时,web应用在所分布的每个虚拟机上都拥有一个ServletContext实例.缺省情况下,ServletContext不是分布式的,并且只存在于一个虚拟机上
首先它可以获取多个servlet公用的初始化参数,比如说配置的数据库连接信息啊这些,如下所示:
1 23 webdemo01 4 56 9driver 7com.mysql.jdbc.Driver 810 13jdbcUrl 11jdbc:mysql://localhost:3306/db20180129 1214 17user 15root 1618 21 22password 19root 2023 36helloServlet 24com.servlet.HelloServlet 25 2627 30username 28yao 2931 34 35pwd 32123456 3337 40helloServlet 38/huha 39
使用servletContext对象获取初始化参数的程序如下所示:其实也是有两种方法,单独获取或者通过枚举,这里只给出比较简单的一种吧
ServletContext servletContext = servletConfig.getServletContext(); String driver = servletContext.getInitParameter("driver"); String url = servletContext.getInitParameter("jdbcUrl"); String user = servletContext.getInitParameter("user"); String pwd = servletContext.getInitParameter("password"); System.out.println("初始化参数,driver:" + driver + ",url:" + url + ",user:" + user + ",password:" + pwd); System.out.println("=====================");这个也是在init()方法中执行的
运行结果如下图所示:
(3)servletContext对象可以获取某一个文件在服务器上的路径,比如我们在 WebContent下新建一个文件,a.txt
1 // 获取文件在服务器上绝对路径,而不是发布前的文件在磁盘上的物理路径2 String path = servletContext.getRealPath("/a.txt");3 System.out.println("路径:" + path);
运行结果如下图:
三、另外的一些东西,怕以后忘了
(1)配置servlet 时,会有<load-on-startup>3</load-on-startup>这样一个配置
说明: init()方法一般在第一次请求时会被调用,但是加了load-up,启动服务就会调用init()方法
load-on-startup的参数值若为负数,则在第一次请求时被创建,并直接调用init()方法;若为正数,值越小 就越先被启动
(2)同一个servlet可以被多次映射,即<servlet-mapping>可以配置多个,以处理不同的访问需求,例如下面的例子:
1 23 17HelloServlet 4com.demo.servlet.HelloServlet 5 67 10 11user 8root 912 15password 131235 141 1618 21 22HelloServlet 19/hey 2023 HelloServlet 24*.html 25
JSP编译运行原理:F:\Program Files\WorkSpace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\webdemo01\org\apache\jsp