# JSP JavaScript SQL Update



## Br4ve (5. Sep 2012)

Hallo,
ich habe ein Problem mit meinem JSP-Code, bzw. mit der Übergabe von bestimmten Attributwerten an eine Java-Funktion aus einer JSP raus.

folgender Code:

```
fsckbutton="<form action=\"error.jsp?\">" +
						"<td class=\"tdsmall\" title=\"Set process to Finished&Checked\">" +
						"<input type=\"submit\" name=\"fus\" class=\"submitbtn2\" onClick=\"return confirmSubmit2("+arlst.get(0)+","+arlst.get(8)+","+cmd+")\" value=\"Finished & .chk.\">" +
						"<input type=\"hidden\" name=\"psid\" value="+arlst.get(8)+">" +
						"<input type=\"hidden\" name=\"pid\" value="+pid+"></td></form>";
```

Diese Variable lese ich an andrer Stelle in meine Jsp ein. Ob die hidden attribute überhaupt nötig sind weiß ich nicht. Die form action hab ich einfach auf die gleiche Seite gelenkt.
Die Javascriptfunktion ist folgende:


```
function confirmSubmit2(test)

{
var agree=confirm("You have to check this values in pcontrol!\\n\\nJobid = "+
confirmSubmit2.arguments[0]+"\\nProcessstep= "+
confirmSubmit2.arguments[1]+"\\nToolname= "+
confirmSubmit2.arguments[2]+"\\n\\nAre you absolutely sure that you want to continue?");

if (agree)
        return true ;
else
        return false ;
}
```

Also eigentlich nichts spektakuläres. Ich will jetzt das wenn man auf den Button drückt diese Javafunktion ausgeführt wird:

```
public static void fus(String db, String psid, String pid){
	PreparedStatement pstmt;
	Connection con = datenbankZugriff.dbverbindung.getConnection(db);
	
	
	
	try {
		pstmt = con.prepareStatement("UPDATE processstep SET status = ? WHERE  psid = ? UPDATE " +
				"processinstance SET status = ? WHERE  pinid = (SELECT processinstance.pinid FROM " +
				"processinstance, processstep WHERE processstep.psid = ? AND processstep.pinid = " +
				"processinstance.pinid); UPDATE process SET status = ? WHERE  pid = ? ");
		
		pstmt.setString(1, "8");
		pstmt.setString(2, psid);
		pstmt.setString(3, "7");
		pstmt.setString(4, psid);
		pstmt.setString(5, "8");
		pstmt.setString(6, pid);
		
		con.close();
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}
```
Also ein Datenbankupdate ausgeführt wird. Irgendwie habe ich jedoch keine Idee wie ich quasi dem HTML-Code sage er soll die Funktion ausführen? Geht das überhaupt?


----------



## nillehammer (5. Sep 2012)

> Irgendwie habe ich jedoch keine Idee wie ich quasi dem HTML-Code sage er soll die Funktion ausführen? Geht das überhaupt?


Ja, durch das Form-Submit erzeugst Du einen Request an den Webserver. Dieser wird an die im action-Attribut genannte URL geschickt. Das ist bei Dir "error.jsp?". D.h. error.jsp muss jetzt irgendwie Code enthalten, um diesen Request zu verarbeiten. Diesen hat sie wohl wahrscheinlich nicht und sollte es auch nicht haben. Normalerweise schreibt man sich ein Servlet für die Verarbeitung von Posts. Dort implementiert man die doPost-Methode. In dieser setzt Du dann Deine Query ab. Je nach Query-Result *redirectest* (wichtig, redirect nicht forward) Du dann auf eine error oder success-Seite.

Aus dem "?" am Ende Deines action-Attributes schließe ich, dass Du Dir gerne einen Get-Request zusammenbasteln willst. Das geht, aber lass es! Man macht das so nicht. Gerade bei Requests, die Datenänderungen auf dem Server auslösen, nimmt man POST.


----------



## Br4ve (5. Sep 2012)

Kann ich nicht irgendwie auf die selbe Jsp verweisen, also error.jsp und bevor die erstellt wird iwie sagen falls Attribut XY = true führe aus und dann das ganz normal per TagHandler machen? ???:L
Wenn auch nicht sonderlich elegant...

EDIT: Oder die Funktion einfach dann am Anfang der JSP direkt aufrufen, anstatt eines HAndleraufrufs...


----------



## nillehammer (5. Sep 2012)

> EDIT: Oder die Funktion einfach dann am Anfang der JSP direkt aufrufen, anstatt eines HAndleraufrufs...


Klar, mit in die JSP eingebettetem Java-Code kannst du Dir Deine Hilfsklasse importieren, die Daten aus dem Request rauspulen und mit den Daten die Methode 
	
	
	
	





```
fus
```
 aufrufen. Ich habe hier keine Laufzeitumgebung für JSPs, deswegen nur ein paar Stichpunkte statt lauffähigen Codes:
- 
	
	
	
	





```
<%@ page import="package1.myClass1,package2.myClass2,....,packageN.myClassN" %>
```
- An die Daten des Requests kommst Du direkt ran mit request.getAttribute("NameDesAttributs")

P.S. Hier findest Du eine Auflistung der Objekte, die implizit in jeder JSP direkt zugreifbar sind: JavaServer Page Implicit Objects


----------



## Br4ve (5. Sep 2012)

Funktioniert so weit blos bekomme ich jetzt eine: java.sql.SQLException: ORA-00933: SQL command not properly ended . Was wohl bedeutet meine SQL Anfrage ist fehlerhaft, untersuche den Ausdruck jetzt schon länger doch kann kein Fehler entdecken...


----------



## nillehammer (6. Sep 2012)

- Habs jetzt nicht genau Analysiert, aber wenn Du Strings als Parameter übergibst, solltest Du sie im SQL-Statement in einfache Hochkommas (') setzen. Das sehe ich nirgends.

- Außerdem versuchst Du *zwei* Statements abzusetzen. Könnte sein, dass er sich da beschwert.

- Und Subselects werden auch nicht von jedem DBMS unterstützt.


----------

