【问题标题】:convert from scriptlet to JSF managed bean problem从 scriptlet 转换为 JSF 托管 bean 问题
【发布时间】:2011-05-16 01:37:40
【问题描述】:

我正在尝试将此 scriptlet code 转换为 JSF 类。

查看代码

<f:view>
<h:form binding="#{jsfSocketClient.form}">
    <h:outputText binding="#{jsfSocketClient.text}"/>

</h:form>
</f:view>

还有java代码

private HtmlForm form = new HtmlForm();
private HtmlOutputText text = new HtmlOutputText();

public HtmlForm getForm() 
{
    System.out.println("instance:  "+FacesContext.getCurrentInstance().getResponseWriter());
    ResponseWriter writer = (FacesContext.getCurrentInstance()).getResponseWriter();  
    try{

        int character;
        Socket socket = new Socket("127.0.0.1", 8765);

        InputStream inSocket = socket.getInputStream();
        OutputStream outSocket = socket.getOutputStream();

        String str = "Hello!\n";
        byte buffer[] = str.getBytes();
        outSocket.write(buffer);
        char characters = 0;
        while ((character = inSocket.read()) != -1) {
            text.setValue((char)character);
            //writer.write((char)character);
            //characters += (char)character;
        }
        //text.setValue(characters);
        if(str.equalsIgnoreCase("bye"))
                {
                    socket.close();
                }
    }
    catch(Exception e)
    {
        e.printStackTrace();
        text.setValue("You must first start the server application (YourServer.java) at the command prompt.");          
    }
    return form;
}

当我运行 scriptlet 代码时,我得到的答案是 “服务器收到了这个:你好!”

当我运行 JSF 代码时,我没有收到此回复。请纠正我的错误

提前致谢

【问题讨论】:

  • 你如何运行 jsf代码..?
  • 你得到了什么?
  • @tomas 像这样的一些未知角色ঠ
  • @mvg:这是因为您的 InputStream 处理代码错误。您不应该将每个字节直接转换为 char,因为某些特殊字符可能是两个字节长。此外,您将覆盖每个字节的文本值,因此最后,文本仅包含一个字节。检查@morja 答案,它是 InputStream 处理。
  • @Tomas 你发现了正确的问题。我没有正确处理输入流。除了尝试 morja 的代码之外,我还修改了问题中提供的代码。使用 Stringbuffer,我附加了输入值,并在循环之外将 Stringbuffer 设置为 HTMLOutputText。这也有效。

标签: java jsp jsf scriptlet


【解决方案1】:

我更正了我的答案。问题是输入流的处理。这是固定的代码:

    String response = "";
    try {

        Socket socket = new Socket("127.0.0.1", 8765);

        Reader reader = new InputStreamReader(socket.getInputStream());
        OutputStream outSocket = socket.getOutputStream();

        String str = "Hello!\n";
        byte buffer[] = str.getBytes();
        outSocket.write(buffer);

        CharArrayWriter result = new CharArrayWriter();
        char[] buf = new char[4096];
        int charsRead = 0;
        while ((charsRead = reader.read(buf)) != -1) {
            result.write(buf, 0, charsRead);
        }
        response = result.toString();

        if (str.equalsIgnoreCase("bye")) {
            socket.close();
        }
    } catch (Exception e) {
        e.printStackTrace();
        response = "You must first start the server application (YourServer.java) at the command prompt.";
    }
    text.setValue(response);

【讨论】:

  • 我认为主要问题实际上是输入套接字处理,其中他为每个字节设置值字段,并直接转换为字符。 @morja 代码以正确的方式处理 InputStream,所以我赞成这个答案。
  • 是的。我修复了代码(缓冲区/缓冲区)错误,感谢您的评论。
  • @morja 当我使用您更新的代码时,错误来自“InputStream 类型中的方法 read(byte[]) 不适用于参数 (char[])”。我调试了你以前的代码,它从服务器接收了一些输入,但只有空字符串作为输出返回
  • @mvg 是的,抱歉,我在代码中遗漏了另一件事,我将其更改为使用阅读器。
  • @morja 绑定不是问题
猜你喜欢
  • 2013-08-20
  • 2015-03-11
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 2023-03-05
  • 2016-07-05
  • 1970-01-01
相关资源
最近更新 更多