【问题标题】:Access current Model in spring-mvc在 spring-mvc 中访问当前模型
【发布时间】:2015-07-01 17:09:10
【问题描述】:

我正在学习来自 asp.net MVC 的 Spring-MVC 4,并且我正在寻找一种无需在每次调用中声明模型属性即可将数据传递到视图的方法。

例如,现在我有这个。

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";
         }
}

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

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

谢谢

【问题讨论】:

  • 你想对模型做什么?

标签: spring-mvc


【解决方案1】:

如果要避免将模型作为方法参数传递,可以在方法中使用 ModelAttribute 注解: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/ModelAttribute.html

只需对方法进行注解,Spring 会自动将方法返回的内容添加到模型中。

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

【讨论】:

  • 还有别的办法吗?正如您想象的那样(例如)向模型添加错误消息意味着需要从模型中检索 List 然后向其中添加内容。所以我真的需要访问模型实例
  • @TiagoMatias 你在考虑 AOP 还是类似的?
【解决方案2】:

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

在我的基本控制器类上:

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();
        }
    }
}

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

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);
    }
}

在 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>

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

【讨论】:

    猜你喜欢
    • 2019-03-03
    • 1970-01-01
    • 2011-11-21
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 2021-05-12
    • 2017-08-27
    相关资源
    最近更新 更多