Как Spring MVC решает конфликт между homecontroller и jsp? - PullRequest
0 голосов
/ 28 января 2019

Я конвертирую приложение 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 ]

0 голосов
/ 28 января 2019

@RestController не используется для возврата обработанных JSP с.Вот почему 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.Чтобы понять это правильно, эта статья , которую я только что нашел, может помочь!

0 голосов
/ 28 января 2019

В среде 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...