Beans

 

Du kan godt lave XPages uden at bruge Java – ligesom du kan lave Notes Apps uden at bruge Lotus Script … Med andre ord: Lav alt din kode i Java Beans!

Der er 3 krav til en bean (Se også ‘what the heck is a bean?‘)

  1. Skal have en constructor uden parameter
  2. Skal være Serializable
  3. Properties skal kunne tilgåes med ‘getters’ og ‘setters’ med samme navn prefixed med get eller set

Recycle

Husk at recycle alle Notes objekter efter brug, eksempelvis:
doc.recycle();
view.recycle();

Debug

Beans kan nemmest debugges med ’XPages Debug Toolbar‘ som kan downloades fra OpenNTF. I din java kode kan du skrive
import com.debug.*;
DebugToolbar debug=new DebugToolbar();
debug.warn("my warning");
debug.info("some info");
debug.error("This is wrong", "!!");
Debug teksterne vil se således ud i toolbaren:
I toolbar basen kan du på demoPage.xsp siden se flere eksempler og dokumentation.

Skabelon

Vedlagt en bean skabelon som du kan bruge som udgangspunkt for dine egne bean. Simpelt eksempel der giver adgang til currentSession, currentDatabase samt Debug Toolbar: beanTemplate.java

Server Side Java Script

Du kan kalde din Java kode direkte fra SSJS på 3 måder:
  • Med importPackage
importPackage( majkilde.fw );
var config: DbConfig = new DbConfig();
config.getDatabaseUrl("LOG");
  • Direkte
var config = new majkilde.fw.DbConfig();
config.getDatabaseUrl("LOG");
  • Som en Managed Bean – her kan du både bruge SSJS og EL. Først skal kode registreres som en managed bean (se screenshot) – herefter kan den kaldes simpelt fra SSJS:
DbConfig.getDatabaseUrl("LOG");
faces-config.xml filen findes under WebContent\WEB-INF i Package Explorer

Links

XPages og performance

 

Paul Withers lavede et glimrende indlæg på Dannotes hvor han havde lavet performance målinger på XPages. Her et par af konklusionerne:

  • SSJS bliver fortolket af JVM, mens EL og Java (e.g. beans) bliver compileret til bytecode. Dette er en af grundene til at Java kode er hurtigere end SSJS
  • Hver Control bliver til en Java Class som eksekveres på serveren – spar derofr på antallet af controls hivs det er muligt. F.eks. er det bedre med ét computet fullname field fremfor 2 fields med fornavn og efternavn.
  • Persistence: På application properties kan man angive Persistence. Der er flere indstillingsmuligheder i xsp.properties filen (findes under WebContent\WEB-INF i Package Explorer). Her kan persistence sættes til None, hvilket kan give et performance boost. Ligeledes kan ‘Persist pages between request’ disables – hvilket gør siderne stateless (og hurtigere)
  • Brug ‘loaded’ fremfor ‘rendered’
  • Brug dataContexts – specielt ifm. med beregning af ‘rendered’ (se side 47 i slide og frem)
  • Partial refresh: hvis muligt, så sæt execMode=’partial’
  • Brug gerne variableResolvers

Links

Fonts

 

Med CSS @Font-Face selector kan du nemt indsætte andre fonte i din web page. På Google Web Fonts kan du finde mange flotte fonte. For at bruge en af dem i din XPage skal du gøre 2 ting:

  1. Benytte et google stylesheet – dette vil give dig den ønskede font
  2. I dit eget stylesheet kan du nu bruge fonten
Her vist et lille eksempel, der blot skriver ‘Hello World’ med en pæn Google font

 

Links

Extension Library Version

 

På server consollen kan du skrive nedenstående kommando for at få at vide hvilken version af Extension Library der er installeret på serveren:

tell http osgi ss com.ibm.xsp.extlib

Du kan evt. lave en knap på din toolbar med denne kommando:

@Command([AdminRemoteConsole])

så får du en hurtig genvej til server konsollen. Knappen findes som default på Developer Toolbaren

Du kan også få versionsnummeret via SSJS:

RichText felter

 

XPages benytter en CKEditor til RichText redigering. Med simpel kode kan du selv kontrollere menuen og dermed hvilken muligheder brugeren skal have, læs mere her: CKEditor in XPages eller brug XSnippet. Eksempel:

<xp:inputRichText value="#{document1.body}" id="body1" style="width:600px">
 <xp:this.dojoAttributes>
 <xp:dojoAttribute name="toolbar">
 <xp:this.value><![CDATA[#{javascript:var myToolbar = "[['Bold','Italic','Underline','Strike'],['TextColor','BGColor']]";
return myToolbar}]]></xp:this.value>
 </xp:dojoAttribute>
 </xp:this.dojoAttributes>
 </xp:inputRichText>

Hvis du skal vise RichText i en Repeat control (et view), så kan du benytte dette lille trick: Displaying mixed-type Rich Text in an XPages repeat control. Et Panel indsættes i Repeat Controllen og tildeles en datasource – herefter kan Body feltet inkluderes (og bliver renderet korrekt):

