博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Servlet里的学问(一)
阅读量:5270 次
发布时间:2019-06-14

本文共 6679 字,大约阅读时间需要 22 分钟。

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 
2
3
webdemo01
4
5
6
helloServlet
7
com.servlet.HelloServlet
8
9
10
11
helloServlet
12
/huha
13
14

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  
2
helloServlet
3
com.servlet.HelloServlet
4
5
6
username
7
yao
8
9
10
pwd
11
123456
12
13 14
15
16
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         // 接下来是方法二,使用枚举           Enumeration
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应用程序的“大管家”。

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

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

1 
2
3
webdemo01
4
5
6
driver
7
com.mysql.jdbc.Driver
8
9
10
jdbcUrl
11
jdbc:mysql://localhost:3306/db20180129
12
13
14
user
15
root
16
17
18
password
19
root
20
21 22
23
helloServlet
24
com.servlet.HelloServlet
25
26
27
username
28
yao
29
30
31
pwd
32
123456
33
34 35
36
37
helloServlet
38
/huha
39
40

使用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  
2
3
HelloServlet
4
com.demo.servlet.HelloServlet
5
6
7
user
8
root
9
10 11
12
password
13
1235
14
15
1
16
17
18
HelloServlet
19
/hey
20
21
22
23
HelloServlet
24
*.html
25

 JSP编译运行原理:F:\Program Files\WorkSpace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\webdemo01\org\apache\jsp

转载于:https://www.cnblogs.com/yaoruozi/p/8728212.html

你可能感兴趣的文章
PHP截取中英文混合字符
查看>>
电子眼抓拍大解密
查看>>
51nod1076 (边双连通)
查看>>
Linux pipe函数
查看>>
java equals 小记
查看>>
2019春 软件工程实践 助教总结
查看>>
Zerver是一个C#开发的Nginx+PHP+Mysql+memcached+redis绿色集成开发环境
查看>>
程序的静态链接,动态链接和装载 (补充)
查看>>
关于本博客说明
查看>>
[Kaggle] Sentiment Analysis on Movie Reviews
查看>>
价值观
查看>>
mongodb命令----批量更改文档字段名
查看>>
MacOS copy图标shell脚本
查看>>
国外常见互联网盈利创新模式
查看>>
android 签名
查看>>
android:scaleType属性
查看>>
mysql-5.7 innodb 的并行任务调度详解
查看>>
shell脚本
查看>>
Upload Image to .NET Core 2.1 API
查看>>
Js时间处理
查看>>