1

I am developing a web application in java. But for certain purposes, I have to use javascript. I am facing an infinitive loop issue caused by I believe that very same javascript. I trigger the init method in java bean by clicking on the command link. This command link should open a new XHTML page. During init, I have to resolve the local IP address which I need for further implementation. I found javascript here on Stack Over Flow which will resolve that for me. After executing javascript I need to store that IP into some variable and pass it back to bean. I found a way of doing it by using <p:remoteCommand> which I trigger right from javascript itself. I managed to pass the variable to bean successfully, and use it for other functionality. At this point, I'm facing a problem, which I have no clue how to solve. After the script is executed successfully somehow the page is reloaded, and the init method is invoked again. So it basically creates an infinite loop.

Here is my init method in java bean:

public void init() {

        RequestContext.getCurrentInstance()
        .execute("getLocalIP();");
}

JavaScript for resolving local IP address:

 window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
    
    var pc = new RTCPeerConnection({
        iceServers : []
        }), noop = function() {};
    
    pc.createDataChannel('');
    pc.createOffer(pc.setLocalDescription.bind(pc), noop);
    pc.onicecandidate = function(ice) {
        if (ice && ice.candidate && ice.candidate.candidate) {
            var localIP = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}) 
                      {7})/.exec(ice.candidate.candidate)[1];
            console.log('my IP: ', localIP);
            
            // this will trigger the remoteCommand 
            // which will pass value from JS to java bean
            loadLocalIP([{name:'localIPParam', value: localIP}]);
            pc.onicecandidate = noop;
        }
    }

Here is my xhtml(remoteCommand) which is triggered from javascript:

 <h:form id="localIPForm">
        <p:remoteCommand name="loadLocalIP" action="#{aggregationStationController.loadData()}"/>
 </h:form>

This method is invoked by remoteCommand:

 public void loadData() {

    Map<String, String> params = FacesContext.getCurrentInstance()
                                             .getExternalContext()
                                             .getRequestParameterMap();
    ipValue = params.get("localIPParam").toString();

    System.out.println(ipValue);

    if (!ipValue.isEmpty()) {
        resolveAggregationStationByIP(ipValue);
    }
 // after this line init method is invoked again and creates an infinite loop
 }

 private void resolveAggregationStationByIP(String ipAddress) {

    aggregationStation = organizationStructureService.getOrgEntityByTypesAndAttrCodeAndAttrValue(
            Arrays.asList(OrgEntityTypeCode.AGGREGATION_STATION.getCode(), 
            OrgEntityTypeCode.PROD_LINE.getCode()), "IP", ipAddress);

    if (aggregationStation != null) {
        printerName = organizationStructureService.
                      getOrgEntityAttrValue(aggregationStation, "PRINTER_NAME");

        if (printerName == null) {
            printerName = "";
        }

        // check if there is order in progress for station
        selectedPackagingOrder = getInProgressOrderForStation();

        loadOperationTypes();

        populateDataFromDB();
    } else {
        error = true;
        errorMessage = MessageUtil.interpolate("ip_not_registred_as_station", ipAddress, 
                       MessageUtil.interpolate(OrgEntityTypeCode.AGGREGATION_STATION.getCode()));
    }
}

My question is: How to avoid javascript execution more than once?

I would appreciate any help I can get to sort this one out. Thanks in advance!

2
  • 1
    use actionListener instead of action Commented Mar 4, 2021 at 12:35
  • I tried with actionListener but it didn't solve the issue I am having. Thanks anyway. Commented Mar 8, 2021 at 12:13

1 Answer 1

1

Try and use event.preventDefault() to prevent the page refreshing.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.