Feed on
Posts
Comments

Heute musste ich mein Wissens über Cookies in ASP.net wiedermal etwas auffrischen. Damit ich es nicht vergesse, schreibe ich es hier nun entgültig auf:

Einfaches Cookie anlegen:

Cookies legt man prinzipiel über das Response-Objekt an. Wichtig ist zu wissen, dass die Daten auf 4 KB beschränkt sind.

Response.Cookies["Testcookie"].Value = "Mein Wert";

Auslesen eines Cookies:

Das Auslesen geht denkbar einfach:

if (Request.Cookies["Testcookie"].Value != null)
{
      string s = Request.Cookies["Testcookie"].Value;
}

Ablaufdatum eines Cookies:

Wird nichts angegeben so lebt ein Cookie solange bis der Browser geschlossen wird (unbeschränktes Cookie). Will man eine längere Lebensdauer sicherstellen, so kann man ein Ablaufdatum angeben.

if (Request.Cookies["Testcookie"].Value != null)
{
      Response.Cookies["Testcookie"].Expires = DateTime.Now.AddMonths(2);
}

Manuelles Löschen eines Cookies:

Das löschen des Cookies funktioniert so, dass man dem Cookie ein Ablaufdatum gibt, welches in der Vergangeheit liegt.

if (Request.Cookies["Testcookie"].Value != null)
{
       Response.Expires = new DateTime(0);
}

Verschachtelte Cookies:

Man kann Cookies erstellen, welche sich wie ein Array verhalten (Dictionary) .

  Response.Cookies["bookstore"]["book1"] = "ASP.net 2.0";
  Response.Cookies["bookstore"]["book2"] = "JSF 1.2";

Das Resultat sieht anschliessend folgendermassen aus: MehrereInhalte:book1=ASP.net 2.0&book2=JSF 1.2

Definieren eines HTTP-Cookie:

Der Unterschied von einem HTTP-Cookie zu einem normalen Cookie ist, dass das HTTP-Cookie erst beim Absenden der Response hinzugefügt wird. Ein „normales“ Cookie wird hinzugefügt sobald Response.Cookies['…'] aufgeführt wird.

HttpCookie Cookie = new HttpCookie("bookstore");
Cookie.Values.Add("book1", "ASP.net 2.0");
Cookie.Values.Add("book2", "JSF 1.2");
Response.AppendCookie(Cookie);

Eine Funktion, welche ich am meisten in Visual Studio vermisse ist das automatisch generieren von Getter/Setter properties. Klar es gibt die Möglichkeit private Felder automatisch zu entkapseln. Will man jedoch eine grössere Menge von Feldern auf einmal entkapseln, ist das leider nicht möglich.

Eine gute Abhilfe für dieses “Problem” schafft das Plugin “Property Manager”. Dieses AddIn verleiht Visual Studio die Möglichkeit Properties à la bekannte Java IDE’s (generate Getter/Setter-methods) zu erstellen.

Download unter: http://www.csharper.net/download.aspx?f=PropertyManagerSetup.exe

Blog mit Gebrauchsanleitung: http://www.csharper.net/blog/property_manager_addin_for_visual_studio_2005.aspx

Malen mit Licht

In einem Photobuch habe ich mal den Satz gelesen, dass Photographieren nichts anderes sei als “Malen mit Licht”. Dies finde ich eine sehr schöne Definition, denn für mich ist ein Photo mehr als nur eine Momentaufnahme. Unter diesem “Malen”-Vorwand, habe ich gestern Abend ein bisschen mit einer Strassenlaterne experimentiert. Was hierbei bei entstanden ist, präsentiere ich euch nun exklusiv ;-)

Malen mit Licht

Heute hatte ich wiedermal ein altbekanntes Problem mit SVN. Ich wollte in einem IntelliJ-Projekt einen Ordner umbenennen und wieder einchecken. Hier zur Veranschaulichung:

