[JSP] Usare form da una JSP inclusa

di il
2 risposte

[JSP] Usare form da una JSP inclusa

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

  • Re: [JSP] Usare form da una JSP inclusa

    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!
  • Re: [JSP] Usare form da una JSP inclusa

    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