Jakarta ee 如何在另一个Servlet的post方法中包含Servlet?

Jakarta ee 如何在另一个Servlet的post方法中包含Servlet?,jakarta-ee,servlets,Jakarta Ee,Servlets,我有一个名为Menu的Servlet,它生成一些html和一个动态菜单, 我所说的动态是指每次用户在一个框架中选择一个表时,菜单中的链接都会发生变化,下面是一个快速示例: Browse?table=student Search?table=student Browse?table=professor Search?table=professor 我在大多数Servlet的开头都包含了这个Servlet,为了优化修改,我使用了以下代码: RequestDispatcher dispatcher

我有一个名为Menu的Servlet,它生成一些html和一个动态菜单, 我所说的动态是指每次用户在一个框架中选择一个表时,菜单中的链接都会发生变化,下面是一个快速示例:

Browse?table=student
Search?table=student

Browse?table=professor
Search?table=professor
我在大多数Servlet的开头都包含了这个Servlet,为了优化修改,我使用了以下代码:

RequestDispatcher dispatcher = request.getRequestDispatcher("/Menu?table="+tableName);
dispatcher.include(request, response);
但是,当我尝试向包含前面代码的Servlet发送post请求时,我收到一个错误消息: HTTP状态405-此URL不支持HTTP方法POST

我使用的是NetBeans 6.9.1、TomCat 6.0.26和Java版本1.6

那么,有没有办法在另一个Servlet的POST方法中包含我的Servlet菜单呢? 或者,除了Servlet之外,还有其他解决方案可以使用动态菜单吗

为了向大家解释更多,下面是我的Servlet的代码:

public class ExecuteAnySql extends HttpServlet {

//No problem here
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//code
//include the Menu Servlet
//code
}

//this does not work when I include the Menu Servlet
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//code
//include the Menu Servlet
//code
}
}

谢谢各位,我想我找到了解决办法

您提供给我的解决方案只有在我有一个Servlet的情况下才能工作,但是我有太多的Servlet,我希望它们共享同一个菜单

所以我所要做的就是创建一个静态方法,将表名作为参数并生成html代码。
如果我继续这样做,我可以从所有servlet调用我的方法。

您需要在servlet中提供POST支持。默认情况下,Netbeans使用的servlet模板为您执行此操作。但只需提供一个完成servlet工作的方法:

   public void doEverything(HttpServletRequest request, HttpServletResponse response){
          //all your servlet code here
   }
然后在doPost中,您可以简单地调用此方法,在doGet中,您可以这样调用此方法:

   doEverything(request, response);
protected void doGet(final HttpServletRequest request, final HttpServletResponse response)
{
  doGetAndPost(request, response);
}

protected void doPost(final HttpServletRequest request, final HttpServletResponse response)
{
  doGetAndPost(request, response);
}

protected void doGetAndPost(final HttpServletRequest request, final HttpServletResponse response)
{
  ... process requests here.
}
这样,单个servlet处理GET和POST


因此,扩展您发布的代码:

public class Menu extends HttpServlet {

//No problem here
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
         doEverything(request, response);
}

//this does not work when I include the Menu Servlet
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {   
        doEverything(request, response);
}

protected void doEverything(HttpServletRequest request, HttpServletResponse response){
    //do actual menu code
    //forward to the requested servlet
}

}

只是文森特·拉姆达尼答案的扩展:

在包含的servlet中,需要实现doPost方法。我经常看到这样的事情:

   doEverything(request, response);
protected void doGet(final HttpServletRequest request, final HttpServletResponse response)
{
  doGetAndPost(request, response);
}

protected void doPost(final HttpServletRequest request, final HttpServletResponse response)
{
  doGetAndPost(request, response);
}

protected void doGetAndPost(final HttpServletRequest request, final HttpServletResponse response)
{
  ... process requests here.
}

菜单servlet应该是
。是否可以在servlet中包含jsp?但是,您的菜单servlet是否同时提供doPost和doGet?这就是问题所在。不,我的菜单servlet只提供doGet,但其他servlet支持doGet和doPost,它们在这两个servlet中都使用菜单servlet。为了在我的整个应用程序中使用相同的接口,这是一个好的实践吗?这就是我的建议。您的菜单servlet必须同时提供这两种方法,因为您希望它对这两种方法都执行。我发布的代码将适用于该场景。