# Unterschriftenfeld



## dereine82 (14. Mai 2008)

Hallo,

zu anfang möchte ich erstmal gestehen von Java wenig bis gar keine Ahnung zu haben, hoffe aber trotzdem hier hilfe zu bekommen ich denke mein Problem lässt sich nur über ein Java Applet lösen.

Ich habe ein Formular welches ich in digitale Form bringen will und den Inhalt in einer MYSQL Datenbank ablegen möchte. Leider gibt mit Html nicht die möglichkeit das der User dieses Formular auch unterschreibt. Sowas würde ich aber brauchen.

Gibt es nicht in Java die möglichkeit ein Java feld zu machen in der der Anwender per Maus seine Unterschrift hinkritzelt und diese dann auf den Webserver als JPG ablegt (dateinamen müsste per parameter an das Applet mitgeben)

Danke schonmal


----------



## ARadauer (14. Mai 2008)

ja dürfte klappen


----------



## dajos7 (14. Mai 2008)

Hallo, das ist prinzipell möglich.

Zu bedenken ist, das für Zugriffe des Applets auf andere Server generell ein Signiertes Applet bereitstehen muss. 
Also man kann das über Streams lösen.

Man öffnet mit einer URLConnection eine URL und nimmt sich davon die bereitgestellten Streams.

Das Servlet hat über das request Objekt auch Streams. Damit lässt sich vom Applet ganz einfach etwas zum Servlet schicken. Beispiele dafür gibt es aber im Internet wie Sand am Meer.

Das Zeichnen auf einen Panel ist auch nicht die Welt. Von dort eben einfach das Bild erzeugen und über die Streams hochschieben.

Falls es nicht klappt, kann ich mich evtl für ein beispiel erbarmen


----------



## Illuvatar (14. Mai 2008)

@dajos7 Das Applet müsste eigentlich eine Netzwerkverbindung zu dem Server aufbauen dürfen, auf dem es liegt.

@OP Das ganze wäre übrigens sicherlich ach irgendwie in JavaScript lösbar. Ich würde Java bevorzugen weil ich das besser kann, aber ich wollte es nur anmerken


----------



## dajos7 (14. Mai 2008)

*@Illuvatar*
Ja mit Ajax gehts auch
ajax-file-upload

Solang es vom gleichen Server geladen wird, ist das auch kein Problem es ohne Signatur rennen zu lassen.

Ist immer etwas aufwendig sowas umzusetzen. Der Theard-Steller soll hier ja was lernen und sich selbst damit beschäftigen  Bin da meist zu faul aufwenige Beispiele zu erstellen.


----------



## Gast (15. Mai 2008)

Dazu hab ich mal ne Frage: 
Wie soll der User das denn Unterschreiben? Mit der Maus? Weil 
ich schaffs nicht mal nen graden Strich mit der Maus zu ziehen, 
von ner Unterschrift ganz zu schweigen. 
Das würd mich jetzt echt mal interessieren.


----------



## dereine82 (15. Mai 2008)

Ja, einfach mit der Maustaste gedrückt wie bei Paint irgendwas dahinkritzeln was er dann sein Unterschrift nennt das wäre für mich schon völlig ausreichend. Am besten noch ein button dabei um sein kunstwerk im zweifelsfall wieder zu clearen. anschliessend sollte das nach absenden als bilddatei auf dem server bereitliegen sodass ich dann einfach nur den pfad in mysql hinterlegen muss. Macht die sache sicherlich noch einfacher.


----------



## dereine82 (15. Mai 2008)

dajos7 hat gesagt.:
			
		

> Hallo, das ist prinzipell möglich.
> 
> Zu bedenken ist, das für Zugriffe des Applets auf andere Server generell ein Signiertes Applet bereitstehen muss.
> Also man kann das über Streams lösen.
> ...



Ich glaube ich kann hier beruhigen das Applet soll auf den gleichen Server laufen wie auch die Bilder abgelegt werden sollen.


----------



## Campino (15. Mai 2008)

Ich würde eventuell das ganze Formular als Applet machen, weil du sonst entweder vom Absenden- Button des HTML- Formulars aus das Applet benachrichtigen musst oder vom Absenden- Button des Applets aus das Formular, beides ist aufwendig...(und bei beidem müsste ich erstmal überlegen, wie/ob das überhaupt geht)
Außerdem sieht ein ordentliches Java- Applet schöner aus also ein HTML- Formular


----------



## dajos7 (15. Mai 2008)

Hallo,

wenn der Submit button gedrückt wird, kann man über die onclick oder onsubmit methode des Tags eine javascript funktion aufrufen. Das ganze kann man dann so schön machen, das man auf die ID des Applet tags zugreift und direkt die im applet implentierten funktionen aufrufen kann. Da könnte man zB eine Funktion aufrufen, die das Bild sendet.
So ich nehm mich der sache mal an und bau ein beispiel. Kann etwas dauern. Aber bis jetzt war ja noch keiner schneller


