Uscita a video risultati parziali[fattoriale]

di il
3 risposte

Uscita a video risultati parziali[fattoriale]

Salve, mi è stato assegnato l'esercizio da svolgere in java che consiste nel calcolare il fattoriale di un numero intero dato in ingresso(con controllo del campo), in pratica devo creare una SERVLET. Sono riuscito a fare tutto, l'unico problema è che non riesco a visualizzare a video i risultati parziali, cioè mano mano che il fattoriale viene calcolato; il tutto deve essere cadenzato temporalmente; sono riuscito solo a mostrare a video il risultato finale del fattoriale. La servlet gira correttamente.
Grazie.

PARTE HTML
<!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>Insert title here</title> </head> 
<body> <form action="fattoriale" method="post">   
 <h3>Inserisci numero intero</h3>  
<input type="TEXT" name="intero"> 
  <BR> <input type="submit" name="invianumero" value="Calcola fattoriale!">  
 </form>  
</body> </html>


		

3 Risposte

  • Re: Uscita a video risultati parziali[fattoriale]

    Ciao provo ad aiutarti.Per fare quello che chiedi esiste la tecnologia ajax utilizzata insieme a tecnologie J2EE (servlet,jsp...). Grazie ad ajax non abbiamo bisogno di ricaricare tutta una pagina html ma possiamo aggiornare solo una parte che ci interessa.
    Ad esempio una possibile soluzione è quella che ti posto qui. Una pagina jsp che utilizza chiamate ajax verso la servlet responsabile del calcolo del fattoriale, questa servlet però fa un calcolo parziale, in sostanza attraverso ajax facciamo tante request get verso la servlet quanti sono i passi del calcolo del fattoriale di un dato numero, il risultato parziale viene restituito dalla servlet ad ogni request e memorizzato in sessione di volta in volta per poter essere recuperato negli step successivi. Ho utilizzato ajax attraverso la libreria javascript JQuery scaricabile all'url

    http://code.jquery.com/jquery-1.4.4.min.j

    Per poter ottenere una cadenza temporale e vederne l'effetto sulla pagina, ho fatto in modo di addormentare il thread della servlet di 2 secondi prima che invii la risposta http.Il risultato parziale restituito dalla servlet viene recuperato nel parametro data della funzione javascript ed inserito nell'input text con id output.

    Qui di segutio la pagina jsp (Fattoriale.jsp), nella tua web application java, fai attenzione a dove poni il file jquery-1.4.4.min.js perchè deve essere importato :
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Insert title here</title>
    <script type="text/javascript" src="${pageContext.request.contextPath}/script/jquery-1.4.2.min.js"></script>
    
    </head>
    <body>
    
    <h3>Calcolo fattoriale</h3>
    <label>Fattoriale di:</label><br/>
    <input value="" id="input" type="text" /><br/>
    <label>Risultato</label><br/>
    <input value="" id="output" type="text" readonly="readonly" />
    <input type="button" onclick="fattoriale();" value="Start" id="button"> 
    <script>
    function fattoriale(){
    var i=0;
    document.getElementById("button").value='Calcolo in corso';
    document.getElementById("button").disabled=true;
    for (i=1;i<=document.getElementById("input").value;i++){
            $.ajax({ url: "${pageContext.request.contextPath}/Fattoriale?step="+i, context: document.body,async:false, success: function(data){
         
                document.getElementById("output").value =data;
             }});
    }
    $.ajax({ url: "${pageContext.request.contextPath}/Fattoriale?finish=true", context: document.body,async:false, success: function(data){
        
     }});
    alert('Calcolo terminato');
    document.getElementById("button").value='Start';
    document.getElementById("button").disabled=false;
    }
            	        
    </script>
    </body>
    </html>
    La servlet :
    package demo;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    /**
     * Servlet implementation class Fattoriale
     */
    public class Fattoriale extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    
    	public Fattoriale() {
    		super();
    		// TODO Auto-generated constructor stub
    	}
    
    	
    	protected void doPost(HttpServletRequest request,
    			HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    
    	}
    
    
    	protected void doGet(HttpServletRequest request,
    			HttpServletResponse response) throws ServletException, IOException {
    
    		HttpSession session = request.getSession();
    
    		if (request.getParameter("finish") != null) {
    			session.removeAttribute("fatt");
    			return;
    		}
    
    		String step = request.getParameter("step");
    
    		Long fatt = (Long) session.getAttribute("fatt");
    
    		if (fatt == null) {
    			fatt = (long) 1;
    		} else {
    			fatt = fatt * Long.valueOf(step);
    		}
    		session.setAttribute("fatt", fatt);
    
    		PrintWriter out = response.getWriter();
    
    		try {
    			Thread.sleep(2000);
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    		out.print(fatt);
    
    	}
    }
  • Re: Uscita a video risultati parziali[fattoriale]

    Grazie 1000 x la risposta, il problema è che il mio esercizio devo consegnarlo per l'esame e non posso utilizzare cose non studiate

    ho provato a fare così (posto solo quel pezzo di codice che mi interess):

    for (int i = 1; i <= numero; i++){
    					// calcolo ris parziali
    					Thread.sleep(500);
                                     //visualizza parziale
    					responseOutput.println("Il primo risultato parziale è " + i*fatt);
    					
    					
    				
    				};
    				// calcolo ris finale
    				Thread.sleep(500);
    				for (int i = 1; i <= numero; i++)
    				fatt = fatt * i;
    			
    	
    				
    				// visualizzo il risultato
    				responseOutput.println("<br/><br/>Il fattoriale di "+numero+ " è "+fatt);

    il risultato è questo:




    grazie
  • Re: Uscita a video risultati parziali[fattoriale]

    Ciao, ho capito. Allora mi viene questa possibile soluzione solo con le servlet che sfrutta l'header Refresh della response. Non ho inserito i controlli, se dovesse andar bene aggiungerli è semplice. La servlet prevede di essere invocata con il parametro numero che rappresenta appunto il numero di cui si vuole calcolare il fattoriale.
    /**
     * Servlet implementation class Fattoriale
     */
    public class Fattoriale extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    
    	public Fattoriale() {
    		super();
    		// TODO Auto-generated constructor stub
    	}
    
    	
    	protected void doPost(HttpServletRequest request,
    			HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    
    	}
    
    
    	protected void doGet(HttpServletRequest request,
    			HttpServletResponse response) throws ServletException, IOException {
    
    		String numero = request.getParameter("numero");
    		
    		HttpSession session = request.getSession();
    
    		long fattoriale = 1;
    		long step=1;
    		
    		if(session.getAttribute("fattoriale")!=null){
    		  /*Valore parziale del fattoriale*/	
    		  fattoriale = (Long)session.getAttribute("fattoriale");
    		  /*Step del calcolo*/
    		  step = (Long)session.getAttribute("step");
    		}
    
    		
    		fattoriale*=step;
    		  
    		PrintWriter out = response.getWriter();
            
    		if(++step <= Long.valueOf(numero)){
                     /*Refresh del browser ogni 2 secondi*/
    		 response.setIntHeader("Refresh", 2);
    		
    			session.setAttribute("fattoriale",fattoriale);
    			session.setAttribute("step",step);
    		}else{
    			session.removeAttribute("fattoriale");
    			session.removeAttribute("step");
    		} 	
    		try {
    			Thread.sleep(2000);
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
    		
    		 out.print(fattoriale);
    			out.flush();
    	
    	}
    }
Devi accedere o registrarti per scrivere nel forum
3 risposte