[JSP] Usare form da una JSP inclusa

di Anonimizzato1054 il
2 risposte
Ho una JSP con un form importato includendo un'altra pagina JSP.
Prima di questo form ne ho un altro che mi permette di generare dinamicamente la tabella che va a comporre il form, nello specifico, seleziono un radio button a cui è associata una lettera e mi appare un form con degli ingredienti che iniziano con quella lettera presenti in un DB mysql.
Tutto questo funziona, il problema è che il form funziona solo al primo utilizzo, inserisco un valore nel campo text, clicco sul pulsante submit e viene regolarmente fatta la modifica sul DB. Fatta la modifica si torna alla JSP contenente i form, a questo punto se clicco su un radio button, invece di apparire la tabella che ci si aspetterebbe come prima, Tomcat da questo errore:

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

java.lang.NumberFormatException: null
java.lang.Integer.parseInt(Unknown Source)
java.lang.Integer.parseInt(Unknown Source)
frontend.ModificaRimanenza.doPost(ModificaRimanenza.java:30)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.16 logs.


frontend.ModificaRimanenza.doPost(ModificaRimanenza.java:30)
contiene la seguente istruzione:
int daModificare = Integer.parseInt(request.getParameter("totale_selezionati"));

In pratica request.getParameter("totale_selezionati") risulta essere null.
La servlet ModificaRimanenza è associata al form importato e non a quello coi radio botton, quindi mi pare molto strano che parta cliccando su un radio button senza che si clicchi sul pulsante submit dell'altra form.
A cosa può essere dovuto questo comportamento?

Codice della JSP che include la seconda

