Posts Tagged: ‘Internet Explorer’

Kommentar: „Firefox ist jetzt das gallische Dorf im Chromium-Imperium“

7. Dezember 2018 Posted by Stefan Pfeiffer

Nachgelegt zu meinem gestrigen Lesezeichen zum Internet Explorer, der noch immer auf vielen Rechnern auch in Unternehmen installiert ist. Doch eine andere Gefahr könnte viel größer sein. Meine Empfehlung bleibt allerdings gleich: Unterstützt und nutzt Firefox.

Wichtiger, lesenswerter Kommentar von Herbert Braun auf heise online zur Dominanz von Chrome angesichts der wohl mehr als Gerüchte, dass Microsoft Chromium in seinem neuen Browser nutzen will.

Mit einer Chromium-Dominanz jenseits der 90 Prozent steuert das Web auf eine Monokultur zu. Wenn Sie das nicht schlimm finden, denken Sie an die beiden Produkte, die bisher als einzige solche Marktanteile verzeichnen konnten: Internet Explorer und der Flash Player, die beiden meistgehassten Web-Clients. Die Erfahrung hat gezeigt, dass sich das Web am besten entwickelt, wenn mehrere gleichstarke Kräfte in einer Mischung aus Kooperation und Konkurrenz daran arbeiten. Diese Mischung ist jetzt endgültig aus der Balance geraten. Mit Android, der Suchmaschine und YouTube dominiert Google für meinen Geschmack bereits mehr als genug Märkte. Werden wir uns eines Tages den Internet Explorer als Gegengewicht zu Chromium zurückwünschen?

Nein, natürlich nicht. Aber um so wichtiger wird es, dass Mozilla stark und innovativ bleibt. Denn Firefox ist jetzt das gallische Dorf im Chromium-Imperium.

über Kommentar: Ohne Edge steht nur noch Firefox gegen die Chromium-Dominanz | heise online

Deshalb – wie schon öfters – die Aufforderung Firefox zum Surfen im Netz zu verwenden. Ich mache das schon sehr lange Zeit und bin gerade auch mit den neuen Versionen zufrieden.

Leezeichen zum Thema:

(Stefan Pfeiffer)

Mehr als ein Lesezeichen: Alles hat ein Ende – nur der Microsoft Internet Explorer nicht? Doch!

6. Dezember 2018 Posted by Stefan Pfeiffer

Wer ein wenig technisch interessiert ist und sich unter dieser Perspektive mit World Wide Web befasst, der sollte den Kommentar von Claudia Rülke auf heise online zum Gespenst Microsoft Internet Explorer lesen. Noch immer setzen ihn 9 Prozent ein, so zitiert der Bericht Statcounter.  Für alle anderen – die nicht zum IE gezwungen werden – gilt die Empfehlung, einen anderen Browser zu installieren und zwar schnellstens! Am besten Firefox als Open Source-Alternative unterstützen! Firefox wurde ja gerade auch grundlegend modernisiert und bietet interessante Datenschutz-Features und AddOns!

Falls Sie noch zu den Nutzern des Internet Explorers gehören und dazu gezwungen werden: Mein Beileid, ich fühle mit Ihnen.

Falls Sie Explorer-Nutzer aus Leidenschaft sind: Tun Sie Ihren Unmut kund, schimpfen Sie ruhig auf mich, das ist schon in Ordnung. Aber tun Sie mir einen Gefallen: Installieren Sie sich einen Browser.

über Kommentar zum Internet Explorer: Ein Gespenst geht um im World Wide Web | heise online

Und zur Information:

Auf den IE gekommen sind momentan noch Nutzer des Windows Betriebssystems Windows 8.1 und 7. Laut dem Plan zum Lebenszyklus von Windows (Version Oktober 2018) läuft der erweiterte Support für Windows 7 am 14. Januar 2020 und der für Windows 8 am 10. Januar 2023 endgültig ab. Dann sollte schon aus Sicherheitsgründen auch der letzte IE in die ewigen Jagdgründe eingehen.

über Kommentar zum Internet Explorer: Ein Gespenst geht um im World Wide Web | heise online

 (Stefan Pfeiffer)

Datenschutz: Nicht nur Facebook im Firefox Browser mit Add On separieren!

30. März 2018 Posted by Stefan Pfeiffer

