Servlet的init()方法和service()方法的区别是什么

本文详细解析Servlet的init方法,包括其参数ServletConfig的作用、方法实现原理及使用场景,重点介绍了如何利用init方法获取配置参数并进行一次性初始化操作。
nit方法是在Servlet实例化之后执行的,并且只执行一次。
一.先说init(ServletConfig)中参数ServletConfig,代表的是配置信息。即在web.xml中配置的信息,比如:
                        <servlet>                
                                <servlet-name>myfirstservlet</servlet-name>            
                                <servlet-class>as</servlet-class>    
                                <init-param>
                                    <param-name>name</param-name>
                                    <param-value>小明</param-value>
                                </init-param>
                                <init-param>
                                    <param-name>age</param-name>
                                    <param-value>25</param-value>
                                </init-param>
                        </servlet>
   在程序中可以用this.getServletConfig()方法得到ServletConfig的实例,然后用ServletConfig的相应方法可以得到ServletConfig的名字(getServletName)和配置参数的名字(getInitParameter("name"))或者名字枚举(getInitParameterNames()),并且通过参数名字得到相应的参数值。具体方法参见API。

二.再说说init方法,从源码中我们不难发现:Servlet接口里面只有init(ServletConfig),这是供tomcat调用的。GenericServlet类里面有成员变量ServletConfig,init(ServletConfig)方法和init()方法:

                        private transient ServletConfig config;

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

                        public void init() throws ServletException{

                        }
现在一切都很明了了,当容器(tomcat)帮忙调用init(ServletConfig config)并且给传过来一个参数config,这个方法把参数对象的引用指向类的成员变量this.config,并且调用类的 this.init()方法。有人问了,我们在写Servlet类时只要重写init(ServletConfig config)就可以了,init()不就成了多余的了吗?实际上init()方法是为了防止程序员在写Servlet类重写 init(ServletConfig config)时忘记写super.init(ServletConfig config),这样就容易造成出现空指针异常。而这就要求我们最好不要重写init(ServletConfig config),而要重写init()方法,就可以不写super。Servlet,你真是绕死人不偿命! 

有时候希望在servlet首次载入时,执行复杂的初始化任务,但并不想每个请求都重复这些任务的时候,用init()方法他在servlet初次创建时被调用,之后处理每个用户的请求时,则不在调用这个方法。因此,他主要用于一次性的初始化,和applet的init方法相同。
   由于servlet初始化参数的使用非常依赖于部署描述文件(web.xml),该文件可存放servlet所需要的起始参数以及web应用程序的结构数据。当servlet容器读取web.xml文件内容后。可以将这些起始参数封装成一个对象并在调用init方法时传递个servlet,这个对象就是ServletConfig对象所以我们可以在Servlet内覆写init方法,并通过ServletCongig对象来取得某些初始参数。
   以init参数的名称为参数,调用ServletConfig的getInitParameter方法。返回值就是init参数的值。
程序运行应该是 先 init方法 然后service方法 然后经过service方法 判断你提交的模式是post还是get 然后调用其中一个方法 你可以去试验一下 在init 和 service方法 中写一句后台打印 然后看哪段话先出来就知道了



Servlet编程中,`init()`方法`service()`方法Servlet生命周期中的两个重要阶段: 1. `init()`方法: - **初始化阶段**: 当Servlet被容器初次加载到内存中并且尚未接收任何HTTP请求之前,`init()`方法会被调用。这个方法主要用于设置一些全局的、不会改变的对象或配置信息,如数据库连接、缓存实例等。如果`init()`方法抛出异常,Servlet将无法正常启动,且容器通常会关闭该Servlet。 2. `service()`方法: - **响应请求阶段**: 当Servlet接收到客户端的HTTP请求后,`service()`方法负责处理实际的业务逻辑。它接受一个`ServletRequest`一个`ServletResponse`作为参数,根据请求的方法(GET、POST等)调用相应的处理器。每个HTTP方法映射到`doGet()`、` doPost()`等子方法上,这些都是`service()`方法内部调用的。 为了演示这两个方法区别,你可以创建一个简单的Servlet并分别覆盖它们: ```java import javax.servlet.*; import java.io.IOException; @WebServlet("/MyServlet") public class MyServlet extends HttpServlet { private String initMessage; // Override init() method @Override public void init() throws ServletException { initMessage = "This is the initialization phase."; System.out.println(initMessage); } // Override service() method @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { initMessage += "\nNow handling a request."; System.out.println(initMessage); // Your custom logic here... // response.getWriter().write("Hello from MyServlet"); } } ``` 部署这个Servlet后,你可以访问`/MyServlet`看到`init()`方法执行的初始化消息,然后发送多次请求,每次都会触发`service()`方法及其后续逻辑。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值