0

doPost()コントローラーの 1 つに次のコードが含まれています。このコードは基本的にaction、リクエストからパラメーターを取得し、action の値と同じ名前のメソッドを実行します。

// get the action from the request and then execute the necessary
    // action.
    String action = request.getParameter("action");
    try {
        Method method = UserController.class.getDeclaredMethod(action,
                new Class[] { HttpServletRequest.class,
                        HttpServletResponse.class });
        try {
            method.invoke(this, request, response);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    } catch (SecurityException e) {

        e.printStackTrace();
    } catch (NoSuchMethodException e) {

        ErrorHandlingHelper.redirectToErrorPage(response);
        e.printStackTrace();
    }

今、私はすべてのコントローラーにこの機能を実装したいと考えています。helperクラスの関数内に入れて一般化しようとしましたが、正しい方法を取得できません。

どうすればこれを達成できますか?

4

2 に答える 2

1

UserController.class.getDeclaredMethod(string, args) は、クラス UserController で宣言されている場合、メソッドを返します。

Funtikが提案したように、すべてのサーブレットクラスを親サーブレットに継承させてから、このメソッドをスーパークラスに追加できます。

protected Method methodToInvoke(String action) {
    Class[] args =  { HttpServletRequest.class,
                    HttpServletResponse.class };
    Method method = this.getClass().getDeclaredMethod(action, args);
}

このメソッドは、実行中のサーブレットのクラスのメソッド (this.getClass()) を検索します。スーパータイプ sevlet クラスに実行メソッドを含めることもできます。

または、すべてのサーブレットをサブクラス化したくない、または単にサブクラス化できない場合は、この機能をユーティリティ クラスに配置できますが、サーブレット クラスをパラメーターとして渡す必要があります。

protected static Method methodToInvoke(String action, Class clazz) {
    Class[] args =  { HttpServletRequest.class,
                    HttpServletResponse.class };
    Method method = clazz.getDeclaredMethod(action, args);
}

ただし、この静的メソッドをサーブレットから呼び出すときは、 this.getClass() を引数として渡す必要があります。

http://code.google.com/p/bo2/source/browse/trunk/Bo2Utils/main/gr/interamerican/bo2/utils/ReflectionUtils.javaもご覧ください。必要なユーティリティの一部が含まれています(メソッドの検索、実行など)

于 2013-05-09T08:56:04.410 に答える