JSP - eigene Klasse importieren

NestorA83

Grünschnabel
Guten Tag die Herren!


Ich schreibe das erste Mal in diesem Forum und sage allen herzlich Hallo!
Bei euren Tutorials suchte und fand ich aber schon des Öfteren Hilfe.


Sitze gerade bei einem Projekt und bin knapp am verzweifeln, weil schon viele viele Stunden in die Fehlersuche gelaufen sind.

Also, ich beschreibe mal was ich bei dem Projekt mache:
Ich will grundsätzlich eine Hardwareansteuerung (Schrittmotoransteuerung) mittels JSP realisieren. Momentan überprüfe ich die Kommunikation (über RS232-Schnittstelle) nur mit einer keinen Testroutine (am µC), mit der ich den erhaltenen String am Display einfach ausgebe.


Im ersten Schritt hab ich zwei JSP-Files erzeugt. Das erste ist fast ausschließlich in HTML-Code geschrieben mit dem ich ein Eingabefenster erzeuge:

Schrittmotoransteuerung.jsp

HTML:
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<%@ page import="java.util.StringTokenizer" %>
	
<html>
	<head>
		<title >Schrittmotoransteuerung mit JavaServer Page</title>
	</head>
	<body BGCOLOR="lightgray">
		<br><!-- br: Leerzeile -->
		<FONT FACE="Arial,Helvetica" COLOR="blue" SIZE="+3">
		<td><IMG SRC="rsz_LITEC.jpg" ALIGN=right HSPACE=10></td>
		<td><IMG SRC="rsz_schrittmotor.jpg" ALIGN=right HSPACE=10></td>	
		<EM>
		<U>
		<B>
		Schrittmotoransteuerung mit JavaServer Page		
		</B></EM></U>
		</FONT>
		<H2>TINF Projekt</H2>		
		<br>
		<HR >
		<DIV ALIGN="center">
			<H3>Eingabefeld</H3>		
			<form action="/Schrittmotoransteuerung_page2.jsp" method="post">	
				
				<!-- Erstes Eingabefeld -->
					<table width=540 border=1>
						<tr>
							<td>
								Anzahl der Schritte:
							</td>
							<td>
							<input name="steps" type="text" size="50"   >							</td>
						</tr>
						<tr>					
							<td>
								Geschwindigkeit:
							</td>
							<td>
								<input name="speed" type="text" size="50">							</td>
						</tr>
						<tr>
							<td>
								Drehrichtung:
							</td>
							<td>
								<input name="direction" type="radio" checked value="rechtslauf" size="50">     Rechtslauf<br>								
								<input name="direction" type="radio" value="linkslauf" size="50">     Linkslauf<br>
		
							</td>
						</tr>
						<tr>
							<td>
								Schrittweite:
							</td>
							<td>
								<input name="stepwidth" type="radio" checked value="vollschritt" size="50">     Vollschritt<br>	
								<input name="stepwidth" type="radio" value="halbschritt" size="50">     Halbschritt<br>	
							</td>
						</tr>										</table>					
			</DIV>

			<P ALIGN=CENTER>
			<tr>
				<td><input type="submit" value="Execute"></td>
			</tr>
			</P>
			<HR>					
		</form>
	</body>
</html>

Im zweiten JSP-File verarbeite ich nun die übergebenen Strings und will diese über die RS232-Schnittstlle an einen µC senden.


Schrittmotoransteuerung_page2.jsp

HTML:
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<%@ page import="java.util.StringTokenizer" %>

<html>
	<head>
		<title >Schrittmotoransteuerung mit JavaServer Page</title>
	</head>
	<body BGCOLOR="lightgray">

		<br><!-- br: Leerzeile -->
		<FONT FACE="Arial,Helvetica" COLOR="blue" SIZE="+3">
		<td><IMG SRC="rsz_LITEC.jpg" ALIGN=right HSPACE=10></td>
		<td><IMG SRC="rsz_schrittmotor.jpg" ALIGN=right HSPACE=10></td>	
		
		<EM>
		<U>
		<B>
		Schrittmotoransteuerung mit JavaServer Page		
		</B></EM></U>
		</FONT>
		<H2>TINF Projekt</H2>		
		<br>
		<HR >
		<DIV ALIGN="center">

			<H3>Ausgabefeld</H3>		
	
			<form action="/Schrittmotoransteuerung.jsp" method="post">	
		</DIV>

	
		<P ALIGN=CENTER>
		<tr>
			<td><input type="submit" value="Back"></td>
		</tr>
		</P>
		
