Recuperare un vettore d'oggetti da una servlet

di il
2 risposte

Recuperare un vettore d'oggetti da una servlet

Sto creando un Dynamic Web Project per la scuola che permetta ai ragazzi di terza media di prenotare, compilando un modulo di prenotazione online, un incontro con i professori dell'istituto superiore per orientarsi sul proprio percorso di studi dopo l'esame.
Inizialmente l'utente visualizza una pagina che gli consentirà di cliccare un semplice bottone per accedere al modulo.
Naturalmente questa pagina è un file jsp che al click del tasto richiamerà la seguente servlet.
Questa servlet mi serve essenzialmente per recuperare i dati relativi agli istituti di scuola media da un database ed inserirli sotto forma di oggetti <Istituti> in un vettore, e i dati relativi ai laboratori delle scuole superiori che verranno anch'essi inseriti in un array sotto forma di oggetti <Laboratorio>.
package it.meucci;

import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class InitServelet
 */
@WebServlet("/init")
public class InitServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	

    /**
     * Default constructor. 
     */
    public InitServlet() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//to do
		//1)lettura istituti dati DB
		//2)Lettura istituti lab
		
		try {
			DBManager db1=new DBManager();
			ArrayList<Istituti> istituti= db1.leggiIstituti();
			ArrayList<Laboratorio> laboratori=db1.leggiLaboratori();
			
			request.getSession().setAttribute("istituti",istituti);
			request.getSession().setAttribute("laboratori",laboratori);
			
			
		} catch (ClassNotFoundException | SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	
		//3)Inserimento oggetti
		response.sendRedirect("prenotazione.jsp");
		doGet(request, response);
	}

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

}
Ora, io invio i due vettori ad una pagina jsp chiamata prenotazione.jsp che contiene il modulo di prenotazione e con essi vado a riempire due combo dinamiche.
Il problema che mi segnala eclipse si trova nelle righe dopo il commento //recupero dati e dice: "Type mismatch: cannot convert from Istituti to ArrayList<Istituti>" e "Type mismatch: cannot convert from Laboratorio to ArrayList<Laboratorio>" come se non riuscisse a fare il cast.

Qualcuno sarebbe così gentile da spiegarmi dove sto sbagliando e controllare se la sintassi per creare le combo dinamiche è giusta, per favore? Tenendo conto che frequento il quinto superiore e che ho appena iniziato a studiare jsp e servlet?

<%@page import="it.meucci.*"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="ISO-8859-1"%>
<%! private ArrayList<Istituti> istituti;
	private ArrayList<Laboratorio> lab;
	private String p;%>
	
	<%
			//recupero dati
		istituti=(Istituti)session.getAttribute("istituti");
		lab=(Laboratorio)session.getAttribute("laboratori");
		%>

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Modulo di prenotazione</title>
</head>
<body>
	<h1>Modulo di prenotazione</h1>
	<form action="loggon" method="post"> 

		<center>
			<table>
				<tr>
					<td>Nome del genitore:</td>
					<td><input id="nomeG" type="text" placeholder="Nome e cognome"></td>
				</tr>

				<tr>
					<td><input type="radio" name="tipo">Madre</td>
					<td><input type="radio" name="tipo">Padre</td>
				</tr>

				<tr>
					<td>Nome e cognome dell'alunno/a:</td>
					<td><input id="nome" type="text" placeholder="Nome"></td>
					<td><input id="cognome" type="text" placeholder="Cognome"></td>
				</tr>

				<tr>
					<td>Frequentante l'istituto:</td>
					<td><select>
							<%
								for (int i = 0; i < i.size(); i++) {
							%>
							 <option value=<%p = i.get(i);%>></option>
							<%
								}
							%>
					</select></td>
				</tr>

				<tr>
					<td>LABORATORIO SCELTO:</td>
					<td><select>
							<%
								for (int i = 0; i < i.size(); i++) {
							%>
							<option value=<%p = i.get(i);%>></option>
							<%
								}
							%>
					</select></td>
				</tr>

				

			</table>
		</center>
		<input type="button" value="invia">

	</form>
</body>
</html>

2 Risposte

  • Re: Recuperare un vettore d'oggetti da una servlet

    Whalien52 ha scritto:


    Qualcuno sarebbe così gentile da spiegarmi dove sto sbagliando e controllare se la sintassi per creare le combo dinamiche è giusta, per favore? Tenendo conto che frequento il quinto superiore e che ho appena iniziato a studiare jsp e servlet?
    Capisco ... ma il fatto è che ci sono svariati errori e cose dubbie/discutibili.

    Innanzitutto la chiamata doGet(request, response); al fondo del doGet stesso ... non ha senso. Poi l'utilizzo di sendRedirect con il necessario uso (altrimenti non "tiene" i dati, ovviamente) della sessione è un po' dubbio. Serve davvero tenere tutta quella roba in sessione? Non ho visione completa di tutto quanto ma molto probabilmente no.

    Quando si usano Servlet+JSP, l'approccio tipico (e "buono") è di usare le Servlet per gestire inizialmente le request, poi si usano le JSP solo come "vista" facendo un "forward" interno ad una JSP. C'è una mia vecchia spiegazione con esempio sul forum: https://www.iprogrammatori.it/forum-programmazione/post8529076.html#p8529076
    L'esempio utilizzava JSTL (una libreria di custom-tag) nella JSP ma non è fondamentale (cioè si può usare anche solo dello "scriptlet" come stavi facendo).

    Riguardo la JSP, ci sono diverse cose dubbie/errate. Quei cast sono ovviamente sbagliati. Gli oggetti in sessione sono delle liste, non un singolo elemento. Quindi come minimo:

    istituti = (ArrayList<Istituti>) session.getAttribute("istituti");

    (similare l'altro)

    La generazione degli <option> è comunque sbagliata.

    1) i < i.size() è sbagliato (i è un int, non ha senso i.size() )

    2) <%p = i.get(i);%> qui i ripeto che è un int, non puoi fare i.get(i)
    E comunque qui stai solo assegnando ad una variabile, NON stai "emettendo" qualcosa in output nella pagina.
    Anche ammesso di emettere correttamente il value, questo è solo il valore "nascosto" (l'utente NON lo vede) che può essere usato per passarlo ad un'altra request. Quello che manca è il testo che l'utente vedrebbe, che si mette DENTRO il tag <option>

    <option value="123">Testo che l'utente vede</option>


    Insomma ... è tutto un po' da rivedere!


    EDIT: e aggiungo, queste variabili

    <%! private ArrayList<Istituti> istituti;
    private ArrayList<Laboratorio> lab;
    private String p;%>

    sono variabili "di istanza". Ma una JSP viene trasformata in una Servlet di cui c'è (di norma) una sola istanza. Quindi queste variabili diventano in un certo senso "globali" e sono condivise tra più thread che possono eseguire la Servlet in maniera concorrente a seconda delle request. Quindi è inappropriato. Devi usare variabili locali, non "di istanza". Quindi non devi usare <%! ...... %>
  • Re: Recuperare un vettore d'oggetti da una servlet

    Grazie mille. Riguarderò un po' tutto
Devi accedere o registrarti per scrivere nel forum
2 risposte