Der Ordner devisenundzinsen sollte in devisen_zinsen umbenannt werden.

Als ich meine Änderungen einchecken wollte, gab mir SVN immer wieder folgende Fehlermeldung zurück:

Commit Failed Directory trunk/clippings/devisenundzinsen is out of datesvn

Sicher haben die meisten SVN User haben diese Fehlermeldung bereits einmal zu Gesicht bekommen. Wie lässt sich das Problem nun aber lösen? Aus meiner Erfahrung geht es am einfachsten, wenn man das zu umbenennende Directory zuerst löscht, das löschen eincheckt, ein neues Directory erstellt und dieses wieder eincheckt.

Hier noch mal die Anleitung anhand des konkreten Beispiels:

  1. Rückgängig machen der lokalen Umbenennung (z.B. via SVN Revert), so dass wieder nur das Ausgangsdirectory vorhanden ist (devisenundzinsen)
  2. Backup der Sources, welche sich innerhalb des zu umbenennenden Directory (devisenundzinsen) befinden
  3. Löschen des zu umbenennenden Directory (devisenundzinsen)
  4. Einchecken des löschbefehls
  5. erstellen eines neuen Directory (devisen_zinsen)
  6. hinzufügen der sources aus dem Backup (punkt 1) in das Directories (devisen_zinsen)
  7. einchecken des neuen Directories (devisen_zinsen)

Wenn der Fehler nach wie vor auftaucht, kann es auch ein Problem in dem SVN-Client sein. In meinem Fall in IntelliJ (7.0.3). Oftmals lässt sich das Problem lösen, wenn man einen anderen SVN-Client verwendet. Z.B: smartSVN. Somit kann man in diesem separaten Tool die oben beschriebenen Änderungen vornehmen und anschliessend in der IDE (z.B. IntelliJ) wieder auschecken.

Dank WMI kommt man mit .net sehr einfach an die SystemInformationen. Will man z.B. alle logischen Drives seines PC’s auslesen, geht dies wie folgt:

using System;
using System.Management;
using System.Management.Instrumentation;
using System.IO;
 
namespace GetDrives
{
    class MyClass
    {
        static void Main(string[] args)
        {
            ManagementObjectSearcher searcher =
             new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk");
 
            foreach (ManagementObject drives in searcher.Get())
                Console.WriteLine(drives["Name"].ToString());
        }
    }
}

Für all diejenigen, welche sich mit WMI auseinander setzten wollen: msdn

Das ist wirklich eine tolle Sache!

Safari erfreut sich immer grösserer beliebtheit und seit der Version für Windows XP und Windows Vista, wird der Apple Browser auch immer mehr von Windows-Andwendern eingesetzt. Als Webentwickler ist es daher immer wichtiger seine Seite auch für den Safari zu testen.

Ich war auf der Suche nach einem Firebug ähnlichen Tool um ein komfortables Debuggen zu ermöglichen. Safari kommt bereits mit einem solchen Tool daher. Es heisst Webkit. Jedoch muss Webkit zuerst noch aktiviert werden, bevor man dieses Tool verwenden kann. Dies geht denkbar einfach:

1. klicke im Menü auf: Bearbeiten>Einstellungen

2. Aktiviere unter dem Menü Erweitert, die Option: Menü “Developer” in der Menüleiste einbinden

Das wars. Viel Spass beim Debuggen

ferien auf mallorca

vom 21. juni 2008 bis am 01. juli 2008 verbrachte ich meine sommerferien auf mallorca. nein! ich hatte keine partyferien gemacht. stationiert war ich im osten von mallorca: in cala murada. ich lernte mallorca von einer sehr ruhigen seite kennen und kann es getrost weiter empfehlen. als wahre korfu-fan habe ich jedoch die vorzüge von griechenland vermisst. ehja sommer 2009 werde ich wohl wieder dort anzutreffen sein :-)

es sind einige fotos entstanden, welche ihr hier bestaunen könnt:photos

JSF mit JSTL verwenden