<%  //--------------------------//Ab hier startet die Java Anwendung//------------------------------------------//
	  String steps;
	  String speed;
	  String direction;
	  String stepwidth;
	  String err_steps = null;
	  String err_speed = null;
	  String err_direction = null;
	  String err_stepwidth = null;

	if ( (request.getParameter("steps")  != null)  &&  (request.getParameter("steps").compareTo("") != 0) &&
         (request.getParameter("speed")  != null)  &&  (request.getParameter("speed").compareTo("") != 0) 
   	   ) // Abfrage ob alle Eingangsfelder ausgefüllt wurden
	{
		steps = request.getParameter("steps");
		speed = request.getParameter("speed");
		direction = request.getParameter("direction");
		stepwidth = request.getParameter("stepwidth");
		
		
		out.println("<P ALIGN=CENTER>"); 				
		out.println("<table width=540 border=1>");
		
		//Schnittstelle anlegen und Fehler ausgeben
		try
		{

//			RS232 rs = new RS232("COM1",9600,8,1,"NONE",10000);
			
			
			// Übertragen der Schritte
//			rs.writeRS232(steps);		// Abschlusszeichen auf '\r\n' im C-Programm ändern
//			err_steps = rs.readRS232();			


			// Übertragen der Geschwindigkeit			
//			rs.writeRS232(err_speed);	
//			err_steps = rs.readRS232();			


			// Übertragen der Drehrichtung	
			if(request.getParameter("steps").compareTo("rechtslauf") != 0){
//				rs.writeRS232("0");	
//				err_direction = rs.readRS232();			
			}
			if(request.getParameter("steps").compareTo("linkslauf") != 0){
//				rs.writeRS232("1");	
//				err_direction = rs.readRS232();			
			}


			// Übertragen der Schrittweite	
			if(request.getParameter("steps").compareTo("vollschritt") != 0){
//				rs.writeRS232("0");	
//				err_stepwidth = rs.readRS232();			
			}
			if(request.getParameter("steps").compareTo("halbschritt") != 0){
//				rs.writeRS232("1");	
//				err_stepwidth = rs.readRS232();			
			}
			
//			rs.closeRS232();
			
		}
		catch(Exception e)
		{
			out.println("RS232_Schnittstellenfehler"+e);
	
		}
		
		// Ausgabe der Schnittstellenparameter
			out.println("Schritte: "+steps);
			out.println(""+err_steps);
			out.println("<br>");
		
	 		out.println("Gschwindigkeit: "+speed);
			out.println(""+err_steps);			
			out.println("<br>");

	 		out.println("Drehrichtung: "+direction);
			out.println(""+err_direction);			
			out.println("<br>");

	 		out.println("Schrittweite: "+stepwidth);
			out.println(""+err_stepwidth);			
		out.println("<br>");

		out.println("<HR>"); 
		out.println("</table>"); 
  		out.println("</P>");
	}
	else
	{
		out.println("<P ALIGN=CENTER>");
		out.println("<table width=540 border=1>");
		out.println("Zu wenige Parameter"); 
		out.println("<HR>"); 
		out.println("</table>"); 
  		out.println("</P>");

	} 		
%>


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

Nun ja. Da ist jetzt natürlich eine menge auskommentiert. So Funktioniert es ja ziemlich gut. Nur sobald ich das RS232 Objekt erzeugen will wirft er sofort folgende Errormeldung aus:

type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
org.apache.jasper.JasperException: Unable to compile class for JSP:

An error occurred at line: 66 in the jsp file: /Schrittmotoransteuerung_page2.jsp
RS232 cannot be resolved to a type
63: try
64: {
65:
66: RS232 rs = new RS232("COM1",9600,8,1,"NONE",10000);
67:
68:
69: // Übertragen der Schritte


An error occurred at line: 66 in the jsp file: /Schrittmotoransteuerung_page2.jsp
RS232 cannot be resolved to a type
63: try
64: {
65:
66: RS232 rs = new RS232("COM1",9600,8,1,"NONE",10000);
67:
68:
69: // Übertragen der Schritte


Stacktrace:
org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:93)
org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)
org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:435)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:298)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:277)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:265)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:564)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:302)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
note The full stack trace of the root cause is available in the Apache Tomcat/5.5.26 logs.

Apache Tomcat/5.5.26



