Servlet

di il
7 risposte

Servlet

Salve a tutti,
Da un po' di giorni sto studiando come creare i servlet e, usando programmi già fatti su internet come spunto, penso di aver capito le basi.
Il problema è che mi da problemi quando da "index.jsp" devo passare al servlet "Controllo.java". In "web.xml" ho già inserito tutto quello che serve e non ci sono errori di scrittura...
Codici:

index.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Iscrizione</title>
</head>
<body>
<div style="text-align:center">
<form action="Controllo" name="Controllo">
Nome: <input name="nome" type="text"/><br>
Cognome: <input name="cognome" type="text"/><br>
Nazione: <input name="nazione" type="text"/><br>
<input name="Show" type="submit" value="Vai"/>
</form>
</div>
</body>
</html>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>UtentiWeb</display-name><servlet>
  	<servlet-name>Controllo</servlet-name>
  	<servlet-class>Controllo</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>Controllo</servlet-name>
  	<url-pattern>/Controllo</url-pattern>
  </servlet-mapping>
  
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
Controllo.java
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Vector;
/**
 * Servlet implementation class Controllo
 */
@WebServlet("/Controllo")
public class Controllo extends HttpServlet {
	private static final long serialVersionUID = 1L;
    private Vector<Utente>utenti;
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Controllo() {
    	utenti=new Vector<>();
    }
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		PrintWriter out=response.getWriter();
		if(request.getParameter("nome").isEmpty()){
			out.println("<html>"+
			"<title>Errore 001</title>"+
			"<body>"+
			"<h1>Errore 001: Nome non inserito!</h1>"+"<br>"+
			"<a href=\"index.jsp\"><input type=\"submit\" value=\"Indietro\"/></a>"+
			"</body></html>");
		}else{
			String nome=request.getParameter("nome");
			if(request.getParameter("cognome").isEmpty()){
				out.println("<html>"+
				"<title>Errore 002</title>"+
				"<body>"+
				"<h1>Errore 002: Cognome non inserito!</h1>"+"<br>"+
				"<a href=\"index.jsp\"><input type=\"submit\" value=\"Indietro\"/></a>"+
				"</body></html>");
			}else{
				String cognome=request.getParameter("cognome");
				if(request.getParameter("nazione").isEmpty()){
					out.println("<html>"+
					"<title>Errore 003</title>"+
					"<body>"+
					"<h1>Errore 003: Nazione non inserita!</h1>"+"<br>"+
					"<a href=\"index.jsp\"><input type=\"submit\" value=\"Indietro\"/></a>"+
					"</body></html>");
				}else{
					String nazione=request.getParameter("nazione");
					utenti.add(new Utente(nome,cognome,nazione));
					String page="<html><title>Elenco Utenti</title><h1>Utenti:</h1><br>";
					for(int i=0; i<utenti.size(); i++){
						page+="<p>Utente:</p><br><h4>Nome: "+utenti.get(i).getNome()+"</h4><br>"+
								"<h4>Cognome: "+utenti.get(i).getCognome()+"</h4><br>"+
								"<h4>Nazione: "+utenti.get(i).getNazione()+"</h4><br>";
					}
				}
			}
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}
Errore riportato:
javax.servlet.ServletException: Error instantiating servlet class Controllo
	org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
	org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
	org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1100)
	org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:687)
	org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
	org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
	java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	java.lang.Thread.run(Unknown Source)


root cause
java.lang.ClassNotFoundException: Controllo
	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1333)
	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167)
	org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
	org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
	org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1100)
	org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:687)
	org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
	org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
	java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	java.lang.Thread.run(Unknown Source)

Grazie a tutti in anticipo,
Niar

7 Risposte

  • Re: Servlet

    Non ho letto tutti i pezzi di codice ma una cosa è evidente ed è bene segnalartela. Nelle web application è bene avere tutte le classi Java qualificate con dei package. Detto in altro modo: NON usare il unnamed (default) package.

    Inoltre dovresti chiarire come stai facendo il build. A "mano" con i tools del JDK (molto scomodo per le webapp)? O un tool di build es. Ant/Maven? O un IDE? (se sì quale? e che tipo di progetto?)
  • Re: Servlet

    andbin ha scritto:


    Non ho letto tutti i pezzi di codice ma una cosa è evidente ed è bene segnalartela. Nelle web application è bene avere tutte le classi Java qualificate con dei package. Detto in altro modo: NON usare il unnamed (default) package.

    Inoltre dovresti chiarire come stai facendo il build. A "mano" con i tools del JDK (molto scomodo per le webapp)? O un tool di build es. Ant/Maven? O un IDE? (se sì quale? e che tipo di progetto?)
    Utilizzo Eclipse Mars.2 per programmare in java ed ho fatto un Dynamic Web Project.
  • Re: Servlet

    Scusa ma le servlet mica hanno il costruttore?
    Per inizializzare i dati in una servlet si utilizza in metodo init(), il quale alloca i dati in memoria e gli stessi verranno utilizzati durante tutto il ciclo di vita della servlet da ogni thread creato dal container per gestire le richieste del client.
  • Re: Servlet

    Paolovox ha scritto:


    Scusa ma le servlet mica hanno il costruttore?
    Una servlet è una classe, e le classi hanno SEMPRE almeno 1 costruttore. Il punto è che la servlet non la istanzi tu ma la istanzia il servlet container dinamicamente tramite reflection conoscendo il nome qualificato della classe. E per farlo si aspetta che la classe abbia un costruttore no-arg (senza argomenti).
    Solo che quando il costruttore no-arg viene invocato la servlet non è ancora una "vera" Servlet, perché non ha nulla in mano e nessuna connessione con il servlet container. Insomma in quel momento è solo un oggetto e basta.
    È poi quando viene invocato il init(ServletConfig) che allora inizia ad essere una vera Servlet con accesso alla configurazione, al contesto e tutto quanto connesso.
  • Re: Servlet

    Ok grazie mille ho capito.

    Allora forse il problema è nell'action del form:
    <form action="Controllo" name="Controllo">

    Mi sono ricordato che senza il frontslash, il path è relativo al file chiamante, quindi devi far attenzione al delivery environment.
    Mentre con, il path è relativo alla context root della web application.
  • Re: Servlet

    Paolovox ha scritto:


    Allora forse il problema è nell'action del form:
    <form action="Controllo" name="Controllo">

    Mi sono ricordato che senza il frontslash, il path è relativo al file chiamante, quindi devi far attenzione al delivery environment.
    Mentre con, il path è relativo alla context root della web application.
    Lato client, ovvero sul browser, uno slash iniziale nel url denota la server-root (es. http://nomehost/ )
    mentre in generale nella web application JavaEE, come ad esempio nel <url-pattern>/Controllo</url-pattern> lo slash iniziale denota la context-root (es. http://nomehost/nomecontesto/ )
  • Re: Servlet

    Grazie per la vostra attenzione, ma ho risolto prima di leggere le vostre risposte.
    Terrò comunque in considerazione anche quello che avete scritto per le prossime volte, grazie ancora!
    Niar
Devi accedere o registrarti per scrivere nel forum
7 risposte