Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
HTML Datei einlesen und HTML Code in String wandeln
ich möchte gerne HTML - Dateien einlesen. Den Code von der Datei möchte ich dann gerne in einen String speichern.
Welche Library ist im Jahre 2019 hier gängig? Wünschenswert, wenn es 1-2 Zeilen Code sind:
Genau, es geht einfach darum eine HTML Datei (test.html) in JAVA einzulesen, sodass ich den Code dieser HTML Datei in einen String speichern kann.
Dieser String möchte ich dann wieder in meine Datenbank speichern....
Muss ich hier noch auf irgendwas aufpassen? Zeichenkodierung oder sowas? Was ist das: String.join("\n" ?
________
Ich möchte mir verschiedene HTML Dateien erstellen, die ich später als Emailtemplate verwenden möchte.
Zum Beispiel ein EmailTemplate für "Registrierung", inkl. Firmenlogo, Anschrift usw.
Das Template (HTML Code) enthält wiederum Platzhalter, die dann zur Laufzeit befüllt werden (u.a. mit Name, Vorname usw.).
Worfflow:
- User registriert sich
- System holt sich aus der Datenbank das EmailTemplate (der HTML Code, der aus der Datei kommt)
- System ersetzt Platzhalter mit richtigen Daten
- Versand Email
Ich möchte mir verschiedene HTML Dateien erstellen, die ich später als Emailtemplate verwenden möchte.
Zum Beispiel ein EmailTemplate für "Registrierung", inkl. Firmenlogo, Anschrift usw.
Das Template (HTML Code) enthält wiederum Platzhalter, die dann zur Laufzeit befüllt werden (u.a. mit Name, Vorname usw.).
Worfflow:
- User registriert sich
- System holt sich aus der Datenbank das EmailTemplate (der HTML Code, der aus der Datei kommt)
- System ersetzt Platzhalter mit richtigen Daten
- Versand Email
Danke für die Nennung der Frameworks.
Welches der beiden ist denn empfehlunsgwerter?
1) Für was meinst du nun genau, sollte ich das Framework verwenden? Der Code der HTML Email muss ja irgendwoher herkommen?
2) Wie würde das denn von der Umsetzung aussehen?
3) Derzeit:
Was ich derzeit mache ist (ist ein großer Aufwand):
- Ich habe bei jeder Entity (zB Customer) String für meine Attributfelder: public final String CUSTOMER_NUMBER = "[%CUSTOMER_NUMBER%]".
Ich verwende diese Platzhalter nicht nur bei EmailTemplates, sondern auch bei Texten, die der User selbst definieren kann.
Also sprich der User kann sich selbst Textvorlagen speichern, in welchem dann eben die Platzhalter im String ebenfalls mit gespeichert werden.
Hallo Kunde,
Du hast die Nummer: [%CUSTOMER_NUMBER%]
Für das generieren von gültigem Markup aus Templates.
Das Template kann überall herkommen, wenn du Features einer Datenbank brauchst, dann ruhig Datenbank.
Ok, also das Prinzip habe ich verstanden. Was ich aber nicht verstehe, wie hole ich von einem Objekt den Wert der Property?
Java:
Customer customer = new Customer();
customer.setName("Hugo");
VelocityContext context = new VelocityContext();
context.put("name", "World");
Wie kann ich nun "World" ersetzen. Ich will NICHT customer.getName() hier reinschreiben.
Gibt es hier zB etwas wie "customer.name", welches mir dann die Get - Methode vom Objekt zurückliefert?
Was ich mir vorstellen kann ist:
Ich habe in meiner Datenbank eine Liste aller Platzhalter mit den Feldern:
- PlatzhalterName (zB "customerName")
- Entity (zB "customer"
- Attribut von Entity (um die Get Methode der Entity aufzurufen)
Also im Endeffekt möchte ich mir diesen Code sparen:
Java:
public String getValueFromProper(Customer customer, String propertyName){
if(propertyName.equals("customerName)){
return customer.getCustomerName();
}
// Diese Abfrage für alle weiteren Felder!!
......
}
Und in meinem Backend habe ich eine Methode, die mir dann diesen String mit den "echten" Daten befüllt:
Am Ende kommt dann ein String wiederum heraus, aber eben mit den "richtigen" Daten
Jetzt gibt es aber ein Problem:
Ich möchte nicht, dass ALLE Felder ausgegeben werden können (nicht vom normalen User).
So wie ich das verstehe, könnte er dann in seiner Textvorlage: $customer.id hereinschreiben, und dann wird eben die ID ausgelesen.
Daher ist die Idee die Platzhalter in einer DB zu speichern:
- ID
- Name (customer.customerName)
- Entity
In etwa so:
Java:
public String replace(String sReplacement, Customer customer) {
// Hole Platzhalter Liste aus DB
List<ReplacementEntity> list = holeVonDatenbank();
for(ReplacementEntity r : list){
context.put(r.getName(), customer);
}
StringWriter writer = new StringWriter();
t.merge( context, writer );
System.out.println( writer.toString() );
}
Eine weiter Frage:
Kann man den Platzhalter auch anderst darstellen, als $customer.customerName.
Ich hätte das eher gerne so: {{customer.customerName}} oder [%customer.customerName%]
Oder funktioniert das dann nicht mehr in Velocity?
Jetzt gibt es aber ein Problem:
Ich möchte nicht, dass ALLE Felder ausgegeben werden können (nicht vom normalen User).
So wie ich das verstehe, könnte er dann in seiner Textvorlage: $customer.id hereinschreiben, und dann wird eben die ID ausgelesen.
Eine weiter Frage:
Kann man den Platzhalter auch anderst darstellen, als $customer.customerName.
Ich hätte das eher gerne so: {{customer.customerName}} oder [%customer.customerName%]
Oder funktioniert das dann nicht mehr in Velocity?
Keine Ahnung ob das mit Velocity geht, generell bietet schon jedes Framework seine eigene Syntax, {{customer.customerName}} wird zb von mustache genutzt.
Habe noch eine Frage zu Datumformat, Numberformat....
Der Kunde kann je nach Einstellung in verschiedenenen Formaten ausgegeben werden.
Wie mache ich das dann?
Wünschenswert wäre, dass ich in der Variable das Dateformat mitgeben kann:
{{createDate, dd.MM.yyyy}}
Alternativ könnte ich mir eine globale Einstellung vorstellen.
Sodass ich dem Customer mitgebe:
- String dateFormat
- String numberFormat
Der Getter von "createDate" liefert mir dann einen String zurück (mit Berücksichtigung des eingestellten Dateformats) ?
Java:
public String dateFormat = "dd/MM/yyyy";
private Date createDateORIG;
private String createDate;
public String getCreateDate() {
return new SimpleDateFormat(dateFormat ).format(createDateORIG);
}
Dann setze ich beim Kunden das ORIG Date:
customer.setCreateDateORIG(new Date());
Mustache m = mf.compile(new StringReader("{{customer.createDate }}"), "nameUsedForErrorReporting");
Map<String, Object> context = new HashMap<>();
context.put("customer", customer);