在系统中,用户可以输入“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没有像我希望的那样更新。
答案 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);
}
}