Wie kann man mit Java eine HTML-Seite darstellen?
Der folgende Quelltext demonstriert die Anfertigung
eines Programms, das lokale und Internet-basierte
HTML-Seiten darstellen kann, nichts desto trotz aber von
der Funktionalität eines richtigen Browsers sehr
weit entfernt ist. Vielmehr zeigt es das Vorgehen bei
der Verwendung von JEditorPane
und einige
Möglichkeiten, eine URL zu überprüfen.
Zu diesem Zweck wird ein JFrame
erstellt,
der im oberen Bereich ein JTextField
zur
Eingabe der URL und im unteren Bereich einen Button zum
Laden der Seite enthält. Der mittlere Bereich
stellt die geladene Seite in Originalgröße
dar.
Die Klasse besitzt neben dem Konstruktor init()
zur Erstellung des GUI und main()
drei
Methoden:
verifyStr()
prüft die Stimmigkeit des Pfades im Textfeld. Die Methode wird abgebrochen, wenn der String leer ist oder wenn er nicht länger als sieben Zeichen ist, da diese Länge derjenigen der in der URL notwendigen Protokollangabe entspricht. Beginnt die URL mit "http://" wird sie ungeprüft übernommen, da der Internet-Server von sich aus Unstimmigkeiten quittiert. Sollte der String weder mit "http://" noch mit "file://" beginnen, wird von einer lokalen Datei ausgegangen und "file://" vorangestellt - eine zugegebenermaßen sehr gewagte Annahme, die zu Demonstrationszwecken aber hier einmal stehen bleiben soll. Ebenfalls sollte man sich darüber im Klaren sein, dass eine URL natürlich nicht nur aus einem Pfad mit vorangestellter Protokollangabe besteht.
In der Folge wird der String wieder seiner Protokollangabe beraubt und der Pfad auf seine Gültigkeit überprüft: Es wird ermittelt, ob die angegebene Datei vorhanden und lesbar ist.setURL()
prüft durch Aufruf der erstgenannten Methode ansatzweise die Gültigkeit des URL-Strings und bildet dann ein URL-Objekt, das in der Objektvariablenurl
abgelegt wird.loadPage()
schließlich lädt die angeforderte Seite und gibt ihren Quelltext auf der Konsole aus. Das Laden geschieht auf einem HTML-fähigenJEditorPane
über dessen MethodesetPage()
, der als Argument die URL übergeben wird.
Das Auslesen des Quelltextes erfolgt auf die gleiche Weise wie hier beschrieben über einenInputStream
, der in einemBufferedReader
gespeichert wird.
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class DisplayHTML {
private JEditorPane editorPane;
private JTextField field;
private JButton button;
private JPanel buttPanel;
private String str;
private URL url;
public DisplayHTML() {
init();
}
private void init() {
JFrame frame = new JFrame("HTML-Seite darstellen");
field = new JTextField("file://");
frame.add(field, BorderLayout.NORTH);
button = new JButton("laden");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setURL();
loadPage();
}
});
buttPanel = new JPanel(new FlowLayout());
buttPanel.add(button);
frame.add(buttPanel, BorderLayout.SOUTH);
editorPane = new JEditorPane();
editorPane.setEditable(false);
frame.add(editorPane, BorderLayout.CENTER);
setURL();
loadPage();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
/**
* loads the asked page to the JEditorPane and displays its source in the
* console
*/
public void loadPage() {
// stop the program if there is no URL-Object
if (url == null) {
return;
}
try {
// load the page
editorPane.setPage(url);
// get the source
InputStream in = url.openStream();
BufferedReader buff = new BufferedReader(new InputStreamReader(in));
String s;
// display source
while ((s = buff.readLine()) != null) {
System.out.println(s);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void setURL() {
// check the URL-String
if (!verifyStr())
return;
if (str.startsWith("file://") || str.startsWith("http://") || str.startsWith("https://")) {
// create an URL-Object
try {
url = new URL(str);
} catch (MalformedURLException e) {
url = null;
System.err.println("Falsches URL-Format!");
e.printStackTrace();
}
}
}
private boolean verifyStr() {
str = field.getText();
if (str.equals("") || str.length() < 8) {
return false;
}
if (str.startsWith("http://") || str.startsWith("https://")) {
return true;
}
if (!str.startsWith("http://") && !str.startsWith("file://")) {
str = "file://" + str;
}
if (str.startsWith("file://")) {
// check if file is valid and can be read
String s = str.substring(7);
File file = new File(s);
if (file.isFile() && file.canRead()) {
return true;
}
}
return false;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new DisplayHTML());
}
}
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.