Как Spring MVC решает конфликт между homecontroller и jsp?

Я конвертирую приложение Spring MVC в Spring Boot. Приложение Spring имеет контроллер Home:

@RestController
public class HomeController {...
    ...
@RequestMapping("/login")
public String login(Principal p) {
    return "login";
    }
}

который должен просто отображать слово "логин". Однако это, похоже, игнорируется, так как у него также есть login.jsp в src/webapp/WEB-INF/views, который делает намного больше, и это то, что отображается при запуске.

Когда я вырезал и вставлял simple-web-app в приложение Boot, я просто получал слово "login".

Как Spring магически игнорирует слово "логин" для более сложного вывода jsp? И как мне имитировать это в Boot?

PS я попытался добавить:

<dependency> 
    <groupId>org.apache.tomcat.embed</groupId> 
    <artifactId>tomcat-embed-jasper</artifactId> 
    <scope>provided</scope> 
</dependency>

spring.mvc.view.prefix=/views/ 
spring.mvc.view.suffix=.jsp

2 ответа

Решение

@RestController не используется для возврата к просмотру JSPs. Вот почему Spring Boot просто отвечает строкой login, Попробуйте изменить это следующим образом:

@Controller
public class HomeController {

    @RequestMapping("/login")
    public String login(Principal p) {
        //do something with your Principal if you want...
        return "login";
    }
}

Если вы все настроили правильно, Spring будет искать шаблон под названием login (ваш JSP) и используйте это как представление.

@RestController является аннотацией Spring, используемой для создания веб-службы RESTful (конечная точка Rest-API, определенная в контроллере)

Кстати, здесь вы можете найти дополнительную информацию о том, как действовать, а также, к сожалению, некоторые причины не использовать JSP с Spring Boot и встроенными контейнерами, а использовать другой движок шаблонов.

Надеюсь это поможет!

РЕДАКТИРОВАТЬ: Другой ответ на этот вопрос упоминает решатели представления - это действительно не важно! Но это особый случай с Spring Boot и JSP. Чтобы понять это правильно, эта статья, которую я только что нашел, может помочь!

В среде Spring, если вы хотите записать строку в тело ответа, вы будете использовать ключевое слово @ResponseBody, Из документации

@ResponseBody аннотации и, следовательно, пишет непосредственно в тело ответа в зависимости от разрешения представления и рендеринга с помощью шаблона HTML.

Или, в вашем случае, @RestController аннотация это

Удобная аннотация, которая сама аннотируется с помощью @Controller и @ResponseBody.

Если вы не используете это ключевое слово, Spring выполнит поиск файла с указанным путем. Для этого он использует viewResolver, Смотрите 16.5 просмотров и их разрешение

Вот пример, где вы можете увидеть свойство, которое позволяет Spring разрешать реальный путь к вашему файлу:

<bean id="viewResolver"
      class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>
Другие вопросы по тегам