Как вернуть имя файла, когда пользователь нажимает кнопку в Thymeleaf? - PullRequest
0 голосов
/ 02 июня 2019

Это грубый способ сделать это, НО я пытаюсь вставить этот атрибут модели «file» в PostMapping «getfile», чтобы, когда пользователь нажимает «Submit», он направлялся к файлу, связанному с этой кнопкой..

Я видел много веб-страниц, говорящих мне th: value вставит нужный текст в поле формы ... это не работает для меня.

В конце концов, я простопытается отправить пользователя в файл, по которому он щелкает.

Шаблон:

<table>

    <tr><th>File Name</th>
    </tr>

    <tr th:each="file : ${filedata}">

        <td>

            <form action="#" th:action="@{~/home/ebay/getfile}" method="post" th:object="${filetobind}">
<!--                               th:field maps to object       -->
                <input type="text" th:field="*{fileName}" th:value="#{file.fileName}" th:text="${file.fileName}"/>
                <input type="submit" value="Get" />
            </form>

        </td>

    </tr>
</table>

Контроллер:

@GetMapping(Mappings.FILES)
    public String getDirectory(Model model){

        model.addAttribute(AttributeNames.FILE_DATA, fileService.getDirectory());
        model.addAttribute(AttributeNames.FILE, new DirectoryFile());


        // debug
        System.out.println("#############################################################");
        for(DirectoryFile file : fileService.getDirectory()){

            System.out.println(file.getFilePath());
        }
        System.out.println("#############################################################");


        return ViewNames.DIRECTORY;
    }


    @PostMapping("getfile")
    public String getFile(Model model, @ModelAttribute(AttributeNames.FILE) DirectoryFile file ){


        System.out.println("Filepath:" + file.getFileName());

        //model.addAttribute(AttributeNames.FILE, file.getFileName().trim());

        return "data/" + file.getFileName();
    }

1 Ответ

0 голосов
/ 06 июня 2019

Давайте посмотрим на ваш ввод

<input type="text" th:field="*{fileName}" th:value="#{file.fileName}" th:text="${file.fileName}"/>

При отправке формы вы отправляете контроллеру значение вашего ввода в атрибуте «fileName» внутри вашего объекта «filetobind», это происходит из-за того, как вы определили th:field и форму th:object, и это хорошо.

Теперь для части th: value и почему она не работает для вас: синтаксис #{...} предназначен для экстернализации текстовых литералов в файлах, поэтому вы делаете свой HTML более «универсальным», цитируя документацию:

Экстернализующий текст извлекает фрагменты кода шаблона из файлы шаблонов, чтобы их можно было хранить в отдельных отдельных файлах (обычно файлы .properties) и что их легко заменить эквивалентными текстами, написанными на других языках (процесс называется интернационализация или просто i18n). Экстернализованные фрагменты текста обычно называются «сообщениями».

В сообщениях всегда есть ключ, который их идентифицирует, а Thymeleaf позволяет указать, что текст должен соответствовать конкретному сообщению с синтаксисом # {...}

Так, например, они хороши для меток, но не для входного содержимого (входных значений).

Теперь, поскольку это текстовый ввод, вы можете либо пропустить часть th:value и позволить пользователю заполнить ввод, либо вы можете присвоить ему значение с синтаксисом ${...}, который обращается к переменной, передаваемой из контроллера. , Цитируя документ:

Выражение $ {today} просто означает «получить переменную, вызванную сегодня», но эти выражения могут быть более сложными (например, $ {user.name} для «Получить переменную с именем user и вызвать ее метод getName ()».

Измените значение на th:value="${file.fileName}", и все будет в порядке (если вы предоставите переменную файла из контроллера).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...