我的一个控制器中的doPost()
内有以下代码。此代码基本上从请求中获取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
类的函数中,但我无法正确的方法。
我怎样才能做到这一点?
答案 0 :(得分:1)
UserController.class.getDeclaredMethod(string,args)返回方法,如果它在类UserController中声明。
您可以使所有servlet类由父servlet继承,如Funtik建议的那样,然后在超类中添加此方法:
protected Method methodToInvoke(String action) {
Class[] args = { HttpServletRequest.class,
HttpServletResponse.class };
Method method = this.getClass().getDeclaredMethod(action, args);
}
此方法搜索以查找正在执行的servlet类的方法(this.getClass())。您还可以在supertype 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。它包含一些您需要的实用程序(查找方法,执行它等)
答案 1 :(得分:-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 {
}