Heute kam ich in die Situation, wo ich JSF 1.2 zusammen mit JSTL verwenden wollte. Die Frage welche im Raum stand: Funktioniert dies überhaupt? Fröhliche Antwort: Ja es funktioniert.

Wie kann man nun JSF zusammen mit JSTL verwenden? Hier zwei Beispiele:

Verwendung von JSTL <c:set> mit JSF

Dieses Tag:

1
<c:set var="variable" value="wert" />

kann in JSF auch verwendet werden. Der Zugriff erfolgt lediglich ein wenig speziell.

1
2
3
4
5
// Definieren
<c:set var="myVariable" value="3" scope="request">
 
// Auslesen
<h:outputText value="#{requestScope.myVariable} />

Hinweis: Die Variablen könne natürlich auch auf der Session usw. gespeichert werden. Der Zugriff würde dafür via sessionScope.myVariable geschehen

Verwendung von JSTL <c:forEach>

1
2
3
<c:forEach value="#{myManagedBean.myList}" var="entry">
  <h:outputText value="#{entry.property}" />
</c:forEach>

Wer mit JSP programmiert hat sicherlich bereits gemerkt, dass JSP je nach Tag viele Blanklines in dem output HTML-File generiert. Owohl das in den meisten Fällen nicht performancekritisch ist, ist es doch störend für das Auge. In Zeiten von Suchmaschinenoptimierung und notwendigkeiten von validem HTML kann es trotzdem interessant sein diese Leerschläge zu ersetzten. Hier ein Ansatz wie man das mit Tomcat (Ab Version 5.0) relativ einfach realisieren kann.

1. Zu Beginn unserer JSP-Seite fügen wir folgende Direktive ein:

1
<%@page trimDirectiveWhitespaces="true"%>

Dies bewirkt, dass alle unnötigen Leerschläge vor dem <html> enfternt werden.

2. Eine konfiguration des Tomcats schafft zudem Abhilfe, dass die Leerschläge innerhalb des <html>-Tag’s entfernt werden.

Dazu öffnen wir das File: %catalina_home%\ conf\web.xml

In diesem File gibt es folgenden Eintrag:

1
2
3
4
5
6
7
8
9
10
11
12
13
<servlet>
        <servlet-name>jsp</servlet-name>
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
        <init-param>
           <param-name>fork</param-name>
           <param-value>false</param-value>
        </init-param>
        <init-param>
           <param-name>xpoweredBy</param-name>
           <param-value>false</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
</servlet>

Diesem Servlet fügen wir nun folgenden Request-Parameter hinzu:

1
2
3
4
<init-param>
   <param-name>trimSpaces</param-name>
   <param-value>true</param-value>
</init-param>

Nun wird sogenanntes pretty-HTML ausgegeben.

Heute hatte ich das Problem, dass der Wert von einem boolean innerhalb einer Hibernate-Entity nicht in die Datenbank persistiert wurde. Zur Veranschaulichung hier etwas code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@entity
public class TestClass
{
    @Id
    @GeneratedValue
    private int id;
    private boolean myBoolean
 
    public int getId()
    {
        return id;
    }
 
    public void setId(int id)
    {
        this.id = id;
    }
 
    public boolean isMyBoolean()
    {
        return configurable;
    }
 
    public void setMyBoolean(boolean myBoolean)
    {
        this.myBoolean = myBoolean;
    }
}

Das Problem besteht darin, dass MySQL seit der Version 5.0 den SQL-Datentyp Bit verwendet um einen boolschen Wert zu repräsentieren. Offenbar kann Hibernate dies aber nicht richtig handeln. In der Kürze liegt die Würze und daher gibt es auch eine kurze Lösung für dieses Problem:

Folgendes als Field-Definition in der Entity-Bean verwenden:

1
2
@Column(columnDefinition="TINYINT(1)")
private boolean myBoolean;

« Newer Posts - Older Posts »

Free counter and web stats