我有一个Servlet类来处理我不想在每个Servlet上重复的函数。我还在努力(即它仍然只加载index.jsp而不是其他文件)。
public class MyServlet extends HttpServlet {
public MyServlet () {
super();
}
public void loadView (HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
RequestDispatcher dispatcher = request.getRequestDispatcher("/index.jsp");
response.setContentType("text/html;charset=UTF-8");
System.out.println("MyServlet::LoadView() success");
dispatcher.forward(request, response);
}
}
我的Servlet如下
@WebServlet(name = "EditServlet", urlPatterns = {"/content/edit"})
public class EditServlet extends Library.MyServlet {
public EditServlet () {
super();
}
public void doGet (HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("EditServlet loaded");
}
}
但是,我无法编译我的代码:
SEVERE: Exception while deploying the app [ContentManagement] : (class: contentmanagement/content/EditServlet, method: <init> signature: ()V) Constructor must call super() or this()
更新
好的,删除我的构造函数上的void
并调用super();
让must call first
部分消失,但它仍然说我必须打电话给super,尽管它已被调用。< / p>
更新
我不明白下面的回答......他们一直说要把super()
放在构造函数中,当我的例子已经表明已完成时,它是第一行代码。任何其他建议将不胜感激。
有什么想法吗?
现在这不是问题。我不知道是什么解决了这个问题,但是经过多次更改并从头开始重建我的应用程序我不再遇到此问题
答案 0 :(得分:11)
你的问题是:
method: <init> signature: ()V) Constructor must call super() or this()
似乎是VerifyError
症状。清理和重建项目应解决问题,另请参阅:
此外,您可以使用super()
单行删除构造函数。 JVM使用默认(隐式隐藏)构造函数为您完成。所以,清除这些不必要的行:
public MyServlet () {
super();
}
和
public EditServlet () {
super();
}
如果您需要在构造函数中编写其他业务行,则必须显式调用super()
。
答案 1 :(得分:2)
Library.MyServlet
的构造函数如何看?请注意,如果要在构造函数中使用super
关键字,则 位于第一行。 this
也是如此。
您是否尝试删除空构造函数?显然,你没有使用它。
答案 2 :(得分:2)
假设Library.MyServlet
有一个不带参数的构造函数,这应该有效:
public class EditServlet extends Library.MyServlet {
public EditServlet () {
super();
// Rest of initialization code...
}
//...
}
答案 3 :(得分:2)
干净整洁...... 这是一个构建问题,你的课程现在完全正常。有时,当您更正代码时,IDE只会重新编译代码的一部分而不是整个代码。一个干净的构建应该做的伎俩
答案 4 :(得分:1)
如果您使用this()
或super()
,则必须是构造函数的第一个行。
但是,如果你需要在调用this()
或super()
之前做一些工作,你可以使用这种模式:
public MyClass () {
this(someStaticMethod());
}
或
public MyClass () {
super(someStaticMethod());
}
并制作其他私人建筑师以适应。
您调用的方法不能是实例方法,因此它并不适用于所有情况,但它可能会对您有所帮助。