----------



## Illuvatar (15. Mai 2008)

Danke dajos7... mich hats noch bei jedem Lesen hier in den Fingern gejuckt, genau das zu tun


----------



## dajos7 (16. Mai 2008)

So ich hab mich mal dran gemacht, man kann es sicherlich besser machen, aber so hat es auf Anhieb geklappt. Verwendet wurde Java 1.6 mit einem Tomcat 5.5.


Servlet


```
package de;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SignatureReceiver extends HttpServlet {

	private static final long serialVersionUID = -1886621951363202578L;

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {
		System.out.println("Made a Post");

		InputStream in = req.getInputStream();

		BufferedImage img = ImageIO.read(in);

		ImageIO.write(img, "png", new File("C:\\test.png"));
		
		//Vlt sollte man das Bild in eine session legen und mit den anderen Daten zusammen dann auslesen.

	}

}
```


Applet

```
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.JApplet;
import javax.swing.JPanel;
import javax.swing.BorderFactory;

public class MainApp extends JApplet {


	private static final long serialVersionUID = -7883883344288822360L;

	private JPanel jContentPane = null;


	public MainApp() {
		super();
	}

	public void init() {
		this.setSize(300, 200);
		this.setContentPane(getJContentPane());
	}

	private JPanel getJContentPane() {
		if (jContentPane == null) {

			jContentPane = new JPanel();
			jContentPane.setLayout(new BorderLayout());
			jContentPane.add(getJPanel(), BorderLayout.CENTER);

		}
		return jContentPane;
	}

	private JPanel jPanel = null;

	public void sendToServer() {

		try {
			if (img != null) {
				URL url = new URL(
						"http://localhost:8080/testServ/signatureReceiver.do");
				HttpURLConnection urlConn = (HttpURLConnection) url
						.openConnection();

				urlConn.setDoInput(true);
				urlConn.setDoOutput(true);
				urlConn.setRequestMethod("POST");
				urlConn.setUseCaches(false);
				urlConn.connect();

				OutputStream out = urlConn.getOutputStream();

				ImageIO.write(img, "png", out);

				if (urlConn.getResponseCode() != HttpURLConnection.HTTP_OK) {
					System.out.println(urlConn.getResponseCode());
				} else {
					System.out.println("alles geschickt");
				}

			}

		} catch (Exception e) {
			System.out.println("Error while sending signature: " + e);
		}

	}


	private int x_old = -1;

	private int y_old = -1;

	private int x = -1;

	private int y = -1;

	private BufferedImage img = null;

	private JPanel getJPanel() {
		if (jPanel == null) {
			jPanel = new JPanel();
			jPanel.setLayout(null);
			jPanel.setBackground(Color.white);

			jPanel.setBorder(BorderFactory.createLineBorder(Color.gray, 2));
			jPanel
					.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
						public void mouseDragged(java.awt.event.MouseEvent e) {
							x = e.getX();
							y = e.getY();

							if (img == null) {
								img = new BufferedImage(jPanel.getWidth(),
										jPanel.getHeight(),
										BufferedImage.TYPE_INT_RGB);
								img.getGraphics().setColor(Color.WHITE);
								img.getGraphics().fillRect(0, 0,
										jPanel.getWidth(), jPanel.getHeight());
							}

							Graphics gg = img.getGraphics();
							Graphics g = jPanel.getGraphics();
							gg.setColor(Color.BLACK);
							g.setColor(Color.BLACK);
							if (x_old == -1 && y_old == -1) {
								gg.drawLine(x, y, x, y);
								g.drawLine(x, y, x, y);
							} else {
								gg.drawLine(x, y, x_old, y_old);
								g.drawLine(x, y, x_old, y_old);
							}

							x_old = x;
							y_old = y;

						}
					});
			jPanel.addMouseListener(new java.awt.event.MouseAdapter() {
				public void mouseReleased(java.awt.event.MouseEvent e) {
					x_old = -1;
					y_old = -1;
				}
			});

		}
		return jPanel;
	}

}
```


Web.xml

```
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	
	
  <servlet>
    <servlet-name>signatureRec</servlet-name>
    <servlet-class>de.SignatureReceiver</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>signatureRec</servlet-name>
    <url-pattern>/signatureReceiver.do</url-pattern>
  </servlet-mapping>
	
	<display-name>
	testServ</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
</web-app>
```


HTML Code


```
<applet id="sender" codebase="http://localhost:8080/testServ/"
	code="MainApp.class" width=400 height=300>
  

  No Java? Get a life!

  </applet>
  
  

  <input type="button" onclick="javascript:document.sender.sendToServer();" value="Send">
```


----------



## dereine82 (21. Mai 2008)

Erstmal Danke für den Code ich bin seit gestern da dran den Tomcat auf der Testmaschine einzurichten und dies ist in meinen Augen abgeschlossen auf port 8080 geht was auf. 