Oder folgende Fehlermeldungen, wenn ich das Fenster neu lade:


type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
org.apache.jasper.JasperException: Unable to load class for JSP
org.apache.jasper.JspCompilationContext.load(JspCompilationContext.java:599)
org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:137)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:314)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
root cause
java.lang.ClassNotFoundException: org.apache.jsp.Schrittmotoransteuerung_005fpage2_jsp
java.net.URLClassLoader$1.run(Unknown Source)
java.security.AccessController.doPrivileged(Native Method)
java.net.URLClassLoader.findClass(Unknown Source)
org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:131)
org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:63)
org.apache.jasper.JspCompilationContext.load(JspCompilationContext.java:597)
org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:137)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:314)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
note The full stack trace of the root cause is available in the Apache Tomcat/5.5.26 logs.

Apache Tomcat/5.5.26

Wahrscheinlich ist das mit dem java.net.URLClassLoader$1.run(Unknown Source)
mein Problem. Also findet er die Klasse RS232.class nicht.



Folgendes Java-File will ich importieren:


RS232.java
Code:
import java.io.*;
import javax.comm.*;

public class RS232 
{
	private String str;
	private PrintStream s_out;
	private SerialPort sp;
	private BufferedReader s_in;

	
	public RS232(	String port,
			int baud,
			int dbits,
			int sbits,
			String xpar,
			int rec_timeout)		throws Exception
	{
		int par = 0;
		
		if(dbits == 5){dbits = SerialPort.DATABITS_5;}
		if(dbits == 6){dbits = SerialPort.DATABITS_6;}
		if(dbits == 7){dbits = SerialPort.DATABITS_7;}
		if(dbits == 8){dbits = SerialPort.DATABITS_8;}
		
		if(sbits == 1){sbits = SerialPort.STOPBITS_1;}		
		if(sbits == 15){sbits = SerialPort.STOPBITS_1_5;}		
		if(sbits == 2){sbits = SerialPort.STOPBITS_2;}
		
		if(xpar == "NONE"){par = SerialPort.PARITY_NONE;}
		if(xpar == "ODD"){par = SerialPort.PARITY_ODD;}
		if(xpar == "EVEN"){par = SerialPort.PARITY_EVEN;}
		if(xpar == "MARK"){par = SerialPort.PARITY_MARK;}
		
		
		CommPortIdentifier p_id = CommPortIdentifier.getPortIdentifier(port);
		sp = (SerialPort)p_id.open("JAVA_Connection",1000);//1s Timeout
		sp.setSerialPortParams(baud,dbits,sbits,par);

		sp.enableReceiveTimeout(rec_timeout); 
		sp.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
		
		s_in = new BufferedReader(new InputStreamReader(sp.getInputStream()));
		s_out = new PrintStream(sp.getOutputStream());
	}
	
	public void closeRS232()throws Exception
	{
		if(s_in != null) s_in.close();
		if(s_out != null) s_out.close();
		if(sp != null) sp.close();
		s_in = null;
		s_out = null;
		sp = null;
	}	
		
	public void writeRS232(String s)throws Exception
	{
		s_out.println(s);
	}
	public String readRS232()throws Exception
	{
		str = s_in.readLine();
		return str;	

	}
}

Diese Routine habe ich bereits getestet. Sie funktioniert einwandfrei.


Ich habe schon versucht die Klasse in 100 verschiedene Ordner zu kopieren. Hab es in ein JAR-File verpackt und hab es nochmals in die 100 Ordner kopiert.(WEB-INF/classes; WEB-INF/lib; common/classes; common/lib; shared/classes; shared/lib; ...) Ich habe auch versucht es zu importieren, auch auf verschiedenste arten.
Danach hab ich mich ins Internet gehackt und bin stundenlang bei verschiedenen Tutorials gesessen. Die schreiben aber alle, dass das *.class File im Ordner WEB-INF/classes liegen muss.
Dann hab ich gemerkt, dass die mit ganz anderen Ordnerstrukturen arbeiten. Ich hatte Tomcat 6 installiert den heruntergelöscht und dann Tomcat 5.5 installiert.


Liegt das Problem vielleicht grundsätzlich an der Verbindung von JSP und der javax.comm.* mit der ich die Schnittstelle integriere. Hoffe nicht, dass das ein Problem darstellt sonst muss ich mein ganzes Konzept verwerfen.

Ich arbeite im Moment mit Tomcat 5.5 und JDK 1.6

