Servlet里的学问
Posted 爱生活的Mr.Yao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 Files\\WorkSpace\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp0\\work\\Catalina\\localhost\\webdemo01\\org\\apache\\jsp
以上是关于Servlet里的学问的主要内容,如果未能解决你的问题,请参考以下文章