Hallo zusammen,
ich beschäftige mich gerade mit Java EE und lese dazu gerade ein Buch, in dem wird ein Onlineshop nach und nach gebildet. Mit Hilfe der Seite sell.html werden Beschreibung, Name, Preis und ein Bild hochgeladen und an SellServlet.java weitergegeben, der wiederum gibt das Abspeichern des Bildes an FotoService weiter. Hier mal der Quellcode.
sell.html
SellServlet.java
FotoService.java
Wenn ich dann auf der HTML Seite die Felder ausfülle und ein Bild auswähle und es abspeichern will, komme ich auf eine leere Seite. In der Konsole wird folgende Meldung ausgegeben.
ich beschäftige mich gerade mit Java EE und lese dazu gerade ein Buch, in dem wird ein Onlineshop nach und nach gebildet. Mit Hilfe der Seite sell.html werden Beschreibung, Name, Preis und ein Bild hochgeladen und an SellServlet.java weitergegeben, der wiederum gibt das Abspeichern des Bildes an FotoService weiter. Hier mal der Quellcode.
sell.html
HTML:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="css/styles.css">
<title>Onlineshop</title>
</head>
<body>
<header>
<hgroup>
<h1 class="title">Onlineshop</h1>
</hgroup>
<nav>
<a href="index.html">Home</a>
<a href="register.html">Registrieren</a>
<a href="signin.html">Einloggen</a>
<a href="sell.html">Verkaufen</a>
<a href="search.html">Suchen</a>
</nav>
</header>
<form action="sell" method="post" enctype="multipart/form-data">
<fieldset>
<legend>Verkaufen</legend>
<table>
<tbody>
<tr>
<th>
<label for="title">Titel</label>
</th>
<td>
<input
type="text"
name="title"
size="40"
maxlength="40"
title="Ein Titel für den Artikel"
placeholder="Titel eingeben"
pattern=".{6,40}"
required="required">
</td>
</tr>
<tr>
<th>
<label for="description">Beschreibung:</label>
</th>
<td>
<textarea name="description" rows="10" cols="100" maxlength="1000"></textarea>
</td>
</tr>
<tr>
<th>
<label for="price">Preis:</label>
</th>
<td>
<input
type="number"
name="price"
size="40"
maxlength="40"
title="Ein Preis für den Artikel"
placeholder="Preis eingeben"
pattern=".{1,40}"
required="required">
</td>
</tr>
<tr>
<th>
<label for="foto">Foto:</label>
</th>
<td>
<input type="file" name="foto">
</td>
</tr>
<tr>
<td/><td>
<input type="reset">
<input type="submit">
</td>
</tr>
</tbody>
</table>
</fieldset>
</form>
<footer>
Copyright
</footer>
</body>
</html>
SellServlet.java
Java:
package de.java2enterprise.onlineshop;
import java.io.IOException;
import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(urlPatterns = {"/sell"}, asyncSupported = true)
@MultipartConfig(maxFileSize = 1024*1024*10, maxRequestSize = 1024*1024*30)
public class SellServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doPost( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
final AsyncContext ac = request.startAsync();
ac.start(new FotoService(ac));
ac.complete();
}
}
Java:
package de.java2enterprise.onlineshop;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import javax.servlet.AsyncContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
public class FotoService implements Runnable{
private AsyncContext ac;
public FotoService( AsyncContext ac) {
this.ac = ac;
}
@Override
public void run() {
final HttpServletRequest request = (HttpServletRequest) ac.getRequest();
final HttpServletResponse response = (HttpServletResponse) ac.getResponse();
InputStream is = null;
OutputStream os = null;
PrintWriter out = null;
try {
final Part part = request.getPart("foto");
os = new FileOutputStream(part.getSubmittedFileName());
is = part.getInputStream();
out = response.getWriter();
byte[] b = new byte[1024];
int i = 0;
while ((i = is.read(b)) != -1) {
os.write(b, 0, i);
}
os.flush();
out.write("true");
ac.complete();
} catch (Exception ex) {
out.write("false");
ex.printStackTrace();
} finally {
try {
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Wenn ich dann auf der HTML Seite die Felder ausfülle und ein Bild auswähle und es abspeichern will, komme ich auf eine leere Seite. In der Konsole wird folgende Meldung ausgegeben.
Code:
2017-05-26T06:21:19.550+0200|Severe: Exception in thread "glassfish-web-async-thread-8"
2017-05-26T06:21:19.550+0200|Severe: java.lang.NullPointerException
at de.java2enterprise.onlineshop.FotoService.run(FotoService.java:48)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)