Ich bin und werde ein immer größerer Verfechter von Open Source-Lösungen und das Thema Datenschutz und Datenhoheit treibt mich ja auch schon eine ganze Weile um. Da habe ich natürlich mit großem Interesse die Meldungen über Facebook Container gelesen. Nicht nur der Spiegel berichtet darüber, dass Mozilla einen gesicherten „Facebook-Container“ für den Firefox-Browser veröffentlicht.

Mozilla selbst schreibt:

Facebook verfügt daher über ein Netzwerk von Tracking-Tools auf verschiedenen Webseiten. Deren Code verfolgt Sie unsichtbar und es ist dadurch fast unmöglich, nachzuvollziehen, wann die so gesammelten Daten mit anderen geteilt werden.

Der Facebook Container isoliert Ihre Facebook-Identität vom Rest Ihrer Internetaktivitäten. Nach der Installation können Sie Facebook weiterhin ganz normal nutzen und auch Facebook kann umgekehrt seine Dienste wie gewohnt für Sie bereitstellen und Ihnen Werbung anzeigen. Der wesentliche Unterschied besteht darin, dass es für Facebook deutlich schwieriger wird, Ihre gesammelten Aktivitäten außerhalb von Facebook zu nutzen, um Ihnen Anzeigen und andere personalisierte Nachrichten zu senden.

via Mit unserem neuen Add-On „Facebook Container“ surfen Sie offen und vernetzt – nach Ihren eigenen Regeln – Mozilla Presse-Center

Klingt gut. Macht Sinn. Ich nutze eh Firefox auf meinem Mac, leider noch nicht auf meinem iPhone. Ist Open Source. Und dann lade ich Depp das falsche AddOn runter: die Firefox Multi-Account ContainersErweiterung.

Add-ons-Verwaltung

Das Tool soll es ermöglichen, meine verschiedenen Online-Aktivitäten in separaten Boxen beziehungsweise eben Containern laufen zu lassen und geht damit über das Facebook Container-AddOn hinaus, das eben nur Facebook isoliert. Ich kann Privat- und Berufsleben trennen, Online Banking separieren und kein Container kennt die Cookies und Daten des anderen. Klingt toll.

Die weitergehende Lösung: Beliebige Programme und Arbeitsumgebungen separieren

„Eigentlich“ ist die Firefox Multi-Account ContainersErweiterung genau deshalb sinnvoller. Sie macht es mir wie beschrieben möglich, viele Datenkraken und Wirkungsfelder voneinander zu separieren. Aber leider hat das Tool einen Haken. Es ist das, was ich typisch Open Source Usability Paradox nennen würde. Das Tool tut es funktional, ist aber viel zu unfreundlich und unhandlich für Otto Normalverbraucher.

 

Facebook

Das hier war mein erster Multi-Container-Ansatz. Ich werde meine Container – falls ich das Tool weiter nutze und nicht nur Facebook aussperre – drastisch vereinfachen. Facebook bekommt bestimmt einen eigenen Container. Amazon auch (auch oder gerade weil ich dort weniger kaufen und weniger getrackt werden will). Eventuell packe ich noch Online Banking separat. Ob ich meine Arbeitsumgebung auf meinem BYOD-Gerät – ich nutze meinen privaten Mac auch für die Arbeit – in einen isolierten Container packe, werde ich noch prüfen und testen. Alle anderen Programme laufen in einem generellen Firefox Container. Mal schauen, ob sich das bewährt.

Leider lassen sich in der aktuellen Version 6.0.0 Multi-Container und Tabs nicht vernünftig sortieren oder gar einfach in eigenen Fenster isolieren. Auch scheinen die Tabs immer wieder neu zu laden, sobald man von einem Container in einen anderen wechselt. Sehr oft kommen in den Containern neuerliche Passwort-Abfragen, auch wenn „man“ dort schon bekannt sein dürfte.

steve-jobs-654485_1280-3200063688-1521370022667

Ein generelles Open Source-Problem: Funktioniert meistens, aber grottig zu bedienen

Simpliy wins hat Steve Jobs postuliert. Da fehlt bei dem Firefox Multi-Account Containers noch eine ganze Menge. Wie oben schon postuliert, erscheint es mir typisch Open Source: Klasse Idee, gutes Konzept, aber in der Usability nur für Freaks und eben nicht für die breite Masse der Anwender geeignet. Das muss sich nicht nur in diesem Add-On ändern, will man Open Source-Lösungen aus der Freak-Ecke raus und „alle“ erreichen. Das gilt für eine Unzahl von Produkten, die eben gerade am Endbenutzer dran sind.

