websocket 如何从web socket消息中捎带请求参数,而无需手动构造数组?

fae0ux8s  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(111)

我有一个应用程序范围的bean,它将JSON对象推送到一个通道,如下所示:

<o:socket channel="controllerEventChannel" onmessage="function(message) {

                var controllerId = message.controllerId;
                var deviceId = message.deviceId;
                var companyKey = message.companyKey;

                onMessage([
                    { name: 'controllerId', value: controllerId },
                    { name: 'deviceId', value: deviceId },
                    { name: 'companyKey', value: companyKey }
                    ]);
        }"
        />

<p:remoteCommand name="onMessage" actionListener="#{controllerGroupDashboardBean.refreshListener()}"
                         update="MainForm:showList MainForm:equipmentView MainForm:mapEquipmentView"/>

但是我已经厌倦了重复自己,更愿意将一个json数组传递给通道,它可以直接传递给远程命令,如下所示:

<o:socket channel="controllerEventChannel" onmessage="function(message) {
                onMessage(message);
        }"
        />

<p:remoteCommand name="onMessage" actionListener="#{controllerGroupDashboardBean.refreshListener()}"
                         update="MainForm:showList MainForm:equipmentView MainForm:mapEquipmentView"/>

但是,这似乎不起作用。我像这样提取参数:

Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        
String companyKey = params.get("companyKey");
String controllerId = params.get("controllerId");
String deviceId = params.get("deviceId");

每个参数都解析为null,奇怪的是,Map似乎包含Map到“”的参数“undefined”(即空字符串)。
有人知道吗

w8biq8rn

w8biq8rn1#

我使用OmniFaces命令脚本来实现这一点,没有任何问题。
编辑:
要获取请求参数,请使用OmniFaces获得更整洁的代码:

String myParam = Faces.getRequestParameter("myJsonField", String.class);

编辑2:

<!-- When browser receive notification, this commandScript will be called -->
    <h:form id="myCommandScriptForm">
        <o:commandScript name="onNotification" actionListener="#{myBean.onNotification}" render="@none" />
    </h:form>

在socket中,类似这样:

<o:socket channel="my-channel" onmessage="function(notificationEvent) {onNotification(notificationEvent);}" />

在MyBean中,类似于:

Long entityId = Faces.getRequestParameter("entityId", Long.class);

如果你想更好,你可以从MyBean更新(注意我在XHTML中有render="@none”,这是因为我可以有条件地决定在bean中更新什么):

public void onNotification() {
    if (myList.contains(myEntity)) {
        PrimeFaces.current().ajax().update(":myWrapperJsfElement");
    }
}

相关问题