Не удается вернуть HTML-представление в Spring MVC

Вопрос: Моя первая попытка использовать Spring и я столкнулась с проблемой. Кажется, я не могу вернуть простой HTML файл в виде представления внутри контроллера. Я пытаюсь вернуть файл index.html (у него есть только текст и кнопка), потому что он отображается правильно при переходе на localhost:8080/. Проект был сгенерирован с использованием IntelliJ, я полагаю, что упомянул

Вопрос:

Моя первая попытка использовать Spring и я столкнулась с проблемой. Кажется, я не могу вернуть простой HTML файл в виде представления внутри контроллера. Я пытаюсь вернуть файл index.html (у него есть только текст и кнопка), потому что он отображается правильно при переходе на localhost:8080/.

Проект был сгенерирован с использованием IntelliJ, я полагаю, что упомянул об этом, так как он обрабатывал большую часть конфигурации.

Здесь файловая структура:

app: | src | main | java | com.my.testapp | Main.java | controllers | TestController.java | resources | static | index.html

Вот мои файлы:

Main.java

@SpringBootApplication public class Main { public static void main(String[] args) { SpringApplication.run(Main.class, args); } }

TestController.java (фактически работает первый контроллер)

@RequestMapping(«/test») @Controller public class TestController { @RequestMapping(method = RequestMethod.GET, value = «/testget») public @ResponseBody ArrayList<Test> foo() { ArrayList<Test> tests = new ArrayList<>(); tests.add(new Test(«id1», «pass1»)); tests.add(new Test(«id2», «pass2»)); return tests; } @RequestMapping(method = RequestMethod.GET, value = «/someview») public String showView() { return «index»; } }

И, наконец, pom.xml:

<?xml version=»1.0″ encoding=»UTF-8″?> <project xmlns=»http://maven.apache.org/POM/4.0.0″ xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance» xsi:schemaLocation=»http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd»> <modelVersion>4.0.0</modelVersion> <groupId>com.my</groupId> <artifactId>testapp</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springtest</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> <relativePath/> <!— lookup parent from repository —> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <addResources>true</addResources> </configuration> </plugin> </plugins> </build> </project>

Ранее я использовал аннотацию @RestController, и контроллер просто вернул индекс строки, но теперь я получаю страницу 404 (страница ошибок Whitelabel). Я знаю, что это распространенная проблема, но я не смог ее решить, используя решение других людей.

EDIT: Хорошо, мне удалось исправить ее часть, удалив строку @RequestMapping(«/test»), но теперь мне нужно передать представление как “index.html”, а не просто “index”. Есть ли способ пропустить.html? В настоящее время он не работает без него.

РЕДАКТИРОВАТЬ № 2: Я, наконец, понял, как правильно просматривать представления, проверьте мой ответ ниже.

Лучший ответ:

После многих бесполезных поисков Google, двух добрых индийских парней, объясняющих материал на YouTube и нескольких белых волосков, я наконец получил приложение, работающее должным образом. Здесь все, что я узнал:

Файловая структура

Структура, которую я опубликовал в моем вопросе, верна, не нужно ничего менять. Представления HTML могут находиться в разделе src/main/resources/static.

Возврат HTML-представлений с использованием контроллеров

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

@Controller public class TestController { @RequestMapping(value = «/someview») public String showView() { return «index»; } }

Вы можете добавить/нанести больше URL-адресов на этот контроллер, изменив аннотацию на

@RequestMapping(value = {«/someview», «/someotherview», «/onelastview»}).

Теперь я могу перейти на localhost:8080/someview и получить представление index.html (без фактического указания расширения файла в контроллере).

Дополнительная конфигурация

По умолчанию моя функция контроллера должна была вернуть «index.html» вместо «index». Решением для этого является добавление строки в application.properties. Этот файл находится (в моем случае) в папке resources.

Строка – spring.mvc.view.suffix=.html. Указывает тип просмотров. Вы также можете установить spring.mvc.view.prefix=/path/to/views, но я не знал, как его установить, и он работал в любом случае (я думаю, что он по умолчанию использует resources/static).

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

prefix + viewName + suffix, где viewName в моем случае является index (любая строка, возвращаемая в моем методе).

Main.java требовала дополнительной настройки, просто SpringApplication.run().

Ответ №1

Вам нужно определить компонент ViewResolver чтобы весна знала, где ваши взгляды

@Bean public ViewResolver internalResourceViewResolver() { InternalResourceViewResolver bean = new InternalResourceViewResolver(); bean.setViewClass(JstlView.class); bean.setPrefix(«/WEB-INF/view/»); bean.setSuffix(«.html»); return bean; } Ответ №2

Просто попробуйте «index.html» вместо «index» в операторе return вашего showView(). Дайте мне знать, если это сработает.

Оцените статью
Добавить комментарий