Страница по умолчанию в соответствии с условием в контроллере Spring

58
5

У меня есть контроллер вроде этого:

@Controller
@RequestMapping("/page")
public class PageController {

@RequestMapping(value = "", method = RequestMethod.GET)
public String index() {

if (condition) {
return "default_page";
}

// some logic
return "index";
}

@RequestMapping(value = "page2", method = RequestMethod.GET)
public String page2() {

if (condition) {
return "default_page";
}

// some logic
return "page2";
}

@RequestMapping(value = "/page3", method = RequestMethod.GET)
public String page3() {

if (condition) {
return "default_page";
}

// some logic
return "page3";
}
}

Как вы можете видеть, все методы начинаются с:

if (condition) {
return "default_page";
}

Есть ли простой способ (без дополнительных классов или аспектов) извлечь этот код и указать, что он должен быть выполнен для всех методов?

спросил(а) 2016-03-12T02:56:00+03:00 4 года, 7 месяцев назад
1
Решение
71

Невозможно сделать то, что вы хотели бы сделать, просто с аннотациями. Вам нужна логика перед методом контроллера. И есть два варианта: использовать аспекты и использовать перехватчик. Перехватчик в этом случае более уместен. Преимущества такого подхода, что другие методы контроллера ничего не знают о condition и остаются простыми и чистыми. Если вы решите изменить или удалить условие, вам не нужно ничего менять в других методах.

Добавить метод по умолчанию в контроллере:

@Controller
@RequestMapping("/page")
public class PageController {
....

@RequestMapping(value = "/defaultPage")
public String defaultPage() {
return "default_page";
}
}

Создайте новый класс перехватчика:

public class PageInterceptor implements HandlerInterceptor {

@Override
public boolean preHandle(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, Object o) throws Exception {

if(condition){
httpServletRequest.getRequestDispatcher("/page/default_page")
.forward(httpServletRequest, httpServletResponse);
}
return true;
}

@Override
public void postHandle(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
Object o, ModelAndView modelAndView) throws Exception {}

@Override
public void afterCompletion(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
Object o, Exception e) throws Exception {}
}

Зарегистрируйте перехватчик в конфигурации приложения. Если вы используете конфигурацию xml файла, добавьте:

<bean id="pageInterceptor" class="PageInterceptor"/>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/page" />
<ref bean="pageInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>

Или если вы используете конфигурацию на основе Java:

@EnableWebMvc
@Configuration
public class AppConfig extends WebMvcConfigurerAdapter{

@Bean
public PageInterceptor pageInterceptor(){
return new PageInterceptor();
}

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MappedInterceptor(new String[]{"/page"}, pageInterceptor()));
super.addInterceptors(registry);
}
}

Обратите внимание, что есть отображение на /page url, поскольку make interceptor работает только для PageController. Кроме того, вы можете зарегистрировать и использовать этот перехватчик для других контроллеров после небольшого изменения кода.

ответил(а) 2016-03-12T08:07:00+03:00 4 года, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема