2013-05-09 45 views
0

我在我的一個控制器中有doPost()裏面的以下代碼。該代碼基本上從請求中獲取action參數,並執行與action的值相同名稱的方法。如何推廣servlet之間的方法調用?

// 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類的函數中,但我無法找到正確的方法。

我該如何做到這一點?

回答

-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 { 
} 
+0

當我調用子servlet時,它永遠不會調用父級的doPost。這將如何工作? – 2013-05-09 08:22:20

+1

是什麼讓你這麼想?如果您沒有在ChildServlet中定義doPost()方法,則會執行父級的doPost()。如果你在孩子中有一個doPost()方法 - 只需調用super.doPost() – WeMakeSoftware 2013-05-09 10:28:40

1

UserController.class.getDeclaredMethod(字符串參數)如果是在類UserController中聲明的返回方法。

您可以通過父母的servlet繼承,如Funtik建議所有的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。它包含你需要的一些實用程序(找到一個方法,執行它等)

+0

cool!看起來有希望 – 2013-05-09 14:07:26