2
votes

Scenario

Lotus Domino form with a button that made an Ajax call to an Xpage, that do some stuff (read a properties file).

Framework: prototype.js

Button code:

var now = new Date()
var n = $H({
            ........
    now: now.getTime()      
});

var url = "/" + $F("path") + "/myxpages.xsp";
var myAjax = new Ajax.Request(
    url, 
{
    method: 'post', 
    parameters: n.toQueryString(), 
    onComplete: function(response) {

                      ajaxResult = response.responseText;
            }
}); 

Xpage

myxpages.xsp has this SSJS code on afterPageLoad event

 var request = facesContext.getExternalContext().getRequest();
 var response = facesContext.getExternalContext().getResponse();
 response.setHeader("Expires", -1);
 response.setHeader("Cache-Control", "no-cache");

 com.org.MyGetProperties.readProperties(request,response);

MyGetProperties class

This class is deployed in WebContent/WEB-INF/classes

public class MyGetProperties {

    static PrintWriter out = null;

    public static synchronized void readProperties(HttpServletRequest request, HttpServletResponse response) throws Exception {
        try {
                *(DO SOME STUFF HERE)*
                out = new PrintWriter(response.getWriter());

                // return result
                out.println("OK");

            } catch (Exception e) {..}
    }
}

Sometimes ajaxResult variable in ajax response call is empty, sometimes is "OK", as expected (seems to be something related to cache, but i think i've managed it correctly).

The behavior is different on different production server, i don't know if depends on server configurations.

Could be a PrintWriter problem?

1

1 Answers

2
votes

Short answer: don't. Long answer: use the Ajax control. You put that on your page and your URL changes to myxpages.xsp/nameyougavetheajaxcontrolproperty

This way you can be sure not to run foul of any cached result or pending operation. It also has a property where you can specify a Java class directly. That class extends (need to Google that - answered it on SO before) which gives you direct access to request/response

Update:

You need to tell that you are done:

facesContext.responseComplete();

See my original post on XAgents, the revision and some thought on testing.