访问spring-mvc中的当前模型

tgg*_*ggm 9 spring-mvc

我正在学习从asp.net MVC传入的Spring-MVC 4,我正在寻找一种方法将数据传递给View,而不必在每次调用中声明Model Atrribute.

例如,现在我有了这个.

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";
         }
}
Run Code Online (Sandbox Code Playgroud)

但我真正想要的是有一种方法来访问我的基本控制器方法中的Model实例,而不必将其作为参数传递.类似于asp.net MVC中ViewData或TempData的用法.

是否可以以这种方式将数据传递给视图?

谢谢

tgg*_*ggm 1

我设法使用请求拦截器解决了这个问题。本质上:

在我的基本控制器类上:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,我添加了一个拦截器来将消息集合复制到模型中:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在 PreHandle 上,它会清除基本控制器集合上的所有消息。在请求(PostHandle)之后并且由于模型可用,我将消息集合复制到模型,从而使其在我的视图中可用,如下所示:

<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>
Run Code Online (Sandbox Code Playgroud)

这不是最佳的,但它有效。