Soweit so gut aber da ich von Java wie oben schon erwähnt schreib ich erstmal was ich danach versucht (verbrochen habe).

Ich hab bissel im forum gesucht gekramt gebastelt und hab die Dateien auf dem Tomcat folgendermassen angeordnet

webapps\Root
│   index.htm
│
├───Backup
│   │   asf-logo-wide.gif
│   │   favicon.ico
│   │   index.jsp
│   │   RELEASE-NOTES.txt
│   │   tomcat-power.gif
│   │   tomcat.gif
│   │
│   ├───admin
│   │       index.html
│   │
│   └───WEB-INF
│       │   web.xml
│       │
│       └───lib
│               catalina-root.jar
│
└───WEB-INF
    │   web.xml
    │
    └───lib
            applet.java
            servlet.java

Unter Backup hab ich die Dateien die vorher drin waren reingepackt kann daher ignoriert werden.

ich hab im root meine index.htm mit dem HTML Code gefüllt abgelegt

Die web.xml und WEB-INF

und die Sourcen für das applet und servlet in lib abgegt. (Ich gehe davon aus das das schonmal falsch ist da diese noch Compiliert werden müssen)

Zum Kompilieren hab ich jawac und die Javadatei verwendet und bekomme:

Servlet.java


```
servlet.java:14: class SignatureReceiver is public, should be declared in a file
 named SignatureReceiver.java
public class SignatureReceiver extends HttpServlet {
       ^
servlet.java:9: package javax.servlet does not exist
import javax.servlet.ServletException;
                    ^
servlet.java:10: package javax.servlet.http does not exist
import javax.servlet.http.HttpServlet;
                         ^
servlet.java:11: package javax.servlet.http does not exist
import javax.servlet.http.HttpServletRequest;
                         ^
servlet.java:12: package javax.servlet.http does not exist
import javax.servlet.http.HttpServletResponse;
                         ^
servlet.java:14: cannot find symbol
symbol: class HttpServlet
public class SignatureReceiver extends HttpServlet {
                                       ^
servlet.java:19: cannot find symbol
symbol  : class HttpServletRequest
location: class de.SignatureReceiver
   protected void doPost(HttpServletRequest req, HttpServletResponse res)
                         ^
servlet.java:19: cannot find symbol
symbol  : class HttpServletResponse
location: class de.SignatureReceiver
   protected void doPost(HttpServletRequest req, HttpServletResponse res)
                                                 ^
servlet.java:20: cannot find symbol
symbol  : class ServletException
location: class de.SignatureReceiver
         throws ServletException, IOException {
                ^
servlet.java:18: method does not override or implement a method from a supertype

   @Override
   ^
10 errors
```
applet.java



```
applet.java:14: class MainApp is public, should be declared in a file named Main
App.java
public class MainApp extends JApplet {
       ^
1 error
```

wenn ich die tomcat seite aufmach bekomm ich 404 meldung. wundert mich auch ich ging jetzt davon aus das die index aufgeht mit einem java was nicht aufgeht.


vermutlich grössere anfängerfehler aber mein bisheriges suchen hat mir nicht weitergeholfen.


----------



## dajos7 (21. Mai 2008)

Das alles von Hand zu Kompilieren, da wirst Du nicht mehr glücklich. Du solltest dringend eine IDE benutzen.




- installier Dir das JDK
- installier Dir zB lomboz oder eine distribution von eclipse mit den WebTools

Man muss pfade setzen und das alles jetzt hier zu erklären wird extrem. Mit Eclipse wirst Du hier extrem entlastet.


zur MainApp.

Die Datei muss den gleichen namen wie die Klasse haben also MainApp.java
das gilt auch für das Servlet.

die index datei muss direkt im Root liegen, dort greift tomcat dann als erstes zu. Du hast da auch noch eine in einem admin verzeichnis.

Wenn Du am WE zeit findest könnten wir gerne eine Messanger-Sitzung (zB ICQ) machen,  dann geht das alles recht schnell.

Das Verzeichnis Root sollte UPPERCASE sein also ROOT


----------



## Guest (21. Mai 2008)

dajos7 hat gesagt.:
			
		

> Das alles von Hand zu Kompilieren, da wirst Du nicht mehr glücklich. Du solltest dringend eine IDE benutzen.
> 
> 
> 
> ...



Hallo Dajos,

erstmal Danke für deine Hilfe. Das Paket hab ich unten. Am Wochenende verbietet mir meine freundin unter auflagen strengster strafen die böse flimmerkiste anzuwerfen daher könnte ich morgen (feiertag) abend anbieten oder freitag im laufe des Tages gerne.

Das Eclipse ist inzwischen unten das JDK sowieso sonst läuft das Tomcat ja nicht 

Hoffe das hilft.

Gruss

dereine82


----------

