2012-02-08 7 views
0

私はどのコントローラを知っていて、それを生成するためにどのアクションが呼び出されたのかを知りたい。実際に、私はビューでこのような何かをしたい:Spring MVC:コントローラ+アクション名をビューに渡す最も良い方法は何ですか?

<script> 
    var controller = "${controllerName}"; 
    var controllerAction = "${controllerAction}"; 
</script> 

と、後で私はへのアクセスを許可するこの.jsファイルに...の.js、

<script src="/public/script.js"></script> 

を含ま中両方の変数:

if(controller == "UserController" && controllerAction == "Edit") 
{ 
    // ... 
} 
else 
{ 
    // ... 
} 

私の質問:コントローラとアクション名を自動的にビューに渡すにはどうすればよいでしょうか?

私のコントローラは、抽象的な "BaseController"を拡張しているので、これらの変数をModelAttributeに追加する最も良い場所はそこにあります。私は具体的なコントローラに、これらの変数を追加するために何もしないように勧めます。しかし、親コントローラは、どのように子コンクリートコントローラの名前とアクションの名前を知ることができますか?

私はBaseControllerでスタックトレースチェックすることができますが、私は本当にこのソリューションのように...

あなたが提案するためのより良い解決策を持っていないのですか?

答えて

-1

あなたのURLからこの情報を取得できないのはなぜですか?通常、urlはSpringのコントローラとアクションにマップされます。 javascriptでなぜこの情報を得るためのURLを解析しないのですか?投稿に応じてアクションが異なるという問題がある場合は、getまたはヘッダー情報をurlにパラメータとして追加できます。

+0

回答を解決策にフラグを付けます。ありがとう!たいていの場合、URLを解析すると、本当にトリックが行われます。また、インターセプタとSpring 3.1を使用して両方の変数を自動的に渡す方法も見つけました(私の「以下の解決策」を参照)。 – electrotype

4

解決策が見つかりました。

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> 
    <property name="interceptors"> 
     <bean id="baseInterceptor" class="xxx.xxx.xxx.BaseInterceptor" /> 
    </property> 
</bean> 

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean> 

そしてBaseInterceptorのpostHandle()メソッドでは、「オブジェクトハンドラは、」私は必要なすべての情報が含まれていHandlerMethod例えば、次のようになります!私はこれらの豆を使っ春3.1を使用して

私はこの情報をModelAndViewオブジェクトに追加するだけです。

public class BaseInterceptor extends HandlerInterceptorAdapter 
{ 
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception 
    { 
     HandlerMethod handlerMethod = (HandlerMethod)handler; 

     modelAndView.addObject("controllerName", handlerMethod.getBean().getClass().getName()); 
     modelAndView.addObject("controllerAction", handlerMethod.getMethod().getName()); 
    } 
} 
+0

これを共有していただきありがとうございます。これはおそらく、アプリケーションが行う必要のあるロギングを行うための素晴らしい方法です。私はこれのためのいくつかの使用を考えることができます! – Ali

関連する問題