0

doPost()我的一个控制器中有以下代码。此代码基本上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 建议的那样,您可以使所有 servlet 类都由父 servlet 继承,然后在超类中添加此方法:

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

此方法搜索以查找正在执行的 servlet 类的方法 (this.getClass())。您还可以在超类型 sevlet 类中包含执行方法。

或者,如果您不想或只是不能将所有 servlet 子类化,则可以将此功能放在实用程序类中,但是您应该将 servlet 类作为参数传递。

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

但是,当您从 servlet 调用此静态方法时,您应该将 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 回答
-1

你试过继承吗?

在其中创建一个抽象ParentServlet和覆盖doPost()方法。所有其他 servlet 都应该继承自ParentServlet

所以这应该看起来像这样:

 public abstract class ParentServlet extends HttpServlet {
     ...
     protected void doPost(HttpServletRequest req, HttpServletResponse resp){
        //your action logic here
     }
 }


 public class ChildServlet extends ParentServlet {
 }
于 2013-05-09T07:55:02.980 回答