Сервлет не может вывести ключи HashMap в jsp: FileNotFoundException, класс утилит не может найти локальный файл после развертывания - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть TranslateServlet, который берет некоторый текст, создает экземпляр класса Cracker и вызывает метод getCrackedResult, который возвращает HashMap ключей и значений:

public class TranslateServlet extends HttpServlet {
    public static void main(String[] args) {
        Cracker cracker = new Cracker("German", "English");
        HashMap<String, ArrayList<Cracker.EntrySet<String, ArrayList<String>>>> crackedResults =
                cracker.getCrackedResult("Ich bin");

        for (String category: crackedResults.keySet())  {
            System.out.print(category);  //works fine
        }

    }


    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        Cracker cracker = new Cracker("German", "English");

        HashMap<String, ArrayList<Cracker.EntrySet<String, ArrayList<String>>>> crackedResults =
                cracker.getCrackedResult("Ich bin");

        for (String category: crackedResults.keySet())  {
                response.getWriter().print(category);  //doesn't work
        }

        response.getWriter().print("DONE");  //works fine
    }
}

Однако, хотя перебор по HashMap внутри метода main работает нормально, при попытке получить значения ключа с помощью метода doPost() я получаю только DONE в качестве вывода, и никаких других значений.Почему ??

РЕДАКТИРОВАТЬ: «Не работает» означает не выводить категории.Если основной метод выводит «Dog», «Cat», то на странице jsp выводятся только «Done», а не «Dog», «Cat», «Done».

Чего не хватает в моем вопросе?закрывать это?Спасибо также анонимному загрузчику.

РЕДАКТИРОВАТЬ : Я проверил журнал tomcat и каждый раз при вызове сервлета возникает ошибка java.io.FileNotFoundException: some_folder/some_file.bin.

Я понял, чтоФункция getCrackedResult использует локальный файл следующим образом:

InputStream inputPOS = new FileInputStream("some_folder/some_file.bin");

Я попытался переместить файл в WEB-INF и изменить путь к файлу:

InputStream inputPOS = new FileInputStream("WEB-INF/some_folder/some_file.bin");

Но я все еще получаюисключение: java.io.FileNotFoundException: WEB-INF/some_folder/some_file.bin.

Как мне поступить с файлом, чтобы класс Cracker, в частности его функция getCrackedResults, мог получить его после развертывания.Моя файловая структура выглядит так:

Project Root
------------src
---------------com
------------------util
----------------------Cracker.java
------------------web
---------------------TranslateServlet.java
------------target
------------------classes
-------------------------com
----------------------------util
--------------------------------Cracker.class
----------------------------web
-------------------------------TranslateServlet.class
------------imgs
------------some_folder
-----------------------some_file.bin
------------WEB-INF
-------------------classes
-------------------lib
-------------------some_folder
------------------------------some_file.bin (tried putting it here)

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Решение:

Пожалуйста, разверните (!) /WEB-INF/some_file/some.bin в правильном месте, затем вы можете получить доступ к FileInputStream из среды сервлета, например:

java.io.InputStream inS = /*httpRequest.get*/servletContext
    .getResourceAsStream("/WEB-INF/some_file/some.bin");

См .: ServletContext Javadoc (Java8)

0 голосов
/ 12 февраля 2019

На данный момент мне удалось исправить это с помощью

InputStream inputPOS = Cracker.class.getClassLoader().getResourceAsStream("some_folder/some_file.bin");

решения и , поместив some_folder/some_file.bin оба внутри

  1. Project Root/target/classes (чтобы код работал внутри IDE)

и

Project Root/WEB-INF/classes (чтобы код работал при развертывании на tomcat).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...