Container separieren muss generelle Funktionalität von Firefox werden

Für mich sollten die Firefox Multi-Account Containers Bestandteil und neues Differenzierungsmerkmal von Firefox und kein AddOn sein. Die Funktionalität muss stark benutzerfreundlicher gestaltet, erwähnte Schwächen beseitigt werden. Wenn ich in diesem neuen Firefox mit integrierten Multi-Account Containern (anderer Name nötig) als Otto Normalverbraucher Facebook oder eine andere Datenkrake öffnen will, sollte die entsprechende Nachfrage kommen: „Willst Du dieses Programm in einem separierten und speziell geschützten Container laufen lassen, so dass Deine Daten geschützt sind?“ Längeren erläuternden Text kann man getrennt geben. Ist dann nicht nur gegen Datenkraken, sondern auch als Schutz bei Online-Bestellungen oder Banking geeignet.

Add-ons-Verwaltung

Das Facebook Container Add-On habe ich dann auch installiert, nach dem ich „Experddde“ es dann doch gefunden habe. Scheint wohl eine vereinfachte Untermenge der Multi-Container-Lösung zu sein. Es hat zuerst nicht zusammen mit den aktivierten Firefox Multi-Account Containers funktioniert, scheint es aber jetzt zu tun, nachdem ich die Multi-Account Container deaktiviert habe. Der Facebook-Container taucht dann als ein Container in der „Multi-Lösung“auf, Das Tool macht einen im positiven Sinne simplen Eindruck: Für den schon öfters zitierten Otto Normalverbraucher geeignet. Nochmals zur Sicherheit: Hier kann man es seinem Firefox hinzufügen.

Plädoyer für Mozilla, Firefox und Open Source

Und zum Abschluss auch nochmals ein ausdrückliches Plädoyer für Mozilla Firefox: Dahinter steht kein Konzern (Google mit Chrome), der von Werbeeinnahmen lebt. Dahinter steht kein Konzern dahinter, der das Betriebssystem monopolisiert hat und für Sicherheitslücken berüchtigt ist (Internet Explorer oder Microsoft Edge). Und Mozilla Org. lebt auch nicht vom Verkauf seiner Hardware und seines Ökosystems (Apple Safari). Wer Firefox und andere Lösungen entwickelt, warum ein freies Internet jenseits besagter Datenkraken wichtig ist, kann man hier auf der Mozilla-Seite nachlesen. Beide in diesem Beitrag vorgestellten Projekte kommen aus diesem „Open Source-Stall“. Von ähnlichen Lösungen für andere Browser habe ich bisher nichts gelesen, kann aber an mir besagtem „Online Deppen und Experdden“ liegen.

(Stefan Pfeiffer)

Das Notes 9.0 Browser Plug-In

28. Januar 2013 Posted by Stefan Gebhardt

Haben Sie schon einmal das Notes-9-Browser-PlugIn ausprobiert?

Wer sich Gedanken darüber macht, wie man auf den ressourcenintensiven Notes-Client zukünftig verzichten kann, der sollte sich diese Alternative einmal ansehen.


Die Strategie der IBM war vor noch nicht einmal zwei Jahren komplett auf den Notes-Client ausgerichtet.Es wurden immer wieder die über Widgets erweiterbaren Funktionalitäten hervorgehoben. Dies war zu einem Zeitpunkt, zu dem sich bereits viele gefragt haben, wer das noch wollte. Die IT-Welt tendierte zu immer mehr browserfähigen Anwendungen und nicht zu lokalen "Monstren". Auch diese Anforderung konnte Notes bedienen: X-Pages war das Mittel der Wahl. Mit einer einfachen Programmierumgebung sollte man anspruchsvolle Anwendungen auf Basis Domino erstellen, die sowohl im Notes-Client als auch im Browser laufen.


Bis heute hat sich X-Pages nach unserer Beobachtung noch nicht wirklich am Markt etabliert. Sicherlich entwickeln Firmen darunter und erstellen auch komplexere Anwendungen. So rechte Begeisterung können wir aber nicht beobachten. Und einfacher ist die Entwicklung auch nicht geworden. Dies bedeutet für die Unternehmen einen immensen Investitionsaufwand um bestehende Anwendungen webfähig zu machen - meist bei ähnlichem Funktionsumfang. Neuentwicklungen unter Domino sind sowieso rar geworden.


