从零开始学习Java Web(二):初步认识Servlet

    这一章我们不深究Servlet是什么,我们来讲讲Servlet有什么。首先先新建一个class,继承HttpServlet,然后重写Servlet生命周期的三个重要方法。

package com.hxl.servlet;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FirstServlet extends HttpServlet {
	@Override
	public void init(ServletConfig config) throws ServletException {
		// TODO Auto-generated method stub
	}

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}
	
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
	}
}
首先说一下init(ServletConfig config)方法,该方法在整个servlet生命周期中只会运行一次,所以通常用来做一些变量的初始化工作,那么,init(ServletConfig)方法到底在什么时候运行呢?方法包含一个ServletConfig对象,那么ServletConfig到底是什么东西呢?

我们不妨看看它有什么方法:

从零开始学习Java Web(二):初步认识Servlet_第1张图片

我们不难发现,它包含的方法很少,从红色方框中我们很容易就能猜到,第一个是根据参数名拿到参数值,第二个是拿到全部参数名称,我们来看看第三个,该方法会返回一个ServletContext对象,不仔细看,一眼还以为它和SercletConfig是同名呢。那么,ServletConfig和ServletContext的区别是什么?


首先,它们作用域不同,ServletConfig的作用域是Servlet,ServletContext作用域是整个项目。一个项目可以有多个Servlet,每个Servlet有一个ServletConfig,但是所有的Servlet共享一个ServletContext。

其次,ServletContext有setInitParameter()方法,我们可以在任意能获取到ServletContext的地方()对其进行设置值,但是ServletConfig没有,也就是说ServletConfig不能手动设置值,那么,问题来了,我们怎么对其设置值?

要回答以上的问题,我们先看看web.xml



	testWeb
	
		index.jsp
	
	
		
		first
		
		com.hxl.servlet.FirstServlet
		
		
			name
			hxl
		
		
		1
	

	
		
		first
		
		/first/*
	

	
	
		name
		root
	

这里我们先做一个简单的理解:中的中的是对应的,这个名字可以随意给,是响应的请求地址。当我们发起一个请求时,服务器会先去寻找匹配的url-pattern,获取同一个的值,再找到相同的中的,调用该class的service(request,response)方法。


问题1:init(ServletConfig)方法什么时候执行?

答:当servlet设置1的时候,服务器启动该servlet就会跟随着启动,就会执行init(ServletConfig)方法。如果不设置,那么则会在第一个客户端访问的时候调用init方法

延伸问题:标签里的数字必须是1么,可以设置成其他数字么,如果可以,数字的大小会不会影响servlet初始化的顺序?

答:只要是大于0并且在int最大值范围内的数都可以,数字的大小不影响初始化顺序


问题2:怎么设置ServletConfig和ServletContext的值?

答:ServletConfig:在里的标签里设置。

ServletContext:在里设置,或者通过getServletContext().setInitParameter()进行设置值。


问题3:ServletConfig和ServletContext有什么用?

答:存放变量。所有的Servlet都能访问ServletContext,只能单独访问各自的ServletConfig,知道这个就能知道什么变量该存放到什么地方。这时候你会想到:我定义一个Constant类,里面的变量都是public static 修饰的,照样能实现ServletContext的作用啊......确实,在开发中,这样也可以


==================分割线=======================

接下来我们看service()方法,我们可以看到两个变量,分别是HttpServletRequest和HttpServletResponse。那么,service方法什么时候会调用?HttpServletRequestHttpServletResponse又是怎么得到的?

首先,当浏览器发出一个请求时,服务器就会创建一个新的线程,并初始化一个HttpServletRequest和HttpServletResponse对象,并把请求的信息设置到HttpServletRequest对象中,之后会执行service方法,将两个对象传递到service()方法中。所以,每有一次请求,就会调用一次service方法

destroy()方法就更不用说了,当服务器关闭时,会调用destroy()方法。


这一章我们不再过多的讲述HttpServletRequestHttpServletResponse过多的知识点,后面会结合session和cookie再深入讨论。


后记:如果本文中有什么说得不对的地方,欢迎指正交流,将不胜感激~~~


你可能感兴趣的:(JAVA,Web)