又是我了)我有另一个问题。我想从web加载文件(例如-txt)。 我尝试使用托管bean中的下一个代码:
public void run()
{
try
{
URL url = new URL(this.filename);
URLConnection connection = url.openConnection();
bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
if (bufferedReader == null)
{
return;
}
String str = bufferedReader.readLine();
while (bufferedReader.readLine() != null)
{
System.out.println("---- " + bufferedReader.readLine());
}
}
catch(MalformedURLException mue)
{
System.out.println("MalformedURLException in run() method");
mue.printStackTrace();
}
catch(IOException ioe)
{
System.out.println("IOException in run() method");
ioe.printStackTrace();
}
finally
{
try
{
bufferedReader.close();
}
catch(IOException ioe)
{
System.out.println("UOException wile closing BufferedReader");
ioe.printStackTrace();
}
}
}
public String doFileUpdate()
{
String str = FacesContext.getCurrentInstance().getExternalContext().getRequestServletPath();
System.out.println("111111111111111111111 str = " + str);
str = "http://narod.ru/disk/20957166000/test.txt.html";//"http://localhost:8080/sfront/files/test.html";
System.out.println("222222222222222222222 str = " + str);
FileUpdater fileUpdater = new FileUpdater(str);
fileUpdater.run();
return null;
}
但BufferedReader返回当前页面的html代码,我试图调用托管bean的方法。 这是非常奇怪的事情 - 我用Google搜索,没有人遇到过这个问题。
也许我做错了,也许我们有一种最简单的方法将文件加载到不使用net API的web(jsf)应用程序中。有什么想法吗?
非常感谢您的帮助!
更新:
也许一些jsf代码会很有用:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:fc="http://www.fusioncharts.com"
xmlns:t="http://myfaces.apache.org/tomahawk"
template="template.xhtml">
<ui:define name="title">Add company page</ui:define>
<ui:define name="content">
<h:form id="addCompanyForm">
<h:outputText value="Add a new company"/><br/><br/><br/>
<div style="width: 400px;">
<table width="100%" cellpadding="0" cellspacing="0">
<tr>
<td width="1">
Company name:
</td>
<td>
<h:inputText id="companyName" value="#{companyBean.companyName}" style="width: 100%;" required="true" />
</td>
</tr>
<tr>
<td valign="top" nowrap="nowrap">
Company description: 
</td>
<td>
<h:inputTextarea value="#{companyBean.companyDescription}" style="width: 100%;"/>
</td>
</tr>
</table><br/>
<center>
<h:commandButton value="Save company" action="#{companyBean.doInsertCompany}" style="width: 40%;"/>  
<a4j:commandButton ajaxSingle="true" value="Clear" actionListener="#{companyBean.doClear}" style="width: 40%;" reRender="addCompanyForm"/>
</center>
<br/><br/><br/>
<h:commandLink value="Return to companies page" action="companies" immediate="true" />
</div>
</h:form>
<h:form>
<br/>
<h:commandButton value="File Update" action="#{companyBean.doFileUpdate}" style="width: 10%;"/>  
</h:form>
</ui:define>
</ui:composition>
更新2 :我从网络(不是localhost)获取另一个文件 - 一切正常!抱歉为此疯狂)))
正如BalusC所说,我的应用程序只是没有通过网址查找文件:http://localhost:8080/sfront/files/test.txt。
我不知道为什么我不能使用本地文件。
有什么想法吗?
答案 0 :(得分:1)
如果您确实希望在JSF页面中包含此内容,那么我建议您使用JSTL c:import
。
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
...
<c:import url="http://narod.ru/disk/20957166000/test.txt.html" />
更容易。但这只适用于在JSP上使用JSF的情况。这不适用于Facelets上的JSF,并且(不幸的是)它也不提供simliar设施。
关于你的实际问题:我不知道,因为所描述的问题是在迄今发布的代码信息范围之外引起的,或者你没有运行你期望它运行的代码(重启webserver以确保Java代码的最新更改得到编译)。至少this.filename
返回的值不正确,我发现您自己的网页的网址已经过了评论。也许你改了这个但是hotdeploy失败了,或者在测试之前没有重启服务器。
此外,我发现您只是从BufferedReader
开始每隔一行打印并忽略每个第一个交替行。
while (bufferedReader.readLine() != null) // You're ignoring first line.
{
System.out.println("---- " + bufferedReader.readLine()); // You're only printing next line.
这不起作用。假设您希望将文件放在一个大的String
中,那么您应该按照以下惯用法正确使用BufferedReader#readLine()
:
BufferedReader reader = null;
StringBuider builder = new StringBuilder();
try {
reader = new BufferedReader(new InputStreamReader(someInputStream, "UTF-8"));
for (String line = null; (line = reader.readLine()) != null;) {
builder.append(line).append("\n"); // Append newline as well since readLine() eats them.
}
} finally {
if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {}
}
String content = builder.toString();