HTML Datei einlesen und HTML Code in String wandeln

Bitte aktiviere JavaScript!
Hallo zusammen,

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:

Sowas wie:
String s = htmlLib.readFile(filePath);

Danke für die Hilfe
 
Super, schaue ich mir mal an.

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....
 
Falls du einfach nur den gesamten Inhalt der Datei willst: String.join("\n", Files.readAllLines(filePath))

Und was willst du am Ende machen? Was macht dieses

Html in der Datenbank speichern klingt uU nicht sehr sinnvoll...
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
 
Was ist das: String.join("\n" ?
Eine statische Methode der Klasse String und das erste Argument des Aufrufs? String#join

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
Nimm dafür irgendein Template-Framework, anstatt das selber zu basteln, zB Velocity oder Thymeleaf.
 
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%]".

Dann habe ich eben eine Methode, wie:
Java:
public checkString(String s, Customer customer) {
if(s.contains(Customer.CUSTOMER_NUMBER) {
  s.replace(Customer.CUSTOMER_NUMBER, customer.getCustomerNumber)
.....
Wie kann man das denn optimieren?


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%]
-> So wird der String dann in die Datenbank gespeichert und bei der Laufzeit eben mit dem Feld gefüllt.
 
Zuletzt bearbeitet:
Danke für die Nennung der Frameworks.
Welches der beiden ist denn empfehlunsgwerter?
Keine Ahnung, Mustache wäre uU auch noch eine Alternative, grad wenn es recht einfach gehalten sein soll.

1) Für was meinst du nun genau, sollte ich das Framework verwenden? Der Code der HTML Email muss ja irgendwoher herkommen?
Für das generieren von gültigem Markup aus Templates.
Das Template kann überall herkommen, wenn du Features einer Datenbank brauchst, dann ruhig Datenbank.

2) Wie würde das denn von der Umsetzung aussehen?
Guck dir einfach mal die Doku der Frameworks an?

Wie kann man das denn optimieren?
Wie gesagt, passendes Framework dafür verwenden :)

Selber schreiben endet in riesigem Aufwand und produziert am Ende nur Sicherheitslücken.

Ich verwende diese Platzhalter nicht nur bei EmailTemplates, sondern auch bei Texten, die der User selbst definieren kann.
Ob da am Ende ne email oder ein beliebiger Text bei rauskommt, macht doch keinen Unterschied?
 
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!!
......
}
 
Der Doku entsprechend würde ich mal annehmen:
Java:
Customer customer = ...
context.put("customer", customer);
Code:
$customer.customerName
 
Also so ganz habe ich das noch nicht verstanden, sorry.
Wenn ich einen String habe:

String sReplacement = Hallo $customer.customerName,
....

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

Java:
public String replace(String sReplacement, Customer customer) {
    context.put("customer", customer);
    StringWriter writer = new StringWriter();
    t.merge( context, writer );
    System.out.println( writer.toString() ); 
}
Passt das so?

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.
Nutz dafür entsprechende DTOs, die einfach nur die Felder enthalten, die benutzt werden dürfen.

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 jetzt mal beide Libs ausprobiert, funktioniert soweit auch....

Nun aber eine Frage zu DTO´s (habe ich bisher NIE verwendet):
Aus meiner Datenbank liefere ich ein POJO "Customer" zurück.

Wie wandle ich denn nun das POJO "Customer" in das DTO "CustomerDTO"?
Klar könnte ich dann sowas schreiben:

Java:
public CustomerDTO convertToCustomerDTO(Customer customer){
    CustomerDTO newCustomerDTO  = new CustomerDTO()
    newCustomerDTO.setId(customer.getId());
    .... usw.
        
    return newCustomerDTO;
}
Wie macht man das denn?
 
Wie wandle ich denn nun das POJO "Customer" in das DTO "CustomerDTO"?
Klar könnte ich dann sowas schreiben:

Java:
public CustomerDTO convertToCustomerDTO(Customer customer){
    CustomerDTO newCustomerDTO  = new CustomerDTO()
    newCustomerDTO.setId(customer.getId());
    .... usw.
       
    return newCustomerDTO;
}
Wie macht man das denn?
Naja, das macht man genau so.
 
Ein Decorator wäre auch eine Möglichkeit:

Java:
class CustomerDTO {
    private final Customer delegate;

    public CustomerDTO(Customer customer) { delegate = customer; }
    public String getName() { return customer.getName(); }
}
 
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);

-> Liefert das: 07/08/2019

Oder wie löst man das sonst?
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben