Servlet映射、生命周期和相对路径与绝对路径

Servlet映射、生命周期和相对路径与绝对路径

  • 一、tomcat和servlet的关系
  • 二、Servlet映射
  • 三、Servlet生命周期
  • 四、HttpServlet中的service()、doPost()、doGet()的区别
  • 五、相对路径与绝对路径

一、tomcat和servlet的关系

Tomcat 是Web应用服务器,是一个Servlet/JSP容器. Tomcat 作为Servlet容器,负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户.而Servlet是一种运行在支持Java语言的服务器上的组件.

二、Servlet映射

  1. 当创建一个TestServlet文件的时候,需要在web.xml中配置TestServlet文件。
public class DataServlet extends HttpServlet {
     
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
		// TODO Auto-generated method stub
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
		// TODO Auto-generated method stub
	}

}
  1. 为什么需要在web.xml中配置TestServlet。让浏览器发出的请求知道到达哪个servlet,也就是让tomcat将封装好的request找到对应的servlet让其使用
  <servlet>
  	
  	<servlet-name>TestServletservlet-name>
  	
  	<servlet-class>com.jd.TestServletservlet-class>
  servlet>
  <servlet-mapping>
  	
  	<servlet-name>TestServletservlet-name>
  	
  	<url-pattern>/TestServleturl-pattern>
  servlet-mapping>

映射步骤:首先浏览器通过127.0.0.1/test/TestServlet来找到web.xml中的url-pattern。2.匹配到了url-pattern后,就会找到第二步servlet的名字TestServlet,知道了名字,就可以通过servlet-name找到第三步,也就能够知道servlet的位置了。然后到其中找到对应的处理方式进行处理。

三、Servlet生命周期

init( ),service( ),destroy( )是Servlet生命周期的方法。代表了Servlet从“出生”到“工作”再到“死亡 ”的过程。Servlet容器(例如TomCat)会根据下面的规则来调用这三个方法:

  1. init( ),当Servlet第一次被请求时,Servlet容器就会开始调用这个方法来初始化一个Servlet对象出来,但是这个方法在后续请求中不会在被Servlet容器调用。我们可以利用init( )方法来执行相应的初始化工作。调用这个方法时,Servlet容器会传入一个ServletConfig对象进来从而对Servlet对象进行初始化。同时也可用于获取web.xml中的数据
	//sevlet对象属于实例(程序运行结束之前,缓存中只有一个对象存在)
    public TestServlet() {
     
    	//用于成员变量赋值,会触发对象创建
    	//默认情况下,第一次使用该Servlet时创建对象
    	//如果配置1,则servlet对象随着tomcat的启动而创建
        super();
    }

	public void init() throws ServletException {
     
		//servlet对象创建后,该方法立即执行,用于获取web.xml中的数据。
		//由于servlet方法式单例,仅仅创建一次,所以该方法只执行一次
		super.init();
		//System.out.println("init"+this);
		String name = getServletContext().getInitParameter("name");//获取web.xml中多个Servlet共享的值
		System.out.println(name);
		String mobile = getInitParameter("mobile");//获取自己Servlet的值
		System.out.println(mobile);
	}
	
	@Override
	public void init(ServletConfig config) throws ServletException {
     
		super.init(config);
		//System.out.println("init(ServletConfig config)"+this);
		String name = config.getServletContext().getInitParameter("name");//获取web.xml中多个Servlet共享的值
		System.out.println(name);
		String mobile = config.getInitParameter("mobile");//获取自己Servlet的值
		System.out.println(mobile);
	}

web.xml中配置:

  <context-param>
  	
  	<param-name>nameparam-name>
  	<param-value>Jimmyparam-value>
  context-param>
  <servlet>
  	<servlet-name>TestServletservlet-name>
  	<servlet-class>com.zzu.servlet.TestServletservlet-class>
  	<init-param>
  		
  		<param-name>mobileparam-name>
  		<param-value>110param-value>
  	init-param>
  	<load-on-startup>1load-on-startup>
  servlet>
  <servlet-mapping>
  	<servlet-name>TestServletservlet-name>
  	<url-pattern>/TestServleturl-pattern>
  servlet-mapping>
  1. service( )方法,每当请求Servlet时,Servlet容器就会调用这个方法。第一次请求时,Servlet容器会先调用init( )方法初始化一个Servlet对象出来,然后会调用它的service( )方法进行工作,但在后续的请求中,Servlet容器只会调用service方法了。
	//任何请求优先到达service方法,通过该方法确定执行doGet还是doPost
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     
		// TODO Auto-generated method stub
		super.service(req, resp);//将这行代码注释将不执行doget或dopost方法
	}
	
	
	//a连接 form指定method标签属性get,异步不写或者指定为get
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
	}
	
	//form指定method标签属性get,异步指定为get
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
	}
  1. destory,当要销毁Servlet时,Servlet容器就会调用这个方法。在卸载应用程序或者关闭Servlet容器时,就会发生这种情况,一般在这个方法中会写一些清除代码。
	//Servlet对象销毁之前调用,用于释放资源。由于servlet方法式单例,仅仅创建一次,所以该方法只执行一次
	//Tomcat服务器关闭时调用,项目重新发布前调用
	@Override
	public void destroy() {
     
		super.destroy();
		System.out.println("destroy"+this);
	}

四、HttpServlet中的service()、doPost()、doGet()的区别

  1. Service() 方法:
    不管是 get 方式或是 post 方式的请求,如果 自己写的Servlet 类中有 service() 方法,则优先调用 Service 方法进行处理。(如果覆写的service方法中调用了父类的servic()方法super.service(req,resp),则service方法处理完后,会再根据请求方式相应的doPost或是doGet方法执行)。

  2. doGet() 方法:
    在没有 service 方法的情况下如果是 get 方式的请求所调 用的处理请求的方法

  3. doPost() 方法:
    在没有 service 方法的情况下如果是 post 方式的请求所调 用的处理请求的方法

Servlet映射、生命周期和相对路径与绝对路径_第1张图片

Servlet映射、生命周期和相对路径与绝对路径_第2张图片
执行结果:我是service方法

五、相对路径与绝对路径

在Servlet中,"/“代表Web应用的根目录。
“./” 代表当前目录,”…/"代表上级目录

动态获取根目录目录:
request.getContextPath()

Servlet映射、生命周期和相对路径与绝对路径_第3张图片

你可能感兴趣的:(Java中级,servlet)