Servlet中init方法,关于编译时期的this对象和运行时期的this对象

package com.ligong.servlets;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

//缺省适配器设计模式


public abstract class GenericServlet implements Servlet,ServletConfig{
	private ServletConfig config;
   
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		return this.config;
	}

	public String getServletInfo() {
		// TODO Auto-generated method stub
		return null;
	}

	public void init(ServletConfig config) throws ServletException {
		this.config=config;
		
	}

   //让子类来实现

```java
	public abstract void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException;
	
	public String getInitParameter(String name) {
		// TODO Auto-generated method stub
		return config.getInitParameter(name);
	}
	public Enumeration getInitParameterNames() {
		// TODO Auto-generated method stub
		return config.getInitParameterNames();
	}
	public ServletContext getServletContext() {
		// TODO Auto-generated method stub
		return config.getServletContext();
	}
	public String getServletName() {
		// TODO Auto-generated method stub
		return config.getServletName();
	}

}

子类:

package com.ligong.servlets;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class SomeServlet extends GenericServlet {

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		System.out.println("执行SomeServlet的service()服务");
		String name=this.getInitParameter("name");
		System.out.println("name:"+name);
		
	}
@Override
	public void init(ServletConfig config) throws ServletException {//该行config是来自服务器的
		// TODO Auto-generated method stub
		super.init(config);
	}
}

如果子类要重写父类的init方法,那么必学显示的super 来自父类的init,不过不显示的super父类的init方法,那么当子类实例化话调用父类中设计到引用config对象所调用方法的时候,肯定会出现空指针异常,而且报错方式肯定是来自父类。
在这里插入图片描述

编译时期this关键字指向的是当前类创建的对象,
在运行时期this关键指向的就是子类创建的对象。
父类:
在这里插入图片描述
在这里插入图片描述
子类
在这里插入图片描述
只是,没有重写,也不需要进行重写。,所以不会执行无参数的init
在这里插入图片描述
那么当代码执行到了继承的父类的init方法的时候,其实这个时候的对象是Someservlet
那么所以
this.init();所指向的是子类中的无参初始化方法,而不是父类的无参构造方法。

模版方法设计模式:
父类:

package com.ligong.servlets;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

//缺省适配器设计模式
public abstract class GenericServlet implements Servlet,ServletConfig{
	private ServletConfig config;
   
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		return this.config;
	}

	public String getServletInfo() {
		// TODO Auto-generated method stub
		return null;
	}

	public void init(ServletConfig config) throws ServletException {
		this.config=config;
		this.init();//编译期间,这个方法确实调用的是当前你类中的无参init();
		
	}
	public void init() {
		System.out.println("无参数的初始化");

	}
   //让子类来实现
	public abstract void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException;
	
	public String getInitParameter(String name) {
		// TODO Auto-generated method stub
		return config.getInitParameter(name);
	}
	public Enumeration getInitParameterNames() {
		// TODO Auto-generated method stub
		return config.getInitParameterNames();
	}
	public ServletContext getServletContext() {
		// TODO Auto-generated method stub
		return config.getServletContext();
	}
	public String getServletName() {
		// TODO Auto-generated method stub
		return config.getServletName();
	}

}

子类:

package com.ligong.servlets;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class SomeServlet extends GenericServlet {

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		System.out.println("执行SomeServlet的service()服务");
		String name=this.getInitParameter("name");
		System.out.println("name:"+name);
		
	}
	/*@Override
	public void init(ServletConfig config) throws ServletException {
		// TODO Auto-generated method stub
		super.init(config);
	}*/
	@Override
	public void init() {
		System.out.println("======");
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Code攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值