Hallo,
eigentlich wollte ich herausfinden, wie ich dem Tomcat beibringen kann, UTF-8 zu verwenden. URIEncoding="UTF-8" in der server.xml scheint nicht zu helfen (funktioniert angeblich nur bei GET). In den JSPs hilft folgende Zeile:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
ebenfalls nicht.
Beim Herumspielen kam ich aber plötzlich auf etwas ganz anderes, noch viel schlimmeres drauf. Offensichtlich scheinen Umlaute am Schluss einer Eingabe in einem HTML-Input-Feld, die über ein Servlet in eienr MySQL-Db landet den Tomcat völlig aus dem Tritt zu bringen. Ein "ÄÖÜ" löst folgende Exception aus:
ava.sql.SQLException: Incorrect string value: '\xC2\x84\xC3\x83\xC2\x96...' for column 't_beschreibung' at row 1
Der Code sieht so aus:
Servlet.....
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ThemenGebietDao dao = new ThemenGebietDaoImpl();
if (request.getParameter("themaanlegen") != null) {
String thema = request.getParameter("themengebiet");
if (thema != null && !thema.trim().equals("")) {
ThemenGebietBo bo = new ThemenGebietBo();
bo.setBeschreibung(thema);
dao.setNewThemengebiet(bo);
request.getRequestDispatcher("themengebiet_erfolgreich.html").forward(request, response);
}
else {
request.getRequestDispatcher("themengebiet_fehler.html").forward(request, response);
}
}
Gespeichert wird der Wert folgendermaßen:
@Override
public void setNewThemengebiet(ThemenGebietBo themenGebiet) {
Connection con = ConnectionFactory.getConnection();
if (con != null) {
String conString = "INSERT INTO Themengebiet SET t_beschreibung = ?";
try {
PreparedStatement pst = con.prepareStatement(conString);
pst.setString(1, themenGebiet.getBeschreibung());
pst.execute();
} catch (SQLException e) {
e.printStackTrace();
}
finally {
try { con.close(); }
catch (SQLException e) { e.printStackTrace(); }
}
}
}
Will ich einen String, der "fünf" heißt speichern, funktioniert es, d.h. es steht richtig in der MySQL-DB als "fünf".
Angezeigt wird es aber trotzdem falsch. Die Kodierung im Browser UTF-8, MySQL ist standardmäßig auf utf8. Scheint wohl ein Tomcat-Problem zu sein.
Jedenfalls ist es mir ein größeres Anliegen, das Problem mit der Tomcat-Exception zu beheben. Will ich ÄÖÜ abspeichern, bekomme ich folgendes als StackTrace:
java.sql.SQLException: Incorrect string value: '\xC2\x84\xC3\x83\xC2\x96...' for column 't_beschreibung' at row 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734)
at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:995)
at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:169)
at dao.ThemenGebietDaoImpl.setNewThemengebiet(ThemenGebietDaoImpl.java:44)
at servlets.ThemenServlet.doPost(ThemenServlet.java:50)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
Kann sich das jemand erklären?
Markus