Newsgroup: it.comp.java
Titolo: LA CLASSE nella jsp non vede un campo del form?!

avevo postato tempo fa la mia web_app che non funzionava: ora(continua
a non funzionare ma..) ho notato su quell'errore altre cose che vi
racconto.
prima faccio un riepilogo delle puntate precedenti:
riempivo un form in una pag html e
passavo i valori dei campi text ad una pag jsp
questa pag li prendeva e li passava ad una classe che comunicava con la
porta seriale (in questo caso un modem)
poi immagazzinavo il risultato(la risposta del modem) in un file di
testo nel contextpath
ed un'altra pag jsp visualizzava il risultato.
Il problema era che i due campi di tipo testo(Stringhe) che passavo dal
form che rappresentavano la porta(es. COM1) e il comando(es. AT\r)
mi bloccavano il modem che continuava a trasmettere senza trasmettere
nulla come se non avesse ricevuto alcun comando
e ovviamente il browser non caricava nulla
Ora ho notato che se nel form invio solo la porta ed il comando lo
dichiaro(è fisso) dentro la classe o dentro la jsp il tutto funziona
ma che sistema di controllo remoto sarebbe se posso impostare solo la
porta e non il comando?!
infatti il modem è collegato al server ed io collegandomi a
quest'ultimo posso inviargli un comando ma se il comando non riesco a
settarlo faccio davvero
poco.
Sapreste dirmi perchè la stringa portname non mi crea problemi e
l'altra message si?
so di essere stato lungo ma dovevo esserlo,vi posto il codice se
pensate di provarlo ,spero possiate aiutarmi ciao e grazie
FORM:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
<!-- This file was generated by the VisualAge for Java Servlet
SmartGuide. -->
<HEAD>
</HEAD>
<BODY>
<FORM METHOD="post" ACTION="mia.jsp">
<P>Please complete the form.</P>
<TABLE border="0">
<TR>
  <TD>portname</TD>
  <TD>
    <INPUT TYPE="text" NAME="portname" ID="portname"  SIZE="20"
MAXLENGTH="20" >
  </TD>
</TABLE>
<P>
<INPUT TYPE="submit" NAME="Submit" ID="Submit" VALUE="Submit">
&nbsp;
<INPUT TYPE="reset" NAME="Reset" ID="Reset" VALUE="Reset">
&nbsp;
</P>
</FORM>
</BODY>
</HTML>
PAG JSP:
<%@ page language="java" import="javax.comm.*,riccardo.*" %>
<%!String message="AT\r";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'Prova.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>
  <body>
    <% String portname=request.getParameter("portname");
       String message=request.getParameter("message");
     try {
            CommPortIdentifier portId =
CommPortIdentifier.getPortIdentifier(portname);
            if (portId.getPortType() ==
CommPortIdentifier.PORT_SERIAL) {
         SimpleReadWrite1 srw = new SimpleReadWrite1(portId,message);
            }
            else {
               System.err.println(portname + " is not a serial port");
               System.exit(1);
            }
         }
             catch (NoSuchPortException e) { //Port nicht vorhanden
               System.err.println("No such port: " + portname);
               System.exit(1);
            }
             catch (PortInUseException e) { //Port ist
gesperrt/inGebrauch
               System.err.println("Port in use: " + portname);
               System.exit(1);}
     out.println("risposta andata a buon fine");
     out.println("se vuoi vedere il risultato clicca :");
       %>
        <a href="
http://localhost:8080/ciaobello/Risposta.jsp
">qui</a>
  </body>
</html>
classe:
package riccardo;
import java.io.*;
import javax.comm.*;
/**
 * Simple program to read characters from the command-line, send
 * them to the specified serial port, and echo any characters
returned.
 * Modeled after the SimpleRead and SimpleWrite sample programs
included
 * with the Java Communications API distribution.
 */
    public class SimpleReadWrite1
	{
private InputStream in;
private OutputStream out;
    	public SimpleReadWrite1(CommPortIdentifier portId,String message)
throws
		PortInUseException {
            	  try {
                    SerialPort serialPort = (SerialPort)
        portId.open("SimpleReadWrite",2000);
//        Port mit
                    in  = serialPort.getInputStream();
                    out = serialPort.getOutputStream();
                    serialPort.notifyOnDataAvailable(true);
                    serialPort.setSerialPortParams(19200,
//Schnittstelleneinstellungen initialisieren
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
                    byte[] readBuffer = new byte[33];
                      out.write(message.getBytes());
                      int numBytes = in.read(readBuffer);
                      PrintWriter out1 = new PrintWriter(
        					   new
FileWriter("C:/Jakarta/jakarta-tomcat-5.0.28/webapps/ciaobello/nome.txt",true));
        					   out1.print(new String(readBuffer));
        					   out1.close();
        			       serialPort.close();
                 } //Exception-Handling
                     catch (IOException e) {
                       System.err.println("Problem opening streams");
                      // System.exit(1);
                    }
                     catch (UnsupportedCommOperationException e) {
                       System.err.println("Problem setting port
parameters");
                       //System.exit(1);
                    }
            }
  }
PAG JSP IN CUI VISUALIZZA IL RISULTATO:
<%@ page language="java" import="java.util.*,java.io.*" %>
<%!
private String p;
private int next;
private char nextc;
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'Risposta.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>
  <body>
    <%
  String p=getServletContext().getRealPath("/");
    String p1=p.concat("nome.txt");
    try{
    FileReader filein = new FileReader(p1);
                       do{
      next = filein.read();  // legge il prossimo carattere
      if (next != -1)   // se non e' finito il file
          out.println((char) next);
          else
          out.println("<br>");
      }
    while (next !=-1);
   filein.close();
   }
        //chiude il file
 catch(IOException e){}
 out.println("se vuoi inserire tale risultato nel database clicca:");
 %>
 <a href="
http://localhost:8080/finito/Archivia.jsp
">qui</a>
 <a href="
http://localhost:8080/finito/MandaParametri.jsp
">se vuoi
lanciare un altro comando</a>
  </body>
 
</html>

forse é un problema di visibilità che stranamente viene a mancare
perchè applico un metodo write su message che dite?

credo proprio di aver capito male la visibilità dei parametri passati
da un form dato che passando da un form ad una pag jsp 2 parametri
questi sono visti, dopo, questi 2 parametri li passo ad una classe ed
il secondo parametro di nome message che entra in questa istruzione
out.write(message.getBytes) non viene visto perchè?Ho letto migliaia
di post qualcuno è in grado di aiutarmi?Se volete vedere il codice
guardate sopra ciao grazie

Scusa, ma io non vedo nel form che posti l'input type del dato
"message".
Comunque, il consiglio che intanto ti dò è di verificare i passaggi
cruciali.
Per esempio, prima di passare i parametri alla tua classe, metti una
bella
<%= request.getParameter("message"); %> nella tua mia.jsp
e guarda se scrive.
Consiglio generale: usa le servlet. La mappatura dei campi del form
così è automatico.

grazie per la risposta
ho fatto il copia incolla sbagliato ma ti assicuro che c'è anche :
<TR>
  <TD>message</TD>
  <TD>
    <INPUT TYPE="text" NAME="message" ID="message"  SIZE="20"
MAXLENGTH="20" >
  </TD>
inoltre <%= request.getParameter("message"­); %> mi scrivi message e
la classe va in esecuzione ma il modem non risponde nulla continuando a
trasmettere senza far terminare la classe tutto questo non succede se
dichiaro message dentro la classe o dentro la jsp del tipo
message=AT\r; se la posto con il form non funziona ;
ho provato a mettere anche se brutale tutto il codice nella pag jsp che
sono certo arrivano i parametri anche se brutale ma mi da errore in
in  = serialPort.getInputStream();
 out = serialPort.getOutputStream(); dicendo che non può convertire
OutputStream in JspWriter
quindi neanche riesco a mettere tutto in una jsp

riepilogando :
se passo da un form il parametro portname che viene trasformato
all'interno della jsp in portId e poi trasferito alla classe nessun
problema
il problema salta fuori quando passo il parametro message che passa
alla jsp ma sembra non arrivare alla classe o arrivarci troppo tardi
dopo che il modem è già andato in lettura

adesso ho messo un solo campo nel form quello della porta,poi ho
modificato la pag jsp in questo modo:
<%@ page language="java" import="javax.comm.*,riccardo.*,java.io.*" %>
<%!OutputStream out1;
InputStream in1;
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'Prova.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>
  <body>
 <% String portname =request.getParameter("portname");
     String message=request.getParameter("message");
     try {
            CommPortIdentifier portId =
CommPortIdentifier.getPortIdentifier(portname);
            if (portId.getPortType() ==
CommPortIdentifier.PORT_SERIAL) {
        SimpleReadWrite1 srw=new SimpleReadWrite1(portId);
            }
            else {
               System.err.println(portname + " is not a serial port");
               System.exit(1);
            }
         }
             catch (NoSuchPortException e) { //Port nicht vorhanden
               System.err.println("No such port: " + portname);
               System.exit(1);
            }
            catch (PortInUseException e) { //Port ist
gesperrt/inGebrauch
               System.err.println("Port in use: " + portname);
               System.exit(1);}
 byte[] readBuffer = new byte[33];
                      out1.write(message.getBytes());
                      int numBytes = in1.read(readBuffer);
                      PrintWriter out2 = new PrintWriter(
        					   new
FileWriter("C:/Jakarta/jakarta-tomcat-5.0.28/webapps/ciaobello/nome.txt",true));
        					   out2.print(new String(readBuffer));
        					   out2.close();
        			      %>
        <a
href="
http://localhost:8080/nprova/ServletResults.jsp
">qui</a>
  </body>
</html>
 E LA mia CLASSE ora si è ridotta così:
package riccardo;
import java.io.*;
import javax.comm.*;
/**
 * Simple program to read characters from the command-line, send
 * them to the specified serial port, and echo any characters
returned.
 * Modeled after the SimpleRead and SimpleWrite sample programs
included
 * with the Java Communications API distribution.
 */
    public class SimpleReadWrite1
	{
private InputStream in;
private OutputStream out;
    	public SimpleReadWrite1(CommPortIdentifier portId) throws
		PortInUseException {
            	  try {
                    SerialPort serialPort = (SerialPort)
        portId.open("SimpleReadWrite",2000);
//        Port mit
                    in  = serialPort.getInputStream();
                    out = serialPort.getOutputStream();
                    serialPort.notifyOnDataAvailable(true);
                    serialPort.setSerialPortParams(19200,
//Schnittstelleneinstellungen initialisieren
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
                 } //Exception-Handling
                     catch (IOException e) {
                       System.err.println("Problem opening streams");
                      // System.exit(1);
                    }
                     catch (UnsupportedCommOperationException e) {
                       System.err.println("Problem setting port
parameters");
                       //System.exit(1);
                    }
            }
  }
COME la giro mi dà questo errore:
type Exception report
message
description The server encountered an internal error () that prevented
it from fulfilling this request.
exception
org.apache.jasper.JasperException
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:372)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
root cause
java.lang.NullPointerException
	org.apache.jsp.mia_jsp._jspService(mia_jsp.java:101)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
note The full stack trace of the root cause is available in the Apache
Tomcat/5.0.28 logs.
sto facendo un monologo in questo ng ma è troppo stupida la mia
domanda o incomprensibile?

Hai postato troppo codice.
Lascia perdere quello che devi fare con "message".
La prima cosa che devi controllare è il passaggio delle informazioni
form->jsp->classe java quindi lascia perdere il modem e verifica solo
quello.
Inoltre, non hai uno strumento di debug per vedere dove prendi la
NullPonter?

grazie è la dimostrazione che esisto ma il controllo del passaggio dei
parametri lo fatto è per quello che mi concentravo nella parte di
codice relativa alla scrittura sul modem
la cosa strana è che se dichiaro String message="AT\r" dentro la jsp o
dentro la classe funziona ma perchè non dovrebbe funzionare se la
stringa gli arriva ne ho le prove ,quest'ultime smentite da questo
errore
il debug con myEclipse mi dice solo quello scritto sopra ma è mai
possibile che uno costruisce una applicazione che funziona
"perfettamente" funzionante e poi gli vuole solo impostare i parametri
e non funziona, sono tot. scoraggiato
scusa per lo sfogo ciao e grazie

Il problema potrebbe risiedere nel fatto che \r è l'espressione
regolare per il Carriage Return.
Se vuoi scrivere "AT\r" dovresti passargli "AT\\\\r" (ovviamente non è
l'utente che deve scrivere così nel form ma tu che devi gestire la
trascodifica).

grazie hai tentato ma alla classe prima di out.write(message.getBytes)
arriva AT\r proprio come deve arrivare ora non mi dà più un errore
java.lang.NullPointerException ma: riempo il form invio e vedo il modem
che invia qualcosa ma quel qualcosa è niente e continua ad inviare il
"niente" , e se non termina l'invio non termina la classe e quindi non
termina il caricamento della pagina se invece dichiaro message
all'interno della JSP o della classe tutto va a meraviglia ;comunque ho
provato come dici tu ma non funziona, ciao