JSF页面未显示内容

时间:2013-12-28 21:07:55

标签: java jsf jsf-2

在系统中,用户可以输入“URL”,例如“http://www.google.com”,此URL必须在SERVER中处理,并在XHTML页面中显示内容后。

在我的XHTML中我有:

    <h:form id="formNavegador" enctype="multipart/form-data">
        <p:inputText value="#{navegadorMB.url}" required="true"
            requiredMessage="A url é obrigatória"
            type="Digite a url para navegar. Ex: http://www.google.com.br" />

        <h:outputText value="#{navegadorMB.htmlContent}" escape="false"
            id="htmlContent" />

        <p:commandButton id="commandButtonProcessar" value="Ir"
            update=":formNavegador:htmlContent" icon="ui-icon-play"
            actionListener="#{navegadorMB.processaRequisicao}" />


    </h:form>

因此,当用户键入URL并单击commandButton时,将处理以下代码:

public void processaRequisicao(ActionEvent event){
        if (url.isEmpty()){
            addErrorMessage("Você precisa digitar um endereço");
            FacesContext.getCurrentInstance().validationFailed();
        }else{
            htmlContent = boPadrao.processaRequisicaoOnServer(url);
            System.out.println(htmlContent);
        }
    }

在我的方法“processaRequisicaoOnServer”中,在返回网站内容后,将打开URL并读取所有内容。参见:

public String processaRequisicaoOnServer(String url) {
        URL urlObj;
        try {
            urlObj = new URL(url.trim().toLowerCase());
            BufferedReader conteudo = new BufferedReader(new InputStreamReader(urlObj.openStream()));
            String linha = "";
            StringBuffer sb = new StringBuffer();
            while((linha = conteudo.readLine()) != null)
            {
                sb.append(linha);

            } 

            return sb.toString();

        } catch (MalformedURLException e) {
            e.printStackTrace();
            throw new BOException(e.getMessage());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            throw new BOException(e.getMessage());
        }
    }

因此,由于“System.out ..”而在控制台中显示了URL的内容,但是h:outputText没有像我希望的那样更新。

2 个答案:

答案 0 :(得分:0)

我在这里看不到你的整个豆子,但这里有一些我注意到的事情:

如果这是您的整个表单,则不需要enctype="multipart/form-data",因此您可以将其删除。

您的第一个type中有一个奇怪的p:inputText属性。你的意思不是title

<p:inputText type="Digite a url para navegar. Ex: http://www.google.com.br" />

此外,当组件已经是此父组件的子组件时,您不需要指定组件的父组件,因此您可以更改此设置:

<p:commandButton id="commandButtonProcessar" value="Ir" update=":formNavegador:htmlContent" icon="ui-icon-play" actionListener="#{navegadorMB.processaRequisicao}" />

到此:

<p:commandButton id="commandButtonProcessar" value="Ir" update="htmlContent" icon="ui-icon-play" actionListener="#{navegadorMB.processaRequisicao}" />

你正在调用一个动作监听器并传递一个你不需要的ActionEvent,所以你可以改变它:

public void processaRequisicao(ActionEvent event) { ...

到此:

public void processaRequisicao() { ...

此外,为了对所有内容进行测试,您可以先进行步骤,首先创建模拟方法并检查事情是否正常,然后添加业务内容。

例如,要对此进行测试,您可以将processaRequisicao更改为:

public void processaRequisicaoMock() { 
    htmlContent = "Funcionou!";
}

然后调用它,并检查视图是否正常工作。如果是,您可以继续,添加业务层和所有。

我希望它有所帮助。

答案 1 :(得分:0)

而不是

 <p:commandButton id="commandButtonProcessar" value="Ir"
        update=":formNavegador:htmlContent" icon="ui-icon-play"
        actionListener="#{navegadorMB.processaRequisicao}" />

尝试

 <p:commandButton id="commandButtonProcessar" value="Ir"
        update="htmlContent" icon="ui-icon-play"
        actionListener="#{navegadorMB.processaRequisicao}" ajax="false"/>

此外,将您的方法更改为

public void processaRequisicao(){
    if (url.isEmpty()){
        addErrorMessage("Você precisa digitar um endereço");
        FacesContext.getCurrentInstance().validationFailed();
    }else{
        htmlContent = boPadrao.processaRequisicaoOnServer(url);
        System.out.println(htmlContent);
    }
}