2015-07-01 14 views
8

Uczę się Spring-MVC 4 pochodzącego z asp.net MVC i szukałem sposobu na przekazanie danych do Widoku bez konieczności deklarowania Modelu Atragram w każdym wywołaniu.Dostęp do bieżącego modelu w spring-mvc

Na przykład teraz mam to.

public class BaseController { 
    public void AddMessage(Model model, String m) { 
     Model.addAttribute("msg", m); 
    } 
} 

public class PersonController extends BaseController{ 
     @RequestMapping("details/{Id}") 
     public String details(@PathVariable int Id, Model model) { 
      Person p = service.LoadById(Id); 

      if(p == null) { 
       AddMessage(model, "Record not found..."); 
      } else { 
       model.addAttribute("bean", q); 
      } 

      return "person/details"; 
     } 
} 

Ale to, co naprawdę chciałbym to mieć sposób na Acess to wystąpienie modelu w moim metod kontrolera bazowa bez konieczności przekazać ją jako argument. Podobne do użycia ViewData lub TempData w asp.net MVC.

Czy w ten sposób można przekazać dane do widoku?

Dziękuję

+0

co chcesz zrobić z modelem? –

Odpowiedz

1

Udało mi się obejść ten problem, używając przechwytywacza żądań. Zasadniczo:

Na mojej klasie kontrolera Base:

public abstract class BaseController { 

    protected List<UserViewMessage> viewMessages; 

    public List<UserViewMessage> getViewMessages() { 
     if (viewMessages == null) { 
      viewMessages = new ArrayList<UserViewMessage>(); 
     } 

     return viewMessages; 
    } 

    public void addMessage(String message, UserViewMessageType type) { 
     getViewMessages().add(new UserViewMessage(message, type)); 
    } 

    public void clearMessages() { 
     if (viewMessages != null) { 
      viewMessages.clear(); 
     } 
    } 
} 

Potem dodał przechwytujących, aby skopiować zbiór wiadomości modelu:

public class RequestInterceptor extends HandlerInterceptorAdapter { 

    private static String MODEL_MESSAGES_KEY = "ModelMessageList_"; 

    @Override 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 
      throws Exception { 

     if (handler instanceof org.springframework.web.method.HandlerMethod) { 

      HandlerMethod handlerMethod = (HandlerMethod) handler; 

      if (handlerMethod != null) { 
       Object bean = handlerMethod.getBean(); 

       if (bean != null && bean instanceof BaseController) { 

        BaseController bc = (BaseController) bean; 
        bc.clearMessages(); 
       } 
      } 
     } 

     return super.preHandle(request, response, handler); 
    } 

    @Override 
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, 
      ModelAndView modelAndView) throws Exception { 

     if (handler instanceof org.springframework.web.method.HandlerMethod) { 

      HandlerMethod handlerMethod = (HandlerMethod) handler; 

      if (handlerMethod != null && modelAndView != null) { 
       Object bean = handlerMethod.getBean(); 

       if (bean != null && bean instanceof BaseController) { 

        BaseController bc = (BaseController) bean; 

        if (bc.getViewMessages() != null) { 
         modelAndView.addObject(MODEL_MESSAGES_KEY, bc.getViewMessages()); 
        } 
       } 
      } 
     } 

     super.postHandle(request, response, handler, modelAndView); 
    } 
} 

który na PreHandle, podaje wszelkie wiadomości na temat kolekcja podstawowego kontrolera. Po życzenie (PostHandle) i od tego modelu jest dostępny, skopiować kolekcję wiadomość do modelu, dzięki czemu jest dostępny na moich poglądów tak:

<div class="row"> 
    <div class="col-lg-12"> 
     <c:forEach var="messageItem" items="${_ModelMessageList_}"> 
      <div class="alert alert-info"><c:out value="${messageItem.message}" /></div> 
     </c:forEach> 
    </div> 
</div> 

To nie jest optymalna, ale to działa.

0

Jeśli chcesz uniknąć przeniesienia modelu jako parametr metody, można użyć ModelAttribute adnotacji w metodzie: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/ModelAttribute.html

Wystarczy opisywanie sposobu i wiosna będzie automatycznie dodać co metoda powraca do modelu.

@ModelAttribute 
public Stuff addStuffToModel() { 
     Stuff stuff = new Stuff("dummy data"); 
     return stuff; // stuff is added to the model 
} 
+0

Czy istnieje inny sposób? Jak można sobie wyobrazić dodanie komunikatów o błędach do modelu (na przykład) implikuje potrzebę odzyskania listy z modelu, a następnie dodać do niej rzeczy. Tak naprawdę muszę uzyskać dostęp do instancji Modelu – tggm

+0

@ Santiago Mema myślisz w AOP lub podobnym? –

Powiązane problemy