Как я могу загрузить текстовый файл из Интернета в свое приложение jsf?

Это снова я) У меня другая проблема. Я хочу загрузить файл (например, txt) из Интернета. Я попытался использовать следующий код в своем управляемом компоненте:

 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-код текущей страницы, где я пытаюсь вызвать метод управляемого компонента. Это очень странно - я гуглил, и ни у кого не было этой проблемы.

Может я что-то не так делаю, может есть самый простой способ загрузить файл в веб (jsf) приложение без использования сетевого API. Любые идеи?

Большое спасибо за помощь!

Обновление:

Возможно, какой-нибудь код 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:&#160;
                        </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%;"/>&#160;&#160;
                    <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%;"/>&#160;&#160;
        </h:form>
    </ui:define>
</ui:composition>

Обновление 2: я беру другой файл из Интернета (не с локального хоста) - и все работает нормально! Извините, что схожу с ума по этому поводу)))

Как сказал BalusC, мое приложение просто не нашло файл по URL-адресу: http://localhost:8080/sfront/files/test.txt.

Я не знаю, почему я не мог использовать локальные файлы.

Любые идеи?


person Elena    schedule 20.05.2010    source источник
comment
Вам нужно некоторое форматирование кода...   -  person mosg    schedule 20.05.2010
comment
Я отформатировал код. @Elena: пожалуйста, обратите внимание на правила форматирования в правом столбце при редактировании сообщения, а также используйте раздел предварительного просмотра внизу страницы, чтобы проверить, все ли выглядит хорошо.   -  person BalusC    schedule 20.05.2010
comment
Спасибо за помощь))) Какой код форматировал? В моем браузере (Опера 10.53) все выглядит хорошо. Для исходников делаю 4 пробела (даже больше). Не могли бы вы сказать мне, что было не так и как я могу это исправить?   -  person Elena    schedule 20.05.2010


Ответы (1)


Если вы действительно хотите включить это в свою страницу JSF, я предлагаю вам использовать JSTL c:import< /a> для этого.

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
...
<c:import url="http://narod.ru/disk/20957166000/test.txt.html" />

Намного легче. Однако это работает, только если вы используете JSF на JSP. Это не будет работать с JSF на Facelets, и он (к сожалению) также не предлагает подобных возможностей.

Что касается вашей фактической проблемы: я понятия не имею, поскольку описанная проблема вызвана выходом за рамки опубликованной информации о коде или вы не запустили код, который, как вы ожидаете, он запускал (перезапустите веб-сервер, чтобы убедиться, что последние изменения в Код Java компилируется). По крайней мере, this.filename вернул неверное значение, и я вижу, что вы закомментировали URL своей собственной веб-страницы. Возможно, вы изменили это, но горячее развертывание не удалось или сервер не был перезапущен перед тестированием.

Далее я вижу, что вы печатаете только каждую вторую строку из 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();
person BalusC    schedule 20.05.2010
comment
Привет, BalusC! Спасибо за быстрый ответ! Я попробую ваше предложение через несколько минут. Теперь я попытаюсь объяснить, что мне нужно - мне нужен метод, который будет получать URL-адрес некоторого файла (это может быть файл txt, xls, sql) в качестве параметра, и я хочу прочитать информацию в этом файле и обработать его позже . Но вместо информации в этом файле я получаю исходный код текущей страницы. - person Elena; 20.05.2010
comment
Да это я уже понял. Это просто означает, что URL-адрес неверен. Проверьте значение this.filename. Или перезагрузите сервер. - person BalusC; 20.05.2010