2010-12-07 3 views
4

Я использую IDE NetBeans, и в настоящее время я использую сервер GlassFish. Что я хочу сделать, это напишите файл.Java Servlets - Запись в файл

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

File outputFile = new File(getServletContext().getRealPath("/") 
      + "TheFile.txt"); 
    FileWriter fout = new FileWriter(outputFile); 
    fout.write("The Content"); 
    fout.close(); 

Это структура моего проекта:

alt text

Также будет ли размещен файл?


Edit: Я забыл упомянуть, есть некоторые другие папки ниже тех, на картинке: Тестовые пакеты, библиотеки, Тестовые библиотеки и файлы конфигурации. Однако я не думаю, что файл будет размещен там.

Редактировать (новое): Я выяснил, что файл хранится в папке/build/web, но это не отображается в Netbeans. Даже после того, как я перезапустил его.

+0

`Что я хочу сделать, это записать в файл. '. Напишите ** что ** точно? Чего вы хотите достичь? – 2010-12-07 16:19:52

+0

То, что я на самом деле хочу написать, это .html-файл. Я пытаюсь дать кому-то возможность обновить уже существующую страницу, например index.html. Поэтому, когда кто-то пытается, код должен быть выполнен. – whirlwin 2010-12-07 16:25:12

ответ

4

Как вы закодировали, файл будет размещен в общедоступном сетевом корне. Вот на что указывает getRealPath("/"). Если быть точным, это папка с именем Веб-страницы как на вашем скриншоте. В качестве упражнения сделайте следующее, чтобы понять абсолютный путь, чтобы его можно найти в проводнике ОС.

System.out.println(file.getAbsolutePath()); 

Я не делаю Netbeans, но, вероятно, вам необходимо обновить папку в IDE после записи файла, чтобы он появился в списке в IDE. Щелкните папку и нажмите F5. Это, по крайней мере, верно для Eclipse.

При этом этот подход не рекомендуется. Это не будет работать, если сервлетконтейнер не настроен на расширение WAR на диске. Даже когда это произойдет, вы потеряете все новые файлы и изменения в существующих файлах, когда WAR будет перераспределен. Его нельзя использовать в качестве постоянного хранилища. Скорее сохраните его на фиксированном пути за пределами webapp или в базе данных (что предпочтительнее, поскольку вы, похоже, хотите изобрести CMS).

+0

Спасибо! Я понял, где он был помещен, и теперь он работает так, как я планировал. Кроме того, спасибо за дополнительную информацию о хранении. – whirlwin 2010-12-07 17:32:09

2

См. Документацию по адресу getRealPath. Он возвращает вам местоположение на диске для чего-то, указанного URL.

Я предполагаю, что ваш файл находится в корне вашего веб-приложения на диске в Glassfish (где извлекается WAR-файл). Я не знаю достаточно о Glassfish, чтобы сказать, где это будет.

Также обратите внимание, что для создания имени файла используется конкатенация строк, поэтому, если вызов getRealPath не возвращает строку с «/» в конце, вы можете создать файл в родительском каталоге ваше веб-приложение. Возможно, лучше всего использовать объект File для родительского каталога при создании объекта File для фактического файла. Проверьте API файлов.

Я бы рекомендовал создать файл за пределами вашего веб-приложения. Если вы повторно развернете свой WAR-файл, вы можете удалить свой файл, который, вероятно, не тот, который вы хотите.

Быть в сервлете мало чем отличается от того, что вы хотите вывести файл. Просто следуйте стандартным API файлов в качестве отправной точки. Here's учебник.

4

Обратите внимание, что это никоим образом не гарантирует работу во всех веб-контейнерах или через перезагрузки и, скорее всего, будет перезаписана путем перераспределения.

Если вы хотите, чтобы ваш пользователь мог обновлять контент, вам нужно где-то сохранить новое содержимое и иметь сервлет или JSP-страницу, или facelet получить новое содержимое из резервного хранилища и отправить его на браузера.