Nun kam im letzten Jahr die Ankündigung zu der "Social Edition" von Notes, die zuerst "Lotus Notes 8.5.4" hieß und nun als "IBM Notes 9" bald die Beta-Phase verlassen wird. In diesem Zug war auch vom Browser-Plug-In die Rede, quasi einem Notes-Client im Browser. Dieses Plug-In steht inzwischen zur Verfügung und zeigt aus unserer Sicht den Weg weg vom dicken Notes-Client auf. Im Gegensatz zur vorherigen X-Pages-Strategie eine 180°-Wendung: statt die einzelnen Anwendungen mit viel Aufwand webfähig zu machen, ist nun der ganze Client in einem Browser lauffähig. Somit können die Anwendungen wie gewohnt genutzt werden und es muss nicht Hand angelegt werden. Die Migrationskosten können vernachlässigt werden und keine alternative Plattform wird da im Vergleich mithalten können.


Sicherlich ersetzt das Plug-In keine native Webanwendung. Es hat aber durchaus das Zeug dazu, die ein oder andere Domino-Installation vor einer Ablösung durch ein Drittprodukt zu bewahren. Die Schnittstellen der nächsten Notes-Version zum neuen Zugpferd "IBM Connections" (nach Hoffnung der IBM zukünftig "die" Oberfläche, in der sich die Benutzer bewegen werden) werden einen weiteren Beitrag dazu leisten.


Das Plug-In kann sich jedermann im Rahmen der öffentlichen Beta von Notes 9 ansehen. Es installiert sich recht schnell über eine eigene Installationsroutine und läuft auf Firefox und Internet Explorer. Eine vorherige Installation eines Notes-Clients der Version 9 ist nicht nötig - auf unserer Testmaschine läuft ein altes Notes 7 und eben das Plug-In.


Nach dem ersten Start erfolgt die Konfiguration genau so wie man es von einem frisch installierten Notes-Client kennt (sogar das verstaubte NetBios-Protokoll steht als Auswahl bereit ;-) ).

Hat man die Konfiguration erfolgreich hinter sich gelassen, startet der Notes-Client wie gewohnt und fragt das Kennwort der Benutzer-ID ab:



Anschließend steht die bekannte (und beliebte) Kacheloberfläche bereit und die Kacheln können über den gewohnten Dialog auf die Oberfläche geholt werden:



Nach unseren bisherigen Tests lassen sich auch komplexere Anwendungen sehr gut nutzen. Lediglich die E-Mail-Kachel verweigert ihren Dienst und verweist darauf, dass diese Funktion nicht unterstützt wird. Dies ist aber sicherlich eher gewollt als ein technisches Problem - der Nutzer soll hier iNotes nutzen:

Stolperfalle: Ids bei clientseitigen Events

20. März 2012 Posted by airwolf89

Heute bin ich mal wieder über einen Fehler gestolpert, welchen ich schonmal begangen habe, und dadurch mal wieder viel Zeit verloren habe. Deshalb landets jetzt hier, in der Hoffnung dass ichs mir auch endlich mal merke =)

Ich hatte ein xp:div Element, welches eingebettet einen Text und ein Bild hatte. Mit einem onMouseover Event wollte ich die URL des zu verwendeten Bildes ändern. Leider reagierte das Element auf keinen MouseOver.

Dies kann man übrigens auf 2 Arten erreichen:

document.getElementById("#{id:zielElement}").src = "url_zum_bild.gif";

oder wenn man sich auf das aktuelle Element beziehen möchte, auf welchem das Event liegt:

try{
	if (thisEvent.originalTarget) {
		thisEvent.originalTarget.src = "btn_go_Hover.gif";
	} else {
		thisEvent.srcElement.src = "btn_go_Hover.gif";
	}
}catch(e){}

Die If-Abfrage hat den Hintergrund dass der Internet Explorer “srcElement” braucht und nicht auf originalTarget zugreifen kann.

Dass mein xp:div auf kein Event gehört hat lag einfach daran dass mein xp:div Element keine ID hatte.

MERKEN: Elemente mit einem clientseitgen Event brauchen IMMER eine ID!!

Btw: Wo wir gerade bei xp:div sind:

Mann sollte immer, wenn man nur ein einfaches div in der Seite braucht, xp:div verwenden. xp:panel hat zwar das gleiche Ergebnis, allerdings werden bei xp:panel noch ein paar Sachen im Hintergrund geladen die es ermöglichen eine Datasource anzubinden. Wenn man dies beachtet kann man noch ein paar Quäntchen Performance aus der Applikation herausholen. Besonders wenn man diese Elemente in einem xp:repeat loopt.


