-1

スーパークラスに属するメソッドをオーバーライドしています。メソッドはパラメータを取りません。したがって、モデルを使用してオブジェクトをビューに渡すことができません。誰か提案がありますか?

@Override
protected String connectView(){
    // I'd like to include an object in Model here
    // e.g. model.addAttribute(....) 
    // but unpossible because super does not take a Model as param
    return "connect/status";
}
4

2 に答える 2

1

少なくともリクエストオブジェクトがなければ、あなたが求めていることを単純に行うことができるとは思いません。ただし、いくつかのオプションがあります。

  1. サーブレットフィルタを使用します...そこで必要な値をセッションに追加します
  2. 別のラッパークラス内にクラス(この場合はコントローラー)のインスタンスを作成するデコレーターパターンを使用します。ラッパーでは、追加の処理を実行してから、ラップされた内部オブジェクト(ラップされたコントローラー)を呼び出し、最後の処理を実行します。
  3. @ sp00mのようなHandlerInterceptorが提案します(私はこれを使用したことがないので、そこに入力はありません)

おそらく他にもいくつかの選択肢があると思いますが、他の選択肢は考えられません。

于 2013-01-23T15:48:08.130 に答える
0

HandlerInterceptorこれは、カスタムアノテーション@Modelとリフレクションを使用して、ニーズに合うはずです。

Model.java

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Model {

}

RequestInterceptor.java

@Service
public class RequestInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException {
        try {
            Class<?> clazz = request.getClass();
            if (clazz.isAnnotationPresent(Controller.class)) {
                for (Field field : clazz.getDeclaredFields()) {
                    if (field.isAnnotationPresent(Model.class)) {
                        field.set(request, new ModelMap());
                        break;
                    }
                }
            }
        } catch (IllegalAccessException e) {
            // log("Cannot access model field of controller " + clazz.getSimpleName());
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        try {
            Class<?> clazz = request.getClass();
            if (clazz.isAnnotationPresent(Controller.class)) {
                for (Field field : clazz.getDeclaredFields()) {
                    if (field.isAnnotationPresent(Model.class)) {
                        ModelMap model = (ModelMap) field.get(request);
                        if (model != null) {
                            modelAndView.addAllObjects(model);
                        }
                        break;
                    }
                }
            }
        } catch (IllegalAccessException e) {
            // log("Cannot access model field of controller " + clazz.getSimpleName());
        }
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }

}

applicationContext.xml

<!-- register the interceptor -->
<mvc:interceptors>
    <bean class="your.package.to.the.RequestInterceptor" />
</mvc:interceptors>

YourController.java

@Controller
public class YourController extends ConnectController {

    @Model
    private ModelMap model;

    @Override
    protected String connectView(){
        // model is here available
        model.addAttribute("attrName", "attrValue");
        return "connect/status";
    }

}
于 2013-01-23T16:23:58.267 に答える