无法更新绑定到bean的组件的值

时间:2010-11-27 12:05:54

标签: java jsf

我正在尝试使用JSF创建一个带有Web UI的套接字客户端。在此应用程序中,客户端连接到服务器,将消息发送到服务器,从服务器接收消息并将其显示在JSF页面上。

我设法连接到套接字服务器发送消息并接收消息。我无法在浏览器屏幕中显示来自服务器的消息。当我在控制台中打印时,它显示正确。

我的jsf代码是:

<f:view>
    <h:form binding="#{jsfSocketClient.form}">
        <a4j:keepAlive beanName="jsfSocketClient"/>
        <h:outputText binding="#{jsfSocketClient.outputMessageBinding}"/>
        <br/>
        <h:inputText value="#{jsfSocketClient.inputFromUser}"/>
        <br/>
        <h:commandButton action="#{jsfSocketClient.sendMessage}" value="Send"/>
    </h:form>
</f:view>

我的java代码是:

public HtmlForm getForm() {
    try {
        socket = new Socket("192.168.1.115", 4444);
        response = "Connection Success";
        outputMessageBinding.setValue("Connection Success");
        out = new PrintWriter(socket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    } catch (Exception e) {
        e.printStackTrace();
        response = "You must first start the server application (YourServer.java) at the command prompt.";
        outputMessageBinding.setValue(response);
    }
    return form;
}

public String sendMessage() {
    outputMessageBinding.setValue("");
    try {
        //String str = "Hello!\n";
        out.println(getInputFromUser());
        try {
            String line = in.readLine();
            outputMessageBinding.setValue(line);
            System.out.println("Text received :" + line);
        } catch (IOException e) {
            outputMessageBinding.setValue(e.getMessage());
            System.out.println("Read failed");
            System.exit(1);
        }
        //response = result.toString();

        if (getInputFromUser().equalsIgnoreCase("bye")) {
            socket.close();
        }
    } catch(Exception e) {
        outputMessageBinding.setValue(e.getMessage());
        e.printStackTrace();
    }
    return "";
}

当我加载jsf页面时,如果服务器已连接并且连接成功&#39;显示正确,如果未连接,则错误消息正确显示。当我尝试在屏幕上显示服务器消息时,它不会显示。我该如何解决这个问题?

更新 如果我创建新的outputtext组件并将来自服务器的消息设置为其值,则服务器消息将正确显示。我想知道为什么绑定在我的情况下不起作用?

1 个答案:

答案 0 :(得分:2)

从JSF /网页打开新套接字是一个主要的反模式。你为什么要这样做?

您是否了解所有影响/限制/风险/问题?

<强>更新

从网页创建套接字在性能和安全性方面有几个含义。

如果您只想练习Java套接字,最简单的方法是使用命令行客户端。 http://download.oracle.com/javase/tutorial/networking/sockets/clientServer.html

无需使用JSF或任何其他Web技术添加额外的复杂性。您可以拥有没有Web服务器的套接字。 (实际上套接字在http之前很久就存在了。)