Servlet里的学问(一)

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     @Override
14     public void destroy() {
15         // TODO Auto-generated method stub
16       System.out.println("服务器关闭了???");
17       System.out.println("我被销毁了。。。。");
18     }
19 
20     @Override
21     public ServletConfig getServletConfig() {
22         // TODO Auto-generated method stub
23         return null;
24     }
25 
26     @Override
27     public String getServletInfo() {
28         // TODO Auto-generated method stub
29         return null;
30     }
31 
32     @Override
33     //servlet初始化
34     public void init(ServletConfig arg0) throws ServletException {
35         System.out.println("在这里初始化....");
36         
37     }
38 
39     @Override
40     //每执行一次请求都会调用这个方法
41     public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
42         // TODO Auto-generated method stub
43         System.out.println("只要向浏览器发送请求就会调用我....");
44     }
45 
46 }

在相应的web.xml中配置当前servlet信息

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
 3   <display-name>webdemo01</display-name>
 4   <!-- 配置servlet信息 -->
 5   <servlet>
 6   <servlet-name>helloServlet</servlet-name>
 7   <servlet-class>com.servlet.HelloServlet</servlet-class>
 8   </servlet>
 9   <!-- 配置访问信息 -->
10   <servlet-mapping>
11   <servlet-name>helloServlet</servlet-name>
12   <url-pattern>/huha</url-pattern>
13   </servlet-mapping>
14 </web-app>

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方法时,就要配置初始化参数。如下所示:

 1  <servlet>
 2     <servlet-name>helloServlet</servlet-name>
 3     <servlet-class>com.servlet.HelloServlet</servlet-class>
 4     <!-- 配置servlet的初始化参数 -->
 5     <init-param>
 6     <param-name>username</param-name>
 7     <param-value>yao</param-value>
 8     </init-param>
 9     <init-param>
10     <param-name>pwd</param-name>
11     <param-value>123456</param-value>
12     </init-param>
13     
14   </servlet>
15   <servlet-mapping>
16     <servlet-name>helloServlet</servlet-name>
17     <url-pattern>/huha</url-pattern>
18   </servlet-mapping>

获取初始化参数的代码如下所示:

 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         // 接下来是方法二,使用枚举
Enumeration<String> params = 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应用程序的“大管家”。

每个应用都会有一个ServletContext对象与之关联,当容器分布在在多个虚拟机上时,web应用在所分布的每个虚拟机上都拥有一个ServletContext实例.缺省情况下,ServletContext不是分布式的,并且只存在于一个虚拟机上

首先它可以获取多个servlet公用的初始化参数,比如说配置的数据库连接信息啊这些,如下所示:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
 3   <display-name>webdemo01</display-name>
 4   <!-- 配置整个web应用,多个servlet公用的初始化参数 -->
 5   <context-param>
 6   <param-name>driver</param-name>
 7   <param-value>com.mysql.jdbc.Driver</param-value>
 8   </context-param>
 9   <context-param>
10   <param-name>jdbcUrl</param-name>
11   <param-value>jdbc:mysql://localhost:3306/db20180129</param-value>
12   </context-param>
13   <context-param>
14   <param-name>user</param-name>
15   <param-value>root</param-value>
16   </context-param>
17   <context-param>
18   <param-name>password</param-name>
19   <param-value>root</param-value>
20   </context-param>
21   
22   <servlet>
23     <servlet-name>helloServlet</servlet-name>
24     <servlet-class>com.servlet.HelloServlet</servlet-class>
25     <!-- 配置servlet的初始化参数 -->
26     <init-param>
27     <param-name>username</param-name>
28     <param-value>yao</param-value>
29     </init-param>
30     <init-param>
31     <param-name>pwd</param-name>
32     <param-value>123456</param-value>
33     </init-param>
34     
35   </servlet>
36   <servlet-mapping>
37     <servlet-name>helloServlet</servlet-name>
38     <url-pattern>/huha</url-pattern>
39   </servlet-mapping>
40 </web-app>

使用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  <!-- 同一个servlet可以被多次映射 -->
 2   <servlet>
 3   <servlet-name>HelloServlet</servlet-name>
 4   <servlet-class>com.demo.servlet.HelloServlet</servlet-class>
 5   <!-- 配置初始化参数 -->
 6   <init-param>
 7   <param-name>user</param-name>
 8   <param-value>root</param-value>
 9   </init-param>
10   
11    <init-param>
12   <param-name>password</param-name>
13   <param-value>1235</param-value>
14   </init-param>
15   <load-on-startup>1</load-on-startup>
16   </servlet>
17   <servlet-mapping>
18   <servlet-name>HelloServlet</servlet-name>
19   <url-pattern>/hey</url-pattern>
20   </servlet-mapping>
21   <!-- ===========所有请求为html后缀的都由HelloServlet来处理 -->
22   <servlet-mapping>
23   <servlet-name>HelloServlet</servlet-name>
24   <url-pattern>*.html</url-pattern>
25   </servlet-mapping>

 JSP编译运行原理:F:Program FilesWorkSpace.metadata.pluginsorg.eclipse.wst.server.core mp0workCatalinalocalhostwebdemo01orgapachejsp

原文地址:https://www.cnblogs.com/yaoruozi/p/8728212.html