Softwareentwicklung, SEO und mehr http://m-software.de Software und IT Blog                                            Michael Jentsch Tue, 30 Oct 2012 13:21:29 +0000 de-DE hourly 1 http://wordpress.org/?v=3.4.2 Online JSON und XML Viewer http://m-software.de/online-json-und-xml-viewer http://m-software.de/online-json-und-xml-viewer#comments Tue, 30 Oct 2012 13:21:29 +0000 Michael Jentsch http://m-software.de/?p=2276
  • Branchentipps für den Online Erfolg
  • Facebook-Backup online Tool
  • Open Source Wegwerf E-Mail Adresse
  • ]]>
    Wer öfter mal mit JSON und XML Dokumenten zu tun hat, der kennt das Problem. Die Dateien sind ohne einen entsprechenden Viewer/Editor nicht wirklich lesbar. Wobei hier XML deutlich einfacher zu handhaben ist als JSON (aber das nur am Rande :-) ). Im wesentlichen geht es doch darum, immer und überall einen Viewer für JSON und XML parat zu haben.

    Für die JSON Variante habe ich lange den EXTJS basierten Online JSON Viewer von Gabor Turi unter http://jsonviewer.1pad.de/ genutzt. Der hat genau meine Anforderungen abgedeckt und ist immer verfügbar. Egal ob ich auf der arbeit, zu Hause, bei einem Kollegen, einem Kongress oder sonstwo bin.

    Das Beste an dem online JSON Viewer ist aber, dass die Software “absolutely free” ist. Daher habe ich mich entschlossen, eine Installation auf einem eigenen Server vorzunehmen. So kann ich leichter mal Debug Meldungen einbauen (z.B. für Firebug) und damit auf spezielle Problem der Dateien aufmerksam machen.

    Die Installation liegt aktuell unter http://jsonviewer.1pad.de/. Allerdings habe ich nun die Problematik gehabt, dass ich genau so eine Visualisierung auch für XML Daten gebraucht habe. Also habe ich den JSON Viewer kopiert und ein paar kleine Änderungen vorgenommen. Nun verarbeitet die geänderte Version auch XML Dateien ohne Probleme und innerhalb von kurzer Zeit habe ich mir also einen Online XML Viewer auf Basis der ExtJS Sourcen des JSON Viewers gebaut. Dank der übersichtlichen Sourcen und der einfachen Struktur war das ein Aufwand von weniger als einer Stunde.

    Der Online XML Viewer ist jetzt unter http://xmlviewer.1pad.de/ zu erreichen und kann genauso wie die JSON Version kostenlos genutzt werden.

    Noch ein kleiner Hinweis an die Sicherheits-Gurus da draußen. Die Umwandlung des Textes in die Baumstruktur erfolgt ausschließlich im Browser und es werden keine Daten an den Server übertragen. Daher ist es auch möglich, XML und JSON Daten im Viewer anzeigen zu lassen, die man nicht unbedingt auf einen fremden Server hochladen möchte. Einzig die Funktion “Load XML/JSON Data” lädt die Daten über den Server 1pad.de von einer Online Quelle. Allerdings werden auch hier keine Daten auf dem Server gespeichert oder gecacht. Es wird nur der Inhalt des URLs in den Browser geladen.

    Wer sich selbst eine Installation auf einem Server einrichten möchte, kann dies Tun. Alle HTML, CSS, JavaScript Dateien können direkt heruntergeladen werden. Einzig die Scripte readxml.php und readjson.php können nicht ohne weiteres heruntergeladen werden. Bei Interesse einfach kurz eine Mail an mich, ich schicke die Dateien dann per Mail raus.

    PS: Wer dem ursprünglichen Autor Gabor Turi etwas gutes tun möchte, kann unter  http://extjs.blog.hu/ auf den PayPal Donate Button klicken und ein paar Euro spenden.

    Related posts:

    1. Branchentipps für den Online Erfolg
    2. Facebook-Backup online Tool
    3. Open Source Wegwerf E-Mail Adresse
    ]]>
    http://m-software.de/online-json-und-xml-viewer/feed 0
    PHP Header für jede Gelegenheit http://m-software.de/php-header-fur-jede-gelegenheit http://m-software.de/php-header-fur-jede-gelegenheit#comments Tue, 23 Oct 2012 22:46:55 +0000 Michael Jentsch http://m-software.de/?p=2259 Heute habe ich mal alle meine PHP Sourcen nach Aufruf der PHP Methode “header” durchsucht und dabei eine sehr große Menge an unterschiedlichen Einsatzzwecken für diese Funktion gefunden, die ich euch nun hier präsentieren möchte. Darunter sind einige Varianten, die ich quasi bei der täglichen Arbeit brauche (z.B. der PHP Code für den HTTP Header zum deaktivieren des Browser Caches) und einige sind dabei, die ich doch eher selten verwende. Z.B. Der Refresh Header. Da das aber je nach Aufgabengebiet bei jedem Entwickler anders aussieht, habe ich hier einfach mal alle jemals von mir einsetzten PHP Header Aufrufe zusammengefasst und kurz dokumentiert.

    PHP Snippet “Kein Browser Cache verwenden”

    header(“Expires: 0″);
    header(“Cache-Control: must-revalidate, post-check=0, pre-check=0″);
    header(“Cache-Control: private”,false);
    header(“Cache-Control: no-cache”);
    header(“Pragma: no-cache”);
    header(“Expires: gmdate(“D, d M Y H:i:s”) . ” GMT”);
    header(“Last-Modified: ” . gmdate(“D, d M Y H:i:s”) . ” GMT”);

     Der Klassiker unter den HTTP Headern zum deaktivieren des Browser Caches. Wenn man den vergisst, machen die Tests erst richtig Spaß :-) .

    PHP Snippet “Browser Cache für eine vorgegebene Zeit nutzen”

    $expires = 60*60*24*14;
    header(“Pragma: public”);
    header(“Cache-Control: maxage=”.$expires);
    header(‘Expires: ‘ . gmdate(‘D, d M Y H:i:s’, time()+$expires) . ‘ GMT’);
    header(‘Last-Modified: ‘ . gmdate(‘D, d M Y H:i:s’) . ” GMT”);

     In einigen Fällen macht es auch Sinn, den Browser Cache nicht zu deaktivieren. Statt dessen kann man mit den 5 Zeilen den Browser Cache mit dem HTTP Header steuern und die Verfallszeit der Inhalte einstellen. Die Einstellungen werden auch gerne vom Proxy verwendet. Daher kann es passieren, dass auch ein Löschen des Browser Caches nicht den gewünschten Effekt erzeilt.

    PHP Snippet “Datei nicht gefunden”

    header(‘HTTP/1.1 404 Not Found’);

    Wenn man dem Broser einen 404 Fehler mitteilen möchte, kann man das mit der einfachen Zeile realisieren.

    PHP Snippet “Zugriff verweigert.”

    header(‘HTTP/1.1 403 Forbidden’);

    Finger weg von der Datei. Mehr sagt die Zeile eigentlich nicht aus :-) . Wird gerne auch vom Apache genutzt, wenn leere Verzeichnisse im htdocs Ordner aufgerufen werden und der DirectoryIndex deaktiviert ist.

    PHP Snippet “Zugriff verweigert. Login/Passwort Popup”

    header(‘HTTP/1.1 401 Unauthorized’);
    header(‘WWW-Authenticate: Basic realm=”Zugriff verweigert”‘);
    print ‘Bitte Zugangsdaten eingeben … oder so :-) ’;
    die();

    Wenn man den Zugriff auf bestimmte Dateien nicht erlauben möchte, kann man das mit den 4 Zeilen ermöglichen.

    PHP Snippet “Permanente Weiterleitung auf eine neue Webseite”

    header(‘HTTP/1.1 301 Moved Permanently’);
    header(‘Location: http://www.beispielseite.de/’);

    Ein weiterer Klassiker. Die Seite hat einen neuen URL bekommen und der Browser wird zur neuen Location weitergeleitet.

    PHP Snippet “Verzögerte Weiterleitung”

    header(‘Refresh: 10; url=http://www.beispielseite.de/’);
    print ‘Weiterleitung erfolgt in 10 Sekunden’;

    Eine Weiterleitung, die um 10 Sekunden verzögert ist. Macht in Ausnahmen sinn, aber ist nicht der Standard. In den meisten Fällen kann man besser den 301 oder 302 nutzen.

    PHP Snippet “Interner Fehler. Sollte möglichst nicht passieren :-)

    header(‘HTTP/1.1 500 Internal Server Error’);

    Den HTTP Code 500 sollte man nicht gerade im Code verwenden. Es gibt zwar Situationen, in denen das sinn macht, aber ich kenne keinen Entwickler, der sich über einen 500er freut :-) .

    PHP Snippet “Sprache der Inhalte im HTTP Header”

    header(‘Content-language: de’);

    Wenn man weiß, dass der Inhalt des HTTP Bodys in Deutsch ist, kann man es dem Browser (oder der Suchmaschine :-) ) auch mitteilen.

    PHP Snippet “Seite hat sich nicht geändert”

    header(‘HTTP/1.1 304 Not Modified’);

    Hier wird dem Browser mitgeteilt, dass sich an dem Inhalt nichts geändert hat. dementsprechend wird die Darstellung im Browser auch nicht aktualisiert.

    PHP Snippet “Größe der HTTP Body Contents in Bytes”

    header(‘Content-Length: 100000′);

    Sollte für Downloads benutzt werden. Dann kann der Fortschrittsbalken im Browser vernünftig dargestellt werden und die erwartete Zeit für den Download berechnet werden.

    PHP Snippet “Diese Inhalt werden nicht dargestellt, sondern im Browser zum Download angeboten”

    header(‘Content-Type: application/octet-stream’);
    header(‘Content-Disposition: attachment; filename=”meine-datei.txt”‘);
    header(‘Content-Transfer-Encoding: binary’);

    Wird diese HTTP Header Kombination verwendet, wird der Inhalt nicht im Browser dargestellt, sondern der Inhalt zum Download angeboten. Im Chrom wird die Datei direkt im Downloads Ordner abgelegt. Im Firefox geht der “Speichern unter” Dialog auf.

    PHP Snippet “Setzen der Codierung”

    header(‘Content-Type: text/html; charset=utf-8′);

    Typische Kodierungen in Deutschland sind:

    •  iso-8859-1
    •  utf-8

    Ich persönlich bevorzuge utf-8, aber das ist jedem selbst überlassen. Hier noch eine (nicht vollständige) Liste mit den Typischen Werten für Charset:

    big5 = Chinese Traditional (Big5)
    euc-kr = Korean (EUC)
    iso-8859-1 = Western Alphabet
    iso-8859-2 = Central European Alphabet (ISO)
    iso-8859-3 = Latin 3 Alphabet (ISO)
    iso-8859-4 = Baltic Alphabet (ISO)
    iso-8859-5 = Cyrillic Alphabet (ISO)
    iso-8859-6 = Arabic Alphabet (ISO)
    iso-8859-7 = Greek Alphabet (ISO)
    iso-8859-8 = Hebrew Alphabet (ISO)
    koi8-r = Cyrillic Alphabet (KOI8-R)
    shift-jis = Japanese (Shift-JIS)
    x-euc = Japanese (EUC)
    us-ascii = US-ASCII
    utf-7 = Unicode (UTF-7)
    utf-8 = Universal Alphabet (UTF-8)
    windows-1250 = Central European Alphabet (Windows)
    windows-1251 = Cyrillic Alphabet (Windows)
    windows-1252 = Western Alphabet (Windows)
    windows-1253 = Greek Alphabet (Windows)
    windows-1254 = Turkish Alphabet
    windows-1255 = Hebrew Alphabet (Windows)
    windows-1256 = Arabic Alphabet (Windows)
    windows-1257 = Baltic Alphabet (Windows)
    windows-1258 = Vietnamese Alphabet (Windows)
    windows-874 = Thai (Windows)

    PHP Snippet “Content Type festlegen”

    header(‘Content-Type: text/plain’); // Textdatei
    header(‘Content-Type: image/jpeg’); // JPG Bild
    header(‘Content-Type: image/png); // PNG Bild
    header(‘Content-Type: application/zip’); // Zip-Datei
    header(‘Content-Type: application/pdf’); // PDF Datei

    Neben diesen Beispiel Content Types gibt es noch eine Reihe anderer Content Types, die ich hier nicht alle aufführen möchte. Daher habe ich der Einfachheit halber die Datei „/etc/mime.types“ von meinem Linux System hier zum Download bereitgestellt. In der Datei sind alle nur denkbaren Content Types enthalten.

    mime.types

    Der Aufbau ist wie folgt:

    Spate 1: Name des Content Types
    Spalte 2 – n: Dateiendung des Content Types (optional)

    Wem hier noch was fehlt, dem kann ich nur den folgenden Wikipedia Artikel empfehlen. Hier werden wirklich alle HTTP Header Felder aufgelistet und kurz erklärt.

    http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

    So, nun sollten aber alle Fragen zum Thema PHP Header beantwortet sein. Sollten doch noch Fragen offen sein, benutzt bitte die Kommentar-Funktion.

     

    No related posts.

    ]]>
    http://m-software.de/php-header-fur-jede-gelegenheit/feed 0
    Ein Online Marketing Unternehmen mit einer langen Geschichte http://m-software.de/ein-online-marketing-unternehmen-mit-einer-langen-geschichte http://m-software.de/ein-online-marketing-unternehmen-mit-einer-langen-geschichte#comments Fri, 12 Oct 2012 18:46:33 +0000 Michael Jentsch http://m-software.de/?p=2233
  • Blog Marketing
  • Online Shop für Leiterplatten
  • Branchentipps für den Online Erfolg
  • ]]>
    Heute präsentiere ich mal wieder ein Unternehmen, dass sich im Online Marketing Geschäft schon eine kleine Ewigkeit hält und dabei sehr erfolgreich ist. Bei dem Unternehmen handelt es sich um eine GmbH mit Sitz in Bonn.

    Das Unternehmen ist unter anderem verantwortlich für solche Projekte wie z.B. Astroskopia.de, Tageshoroskope.de, Gratisgutschein.de und Treiber.de. Der eine oder andere Leser weiß nun schon, um welches Unternehmen es sich handelt. Es ist die SuperComm GmbH.

    Die SuperComm GmbH ist eines der Unternehmen, das es geschafft hat, im Online Marketing bereits seit 2003 als Online-Marketing Agentur aktiv zu sein und viele erfolgreiche Projekte zu launchen. Darunter auch ein so bekanntes Portale wie z.B. free-sms.de. Eine Free-SMS Plattform mit fast 3 Millionen Nutzern. Wer sich im Online Marketing etwas auskennt, weiß, dass es sich hier bei einer fast 10 jährigen Unternehmensgeschichte um eine kleine Ewigkeit handelt, auf die das Unternehmen sehr stolz sein kann.

    Der Erfolg basiert auf einem guten Team und einem umfangreichen Leistungs-Portfolio, das von E-Mail Marketing über Projektentwicklung, Fax Marketing, Lead-Generierung bis zu Banner-Werbung und vielen weiteren Services reicht. Während sich viele kleinere Agenturen auf nur wenige Dienstleistungen und Produkte konzentrieren, ist die SuperComm Data Marketing GmbH vergleichbar mit dem Schweizer-Taschenmesser unter den Online-Marketing Unternehmen. Zum Beweis hier noch mal ein paar Details zu den einzelnen Leistungen.

    1. E-Mail Marketing
    Beim E-Mail Marketing kann die SuperComm Data Marketing GmbH auf über 5 Millionen Endverbraucher und Geschäftskunden zurückgreifen. Dabei kann der Auswahl aus dem deutschen und europäischen Sprachraum gewählt werden. Eine zusätzliche Eingrenzung der Zielgruppe nach Region oder Interesse ist auch möglich. (Mich würde ja mal interessieren, ob eine meiner E-Mail Adressen auch in der Datenbank enthalten ist… Da muss ich wohl mal nachfragen :-) )

    2. Projektentwicklung
    Hier können Kunden auf die Erfahrung und das Know-How aus den Bereichen Webdesign, Programmierung und natürlich auch Onlinemarketing vertrauen und der SuperComm die Entwicklung und Pflege kompletter Projekte übertragen.
    Dies ist ein echter Mehrwert für eine Online-Marketing Agentur. Eine Agentur, die auch über Programmierer und Projekterfahrung im Programmier-Umfeld hat ich echt wertvoll, da so ein enger Austausch zwischen den Online-Marketing Mitarbeitern und den Programmieren möglich ist.

    3. Fax Marketing
    Ein alter Hut? Für den Einen oder Anderen ist es ein alter Hut, aber Tatsache ist, dass es in Deutschland noch immer über 10 Millionen Faxgeräte gibt und über den Weg der Ansprache per FAX kann man ein großes Potential an speziellen Zielgruppen erreichen.
    Auch wenn ich persönlich kein FAX Nutzer bin und das FAX nach Meiner Meinung nach auch keine rosige Zukunft mehr vor sich hat, ist es heute noch sinnvoll, das FAX Marketing für spezielle Zielgruppen einzusetzen.

    4. Lead-Generierung
    Was nützt das beste Marketing Material, wenn es keiner zu Gesicht bekommt? Es ist ein entscheidender Punkt, dass man möglichst viele und qualifizierte Personen ansprechen kann. Die SuperComm Data Marketing GmbH verfügt über eine großes Netzwerk und täglich kommen über 6.000 neue Adressen hinzu.

    5. Bannerwerbung
    Der Klassiker unter den Online Marketing Maßnahmen ist noch immer die Bannerwerbung. Über die SuperComm Data Marketing GmbH ist es es möglich, Bannerwerbung auf TOP-Internetseiten zu Buchen. Dabei verfügt SuperComm über Top Webseiten aus dem eigenen Netzwerk sowie aus Partner-Netzen.

    6. Weitere Services
    Neben den oben angesprochenen Themen biete SuperComm auch noch eine Reihe anderer Dienste an. Darunter unter anderem Suchmaschinenoptimierung, Suchmaschinenmarketing, individuelle Programmierungen und die Erstellung von Werbemitteln.

    Fazit: Die SuperComm Data Marketing GmbH aus Bonn ist eine Online-Marketing Agentur, die für alle Belange vom Webdesign über Suchmaschinenmarketing bis hin zur individuellen Programmierung alles bietet. Das Team ist eine gute Mischung aus Marketing / Vertrieb und Delivery und auf der Seite „Über uns“ habe ich sogar einen Mitarbeiter entdeckt, der schon eine kleine Berühmtheit in der Online-Marketing und Gründer Szene ist. Wer das ist verrate ich hier nicht. Ich sage nur, dass ich ihn unter „Projektentwicklung / Webdesign“ entdeckt habe. :-)

    Related posts:

    1. Blog Marketing
    2. Online Shop für Leiterplatten
    3. Branchentipps für den Online Erfolg
    ]]>
    http://m-software.de/ein-online-marketing-unternehmen-mit-einer-langen-geschichte/feed 0
    Web2Kindle.de nun noch einfacher http://m-software.de/web2kindle-de-nun-noch-einfacher http://m-software.de/web2kindle-de-nun-noch-einfacher#comments Thu, 11 Oct 2012 23:58:17 +0000 Michael Jentsch http://m-software.de/?p=2215
  • Freitag der 13. und der Kindle Store ist offline
  • Webseiten offline auf dem Kindle lesen (Web2Kindle)
  • SEO, Internet und Mobile Software Entwicklung – SEOzehnario … und noch immer nicht auf platz 10 ?!?!?
  • ]]>
    Wer meinen Dienst Webseiten offline auf dem Kindle lesen (Web2Kindle) kennt und ihn so regelmäßig nutzt wie ich selbst, hat sich sicher schon einmal darüber geärgert, dass man jedes mal aufs neue seine E-Mail Adresse eintragen muss und das Häkchen “Ich habe [email protected] in die E-Mail-Liste für genehmigte persönliche Dokumente eingetragen.” setzen muss. Mir ging es jedenfalls in den letzten Wochen immer mehr auf den Geist. Zum Glück gibt es Ja Menschen, die weiter denken und so hat mich Thomas vor längerem mal darauf hingewiesen, dass es doch einfacher währe, die Daten in einem Cookie zu speichern und beim nächsten Besuch der Seite die Formular-Felder aus dem Cookie wieder zu rekonstruieren. Klingt nach einer einfachen Lösung, die auf jeden Fall fehlt gefehlt hat :-)

    Denn nun ist das Feature eingebaut und nun kann man noch schneller eine Webseite auf den übertragen und het so mehr Zeit zum Lesen.

    Ich hoffe, dass der Webservice zum offline Lesen von Webseiten so noch besser zu nutzen ist und Kindle Inhaber (so wie ich) noch mehr Zeit zum Lesen haben.

    Links:
    web2kindle.de
    Artikel: Webseiten offline auf dem Kindle lesen

    Related posts:

    1. Freitag der 13. und der Kindle Store ist offline
    2. Webseiten offline auf dem Kindle lesen (Web2Kindle)
    3. SEO, Internet und Mobile Software Entwicklung – SEOzehnario … und noch immer nicht auf platz 10 ?!?!?
    ]]>
    http://m-software.de/web2kindle-de-nun-noch-einfacher/feed 0
    Megaabstauberseo http://m-software.de/megaabstauberseo http://m-software.de/megaabstauberseo#comments Thu, 11 Oct 2012 11:53:42 +0000 Michael Jentsch http://m-software.de/?p=2221 Was währe das Leben ohne einen ordentlichen SEO Contest? Jaja, ich weiß. Auf der Startseite von M-Software.de sind noch nicht einmal die Überreste vom letzten SEO Contest verschwunden und schon startet ein neuer. Hier also erst mal die Fakten.

    1. Veranstalter: SEO DAY (Fabian Rossbacher und sein Team)
    2. URL zum Megaabstauberseo Contest: http://www.seo-day.de/seo-contest-der-megaabstauberseo-raumt-richtig-ab.html
    3. Der aktuelle Google Index zum Suchbegriff:

    4. Preise: Eine ganze Menge. Am besten auf der Webseite zum Contest nachlesen. Allerdings ist diese mal kein iPhone und auch kein iPad dabei. :-(
    5. Termin: Der Megaabstauberseo Contest endet am 25.10.2012 um 17.30 Uhr.

    Natürlich gibt es auch schon ein Video dazu, aber das habt Ihr euch sicher schon gedacht. Was ist denn ein SEO Contest ohne ein Video? Das gibt es doch eigentlich nicht mehr. Hier also das Video zum Contest.

    http://www.youtube.com/watch?feature=player_embedded&v=YFcYVFfaIzM

    So wie ich das sehe, bin ich mal wieder recht fix und schaffe es wohl auch wieder in die Top 10. Allerdings werde ich mein Ranking nicht halten können, da ich dieses mal keine Zeit habe mitzumachen. Aber der Artikel ist geschrieben und ich kann sagen ich war auch mal unter den Top 10 und damit ist meine Arbeit auch getan :-)

     

    Megaabstauberseo Update 1 (11.10.2012 13:57):

    Wie oben angedeutet habe ich es in nur 2 Minuten in die Top 10 geschafft :-)

    Naja, das war nicht so schwierig. Aktuell gibt es ja erst 22 Treffer in den Google Suchergebnissen. Da ist es einfach mit einer starken Domain auf Platz 4 zu kommen. Aber halten werde ich den Platz nicht, da ich kein Linkaufbau betrieben werde und nur diesen einen Blogbeitrag veröffentliche, den ich von Zeit zu Zeit einfach ein wenig aktualisiere.

     

    No related posts.

    ]]>
    http://m-software.de/megaabstauberseo/feed 16
    Das Java – Eclipse -Maven – Hibernate – MySQL Beispiel http://m-software.de/java-eclipse-maven-hibernate-mysql http://m-software.de/java-eclipse-maven-hibernate-mysql#comments Thu, 11 Oct 2012 10:56:25 +0000 Michael Jentsch http://m-software.de/?p=2205
  • Java vs. PHP
  • Java Network Monitor
  • Mobile Games – Spieleprogrammierung für Handys mit Java ME von Thomas Lucka
  • ]]>

    Ziel dieses Artikels ist es, ein einfaches Beispiel mit den oben genannten Technologien (Maven, Java, Hibernate und MySQL) zu realisiern, bei dem die Funktion und das Zusammenspiel der unterschiedlichen Komponenten deutlich wird.

    Folgende Tools & Technologienverwende ich für dieses Beispiel:

    Maven  (http://maven.apache.org/)

    Eclipse (http://www.eclipse.org/)

    Java (http://www.java.com/de/)

    Hibernate (http://www.hibernate.org/)

    MySQL  (http://www.mysql.de/)

    Junit  (http://junit.org/)

     

    Schritt 1: Tabelle anlagen

    Als erstes wird in der MySQL Datenbank eine Tabelle angelegt. Auf diese Tabelle wird dann später mit Hibernate zugegriffen.

    SQL Statement:

    CREATE TABLE DBUSER (
      USER_ID       BIGINT (5)    NOT NULL,
      USERNAME      VARCHAR (20)  NOT NULL,
      CREATED_BY    VARCHAR (20)  NOT NULL,
      CREATED_DATE  DATE          NOT NULL,
      PRIMARY KEY ( USER_ID )
    )

     

    Schritt 2: Ein Java Projekt mit Maven anlegen

    Um ein neues Projekt mit Maven anlegen zu können, muss maven installiert und konfiguriert sein. Details zur Installation und Konfiguration von MAven kann man unter (http://maven.apache.org/run-maven/index.html) finden.

    Nach der Installation und Konfiguration von Maven kann man mit dem folgenden Aufruf ganz einfach ein neues Java Projekt erstellen.

    mvn archetype:generate
    -DgroupId=de.msoftware
    -DartifactId=Example1
    -DarchetypeArtifactId=maven-archetype-quickstart
    -DinteractiveMode=false

     

    Wenn man Maven das erste mal ausführt, warden eine ganze Menge jar Files heruntergeladen. Das passiert zum Glück nicht jedes Mal und wenn man Maven schon öfter mal genutzt hat, sieht man nun folgende Ausgaben auf der Konsole.

    [INFO] Scanning for projects…
    [INFO]                                                                        
    [INFO] ————————————————————————
    [INFO] Building Maven Stub Project (No POM) 1
    [INFO] ————————————————————————
    [INFO]
    [INFO] >>> maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom >>>
    [INFO]
    [INFO] <<< maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom <<<
    [INFO]
    [INFO] — maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom —
    [INFO] Generating project in Batch mode
    [INFO] —————————————————————————-
    [INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.0
    [INFO] —————————————————————————-
    [INFO] Parameter: groupId, Value: de.msoftware
    [INFO] Parameter: packageName, Value: de.msoftware
    [INFO] Parameter: package, Value: de.msoftware
    [INFO] Parameter: artifactId, Value: Example1
    [INFO] Parameter: basedir, Value: /home/user
    [INFO] Parameter: version, Value: 1.0-SNAPSHOT
    [INFO] project created from Old (1.x) Archetype in dir: /home/user/Example1
    [INFO] ————————————————————————
    [INFO] BUILD SUCCESS
    [INFO] ————————————————————————
    [INFO] Total time: 1.552s
    [INFO] Finished at: Mon Oct 08 16:40:58 CEST 2012
    [INFO] Final Memory: 8M/23M
    [INFO] ————————————————————————

     

    Maven erstellt hier das sogenannte “Maven Standard Directory Layout” für das neue Java-Projekt. Dabei wählt Maven für den Name des Verzeichnisses den Namen, den man als “artifactId” Parameter beim Maven Aufruf mitgegeben hat.

    Maven Standard Directory Layout

    http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html

    Nun ist ein neuer Ordner mit dem Namen „Example1“ mit allen benötigten Projektdateien angelegt worden, der folgende Dateien enthält:

     

    ./pom.xml
    ./src
    ./src/test
    ./src/test/java
    ./src/test/java/de
    ./src/test/java/de/msoftware
    ./src/test/java/de/msoftware/AppTest.java
    ./src/main
    ./src/main/java
    ./src/main/java/de
    ./src/main/java/de/msoftware
    ./src/main/java/de/msoftware/App.java

     

    Der Aufbau der Verzeichnisstruktur und die darin enthaltenen Dateien sollten dem geübten Java Entwickler nicht unbekannt sein. Einzig die Datei pom.xml ist neu. Die Datei enthält einige maven spezifisch Informationen, auf die ich später noch eingehen werde.

     

    Schritt 3: Das Projekt in die Eclipse IDE importieren.

    Für den Impot des Projektes in Eclipse hat Maven auch eine Lösung parat. Mit dem Aufruf mvn eclipse:eclipse kann man ein Projekt ganz einfach in Eclipse importieren. Wichtig ist, dass man sich beim Aufruf in dem Order befindet, in dem auch die pom.xml Datei liegt. In diesem Beispiel ist es der Ordner Example1.

    Auch hier werden beim ersten Aufruf wieder eine ganze Menge Downloads gestartet. Spätestens beim 2ten Aufruf des Kommandos sollte auf der Konsole folgende Ausgabe erscheinen.

    [INFO] Scanning for projects…
    [INFO]                                                                         
    [INFO] ————————————————————————
    [INFO] Building Example1 1.0-SNAPSHOT
    [INFO] ————————————————————————
    [INFO]
    [INFO] >>> maven-eclipse-plugin:2.9:eclipse (default-cli) @ Example1 >>>
    [INFO]
    [INFO] <<< maven-eclipse-plugin:2.9:eclipse (default-cli) @ Example1 <<<
    [INFO]
    [INFO] — maven-eclipse-plugin:2.9:eclipse (default-cli) @ Example1 —
    [INFO] Using Eclipse Workspace: null
    [INFO] Adding default classpath container: org.eclipse.jdt.launching.JRE_CONTAINER
    [INFO] Not writing settings – defaults suffice
    [INFO] File /home/user/Example1/.project already exists.
           Additional settings will be preserved, run mvn eclipse:clean if you want old settings to be removed.
    [INFO] Wrote Eclipse project for “Example1″ to /home/user/Example1.
    [INFO]
    [INFO] ————————————————————————
    [INFO] BUILD SUCCESS
    [INFO] ————————————————————————
    [INFO] Total time: 1.021s
    [INFO] Finished at: Mon Oct 08 16:54:48 CEST 2012
    [INFO] Final Memory: 5M/13M
    [INFO] ————————————————————————

     

    Nun hat sich die Verzeichnisstruktur etwas verändert. Hinzugekommen sind die beiden Eclipse typischen Dateien:

    ./.project
    ./.classpath

    Nun kann man Eclipse öffnen und das Projekt über den Menüpunkt File -> Import -> „Existing Projects into Workspace“ importieren und schon erscheint in der Liste der Projekt, sofern man den Example1 Order im Workspace liegen hat. Wenn nicht, ist es jetzt der richtige Moment, den Ordner dorthin zu verschieben. Alternativ kann man auch Eclipse dazu nutzen, das Projekt in den Workspace zu kopieren. Dazu setzt man einfach das Häckchen „Copy projects into workspace“.

    Nach dem Import erscheint direkt ein Fehler, der daher kommt, dass es Probleme mit jUnit gibt. Sieht man sich die Projekteigenschaften mal genauer an, kommt man schnell darauf. Die Bibliothek junit-3.8.1.jar konnte nicht geladen werden.  Das hat den einfachen Hintergrund, dass die junit Dateien nicht Teil des Projektes im Workspace sind, sondern direkt aus dem M2_REPO geladen werden. Daher muss Eclipse den Pfad des lokalen Maven Repositorys kennen. Um den Classpath so zu erweitern, dass auch die Dateien des M2_REPO Repositorys gefunden werden führt man einfach den folgenden Befehl  aus:

    mvn -Declipse.workspace=/home/user/workspace eclipse:add-maven-repo

    Danach muss Eclipse einman neu gestartet warden und schon sind die Fehler Vergangenheit. Der Aufruf erzeugt dabei auf der Konsole folgende Ausgaben.

    [INFO] Scanning for projects…
    [INFO]                                                                        
    [INFO] ————————————————————————
    [INFO] Building Example1 1.0-SNAPSHOT
    [INFO] ————————————————————————
    [INFO]
    [INFO] — maven-eclipse-plugin:2.9:add-maven-repo (default-cli) @ Example1 —
    [INFO] ————————————————————————
    [INFO] BUILD SUCCESS
    [INFO] ————————————————————————
    [INFO] Total time: 1.492s
    [INFO] Finished at: Tue Oct 09 08:07:47 CEST 2012
    [INFO] Final Memory: 5M/13M
    [INFO] ————————————————————————

     

    Im Hintergrund passiert eigentlich nicht viel. Es wird nur in der Datei Example1/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.core.prefs der Eintrag org.eclipse.jdt.core.classpathVariable.M2_REPO=/home/user/.m2/repository hinzugefügt. Damit hat Eclipse nun den Hinweis bekommen, die ClasspathVariable M2_REPO durch /home/user/.m2/repository zu ersetzen. Sieht man sich nun in den Projekteigenschaften den Java Build Path an, kann man bei der junit Bibliothek gut erkennen, dass Eclipse die Variable nun durch den Pfad ersetzt.

     

    Schritt 4: Abhängigkeiten festlegen

    Die ersten 3 Schritte haben nun ein fertiges, compilierbares, testbares und ausführbares „Hello Word“ Projekt erzeugt, das aber noch keinerlei Funktionalität enthält. Führt man in Eclipse die Funktion „Run“ aus, erhält man bei der Klasse App.java die Ausgabe „Hello World“ und bei AppTest.java wird eine jUnit Test ausgeführt, der einen Test enthält, der erfolgreich beendet wird.

    So weit so gut. Nun soll die Anwendung aber ein wenig mehr tun, als nur ein ödes „Hello World“ auf den Montor zu  zaubern. Daher ist es nun nötig, sich über die verwendeten Bibliotheken Gedanken zu machen. Je nachdem, welche Anforderungen an ein Projekt gestellt werden, sollte man sich überlegen, was man davon selber programmiert oder ob es möglich ist, hier oder da eine Bibliothek zu verwenden. In diesem Beispiel werden folgende Bibliotheken verwendet:

    -          junit (junit)
    http://mvnrepository.com/artifact/junit/junit/4.10

    -          mysql  (mysql-connector-java)
    http://mvnrepository.com/artifact/mysql/mysql-connector-java/5.1.6

    -          org.hibernate (hibernate-core)
    http://mvnrepository.com/artifact/org.hibernate/hibernate-core/4.1.2

    Da ich nun aber keine Lust habe, mich um die Bibliotheken und die Abhängigkeiten und das ganze Drumherum kümmern möchte, trage ich einfach die beiden Dependencies in meine pom.xml Datei ein. So entgehe ich der Dependency-Hell und kann mich ganz in Zukunft ganz auf meine Programmlogik konzentrieren. Eine gute Hilfe bietet mir hier die Seite http://mvnrepository.com. Hier kann ich einfach meine benötigte Bibliothek auswählen und kann dann den Dependency Block einfach per Drag and Drop in mein pom.xml File kopieren. Nach dem Kopieren der Textblöcke in den XML Source, empfiehlt es sich, einmal die Tastenkombination „Strg“ + „Shift“ + „F“ zu drücken. Damit wird der Sourcecode sauber formatiert und entspricht dann wieder den üblichen Formatierungs-Konventionen einer XML Datei.

    Ob die Änderungen an der pom.xml Datei eine Auswirkung haben, kann man leicht testen, indem man auf der Konsole den Befehl „mvn package“ aufruft.Der Aufruf sollte mindestens folgende Aufrufe enthalten und einen Ordner target anlegen.

    [INFO] Scanning for projects…
    [INFO]                                                                        
    [INFO] ————————————————————————
    [INFO] Building Example1 1.0-SNAPSHOT
    [INFO] ————————————————————————
    [INFO]
    [INFO] — maven-resources-plugin:2.5:resources (default-resources) @ Example1 —
    [debug] execute contextualize
    [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
    [INFO] skip non existing resourceDirectory /home/user/workspace/Example1/src/main/resources
    [INFO]
    [INFO] — maven-compiler-plugin:2.3.2:compile (default-compile) @ Example1 —
    [INFO] Nothing to compile – all classes are up to date
    [INFO]
    [INFO] — maven-resources-plugin:2.5:testResources (default-testResources) @ Example1 —
    [debug] execute contextualize
    [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
    [INFO] skip non existing resourceDirectory /home/user/workspace/Example1/src/test/resources
    [INFO]
    [INFO] — maven-compiler-plugin:2.3.2:testCompile (default-testCompile) @ Example1 —
    [INFO] Nothing to compile – all classes are up to date
    [INFO]
    [INFO] — maven-surefire-plugin:2.10:test (default-test) @ Example1 —
    [INFO] Surefire report directory: /home/user/workspace/Example1/target/surefire-reports
     
    ——————————————————-
     T E S T S
    ——————————————————-
    Running de.msoftware.AppTest
    Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.062 sec
     
    Results :
     
    Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
     
    [INFO]
    [INFO] — maven-jar-plugin:2.3.2:jar (default-jar) @ Example1 —
    [INFO] ————————————————————————
    [INFO] BUILD SUCCESS
    [INFO] ————————————————————————
    [INFO] Total time: 1.537s
    [INFO] Finished at: Tue Oct 09 08:42:02 CEST 2012
    [INFO] Final Memory: 4M/11M
    [INFO] ————————————————————————

     

    Wie man sieht, wird hier nicht nur das Jar File gebaut, sondern auch die junit Tests ausgeführt. Ist alles erfolgreich verlaufen, findet man man im Ordner target folgende Struktur vor:

    target/
    target/test-classes
    target/test-classes/de
    target/test-classes/de/msoftware
    target/test-classes/de/msoftware/AppTest.class
    target/classes
    target/classes/de
    target/classes/de/msoftware
    target/classes/de/msoftware/App.class
    target/surefire-reports
    target/surefire-reports/TEST-de.msoftware.AppTest.xml
    target/surefire-reports/de.msoftware.AppTest.txt
    target/Example1-1.0-SNAPSHOT.jar
    target/surefire
    target/maven-archiver
    target/maven-archiver/pom.properties

     

    Ein Aufruf der Klasse App mit dem Aufruf „java -cp target/Example1-1.0-SNAPSHOT.jar de.msoftware.App“ erzeugt die folgende Ausgabe auf der Konsole.

    Hello World!

    Ein weiterer interessanter Aufruf von Maven ist „mvn site“. Mit dem Aufruf kann man unter target/site eine Reihe von html Dateien erzeugen lassen, die umfangreiche Informationen zu dem Projekt enthalten. Darunter auch die Dependencies, die in der Datei dependencies.html zu finden sind. In dem Dokument wird schnell deutlich, welche Abhängigkeiten man schon jetzt im Projekt hat.

    Sehr interessant ist auch der Dependency Tree. In dem Tree werden noch einmal die Abhängigkeiten als Tree dargestellt. Zu jedem abhängigen Projekt wird hier auch die Projekt Lizenz angezeigt. So lässt sich auf einen Blick überschauen, ob Lizenzen dabei sind, die evtl. untereinander nicht kompatibel oder aus anderen Gründen nicht eingesetzt werden dürfen.

    Schritt 5: Datenbank konfigurieren

    Ein Hello Word zu erzeugen, ohne eine Zeile Programmcode schreiben zu müssen ist toll, aber jeder Entwickler weiß, dass heute zutage kaum eine Anwendung ohne eine Datenbank auskommt. Daher muss als nächstes die Konfiguration der Datenbank folgen.

    In Schritt 1 wurde die Tabelle „DBUSER“ angelegt, die nun in unserem Java Projekt bekannt gemacht werden muss. Dazu wird eine Datei „DBUser.hbm.xml“ im Ordner src/main/resources/de/msoftware/user  mit folgendem Inhalt angelegt:

    <?xml version=“1.0″ encoding=“utf-8″?>
    <!DOCTYPE hibernate-mapping PUBLIC “-//Hibernate/Hibernate Mapping DTD 3.0//EN”
     ”http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd”>
    <hibernate-mapping>
        <class name=“de.msoftware.user.DBUser” table=“DBUSER”>
            <id name=“userId” type=“int”>
                <column name=“USER_ID” precision=“5″ scale=“0″ />
                <generator class=“assigned” />
            </id>
            <property name=“username” type=“string”>
                <column name=“USERNAME” length=“20″ not-null=“true” />
            </property>
            <property name=“createdBy” type=“string”>
                <column name=“CREATED_BY” length=“20″ not-null=“true” />
            </property>
            <property name=“createdDate” type=“date”>
                <column name=“CREATED_DATE” length=“7″ not-null=“true” />
            </property>
        </class>
    </hibernate-mapping>

    In dieser Datei wird die Tabelle DBUSER über das Hibernate Mapping mit der Klasse com.msoftware.user.DBUser verbunden, die Id der DBUSER Tabelle festgelegt und die benötigen Spalten mit ihren Eigenschaften veröffentlicht. Dank des Mappings ist es nun sehr einfach, die zugehörige Klasse in Eclipse anzulegen. Im Ordner src/main/java/de/msoftware/user/ wird die Klasse DBUser mit folgendem Inhalt angelegt:

    package de.msoftware.user;
     
    import java.io.Serializable;
    import java.util.Date;
     
    public class DBUser implements Serializable {
     
                private static final long serialVersionUID = -7859213880449722708L;
               
                private int userId;
                private String username;
                private String createdBy;
                private Date createdDate;
     
                public DBUser() {
                }
     
                public DBUser(int userId, String username, String createdBy,
                                       Date createdDate) {
                            this.userId = userId;
                            this.username = username;
                            this.createdBy = createdBy;
                            this.createdDate = createdDate;
                }
     
    }
     

    Zum Anlegen der Getter und Setter für die Variablen verwenden wir eine der vielen hilfreichen Eclipse Werkzeuge. Dazu einfach im Sourcecode mit der rechten Maustaste (Sorry Mac-Users J ) das Kontextmenü öffnen und dort unter dem Menüpunkt „Source -> Generate Getters and Setters“ den Dialog zum Erzeugen von Gettern und Settern für die privaten Variablen aufrufen.

    Nach der Auswahl der privaten Variablen kann man auf OK klicken und schon sind die get und set Methoden für die 4 Variablen erstellt.

    Damit existiert nun eine Klasse, die per Hibernate Mapping mit einer Datenbank Tabelle verknüpft ist. Was nun noch fehlt ist die Datenbank Konfiguration, denn noch weiß die Anwendung noch nichts darüber, welche Datenbank verwendet werden soll. Hibernate benötigt also noch eine Konfigurationsdatei, in der die Eigenschaften der Datenbank eingetragen werden. Diese Datei wird im Ordern src/main/resources mit dem Namen hibernate.cfg.xml angelegt und hat folgenden Inhalt:

    <?xml version=“1.0″ encoding=“utf-8″?>
    <!DOCTYPE hibernate-configuration SYSTEM
        “classpath://org/hibernate/hibernate-configuration-3.0.dtd”>
        <hibernate-configuration>
                <session-factory>
                            <property name=“hibernate.connection.driver_class”>org.gjt.mm.mysql.Driver</property>
                            <property name=“hibernate.connection.url”>jdbc:mysql://localhost:3306/example_1</property>
                            <property name=“hibernate.connection.username”>root</property>
                            <property name=“hibernate.connection.password”>password</property>
                            <property name=“hibernate.dialect”>org.hibernate.dialect.MySQLDialect</property>
                            <property name=“hibernate.default_schema”>example_1</property>
                            <property name=“show_sql”>true</property>
                            <mapping resource=“de/msoftware/user/DBUser.hbm.xml”></mapping>
                </session-factory>
    </hibernate-configuration>

    Damit nun in der Anwendung auch ein Datenbank Verbindung hergestellt werden kann, muss auch noch eine Java Klasse erstellt werden, die einen einfachen Zugriff auf die Hibernate Sessions ermöglicht. Dazu wird unter src/main/java/de/msoftware/util eine neue Java Klasse mit dem Namen HibernateUtil mit dem folgenden Inhalt angelegt.

    package de.msoftware.util;
     
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.service.ServiceRegistry;
    import org.hibernate.service.ServiceRegistryBuilder;
     
    public class HibernateUtil {
                private static SessionFactory sessionFactory = buildSessionFactory();
                private static ServiceRegistry serviceRegistry;
     
                private static SessionFactory buildSessionFactory() {
                            try {
                                       // Create the SessionFactory from hibernate.cfg.xml
                                       Configuration configuration = new Configuration();
                                       configuration.configure();
                                       serviceRegistry = new ServiceRegistryBuilder().applySettings(
                                                               configuration.getProperties()).buildServiceRegistry();
                                       sessionFactory = configuration.buildSessionFactory(serviceRegistry);
                                       return sessionFactory;
                            } catch (Throwable ex) {
                                       // Make sure you log the exception, as it might be swallowed
                                       System.err.println(“Initial SessionFactory creation failed.” + ex);
                                       throw new ExceptionInInitializerError(ex);
                            }
                }
     
                public static SessionFactory getSessionFactory() {
                            return sessionFactory;
                }
     
                public static void shutdown() {
                            // Close caches and connection pools
                            getSessionFactory().close();
                }
    }

     

    Die frisch erzeugte Klasse hat nun eine Menge Fehler, da Eclipse bisher nicht darüber informiert wurde, dass nun die hibernate jar Files benötigt werden. Dies kann man nun auf unterschiedliche Art und Weise lösen.

    1. Alles von Hand eintragen (Ist aber nicht zu empfehlen)
    2. m2eclipse installieren und dann unter “Configure” => “Convert to Maven Project” die Arbeit überlassen. Dies ist vermutlich der beste Weg, wenn man mit Eclipse arbeitet.
    3. Aufrufen von mvn eclipse:eclipse. Diese Variante ist nich ganz so elegant, wie m2eclipse, verdeutlicht aber, was Maven für Möglichkeiten bietet und in diesem Beispiel geht es ja auch darum. Maven zu versehen.

    Nun wird also mit dem Aufruf „mvn eclipse:eclipse“ die .classpath Datei des Eclipse Projektes auf Basis der pom.xml angepasst und während die Datei vorher fast leer war, hat die Datei nach dem Maven Aufruf nun folgenden Inhalt:

    <?xml version=”1.0″ encoding=”UTF-8″?>
    <classpath>
      <classpathentry kind=”src” path=”src/test/java” output=”target/test-classes” including=”**/*.java”/>
      <classpathentry kind=”src” path=”src/main/java” including=”**/*.java”/>
      <classpathentry kind=”src” path=”src/main/resources” excluding=”**/*.java”/>
      <classpathentry kind=”output” path=”target/classes”/>
      <classpathentry kind=”con” path=”org.eclipse.jdt.launching.JRE_CONTAINER”/>
      <classpathentry kind=”var” path=”M2_REPO/junit/junit/4.10/junit-4.10.jar”/>
      <classpathentry kind=”var” path=”M2_REPO/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar”/>
      <classpathentry kind=”var” path=”M2_REPO/mysql/mysql-connector-java/5.1.6/mysql-connector-java-5.1.6.jar”/>
      <classpathentry kind=”var” path=”M2_REPO/org/hibernate/hibernate-core/4.1.2/hibernate-core-4.1.2.jar”/>
      <classpathentry kind=”var” path=”M2_REPO/antlr/antlr/2.7.7/antlr-2.7.7.jar”/>
      <classpathentry kind=”var” path=”M2_REPO/org/jboss/logging/jboss-logging/3.1.0.GA/jboss-logging-3.1.0.GA.jar”/>
      <classpathentry kind=”var” path=”M2_REPO/org/jboss/spec/javax/transaction/jboss-transaction-api_1.1_spec/1.0.0.Final/jboss-transaction-api_1.1_spec-1.0.0.Final.jar”/>
      <classpathentry kind=”var” path=”M2_REPO/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar”/>
      <classpathentry kind=”var” path=”M2_REPO/org/hibernate/javax/persistence/hibernate-jpa-2.0-api/1.0.1.Final/hibernate-jpa-2.0-api-1.0.1.Final.jar”/>
      <classpathentry kind=”var” path=”M2_REPO/org/javassist/javassist/3.15.0-GA/javassist-3.15.0-GA.jar”/>
      <classpathentry kind=”var” path=”M2_REPO/org/hibernate/common/hibernate-commons-annotations/4.0.1.Final/hibernate-commons-annotations-4.0.1.Final.jar”/>
    </classpath>

     

    Alle Einträge die mit der ClasspathVariable M2_REPO beginnen, wurden von Maven hinzugefügt und sind nach einem Neustart von Eclipse im Java Build Path verfügbar. Damit steht nun eine Datenbankverbindung zur Verfügung und die Nutzung der Tabelle DBUSERS über die Klasse DBUsers aus der Anwendung heraus kann realisiert werden.

    Schritt 6: Applikationslogik und Testen

    Jetzt folgt der letzte Schritt, bei dem die Anwendung über die Anwendungslogik mit der Datenbank verbunden werden muss. Dazu wird die main Methode der App Klasse wie folgt ergänzt und die benötigten Imports mit Hilfe der Eclipse „Quick fixes“ ergänzt.

    package de.msoftware;
     
    import java.util.Date;
    import org.hibernate.Session;
    import de.msoftware.user.DBUser;
    import de.msoftware.util.HibernateUtil;
     
    public class App {
                public static void main(String[] args) {
                            System.out.println(“Maven + Hibernate + MySQL”);
                            App app = new App();
                            app.execute ();
                }
     
                private void execute() {
                            Session session = HibernateUtil.getSessionFactory().openSession();
     
                            session.beginTransaction();
                            DBUser user = new DBUser();
     
                            user.setUserId(1);
                            user.setUsername(“michael”);
                            user.setCreatedBy(“App”);
                            user.setCreatedDate(new Date());
     
                            session.save(user);
                            session.getTransaction().commit();
                }
    }

     

    Das Ausführen der App erzeugt nun in der Datenbank einen neuen Eintrag in der Tabelle DBUSER mit der ID = 1. Spätestens beim Zweiten Aufruf bekommt man dann aber den folgenden Fehler.

    Exception in thread “main” org.hibernate.exception.ConstraintViolationException: Duplicate entry ’1′ for key ‘PRIMARY’

    Das liegt einfach daran, dass schon ein Eintrag in der Datenbank vorhanden ist, der die ID 1 besitzt und die Spalte in der Datenbank als Primary Key gekennzeichnet ist. Daher kann man die execute Methode so wie sie ist nicht in den JUnit Test einfügen. Um einen sinnvollen Test der App Methode machen zu können, benötigt man im Idealfall als erstes also eine leere Datenbank, fügt dann einen Datensatz in die Datenbank ein und prüft zum Schluss, ob der Eintrag wirklich vorhanden ist.

    Um der Anwendung ein wenig mehr Logik zu geben, wird die Klasse App noch einmal refactored und die Methoden getUser, saveUser und deleteUser in eine Klasse User ausgelagert. In der main Methode der App Klasse werden dann nur noch die Methoden aufgerufen.

    Die Klasse User sieht dann z.B. wie folgt aus:

    package de.msoftware.user;
     
    import java.util.Date;
    import org.hibernate.Session;
    import de.msoftware.util.HibernateUtil;
     
    public class User {
     
                Session session;
               
                public User ()
                {
                            session = HibernateUtil.getSessionFactory().openSession();
                }
               
                public DBUser getUser (int id)
                {
                            session.clear();
                            session.beginTransaction();
                            DBUser user = new DBUser();
                            session.load(user, id);
                            session.getTransaction().commit();
                            return user;
                }
               
                public void saveUser (int id, String username, String createdBy)
                {
                            session.clear();
                            session.beginTransaction();
                            DBUser user = new DBUser();
                            user.setUserId(id);
                            user.setUsername(username);
                            user.setCreatedBy(createdBy);
                            user.setCreatedDate(new Date());
                            session.save(user);
                            session.getTransaction().commit();
                }
               
                public void deleteUser (int id)
                {
                            session.clear();
                            session.beginTransaction();
                            DBUser user = new DBUser();
                            user.setUserId(id);
                            session.delete(user);
                            session.getTransaction().commit();
                }
    }

     

    Die Klasse App und den dazu gehörenden JUnit test kann man nun getrost löschen. Für den Test der Klasse User erzeugt man einen neuen JUnit Test mit der Eclipse Funktion „New JUnit Test Case“ und wählt hier für „Class under test“ die Klasse „de.msoftware.user.User“. In der Klasse UserTest wird dann ein Test mit einer Before und einer After Annotationen erstellt, der wie folgt aussieht.

    package de.msoftware;
     
    import static org.junit.Assert.*;
     
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
     
    import de.msoftware.user.DBUser;
    import de.msoftware.user.User;
     
    public class UserTest {
                    User user = new User ();
                    private int id = 1;
                    private String username = “michael”;
                    private String createdBy = “App”;
     
                    @Test
                    public void testGetUser() {
                                  
                                   DBUser dbuser = user.getUser (id);
                                   if (!dbuser.getUsername().equals(username))
                                   {
                                                   fail(“GetUser faild”);
                                   }
                    }
     
                    @Before
                    public void createUser() {
                                   user.saveUser (id, username, createdBy);
                    }
     
                    @After
                    public void deleteUser() {
                                   user.deleteUser (id);
                    }
     
    }

     

    Der Test legt vor dem Test der Methode getUser einen neuen Datensatz an und nach dem Test wird dieser Datensatz wieder gelöscht. Der Test selbst, prüft nur, ob der username des geladenen Obketes dem erwarteten username entspricht. Ist das der Fall, ist der Test erfolgreich.

     

    Schritt 7: Packen

    Nachdem nun alle Komponenten realisiert wurden und die Tests erfolgreich abgeschlossen sind, kann das Projekt zu einem Jar File gepackt werden. Dazu wird noch einmal der Befehl mvn package auf der Konsole eingegeben. Danach ist im Ordner target ein aktuelles Release der Anwendung ohne die Tests in der Datei Example1-1.0-SNAPSHOT.jar enthalten.

    Hinweis: Der Dateiname setzt sich aus 2 Tags der pom.xml Datei zusammen. Einmal die artifactId (Example1) und dann noch die Version (1.0-SNAPSHOT). Das Maven hier ein Jar File erstellt wird auch in der pom.xml Datei festgelegt. In dem Tag packaging kann man statt jar z.B. auch war (für WAR-File J ) eintragen.

    Weitere Details zur pom.xml kann man unter http://maven.apache.org/pom.html nachlesen.

    Fazit

    Jedem sollten nun die Zusammenhänge zwischen den eingesetzten Tools und Techniken klar sein. Trotzdem hier noch mal eine kurze Beschreibung der einzelnen Komponenten dieses Examples.

    Java ist die Programmiersprache. Wer es geschafft hat das Beispiel durchzuarbeiten ohne Vorkenntnisse in Java zu haben verdient meinen Respekt. Alle anderen wissen was Java ist und ich brauche hier nicht weiter darauf eingehen.

    Eclipse ist eine IDE zur Entwicklung von Software. Die Ursprünge von Eclipse liegen in der  Programmiersprache Java. Aber Eclipse wird mittlerweile auch für viele andere Programmiersprachen und Aufgaben eingesetzt. Eclipse selbst ist in Java realisiert und kann über Plugins beliebig erweitert werden.

    Maven ist ein Build-Management-Tool für Java. Mit Maven kann man Java-Programme standardisiert erstellen und verwalten. Die Konfiguration erfolgt im wesentlichen in der pom.xml und auf der Konsole hat man einige Befehle, die Abläufe automatisieren können.

    Hibernate ist ein Java Framework mit dem es sehr einfach möglich ist, Objete aus einem Java Programm  in einer relationalen Datenbank abzulegen. Dem Java-Programm erscheint die Datenbank dann als objektorientierte Datenbank, wodurch die Programmierung erleichtert wird.

    MySQL ist sehr weit verbreitete relationalen Datenbank, die (auch) als Open-Source-Software verfügbar ist. MySQL ist heute in fast jedem Webhosting Paket verfügbar und wird oft in Zusammenhang mit PHP genannt. Es gibt aber Konrektoren für die meisten Programmiersprachen wir z.B. Java.

     

    Related posts:

    1. Java vs. PHP
    2. Java Network Monitor
    3. Mobile Games – Spieleprogrammierung für Handys mit Java ME von Thomas Lucka
    ]]>
    http://m-software.de/java-eclipse-maven-hibernate-mysql/feed 0
    Blog Marketing http://m-software.de/blog-marketing http://m-software.de/blog-marketing#comments Thu, 04 Oct 2012 07:55:21 +0000 Michael Jentsch http://m-software.de/?p=2135 Als Blogger wird man oft gefragt: “Was verdienst Du denn so mit deinem Blog?” Und wie man es macht, dass man überhaupt mit einer Webseite Geld verdient. In der Situation versuche ich dann nach Möglichkeit, auf die individuellen Stärken einzugehen und daraus ein mögliches Szenario zu entwickeln. In den meisten Fällen empfehle ich einen WordPress Blog, was einfach und allein daran liegt, dass ich selber ein begeisterter WordPress Nutzer und Plugin Entwickler bin und so im Falle von Fragen oder Problemen schnell mal eine Lösung bieten kann.

    WordPress als technische Basis

    Ein WordPress Blog ist schnell installiert und dank der endlosen Liste von Plugins und Themes ist so ein Blog schnell und einfach an die eigenen Bedürfnisse angepasst. Im schlimmsten Fall muss dann doch noch mal ein Webdesigner oder Programmierer ran, um die persönlichen Bedürfnisse zu befriedigen. Ist der Blog aber erst mal aufgesetzt, kann man schon mit dem Bloggen beginnen.

    Bloggen ist das tägliche Brot

    Ein Blog alleine ist erst mal nichts, womit man Geld verdienen kann. Ein leerer Blog lässt sich nicht vermarkten. Daher ist der nächste Schritt des Bloggers das Bloggen. Dabei ist es eigentlich egal, worüber man schreibt, wenn es nur genug Menschen gibt, die sich dafür interessieren.
    Mein Blog z.B. behandelt alles Mögliche rund um meine Online-Aktivitäten. Damit hat der Blog keinen richtigen Fokus auf ein Thema, was Vor- und auch Nachteile hat. Ein Vorteil ist, dass ich hier einfach schreiben kann, was ich will. Ein Nachteil ist, dass der Blog nicht als ein themenspezifischer Blog wahrgenommen wird und ich mich natürlich auch nicht wirklich in einer Nische positionieren kann. Da es mir auf dieser Webseite aber nicht primär darum geht, möglichst viel Geld zu verdienen ist das so OK.
    Anders muss man vorgehen, wenn man seinen Blog, und damit auch sich selbst mit einem bestimmten Thema in Verbindung bringen will. Dann heißt es, all sein Wissen zum Thema in Blog Posts zu verpacken, Fragen beantworten und ein Netzwerk zu anderen Bloggern zum Thema aufbauen.

    Das Netzwerk

    Hat man einen Blog erstellt und schreibt fleißig Blog Posts, ist der Anfang schon gemacht. Aber noch fehlen die Besucher. Woher kommen aber die meisten Besucher? Genau, die meisten Besucher kommen über Google und Co. auf die Webseite und nur wer ein gutes Google Ranking hat wird genügend Besucher bekommen um später den eigenen Blog vermarkten zu können. Denn eines ist klar. Eine Webseite ohne Besucher ist in aller Regel nicht interessant für das Blog Marketing (Allerdings gibt es hier auch Ausnahmen). Daher ist es wichtig, das Google Ranking durch die bekannten SEO Maßnahmen zu verbessern und ein Netzwerk von gleichgesinnten aufzubauen. Idealerweise bloggen die zu dem gleichen oder zu ähnlichen Themen und so kann man sich gegenseitig verlinken.

    Nun kann man mit dem Blog Geld verdienen

    Irgendwann ist der Punkt erreicht, an dem man mit dem Blog Marketing beginnen kann. Jetzt ist die Auswahl des optimalen Marketing-Instrumentes entscheidend für den Erfolg. Beim Blog Marketing denken die Meisten wohl erst mal an Google Adsense oder an die klassischen Affiliate Marketing Methoden.
    Doch es gibt noch andere Möglichkeiten, ein effizientes Blog Marketing ohne aufdringliche Banner und Werbeblöcke zu realisieren. Ein sehr einfaches und komfortables System findet man unter www.teliad.de.

    Teliad

    Bei Teliad handelt es sich um einen Online Marketing Dienstleister, der besondere Stärken im Bereich Linkaufbau und Suchmaschinenoptimierung hat. Zu diesem Zweck hat man unter teliad.de einen Marktplatz für das Linkbuilding aufgebaut, der es Bloggern erlaubt, Links zu fairen Preisen zu verkaufen. Da es für die meisten Blogger nicht so einfach ist, den Wert eines Links oder einer Presell Page festzulegen, hat man bei Teliad verschiedene Messwert für die Ranking-Qualität von Webseiten entwickelt, mit denen automatisch ein Preis ermittelt wird. Als Blogger muss man nur noch entscheiden, welches Preisniveau man wünscht.
    Über den Marktplatz kommen sowohl Verkäufer als auch Käufer von Linkbuilding Maßnahmen zusammen und es ist nicht nötig, dass der Blogger sich selbst um die Kunden-Akquise kümmern muss. Besonders vorteilhaft ist auch, dass die Abwicklung der Zahlungen zwischen Verkäufer und Käufer auch über Teliad erfolgt. Dieser Vorteil ist einer der wesentlichen Gründe, warum man sich für Teliad entscheiden sollte, denn gerade für Blog Projekte, die nur wenig Umsatz machen lohnt es sich nicht, eine Rechnungsabteilung zu installieren, die Rechnungen schreibt, eingehende Zahlungen kontrolliert und im Falle von Problemen bei der Zahlung Mahnungen schreibt. Bei Teilad bekommt man jeden Monat eine Gutschrift und braucht sich dafür um nichts zu kümmern. Natürlich ist dieser Service nicht kostenlos und Teliad verdient anhand einer Provisionsstaffelung mit am Blog Marketing. Die Provision die Teliad einbehält ist für jede erfolgreich vermittelte Buchung fällig. Allerdings fallen darüber hinaus keine weiteren Kosten an, so dass nur dann Kosten entstehen, wenn auch ein Umsatz erzielt wird.

    Fazit

    Bei Teliad hat man eine Reihe von Möglichkeiten, den Blog dezent und unauffällig zu vermarkten. Egal wofür man sich hier entscheidet, ein Blog, der gut geführt ist und viele Besucher anzieht kann hier sehr gut vermarktet werden, ohne das Fixkosten entstehen oder man das Risiko eingeht, die Besucher durch zu viele bunte Werbebanner zu vergraulen.

    No related posts.

    ]]>
    http://m-software.de/blog-marketing/feed 13
    Online Shop für Leiterplatten http://m-software.de/online-shop-fur-leiterplatten http://m-software.de/online-shop-fur-leiterplatten#comments Thu, 27 Sep 2012 20:48:52 +0000 Michael Jentsch http://m-software.de/?p=2123
  • Branchentipps für den Online Erfolg
  • Online-Motor-Deutschland
  • Sudoku online spielen
  • ]]>
    Online Shops gibt es im Internet wie Sand am Meer. Angefangen bei Amazon und Ebay gibt es ein paar sehr große Online Shops, die so gut wie jedes Produkt anbieten, was man sich nur denken kann. Daneben gibt es auch ein paar sehr große Spezial-Shops, die sich auf ein bestimmtes Produktsortiment konzentrieren. Hierzu gehört z.B. Zalando, aber auch Conrad Electronics und Staples.

    Doch es gibt auch Online Shops die noch einen Schritt weiter gehen und ihren Shop noch weiter spezialisieren und sich dadurch noch besser fokussieren können. Dazu gehört  auch der Leiterplatten-Shop der Micro Circuit Technology GmbH den ich hier mal etwas näher beleuchten möchte.

    Bei der Micro Circuit Technology GmbH handelt es sich um einen deutschen Leiterplattenhersteller mit Sitz in Krefeld. Im Online Shop ist es möglich, eine individuell gestaltete Leiterplatte online zu bestellen. Bei der Micro Circuit Technology GmbH ist es auch möglich, Multilayer Leiterplatten zu bestellen. Diese Mehrlagenplatinen haben dann statt nur einer, zwei Außenlagen und auf der Grundplatte mehrere Löt- und Bestückungslagen. Die typische Multilayer Platine ist dann je mit einer Bestückungs-, Ground, Signal- und Lötlage bestückt.

    Bei der Micro Circuit Technology GmbH unterscheidet man zwischen 4 Leiterplatten-Services.

    • BASIC JET LINE
    • MEDIUM JET LINE
    • PREMIUM JET LINE
    • Expressdienst für Großserien

    Diese 4 Leiterplatten-Services bieten unterschiedliche Möglichkeiten bei der Bestellung von Leiterplatten. Bei der Basic Jet Line ist es möglich, eine oder verschiedenen Leiterplatten gleicher Spezifikation zu bestellen. Bei der Medium Jet Line hat man schon deutlich mehr Möglichkeiten und kann von Prototypen bis zur Serie jede Leiterplatte online bestellen. Wer mit der Medium Jet Line nicht ausreichend versorgt ist, kann mit der Premium Jet Line noch einen Schritt weiter gehen und bekommt  hier noch mehr Möglichkeiten und sogar noch eine persönliche Beratung oben drauf.

    Eine Sonderstellung nimmt hier der Expressdienst für Großserien in Anspruch, der für besonders eilige Projekte ein Rapid Mass Production ermöglicht.

    Fazit: Bei diesem Online Shop sieht man sehr schön, dass man doch nicht alles bei Amazon und Co. bestellen kann. Denn um Leiterplatten so verkaufen zu können, bedarf es einer ganz besonderen Anpassung der Shop-Lösung die man nicht von der Stange kaufen kann und die man bei der Micro Circuit Technology GmbH mit dem LEO TOOL  (Leiterplatten einfach online) einfach und elegant umgesetzt hat.

    Related posts:

    1. Branchentipps für den Online Erfolg
    2. Online-Motor-Deutschland
    3. Sudoku online spielen
    ]]>
    http://m-software.de/online-shop-fur-leiterplatten/feed 0
    Dmexco 2012 http://m-software.de/dmexco-2012 http://m-software.de/dmexco-2012#comments Wed, 12 Sep 2012 13:45:50 +0000 Michael Jentsch http://m-software.de/?p=2108
  • hochgeschwindigkeitsSEO – SEO Contest zur dmexco
  • Sternschnuppen Nacht vom 11.08.2012 auf den 12.08.2012
  • ]]>
    Wer mitbekommen hat, dass ich am HochgeschwindigkeitsSEO Contest teilnehme hat sich sicher auch schon gedacht, dass ich mir die dmexco nich entgehen lasse. Nun sitze ich also hier im “Blogger Area” und kämpfe mir der WIFI Abdeckung, die ich als das negativste an der Messe kennzeichnen würde. Aber WIFI geht wenigstens leidlich, während an UMTS in den Messe-Hallen nicht zu denken ist.

    Inhaltlich ist die dmexco aber ein voller Erfolg und neben den vielen interessanten Anbietern von Digital Industry Produkten und Dienstleistungen gibt es auch viele spannende Vorträge. Leider sind auch diese total überlaufen und wenn man keinen Sitzplatz bekommt, ist man raus. So hat es mich gerade voll erwischt, als ich zu einem Thema in, die Congress-Hall wollte. Leider alle Plätze belegt – also Raus. Na toll :-( . Aber was soll’s. Ich habe so viele neue interessante Kontakte geknüpft und Impressionen mitgenommen, dass ist echt unglaublich und erinnert stark an die CeBIT der Neunziger. Jetzt sind die Hallen total überfüllt und in den Gängen geht es zu wie auf Crange am Familientag. Die Mitarbeiter auf den Ständen sind alle total überfordert.

    Hier noch ein paar Highlights der dmexco:

    1. Natürlich PayPal und die QR Shopping App. Diese wird hier groß präsentiert. Nach einem Gespräch mit dem Business Development bin ich mir sicher, dass PayPal damit noch viel vor hat und die App ein voller Erfolg ist. Es macht echt Spaß ein kleiner Teil dieser Erfolgsgeschichte zu sein.

    2. EnergyX.my – Ein Energy Drink, dem ich es wohl zu verdanken habe, dass ich mich noch frisch fühle und noch voller Energie bin. Jetzt schnell bestellen und 5 Euro mit dem Gutscheincode DMEXCO sparen.

    3. Rankseller – Habe endlich mal Coskuna kennengelernt und wir haben ein wenig über die Zukunft von Rankseller gequatscht. Da ist noch viel Potential und ich werde mich da in Zukunft wohl etwas intensiver mit befassen. Denn das Konzept von Rankseller ist wesentlich besser als das anderer Linkaufbau Portale und daran möchte ich auch ein wenig partizipieren :-) .

    4. Econda bietet eine sehr gelungene Kombination aus Web Analytics Software und Recommendation Engine. Die grundsätzliche Idee ist sehr gut und eigentlich ist das etwas, das so offensichtlich ist, dass ich mich darüber wundere, nich schon vorher mal von so einer Lösung gehört zu habe. Recommendation Engines gibt es ja mittlerweile wie Sand am Meer und Web Analytics Tools ja auch. Beide nutzen die gleichen Daten und eine Verschmelzung ist nur eine logische Konsequenz.

    5. Hitmeister bietet Verkäufern eine Shopping Platform auf der Produkte aller Art verkauft werden können. Damit steht Hitmeister in Konkurrenz zu ebay und amazon (auch wenn hitmeister nich annähernd die Reichweite von Amazon hat). Die Platform ist trotzdem interessant und bietet eine fertige Schnittstelle zu vielen Shop Systemen was hitmeister zu einer zusätzlichen Verkaufsplattform zum eigenen E-Commerce System macht. Die Kosten halten sich auch in Grenzen und wenn man so mehr potentielle Kunden erreichen kann – warum nich?

    6. Testbirds. Ich habe ja schon mal über testbirds.de geschrieben und nun auch mal mit einem Sales Mitarbeiter gesprochen. Testbirds finde ich von der Idee her einfach gut, auch wenn das Tool (nest) noch verbesserungsbedürftig ist :-) . Allerdings bin ich doch ein wenig erstaunt über die Preise die man hier für ein Test-Projekt veranschlagt.
    Ich habe ja mal das Einführungs-Test-Projekt als Crowd Tester durchgezogen. Daraufhin sind mir auch ein paar Test Projekte angeboten worden und ich habe festgestellt, das man hier als Crowd Tester eher wenig verdienen kann und sich das eher für jugendliche lohnt, die ihr Taschengeld aufbessern wollen. Allerdings ist die Idee hinter testbirds einfach nur genial. Mit dem Konzept kann man wirklich eine unglaublich Testabdeckung erreichen, die sonst kaum möglich ist. Das hat natürlich seinen Preis.

    So, das soll es erst mal gewesen sein. Mein Fazit:
    Sehr gelungener Event, den ich mir für nächstes Jahr schon mal vormerken werde. Evtl. gewinne ich ja sogar ein iPad auf dem ich dann noch besser mobil bloggen kann. Gefühlt habe ich heute an ca. 100 iPAD Gewinnspielen teilgenommen :-) . Jetzt noch schnell einen Penguin Killer auf der Searchmetrics Standparty und dann ist der Tag auch rum.

    Related posts:

    1. hochgeschwindigkeitsSEO – SEO Contest zur dmexco
    2. Sternschnuppen Nacht vom 11.08.2012 auf den 12.08.2012
    ]]>
    http://m-software.de/dmexco-2012/feed 0
    3. Auflage des E-Commerce-Leitfadens ist erschienen http://m-software.de/3-auflage-des-e-commerce-leitfadens-ist-erschienen http://m-software.de/3-auflage-des-e-commerce-leitfadens-ist-erschienen#comments Tue, 11 Sep 2012 13:55:40 +0000 Michael Jentsch http://m-software.de/?p=2100
  • Der Bauplan für den optimalen Mobilen Webshop
  • Adobe’s Digital Edition in Version 1.5 erschienen
  • ]]>
    Unter http://www.ecommerce-leitfaden.de/download.html?dwl=1&wl=DEFAULT kann man sich nun die 3. Auflage des E-Commerce-Leitfadens kostenlos herunterladen.

    Das mehr als 400 Seiten starke PDF von ibi research an der Universität Regensburg GmbH enthält alles was man für einen erfolgreichen Start in des E-Commerce Geschäft benötigt.

     

    Aus dem Inhalt:

    1. Über den E-Commerce-Leitfaden

    2. Im Internet verkaufen – aber richtig!
    2.1 Was, Sie verkaufen noch nicht im Internet?
    2.2 E-Commerce: ja – aber wie?
    2.3 Ohne Pannen und Umwege ans Ziel – was bei der Umsetzung zu beachten ist

    3. Lasst Zahlen sprechen – Konversionsraten
    steigern durch Web-Controlling
    3.1 Wissen Sie, wohin Sie wollen? Am Anfang stehen die Ziele
    3.2 Erfolg braucht Wissen – wichtige Kennzahlen und Instrumente für Online-Händler
    3.3 Wer falsch misst, misst Mist – Verfahren zur Nutzeranalyse
    3.4 Den Kundenwünschen auf der Spur – aber wie?
    3.5 Auf los gehts los – Auswahl und Einführung von Web-Controlling-Tools

    4. Bezahlen bitte – einfach, schnell und sicher!
    4.1 Zahlungsverfahren für den E-Commerce
    4.2 So kommen Sie an Ihr Geld – Auswahl und Integration von Zahlungsverfahren
    4.3 Schluss mit Papier und Zettelwirtschaft – Rechnungen elektronisch abwickeln

    5. Keine Chance ohne Risikomanagement –
    schützen Sie sich vor Zahlungsstörungen
    5.1 Lug und Trug im Online-Handel – was da alles schiefgehen kann
    5.2 Vorbeugen ist besser als Heilen – Risikomanagement im E-Commerce
    5.3 Was passiert, wenns kracht – so kommen Sie zu Ihrem Recht

    6. Versand – vom Shop zum Kunden
    6.1 Verkauft ist noch nicht geliefert
    6.2 Der Versandprozess – das ganze Paket im Überblick

    7. Geschäfte ohne Grenzen – im Ausland verkaufen
    7.1 Neue Umsätze durch Internationalisierung – über das Internet!
    7.2 Alles anders, oder wie? Was bei der Expansion ins Ausland zu beachten ist
    7.3 Der einheitliche Euro-Zahlungsverkehrsraum (SEPA)

     

    Kostenloser Download:

    E-COMMERCELEITFADEN
    NOCH ERFOLGREICHER IM ELEKTRONISCHEN HANDEL

    Related posts:

    1. Der Bauplan für den optimalen Mobilen Webshop
    2. Adobe’s Digital Edition in Version 1.5 erschienen
    ]]>
    http://m-software.de/3-auflage-des-e-commerce-leitfadens-ist-erschienen/feed 0