- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
正如我们所知,init()
完成构造函数的工作,而 destroy()
与 servlet 的 finalize 方法相同,拥有构造函数和Servlet
中的 finalize()
方法。
现在的问题是:如果在Servlet中定义了一个构造函数和一个finalize()
方法,它们会被调用吗?是不是就像我们将在构造函数中初始化的任何内容都将被 init()
中的内容覆盖,或者根本不会调用构造函数?
最佳答案
让我们先回顾一些假设。更多详细信息,请参阅帖子的其余部分。
As we know init() does the job of constructor
不,它没有。它有很大的不同:
throws ServletException
,ServletConfig
参数,* 它调用其父构造函数(因为 Java 默认调用父构造函数的无参数)。对于最后一点,在一般情况下这并不重要,因为 Servlet
和 HttpServlet
什么都不做,但是如果使用这些抽象类的扩展,那么你不应该假设 他们 也没有搞砸构造函数并在其中做事。虽然您可以从 init()
中选择不调用父级 init()
,但父级的无参数构造函数将始终被调用。
[...] and destroy() the same of finalize method
不,不是。
there is no harm having a constructor and finalize method in a servlet
如果在构造函数和终结器中发生异常,可能会造成伤害,无论如何我肯定不建议使用它们,但建议坚持使用 init()
和 destroy()
以符合规范。规范中未定义自定义构造函数和析构函数抛出的异常的异常处理规则,因此这些将是未定义的行为/容器特定的。
will they be called?
你尝试了吗?会发生什么?
(是的:no-arg 构造函数将为每个新线程实例调用,并且终结器将被调用...只要 GC 愿意。 )
is it like whatever we will initialize in constructor will be overriden with that in init() or constructor wont be called at all?
init()
不是构造函数。
您可以覆盖 init()
中在构造函数中初始化的某些内容(例如成员变量),或者撤消/还原您在构造函数中执行的操作。看不出这会有用的原因,但您可能可以。但它们不会相互抵消,如果那是你的意思的话。
我在这里问自己的问题更多:
摘自 Servlet Lifecycle 上的 Java EE 6 教程部分:
- If an instance of the servlet does not exist, the web container
- Loads the servlet class.
- Creates an instance of the servlet class.
- Initializes the servlet instance by calling the init method. Initialization is covered in Creating and Initializing a Servlet.
- Invokes the service method, passing request and response objects. Service methods are discussed in Writing Service Methods.
- If it needs to remove the servlet, the container finalizes the servlet by calling the servlet’s destroy method. For more information, see Finalizing a Servlet.
[...]
Any number of exceptions can occur when a servlet executes. When an exception occurs, the web container generates a default page containing the following message:
A Servlet Exception Has Occurred
init()
让我们回顾 init()
上的 Javadoc (强调我的)
Called by the servlet container to indicate to a servlet that the servlet is being placed into service.
The servlet container calls the init method exactly once after instantiating the servlet. The init method must complete successfully before the servlet can receive any requests.
The servlet container cannot place the servlet into service if the init method
- Throws a ServletException
- Does not return within a time period defined by the Web server
因此,请注意不要在您的 init()
中做任何消耗过多的事情,以及只需要做一次的事情。如果它是所有请求都需要做的事情,那么在请求处理方法中做它(例如doGet()
, doPost()
, ...)。
另见 Creating and Initializing a Servlet在Java EE 6 Tutorial (and for Java EE 5)。
destroy()
Called by the servlet container to indicate to a servlet that the servlet is being taken out of service. This method is only called once all threads within the servlet's service method have exited or after a timeout period has passed. After the servlet container calls this method, it will not call the service method again on this servlet.
This method gives the servlet an opportunity to clean up any resources that are being held (for example, memory, file handles, threads) and make sure that any persistent state is synchronized with the servlet's current state in memory.
另见 Finalizing a Servlet在Java EE 6 Tutorial ( and for Java EE 5 )(诚然,他们在这里选词不当……)。
参见 http://oreilly.com/catalog/jservlet/chapter/ch03.html#15894 :
Why not use a constructor instead? Well, in JDK 1.0 (for which servlets were originally written), constructors for dynamically loaded Java classes (such as servlets) couldn't accept arguments. So, in order to provide a new servlet any information about itself and its environment, a server had to call a servlet's init() method and pass along an object that implements the ServletConfig interface. Also, Java doesn't allow interfaces to declare constructors. This means that the javax.servlet.Servlet interface cannot declare a constructor that accepts a ServletConfig parameter. It has to declare another method, like init(). It's still possible, of course, for you to define constructors for your servlets, but in the constructor you don't have access to the ServletConfig object or the ability to throw a ServletException.
特别注意最后一句话:
[...] but in the constructor you don't have access to the ServletConfig object or the ability to throw a ServletException.
所以在 servlet 的构造函数中做任何事情都是:
关于java - Servlet 中的构造函数和 finalize() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17021689/
关闭。这个问题需要更多 focused .它目前不接受答案。 想要改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 2 年前。 Improve this q
1.final final修饰类,说明这个类不能被继承,是以个顶级类。 final修饰变量,说明这个变量是常量。 final修饰方法,表示这个方法不能被重写,不过可以冲在final方法。 比如有个
我喜欢使用 -Wsuggest-final-types 编译我的代码和 -Wsuggest-final-methods以便在可能使用 final 关键字以允许编译器更积极地优化的机会时收到警告。 不过
我在 Java 8 中有一个异步操作,它返回一个 onError 回调或一个 onSuccess 回调。如果操作成功与否,我需要在我的方法内部返回。所以我返回一个 boolean 值来说明这个信息。我
我正在阅读一些内容,需要对最终类和方法进行一些说明。我的理解是,将一个类声明为 final 会阻止该类被扩展。因此,是否有必要将最终类中的方法声明为最终的?在我看来,如果类不能扩展,则没有必要将方法声
有什么区别 try { // action A } catch(Exception e) { // action B } finally { // action C }
这个程序是我类(class)的最终作业,我无法弄清楚为什么我收到错误“从内部类引用的局部变量必须是最终的或有效的最终”。该程序正在运行并发线程来对# 数组进行排序,然后找到该数组的高值和低值。当我在没
C++11 added final. 终于! 我了解 final 做了两件事: 使类不可继承。 使类中的(虚拟)函数不可覆盖(在派生类中)。 这两者似乎是相互独立的。但以以下为例: class Foo
我想使用具有多个提交按钮的react-final-form构建表单,其中每个提交按钮在表单中设置不同的值。本质上,我想创建一个在呈现的HTML中看起来像这样的表单: Are you over 1
我想知道什么时候应该对变量和(或)方法使用静态、最终、静态最终参数。据我了解: final:类似于c++中的const参数。它基本上意味着值(或在方法中 - 返回值)不会改变。 静态:这意味着值(或方
我正在做一个编程类(class)项目,用于 400 行矩阵本身的矩阵乘法。我让它以顺序模式工作,该项目的目标是编写并行实现。 我有以下代码,当然,当我尝试引用内部类中的计数器 j 时,我收到一个关于
也许这是简单的问题,但我找不到答案。 声明为final的经典变量是否包含与非final变量不同的内存段? 最佳答案 我想说,谈到局部变量,基于 this answer 是不行的。 : The trut
考虑以下代码: #include class B { virtual void f() { std::cout << "Base" << '\n'; } }; class D
这个问题已经有答案了: java: Is it possible to set a lambda expression for an array of Buttons is a for loop? I
考虑这个代码片段 public class ConstantFolding { static final int number1 = 5; static final int numbe
我确定在内部类中访问的变量应该声明为final 或有效final。但在下面的情况下我很困惑。不知道是不是我理解错了。 public class MyClass { private boolea
我必须将一个 java.sql.Connection 对象传递给一个匿名内部类,这意味着我必须对它进行 final 引用。但是,我担心任何资源泄漏。 public static String foo(
我收到 SonarQube 错误:“强烈建议在此方法实现结束时调用 super.finalize(),以防父实现也必须释放一些系统资源。” 但我发现 Object 类没有实现 finalize方法。
我一般认为资源清理是在 finally block 中完成的, 最近我在一个类中发现了这个特定的代码片段,它覆盖了 Object 类'finalize()方法。 protected void fina
让我们在父类中使用这个方法: public void calculateSum(int a, final int b) { } 子类有: public void calculateSum(int a,
我是一名优秀的程序员,十分优秀!