<%@ page language="java" contentType="text/html; charset=iso-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ page import="controller.MagController" %>
<%!
static final String[][] TABS = {
	{"A","showingrediente.jsp"},
	{"B","showingrediente.jsp"},
	{"C","showingrediente.jsp"
<!-- e così via fino a Z -->
	};%>
<!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>Modifica soglia</title>
<% int soglia_scadenza = MagController.getSoglia(); %>

<SCRIPT LANGUAGE="JavaScript">
<!--
function checkSogliaScadenza(obj) {
	//permette solo numeri	
	scadenza = obj.value.replace(/\D/g,"");
	obj.value = scadenza;
}
function checkFormScadenza(obj) {
	if(document.modsoglia.scadenza.value <= 0) {
		alert("La soglia di scadenza deve essere un intero maggiore di 1");
		document.modsoglia.scadenza.value = "";
		document.modsoglia.scadenza.focus();
		return false;
	}

	return true;
}
//-->
</script>
</head>
<body>
<center>
<h2>Modifica valori di soglia</h2>
<br><br>
Modifica soglia di scadenza
<form name="modsoglia" action="ModificaScadenza" method="post">
<table width="300" border="0" cellpadding="6">
	<tr>
		<td width="65%">Soglia per date di scadenza</td>
		<td width="35%"> <%= soglia_scadenza %> giorni</td>
	</tr>
	<tr>
		<td>Nuovo valore di soglia</td>
		<td><input type="text" name="scadenza" size="3" onChange="checkSogliaScadenza(this)" /> giorni</td>
	</tr>
	<tr>
		<td><%if (session.getAttribute("esito_scadenza") != null)
				if (session.getAttribute("esito_scadenza").equals("non_modificata")) {%>
					<font color="red">Soglia non modificata!</font> <% } %></td>
		<td><input type="submit" name="modsoglia" value="Modifica" onClick="return checkFormScadenza(this)"/></td>
	</tr>
</table>
</form>
<br><br><br>
Modifica soglia rimanenze<br>
<form action="" method="post">
<%String which = request.getParameter("which");
  if (which==null)
  	which = TABS[0][0];
  String jspToRun = null;
  for (int i=0; i<TABS.length; i++) {
  	String tabLabel = TABS[i][0];
  	String tabJSP = TABS[i][1];
  	String CHECKED = "";
  	if (which.equals(tabLabel)) {
  		CHECKED = "CHECKED";
  		jspToRun = tabJSP;
  	}
%>
<input name="which" type="radio" value="<%=tabLabel %>" <%= CHECKED %> onClick="this.form.submit()" /><%= tabLabel %>
&nbsp;
<%
	if (i==12) {%>
		<br>
<%	} 
} %>
</form>
<jsp:include page="<%= jspToRun %>" flush="true" />

<br><br><br><br>
<a href="hpmagazziniere.html">Home page</a>
</center>
</body>
</html>
Codice della JSP inclusa nella precedente

<%@ page import="controller.IngrController" %>
<%@ page import="java.sql.*" %>
<SCRIPT LANGUAGE="JavaScript">
<!--
function selezionato(obj) {
	//permette solo numeri	
	nuovaSoglia = obj.value.replace(/\D/g,"");
	obj.value = nuovaSoglia;
	
	if(obj.value > 0)
		document.modrimanenza.totale_selezionati.value = parseInt(document.modrimanenza.totale_selezionati.value) + 1;
	if(obj.value <= 0)
		document.modrimanenza.totale_selezionati.value = parseInt(document.modrimanenza.totale_selezionati.value) - 1;
}

function checkForm() {
	if (document.modrimanenza.totale_selezionati.value == 0)
		return false;
	else
		return true;
}

//-->
</script>
<%
	int i=0;
	String lettera = request.getParameter("which");
	ResultSet rs = IngrController.getIngrMagPerLettera(lettera);
%>

<center>
<form name="modrimanenza" action="ModificaRimanenza" method="post">
<table width="550" cellpadding="2">
	<tr>
		<td width="25%"><b>Ingrediente</b></td>
		<td width="20%"><b>Unit&agrave; di misura </b></td>
		<td width="25%"><div align=center><b>Soglia attuale </b></div></td>
		<td width="30%"><b>Nuovo valore di soglia </b></td>
	</tr>
	<% while (rs.next()) { %>
	<tr>
		<td><%=rs.getString("Nome") %></td>
		<td><div align="center"><%=rs.getString("unitaDiMisura") %></div></td>
		<td><div align="center"><%=rs.getString("Soglia") %></div></td>
		<td><div align="center"><input type="text" name="ingrediente<%= i %>value" size="3" value="0" onChange="selezionato(this)"/></div>
			<input type="hidden" name="ingrediente<%= i %>name" value="<%=rs.getString("Nome") %>" /></td>
	</tr>
	<% i++;
	} %>
	<tr>
		<td>&nbsp;</td>
		<td>&nbsp;</td>
		<td><input type="hidden" name="totale_selezionati" value="0"/>&nbsp;</td>
		<td><div align="center"><input type="submit" name="modifica" value="Modifica" onClick="return checkForm()"/></div></td>
	</tr>
</table>
</form>
</center>
Metodo doPost della servlet associata alla precedente JSP

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		int daModificare = Integer.parseInt(request.getParameter("totale_selezionati")); //numero di ingredienti con quntità scelta > 0
		int j = 0; //conta gli ingredienti con quantità > 0 trovati
		int aux = 0; //cicla su tutti gli ingredienti nel form
		
		String[][] ingrediente = new String[daModificare][2];
		
		while (j < daModificare) { //finché il numero di ingredienti con quantità > 0 trovati non raggiunge il valore conosciuto
			if(Integer.parseInt(request.getParameter("ingrediente"+aux+"value")) > 0) {
				ingrediente[j][0] = request.getParameter("ingrediente"+aux+"name");
				ingrediente[j][1] = request.getParameter("ingrediente"+aux+"value");
				j++;
				aux++;
			}
			else
				aux++;
		}

		IngrController.modificaSogliaRimanenza(ingrediente,daModificare);
		
		RequestDispatcher dispatcher = request.getRequestDispatcher("/modificasoglia.jsp");
		dispatcher.forward(request, response);
	}
Il form coi radio button non ha servlet associate.

EDIT: ops, mi sono accorto di aver sbagliato sezione, non avevo visto quella er le JSP. Chiedo scusa e chiedo ad un moderatore di spostare il thread.

2 Risposte

  • Prova a dare un occhio con un debugger, in tal modo impostando i breakpoint potrai capire come e quando viene chiamata
    http://programmaremobile.blogspot.com/2007/09/usare-il-debugger.html

    Cmq dando un occhio veloce al codice, mi sà che il problema è in questa riga di codice:

    <input name="which" type="radio" value="<%=tabLabel %>" <%= CHECKED %> onClick="this.form.submit()" /><%= tabLabel %>

    quando clicchi sul radio button e come se cliccassi sul submit a causa della gestione dell'evento onClick!
  • Si, ma onClick="this.form.submit()" è relativo al form coi radio button, non a quello con la tabella e il servlet che non dovrebbe partire è quello della tabella, i radio button usandoli la prima volta che viene caricata la pagina funzionano a dovere, quindi dovrebbero giustamente chiamare il servlet #, ovvero niente, e non ModificaRimanenza che viene chiamata dal pulsante submit del form sottostante... vabbè vedrò un po' col debugger cosa ne viene fuori.
Devi accedere o registrarti per scrivere nel forum
2 risposte