7

我有一个这样的控制器:

@Controller
public class HomeController {

    @RequestMapping(value = "/update", method = RequestMethod.POST)
    public String update(@RequestParam("user") User user, ModelMap model){
        SaveUserToDatabase(user);
        return "index";
    }

    @ModelAttribute("user")
    String getUser() {
        return LoadCurrentUserFromDataBase();
    }
}

简而言之,我的视图会呈现user在 中的几乎所有操作中HomeController,但我不想编写代码:

model.addAttribute("user", LoadCurrentUserFromDataBase())

在每一个行动中,我都在寻找一种方式@ModelAttribute来表达user我的所有观点。

但是,根据文档,控制器中的方法在同一个控制器中的方法之前@ModelAttribute被调用。 @RequestMapping

至于我的代码,getUser之前调用过update,但我想获取更新的用户。

有没有办法在动作之后user公开属性而不显式调用每个动作?model.addAttribute

4

2 回答 2

5

每次你做一个POST,做一个重定向。这样,您的POST方法将只负责更新数据,并且更新的数据将由目标控制器加载。

所以在这种情况下,该update()方法将重定向到另一个控制器,该控制器将getUser()在其方法之前调用该GET方法。

于 2013-07-26T14:29:16.527 回答
2

Post / redirect / GET 解决方案如果适合您,则有效。

但是,我遇到了类似的情况,在请求处理之后(主要是跟踪信息),我的所有控制器都需要编写模型属性。我所做的是注册一个自定义接口(例如AdditionalModelDataSupplier),我将其应用于所有需要提供附加数据的控制器。该接口将具有这样的方法:

void provideAdditionalData(Model model, HttpServletRequest request);

现在,我编写了一个拦截器,在该postHandle方法中检查该接口的 Controller bean 并调用该方法:

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

    AdditionalModelDataSupplier modelDataSupplier = findAdditionalModelDataSupplier(handler);
    if (modelDataSupplier != null) {
        final ModelMap modelMap = modelAndView.getModelMap();
        final Model targetModel;
        if (modelMap instanceof Model) {
            targetModel = (Model) modelMap;
        } else {

            // the modelmap doesn't implement model, so we need to provide a wrapper view
            targetModel = new ForwardingModel(modelMap);
        }

        modelDataSupplier.provideAdditionalData(targetModel, request);
    }
}
@Nullable
private static AdditionalModelDataSupplier findAdditionalModelDataSupplier(final Object handler) {
    if (handler instanceof AdditionalModelDataSupplier) {
        return (AdditionalModelDataSupplier) handler;
    }

    if (handler instanceof HandlerMethod) {
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Object bean = handlerMethod.getBean();
        if (bean instanceof AdditionalModelDataSupplier) {
            return (AdditionalModelDataSupplier) bean;
        }
    }

    return null;
}

ForwardingModel上面提到的类很容易创建,它只是将所有内容委托给ModelMap

于 2013-07-26T14:48:17.113 回答