<xp:panel>
 <xp:this.data>
 <xp:dominoDocument var="entryDoc" formName="MainTopic"
 documentId="#{javascript:rowData.getUniversalID();}"
 ignoreRequestParams="true" action="editDocument">
 </xp:dominoDocument>
 </xp:this.data>

Med en Custom Converter kan du, on-the-fly, fjerne eks. FONT tags, SCRIPT tags eller andet uønsket html fra feltet inden det vises:

<xp:this.converter>
 <xp:customConverter>
 <xp:this.getAsObject><![CDATA[#{javascript:value}]]></xp:this.getAsObject>
 <xp:this.getAsString><![CDATA[#{javascript:
 try{
 var html=value.toString();
 html=html.replace(/<(FONT|font)([ ]([a-zA-Z]+)=(\"|')[^\"\\']+(\"|'))*[^>]+>/g,"")
 html=html.replace(/(<\/FONT>|<\/font>)/g,"")
 return html;
 }catch(e){
 print (e);
 }}]]>
 </xp:this.getAsString>
 </xp:customConverter>
 </xp:this.converter>

 Per Lausten har lavet ovenstående eksempel som også findes på OpenNTF

Attachments

Dynamic Views

 

Dynamic Views er en component i Extension Library – gør det muligt at lave én XPages som herefter kan bruges til at vise alle views i din database!

I teorien skal componenten blot indsættes på din XPage – men der er lige et par småting der skal gøres:

  • Data source: viewName skal beregnes. På links i din navigator (hvor view vælges) sættes en querystring variable med navnet på viewet. Data Source på DynamicView controllen kan herefter læse denne og åbne det korrekte view.
  • Collapse All: Data source, expandLevel = 1
  • Pager: Indsæt blot en Core Custom Control Pager
  • CustomizerBean: DynamicView kontrollen har en række ‘fejl’ – f.eks. åbnes alle dokumenter i Edit mode. Dette kan dog rettes ved at bruge en CustomizerBean som vist nedenfor. Andre fejl må rettes direkte i viewet – eller ved at udbygge CustomizerBean’en som gjort på frostillic.us.
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import com.ibm.xsp.extlib.builder.ControlBuilder.IControl;
import com.ibm.xsp.extlib.component.dynamicview.DominoDynamicColumnBuilder.DominoViewCustomizer;
import com.ibm.xsp.extlib.component.dynamicview.UIDynamicViewPanel.DynamicColumn;
import com.ibm.xsp.extlib.component.dynamicview.ViewDesign.ColumnDef;
public class customizer extends DominoViewCustomizer{
 @Override
 public void afterCreateColumn(FacesContext context, int index,
 ColumnDef colDef, IControl column) {
 //Create a variable for the current component
 UIComponent columnComponent = column.getComponent();
 //Create a reference to the column and set the links to open in read mode
 DynamicColumn dynamicColumn = (DynamicColumn) columnComponent;
 //To have every view open the selected documents in read mode add the following
 dynamicColumn.setOpenDocAsReadonly(true);
 super.afterCreateColumn(context, index, colDef, column);
 }
}

Extension Library

 

Med Extension Library får du rigtigt meget kode foræret. Extension Library kan downloades fra OpenNTF eller installeres om en del af Upgrade Pack 1 fra IBM.

Vil varmt anbefale at benytte Upgrade Pack af 2 årsager:

  • Lettere at installere og opgradere
  • Supporteret af IBM

Upgrade Pack skal installere både på serveren og på din Developer PC. Hvis i skal køre XPiNC (XPages in the Notes Client), så skal der installeres på alle PC’ere. Til gengæld bliver det meget nemmere at udvikle nye apps, så det er besværet værd – og pakken udvides hele tiden med nye components.

Du skal også downloade en version fra OpenNTF for at få sample databasen: XPagesExt.nsf (som er en del af pakken). Samme sted finder du ‘XPages-Doc.zip’ som indeholder ‘The XPages Extension Library API documentation’

Dokumentationen skal købes seperat fra IBM Press: XPages Extension Library: A Step-by-Step Guide to the Next Generation of XPages Components. Gør det hellere med det samme – du får brug for den ;-)

Endnu ikke overbevist? Så se denne præsentation: Create an app in 1 hour (almost) with XPages Extension Library

XAgent

 

XAgent’s er en metode til at lave SSJS agenter med XPages. Fordel: De performaner langt bedre end alm. Notes agenter!

De er nemme at lave:

  1. Opret en ny XPage
  2. Sæt rendered = False
  3. Indsæt nedenstående kode i afterRenderResponse event:

var externalContext = facesContext.getExternalContext();

var writer = facesContext.getResponseWriter();
var response = externalContext.getResponse();
 
// set content type, e.g. ...
response.setContentType("text/xml");
// response.setContentType("application/json");
response.setHeader("Cache-Control", "no-cache");
 
// read parameters, e.g. ...
var param = context.getUrlParameter("myParam");
 
// write HTML output e.g. ...
writer.write("<br></br>");
// writer.write("{'jsonvar'='jsonvalue'}");
writer.endDocument();

 

Ligger også som en Snippet på OpenNTF