Как 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
не используется для возврата к просмотру JSP
s. Вот почему 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>