Eigentlich brauche ich nur folgende 3 Informationen:
1. In welchen Ordner gehören die Klassen (in JAR verpackt oder nicht )
2. Die zugehörige Importanweisung
3. Ob es überhaupt funktionieren kann (Ansteuerung der Hardware) und was eventuell ein solche verhindern kann?



Ich arbeite das erste Mal mit Skriptlets und hoffe einer von euch hatte schon einmal dasselbe Problem gehabt und kann mir weiterhelfen.


Vielen Dank im Voraus für die Bemühungen


NestorA83
 
Zum Import in JSPs:

* die Importanweisung bezieht sich nur auf das Package, für die ist also irrelevant wo deine Klasse im Classpath liegt, hauptsache, sie liegt im Classpath
* für Webanwendungen hast du zwei möglichkeiten: Klassen direkt müssen in "WEB-INF/classes" deines WAR files, JARs landen in WEB-INF/lib - alles was da rumliegt wird vom Classloader gefunden

Gruß
Ollie
 
Danke für die rasche Antwort.

Das ist ja das Problem. Meine Klasse RS232.class liegt momentan im Ordner:

C:\Programme\Apache Software Foundation\Tomcat 5.5\webapps\ROOT\WEB-INF\classes

Vielleicht liegt das Problem darin, dass ich nicht direkt ein JSP-Projekt anlege. Ich rufe einfach das JSP-File mit http://localhost:8080/Schrittmotoransteuerung.jsp auf, das im ROOT-Ordner liegt. Das ist ja dann nur ein Skriptlet, wenn ich das richtig verstanden habe.
Eigentlich müsste es aber auch so funktionieren.

Ich werde mich einfach noch ein bisschen in das Problem verbeißen und lass euch dann wissen ob es geklappt hat.


Gruß

NestorA83
 
Dieser schritt wäre geschafft.

Javac findet nun das Package.
Mein Fehler: ich habe den Tomcat gestartet und wild in seinen Verzeichnissen rumkopiert. Was ich nicht wusste ist, dass er beim Starten die ganzen Packages ladet und sie, wenn man danach etwas hineinkopiert, diese nicht mehr kennt. Tja. Anfängerfehler kosten nun mal viel Zeit.


Gut nun lässt sich das JSP-Schrittmotor_page2.jsp auch kompilieren.

ABER!!

Wenn ich ihm nun einen Wert übergebe hängt er sich beim erzeugen des Objektes

RS232 rs = new RS232(blab);

auf.

Gut, dann hab ich gedacht vielleicht is ja was mit dem erzeugten JAR falsch also habe ich folgende JSP geschrieben:

Schrittmotoransteuerung.jsp:
HTML:
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<%@ page import="java.util.StringTokenizer" %>
<%@ page import="javax.comm.*" %>
<%@ page import="java.io.*" %>

<html>
	<head>
		<title >Schrittmotoransteuerung mit JavaServer Page</title>
	</head>
	<body BGCOLOR="lightgray">
		<br><!-- br: Leerzeile -->
		<FONT FACE="Arial,Helvetica" COLOR="blue" SIZE="+3">
		<td><IMG SRC="rsz_LITEC.jpg" ALIGN=right HSPACE=10></td>
		<td><IMG SRC="rsz_schrittmotor.jpg" ALIGN=right HSPACE=10></td>		
		<EM><U>	<B>
		Schrittmotoransteuerung mit JavaServer Page		
		</B></EM></U>
		</FONT>
		<H2>TINF Projekt</H2>	
		<br>	
		<HR>
		<DIV ALIGN="center">
			<H3>Ausgabefeld</H3>		
			<form action="/Schrittmotoransteuerung.jsp" method="post">	
		</DIV>
		<P ALIGN=CENTER>
		<tr>
			<td><input type="submit" value="Back"></td>
		</tr>
		</P>
		
<%  //--------------------------//Ab hier startet die Java Awendung//----------------------------------------//
		String steps;
		String speed;
		String direction;
		String stepwidth;
		String err_steps = null;
		String err_speed = null;
		String err_direction = null;
		String err_stepwidth = null;

