With the Optimized Partial Refresh you can do a lot of nice things: If only a part of the form is sent to the server, only this part of the components in the JSF component tree will be processed. This means that only submitted values are applied, coverted and validated, which can result in less server usage and a better performance.
Normally, if you have two required fields on you XPage and do a Partial Refresh, both fields will have a validation error:
But with this technique, you can choose which component should be refreshed. When clicking of Button Refresh 1, only the first field is marked as a required field:
When filling in the first field, but clicking on Refresh 2…
… the value of the first field gets lost, because it was not sent to the server (if a value was already stored there, it won’t get lost). And the second field is marked as required:
This is the example XPage, the CSJS code is moved to the Custom Control ccOptimizedPR.
<?xml version="1.0" encoding="UTF-8"?>
<xp:view
xmlns:xp="http://www.ibm.com/xsp/core"
xmlns:xc="http://www.ibm.com/xsp/custom">
<xc:ccOptimizedPR />
<xp:div id="refreshMe">
<xp:messages id="messagesError" />
<xp:inputText
id="inputText1"
value="#{sessionScope.inputText1}">
<xp:this.validators>
<xp:validateRequired message="Field 1 is empty!" />
</xp:this.validators>
</xp:inputText>
<xp:inputText
id="inputText2"
value="#{sessionScope.inputText2}">
<xp:this.validators>
<xp:validateRequired message="Field 2 is empty!" />
</xp:this.validators>
</xp:inputText>
</xp:div>
<xp:button
value="Normal Refresh"
id="buttonNormal">
<xp:eventHandler
event="onclick"
submit="true"
refreshMode="partial"
refreshId="refreshMe">
</xp:eventHandler>
</xp:button>
<xp:button
value="Refresh 1"
id="buttonCleaned1">
<xp:eventHandler
event="onclick"
submit="false">
<xp:this.script>
<![CDATA[
XSP.partialRefreshPost(
'#{id:refreshMe}',{
clearForm: true,
additionalFields: ['#{id:inputText1}' ]
}
);]]>
</xp:this.script>
</xp:eventHandler>
</xp:button>
<xp:button
value="Refresh 2"
id="buttonCleaned2">
<xp:eventHandler
event="onclick"
submit="false">
<xp:this.script>
<![CDATA[
XSP.partialRefreshPost(
'#{id:refreshMe}',{
clearForm: true,
additionalFields: ['#{id:inputText2}' ]
}
);]]>
</xp:this.script>
</xp:eventHandler>
</xp:button>
</xp:view>