Einsortiert unter:Notes & XPages Tagged: Datasource, Dojo, Event, Firefox, ID, IE, Internet Explorer, mouseover, Notes, Performance, xp:div, xp:panel, xp:repeat, XPages

XPages: Header setzen

8. November 2011 Posted by airwolf89

Weil heute Dienstag ist gibt’s gleich noch einen kleinen Tipp hinterher.

Es gibt ja die Möglichkeit meta-header zu setzen. Um dies zu tun hat man 2 Möglichkeiten.
1. Über die Properties der XPage eine Ressource vom Typ metaData setzen (siehe Bild)
2. Im BeforeRenderResponse-Event ein paar Zeilen Code einfügen, welche in etwa so aussehen:

try {
   var response = facesContext.getExternalContext().getResponse();
   response.setHeader("Expires", -1);
   response.setHeader("Cache-Control", "no-cache");
   response.setHeader("IE=EmulateIE7", "X-UA-Compatible");
} catch (e) {}

Normalerweise würde man denken, wo man es setzt ist doch. Leider ist es das nicht…

Manche Header können nicht über die erste Variante gesetzt werden. Ich weiß nicht genau zu welchem Zeitpunkt er über die konfigurative Möglichkeit die Header einfügen möchte, auf jeden Fall sind sie schon da!

D.h. wenn ich beispielsweise einen Header IE=EmulateIE7 setzen möchte, wie in einem früheren Post von mir als Workaround beschrieben, dann sollte man das über Variante 2, also im BeforeRenderResponse lösen, da ansonsten vom Browser die Warnung angezeigt wird, dass dieser Header ignoriert wird weil der Doctype schon gesetzt wurde. Fügt man ihn im Event ein, so wird keine Meldung angezeigt.

Im übrigen, wer schnell mal nachschaut, ja, der Header steht trotzdem im Quellcode, er wird scheinbar nur ignoriert weil er zu spät gesetzt wurde.


XPages: Tippsammlung

18. Oktober 2011 Posted by airwolf89

Hallo,

hier mal eine kleine Ansammlung von Tipps welche meine Kollegen und ich uns im Laufe der Zeit notiert haben.

Attributbenennung im IE

Dojo scheint bei Attributselektoren (z.B. dojo.query()) im Internet Explorer Probleme zu haben, die richtigen Elemente zu finden, wenn ein Teilstring des Attributs ein reserviertes Wort (z.B. name oder id) enthält. Da Dojo wie jQuery als Selektor-Engine Sizzle einsetzt, kann dieses Phänomen auch bei jQuery auftreten!

Beispiel hierfür ist ein Input-Feld mit dem Namen „username“. Selektiert man dojo.query(‘input[id$="WFApprovalVFL"]‘) wird das username-Feld mitselektiert, obwohl es nicht auf WFApprovalVFL endet.

Selbiges gilt für Keynamen in JSON-Objekten.

Nich gerenderte Datasources werden dennoch computed

Wenn man in einem Custom Control eine Datasource verwendet, dann wird dessen Code IMMER ausgeführt, egal ob rendered=“false“ oder loaded=“false“. Der Code dazu wird immer ausgeführt. Dies kann zu schwer nachvollziehbaren Fehlern führen.

Des weiteren, wenn man mehrere Datasources in unterschiedlichen Custom Controls hat, welche auf das selbe Dokument zeigen, so werden alle diese Datasources gespeichert und ggf. mehrere Dokumente desselben Typs angelegt.
Um dieses Problem zu umgehen kann man in den Custom Controls entweder die Datasource auf der XPage direkt über den namen referenzieren, oder man übergibt die Datasource per Parameter an das Custom Control (compositeData). Da muss man allerdings manuell einen Typ auswählen, da Datasources nicht in der Liste auftauchen. Der Typ heißt: com.ibm.xsp.model.ModelDataSource

Prüfen ob ein Viewpanel kategorisiert ist

Gesetzt den Fall, das zu prüfende View Control auf der XPage heißt viewPanel1, liefert:

var model:com.ibm.xsp.model.domino.DominoViewDataModel = getComponent("viewPanel1").getDataModel();
return model.getCategoryIndentLevel();

den Wert 0, wenn die View kategorisiert ist, -1 wenn nicht.

