Странное поведение, наблюдаемое с контроллером Spring 3.1

#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). Наконец, Мартин показывает мне, как сделать то же самое.