JSP <TEXTAREA>-Tag unterstützt EL-Variablen nicht

hjpsoft

Mitglied
Ich schreibe eine Rezeptverwaltung, die Servlet-gesteuert mit JSP-Dateien dargestellt wird. Die Persistent-Ebene habe ich mit der JAVA-DB realisiert.
In meiner Update.jsp jedoch funktionieren die EL-Variablen nur in den INPUT-Tags über das VALUE-Attribut lesend und schreibend
Bei der Nutzung des TEXTAREA-Tags (ich will dort die Zutaten eintragen) erscheint der Inhalt der EL-Variable ${rezept.zutaten}, aber nach der Änderung sind die Daten weg.
[CODE lang="html" title="JSP-Formular" highlight="10"]<form name="formular" action="update.html" method="POST" id="inputform">
<table>
<tr>
<th width="300">Name</th>

<td width="300"><input type="text" name="name" id="textboxid" value="${rezept.name}"></td>
</tr>
<tr>
<th><label for="inputform">Zutaten</label></th>
<td><textarea name="feld" id="feld" rows="4" cols="50" form="inputform" onblur="getValue(formular.feld)">${rezept.zutaten}</textarea></td>
</tr>
<tr>
<th><label for="inputform">Gruppe</label></th>
<td><input type="text" name="gruppe" id="textboxid" value="${rezept.gruppe}"></td>
</tr>
<tr>
<td><label for="inputform">Zubereitung</label></td>
<td><input type="text" name="handlung" id="textboxid" value="${rezept.handlung}"></td>
</tr> <tr>
<td><label for="inputform">Sonstiges</label></td>
<td><input type="text" name="sonstiges" id="textboxid" value="${rezept.sonstiges}"></td>
</tr>
<tr>
<td></td><td>
<input type="hidden" name="id" value="${rezept.id}">
<input type="submit" value="Aktualisieren">
</td>
</tr>
</table>
</form>[/CODE]
den ONBLUR-Event habe ich zur Fehlersuche eingebettet.

Hat jemand im Forum einen Hinweis, wie man große Textfelder in einem derartigen Formular darstellt, oder wie man das Tag TEXTAREA benutzen kann, das es schreibend auf eine EL-Variable zugreift.

Liebe Grüße
Hajo
 

Oneixee5

Top Contributor
Der Name des Textarea ist: name="feld", hier ist leider nicht ersichtlich ob du auch "feld" unter "zutaten" speicherst. Wie sieht denn der Datensatz in der DB nach den Speichern aus?
 

hjpsoft

Mitglied
Der Datensatz ist nach der Speicherung in diesem Feld leer. Der Name "feld" ist in der Tat blöd. Ich ändere ihn mal in "zutaten_feld". Aber es hat nichts gebracht.
 

hjpsoft

Mitglied
Ja, der Code ist in der Datei update.java den Du hier siehst: (Zeile 38 vollzieht die Speicherung)
[CODE lang="java" title="update.java"]

package controller.command;

import java.io.IOException;
import java.sql.SQLException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model.Rezept;
import persistence.RezeptDAO;

public class Update implements Command {

@Override
public void executeGET(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

try {
request.setAttribute("rezept", ((RezeptDAO) request.getServletContext().getAttribute("rezeptDAO")).findById(request.getParameter("id")));
} catch (SQLException e) {
throw new ServletException(e);
}

RequestDispatcher dispatcher = request.getServletContext().getRequestDispatcher(JSPPATH+"update.jsp");
dispatcher.include(request, response);

}

@SuppressWarnings("removal")
@Override
public void executePOST(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Rezept aktualisiertesRezept = new Rezept (request.getParameter("name"),request.getParameter("zutaten"),request.getParameter("gruppe"),request.getParameter("handlung"), request.getParameter("sonstiges"));

aktualisiertesRezept.setId(new Integer(request.getParameter("id")));

try {
((RezeptDAO) request.getServletContext().getAttribute("rezeptDAO")).setRezept(aktualisiertesRezept);
} catch (SQLException e) {
throw new ServletException(e);
}

response.sendRedirect("read.html");

}

@Override
public String getTitel() {
return "Rezept aktualisieren";
}

}
[/CODE]

und die Methode setRezept(Rezept Rezept) ist hier:
[CODE lang="java" title="Methode setRezept(Rezept)" highlight="7"]public void setRezept(Rezept rezept) throws SQLException {

PreparedStatement psUpdate = conn.prepareStatement(
"update REZEPTE set NAME = ?, ZUTATEN = ?, GRUPPE = ?, HANDLUNG = ?, SONSTIGES = ? where ID = ?");

psUpdate.setString(1,rezept.getName());
psUpdate.setString(2,rezept.getZutaten());
psUpdate.setString(3,rezept.getGruppe());
psUpdate.setString(4,rezept.getHandlung());
psUpdate.setString(5,rezept.getSonstiges());
psUpdate.setInt(6, rezept.getId());

psUpdate.executeUpdate();

psUpdate.close();
}[/CODE]
 

Oneixee5

Top Contributor
Da die Form ein POST macht ist vermutlich executePOST der interessante Teil.
request.getParameter("zutaten") ist wahrscheinlich immer leer da dein Textarea: name="feld" hat. Du musst meiner Meinung nach request.getParameter("feld") aufrufen oder das Attribut von Textarea name="zutaten" ändern.

Ich hoffe das war verständlich.
 

hjpsoft

Mitglied
Vielen Dank für Deinen Hinweis.
Ich habe in der Methode executePost den TEXTAREA-Inhalt mit
[CODE lang="java" title="Update.java" highlight="1"]aktualisiertesRezept.setZutaten(new String(request.getParameter("zutaten")));
aktualisiertesRezept.setHandlung(new String(request.getParameter("handlung")));[/CODE]
das (fast) aktuelle Ergebnis nochmal "drüber aktualisiert und gleichzeitig ein zweites TEXTAREA-Tag mit "handlung" realisiert.

Funktioniert jetzt, wie es soll.
Besten Dank nochmal.
 

Oneixee5

Top Contributor
Schön das es jetzt funktioniert. Du hast da bestimmt ein tolles Projekt. Trotzdem ist JSP eine veraltete Technologie, welche eine Menge Aufwand verursacht. Auch wenn JSP zum JEE-Standard gehört. Hast du dir schon mal überlegt etwas modernere als JSP einzusetzen? Du könntest dir z.B.: mal Spring Boot mit Thymeleaf https://spring.io/projects/spring-boot, https://www.baeldung.com/spring-boot-crud-thymeleaf anschauen.
Das ist insgesamt sicherer, schneller zu entwickeln und weniger Code. Dinge wie JPA oder Spring Security erleichtern die Entwicklung enorm. Wenn dir das nicht so liegt, es gibt da auch noch viele andere Möglichkeiten.
Ich glaube dir, dass du noch eine Menge ServletFilter und anderen Kram gegen XSS etc. und für die Sicherheit eingebaut hast. Mir sind da trotzdem ein paar Sachen in deinem Code aufgefallen, wie z.B.: <input type="hidden" name="id" value="${rezept.id}"> oder throw new ServletException(e); Für eine Anwendung im Heimnetz außerhalb des Internet ist das aber vermutlich nicht so wichtig.
 

Ähnliche Java Themen

Neue Themen


Oben