#spring #model-view-controller
#весна #модель-вид-контроллер
Вопрос:
Я использую Spring 3.1 и tiles для разработки приложения MVC.
У меня есть страница JSP (header.jsp) и 2 контроллера (HomeController и SignupController).
Файл header.jsp выглядит следующим образом:
<s:url var="login_url" value="${loginUrl}" />
<s:url var="signup_url" value="${signUpFormUrl}" />
<a class="btn btn-primary" href="${login_url}">Login</a>
<a class="btn btn-default" href="${signup_url}">Signup</a>
The HomeController.java похоже на это (URL-адрес / login / form настроен для использования Spring security в качестве страницы входа):
@Controller
public class HomeController {
@RequestMapping({"/", "/home"})
public String showHomePage(final Map<String, Object> model) {
return "home";
}
@ModelAttribute("loginUrl")
public String getLoginUrl() {
return "/login/form";
}
......
}
The SignupController.java похоже на это:
@Controller
public class SignupController {
.....
@RequestMapping(value = "/signup/form")
public String signup(@ModelAttribute SignupForm signupForm) {
return "signup/form";
}
@ModelAttribute("signUpFormUrl")
public String getSignUpFormUrl() {
return "/signup/form";
}
.....
}
Странно то, что, как показано выше, я получил этот результат при рендеринге страницы:
<a class="btn btn-primary" href="/appContext/login/form">Login</a>
<a class="btn btn-default" href="">Signup</a>
Таким образом, в итоге получилось пустое значение href.
НО когда я переместил код контроллера регистрации, касающийся регистрации (RequestMapping и метода ModelAttribute), на домашний контроллер, он сработал, как ожидалось:
<a class="btn btn-primary" href="/appContext/login/form">Login</a>
<a class="btn btn-default" href="/appContext/signup/form">Signup</a>
Возможно ли использовать сопоставление запросов с другого контроллера внутри одного представления?
Может кто-нибудь имеет представление о том, что здесь происходит?
Заранее спасибо. Я могу предоставить что-либо другое (конфигурацию?), Необходимое для дальнейшего понимания проблемы.
Комментарии:
1. Нет, вы не можете. Существует единственный контроллер, обрабатывающий представление, и все свойства (атрибуты модели) должны присутствовать. Он не сканирует все контроллеры и не делает все
@ModelAttribute
доступными. Он просто сканирует текущий контроллер.2. Но вы можете использовать компонент ControllerAdvice для предоставления атрибутов модели и других функций всем контроллерам.
3. Большое спасибо, ребята! Два приведенных выше комментария в значительной степени решают мою «проблему». Я пытался избежать дублирования «волшебных строк» сопоставлений запросов в моем коде представления, предоставляя их значение через модель. Deinum напоминает мне, что это невозможно (это ясно с точки зрения MVC). Наконец, Мартин показывает мне, как сделать то же самое.