//		Streams für die RS232 Schnittstelle
		String str;
		PrintStream s_out;
		SerialPort sp;
		BufferedReader s_in;
		
		int baud = 4800;
		int dbits = SerialPort.DATABITS_7;
		int sbits = SerialPort.STOPBITS_1;
		int par = SerialPort.PARITY_NONE;
		int rec_timeout = 10000;

	if ( (request.getParameter("steps")  != null)  &&  (request.getParameter("steps").compareTo("") != 0) &&
         (request.getParameter("speed")  != null)  &&  (request.getParameter("speed").compareTo("") != 0) 
   	   ) // Abfrage ob alle Eingangsfelder ausgefüllt wurden
	{
		steps = request.getParameter("steps");
		speed = request.getParameter("speed");
		direction = request.getParameter("direction");
		stepwidth = request.getParameter("stepwidth");
		
		
		out.println("<P ALIGN=CENTER>"); 				// Schreibt neue HTML-Anweisung an den Server
		out.println("<table width=540 border=1>");



		//Schnittstelle anlegen und Fehler ausgeben
		try
		{


//----------------------------erzeuge der RS232 Schnittstelle
			CommPortIdentifier p_id = CommPortIdentifier.getPortIdentifier("COM1");
			sp = (SerialPort)p_id.open("JAVA_Connection",1000);
			sp.setSerialPortParams(baud,dbits,sbits,par);
			
			sp.enableReceiveTimeout(rec_timeout); 
			sp.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
			
			s_in = new BufferedReader(new InputStreamReader(sp.getInputStream()));
			s_out = new PrintStream(sp.getOutputStream());

			try
			{

				// Übertragen der Schritte
				s_out.println(steps);				// Abschlusszeichen auf '\r\n' im C-Programm ändern
				err_steps = s_in.readLine();			
	
	
				// Übertragen der Geschwindigkeit			
				s_out.println(err_speed);	
				err_steps = s_in.readLine();			
	
	
				// Übertragen der Drehrichtung	
				if(request.getParameter("steps").compareTo("rechtslauf") != 0){
					s_out.println("0");	
					err_direction = s_in.readLine();			
				}
				if(request.getParameter("steps").compareTo("linkslauf") != 0){
					s_out.println("1");	
					err_direction = s_in.readLine();			
				}
	
	
				// Übertragen der Schrittweite	
				if(request.getParameter("steps").compareTo("vollschritt") != 0){
					s_out.println("0");	
					err_stepwidth = s_in.readLine();			
				}
				if(request.getParameter("steps").compareTo("halbschritt") != 0){
					s_out.println("1");	
					err_stepwidth = s_in.readLine();			
				}
			}
			catch(Exception e)
			{
				out.println("RS232_Schnittstellenfehler:    "+e);
			}
				
				if(s_in != null) s_in.close();
				if(s_out != null) s_out.close();
				if(sp != null) sp.close();
			s_in = null;
			s_out = null;
			sp = null;
		}
		catch(Exception e)
		{
			out.println("RS232_Schnittstellenfehler:    "+e);
		}
			out.println("<br>");

		
		// Ausgabe der Schnittstellenparameter
			out.println("Schritte: "+steps);
			out.println(""+err_steps);
			out.println("<br>");
		
	 		out.println("Gschwindigkeit: "+speed);
			out.println(""+err_steps);			
			out.println("<br>");

	 		out.println("Drehrichtung: "+direction);
			out.println(""+err_direction);			
			out.println("<br>");

	 		out.println("Schrittweite: "+stepwidth);
			out.println(""+err_stepwidth);			
			out.println("<br>");

		out.println("<HR>"); 
		out.println("</table>"); 
  		out.println("</P>");
	}
	else
	{
		out.println("<P ALIGN=CENTER>");
		out.println("<table width=540 border=1>");
		out.println("Zu wenige Parameter"); 
		out.println("<HR>"); 
		out.println("</table>"); 
  		out.println("</P>");
	} 		
%>
			<P ALIGN=right>
				<tr>
					<B>NestorA83</B>
					<br>
					<%= new java.util.Date() %>.	
				</tr>
			</P>
		</form>
	</body>
</html>



Jetzt funktioniert alles perfekt mit dem kompilieren. Nur er schreibt mir eine Exception auf meine HTML-Seite raus: NoSuchPortException


Habe natürlich gleich mal überprüft, ob ich wirklich keinen COM1 Port angeschlossen habe aber der Serielladapter auf diesem.

An was könnte das liegen. Bin echt ratlos und drehe mich geistig im Kreis. Wenn jemand mal über den Code schauen könnte wäre mir echt geholfen.


Danke im voraus

NestorA83
 
Zurück