Use case: Bei kategorisierten Views gehen die Inhalte der Kategoriespalte verloren, wenn die View umsortiert wird. Hiermit kann man prüfen, ob die View umsortiert ist und entsprechend die Anzeige wiederherstellen.

Umgehen des OnChange-Bugs im IE beim Klick auf eine CheckBoxGroup

Werden auf einer XPage oder Custom Control Radiobutton Groups oder Checkbox Groups verwendet, tritt im IE das Phänomen auf, dass beim Partial refresh die übergebenen Werte der Gruppe immer die Werte des vorangegangenen Requests sind. Dies tritt nur auf, wenn man auf das Label klickt, statt direkt auf die Box zu klicken. Grund hierfür ist, dass der IE den Partial refresh-Request abschickt, bevor auf der UI der neue Wert gesetzt wird.

rendered="#{javascript:context.getUserAgent().isIE()}"


Beispiel
:

Es gibt eine Checkbox-Gruppe mit den Optionen A, B, C, D. Beim onchange-Event wird ein Partial refresh auf ein anderes Panel ausgelöst, das abhängig von den gewählten Optionen Elemente ein- oder ausblendet. Klickt man auf das Label für die Option A, kommt kein gewählter Wert an. Klickt man anschließend auf das Label für die Option B, kommt der Wert A an. Klickt man anschließend auf das Label der Option C, kommen A und B an, usw.


Workaround
:

Im onclick-Eventhandler wird der Partial refresh beim oncomplete ein zweites Mal ausgeführt.

 <xp:this.onComplete>
<![CDATA[XSP.partialRefreshPost("#{id:refreshPanelID}");]]>
</xp:this.onComplete>

Obiger Workaround 1 wirkt nicht, wenn auf dem Eventhandler zusätzlich noch Aktionen bzw. Server Side Javascript ausgeführt werden soll. Dieser Code wird dann nur beim ersten partial refresh ausgeführt. Um diesen Eventhandler wieder gängig zu machen, muss man den Click-Event des Labels von seiner Standard-Aktion abhängen und selbst durchführen. Dies macht man in einem clientseitigen Scriptblock. Da aber die Checkbox selbst auch innerhalb des Labels liegt, muss man diese wiederum aus der eigenen Verarbeitung rausnehmen:

 <xp:scriptBlock id="scriptBlock1"
        rendered="#{javascript:context.getUserAgent().isIE()}">
        <xp:this.value><![CDATA[dojo.addOnLoad(function(){
    dojo.query("label",dojo.byId("#{id:checkBoxGroupID}")).forEach(function(el){        
        dojo.connect(el,"onclick",el,function(e){
            if (e.target.type != "checkbox") {
                e.preventDefault();
                dojo.query("input",this).forEach(function(el){
                    dojo.attr(el,"checked",!(dojo.attr(el,"checked")));
                });
            }    
        });
    });        
});]]></xp:this.value>
</xp:scriptBlock>

Ein weiterer Vorteil dieser Methode gegenüber Workaround 1 ist, dass kein zweiter Request nötig ist.

Validierung von zwei abhängigen Eingabefeldern

Bei der Validierung von zwei voneinander abhängigen Eingabefeldern muss der SubmittedValue des Feldes abgefragt werden, das validiert wird. Vergleicht man den Value des Feldes mit dem Value des zweiten Feldes, wird die Validierung nach dem ersten Fehlschlag nicht mehr ausgelöst und der Validierungsfehler bleibt bestehen.

Beispiel:

 <xp:inputText id="recipientNotesID"
   value="#{test.recipientNotesID}"
   disableClientSideValidation="true" required="true">
   <xp:this.validators>
      <xp:validateRequired message="Required value."></xp:validateRequired>
   </xp:this.validators>
</xp:inputText>
<xp:inputText id="recipientNotesPW"
   value="#{test.recipientNotesPW}"
   disableClientSideValidation="true" required="true">
   <xp:this.validators>
      <xp:validateExpression>
         <xp:this.expression><![CDATA[#{javascript:((getComponent("recipientNotesPW").getSubmittedValue()||"")!=(getComponent("recipientNotesID").getValue()||""))}]]>
         </xp:this.expression>
         <xp:this.message><![CDATA[#{javascript:"Values must not be equal."}]]></xp:this.message>
      </xp:validateExpression>
      <xp:validateRequired message="Required value."></xp:validateRequired>
   </xp:this.validators>
</xp:inputText>