2011-12-18 16 views
6

Ho una classe servlet che ho fatto per gestire le funzioni che non voglio ripetere su ogni servlet che ho. Ci sto ancora lavorando (ad esempio, carica ancora index.jsp e non altri file).Dove mettere super() o questo() nelle mie classi

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); 
    } 
} 

mia Servlet è il seguente

@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"); 
    } 
} 

Sono tuttavia, in grado di compilare il mio codice:

SEVERE: Exception while deploying the app [ContentManagement] : (class: contentmanagement/content/EditServlet, method: <init> signature:()V) Constructor must call super() or this() 

aggiornamento

Ok, rimuovendo void sulle mie costruttori e chiamando super(); ho preso la porzione must call first per andare via, ma sta ancora dicendo che devo chiamare super nonostante sia già stato chiamato.

aggiornamento

non capisco le risposte di seguito .... continuano a dire di mettere super() all'interno del costruttore, quando i miei esempi mostrano già che sta facendo, ed è la prima riga di codice . Qualsiasi altro consiglio sarebbe apprezzato.

Qualche idea?

Questo è ora un non-problema. Non so cosa risolvesse questo problema, ma con più modifiche e ricostruendo la mia app da zero non ho più riscontrato questo problema

+2

Se si ottiene un errore che afferma che deve essere il primo, hai provato a metterlo prima nel costruttore? –

+1

Un costruttore non ha alcun tipo di reso. Rimuovere il vuoto prima di MyServlet e EditServlet. Il codice viene compilato? –

+3

Stai usando Netbeans? Ricordo una domanda simile su questa stranezza di Netbeans: http://stackoverflow.com/questions/6560988/method-must-call-super-error-in-netbeans In altre parole, la tua build è sporca. Ad esempio, hai rinominato/spostato manualmente i file di classe nel progetto da un file explorer invece che dall'IDE. Questi costruttori sono assolutamente superflui. Il servlet dovrebbe funzionare ugualmente bene senza nessuno di essi (dopo aver pulito il classpath sporco ovviamente). – BalusC

risposta

11

Il tuo problema era:

method: <init> signature:()V) Constructor must call super() or this()

Sembra VerifyError sintomo. Pulizia e la ricostruzione del progetto dovrebbe risolvere il problema, vedi anche:


Inoltre, è possibile rimuovere le costruttori con una sola riga super() . La JVM lo fa per te con un costruttore predefinito (implicitamente nascosto). Quindi, cancellare queste righe non necessarie:

public MyServlet() { 
    super(); 
} 

e

public EditServlet() { 
    super(); 
} 

si dovrebbe chiamare esplicitamente super() se si ha bisogno di scrivere linee di business aggiuntive nel costruttore.

2

E come funziona il costruttore di Library.MyServlet ?. Come nota, se la parola chiave super deve essere utilizzata in un costruttore, lo ha nella prima riga. Stessa cosa per this.

Hai provato a eliminare il costruttore vuoto? Apparentemente, non lo stai usando.

+0

Il costruttore è mostrato sopra – Webnet

+0

@Webnet Non è chiaro dal momento che nel tuo codice legge 'estende Library.MyServlet', ma il codice che hai mostrato è per' MyServlet'. Se sono uguali, prova a scrivere 'super()' nella prima riga di 'EditServlet', o elimina il costruttore 'EditServlet' –

+0

' MyServlet' fa parte del pacchetto della libreria, non sono sicuro di aver capito cosa non è chiaro Anche quando cancello il costruttore su 'EditServlet' c'è ancora un errore su' MyServlet' – Webnet

2

Supponendo Library.MyServlet ha un costruttore che non accetta argomenti, questo dovrebbe funzionare:

public class EditServlet extends Library.MyServlet { 
    public EditServlet() { 
     super(); 
     // Rest of initialization code... 
    } 
    //... 
} 
1

Se si utilizza this() o super(), deve essere la prima linea del costruttore.

Tuttavia, se avete bisogno di fare un certo lavoro prima chiamare this() o super(), è possibile utilizzare questo modello:

public MyClass() { 
    this(someStaticMethod()); 
} 

o

public MyClass() { 
    super(someStaticMethod()); 
} 

e Artigianato altri costruttori privati ​​per adattarsi.

I metodi che chiamate non possono essere metodi di istanza, quindi non funziona in tutti i casi, ma potrebbe essere di aiuto.

+0

È 'la prima riga del mio costruttore, guarda il mio codice: - \ – Webnet

2

Basta pulire e creare ... È un problema di costruzione, la tua classe è perfettamente normale ora. A volte, quando correggi il codice, l'IDE ricompila solo parti del tuo codice e non l'intero codice. Un clean and build dovrebbe fare il trucco

Problemi correlati