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

时间:2012-03-27 16:10:29

标签: java-ee servlets

我有一个名为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
}

}

谢谢大家,我认为我找到了解决方案,

你提供给我的解决方案只有在我有1个Servlet的情况下才有效,但我有太多,我希望它们共享相同的菜单。

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

2 个答案:

答案 0 :(得分:1)

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

   public void doEverything(HttpServletRequest request, HttpServletResponse response){
          //all your servlet code here
   }

然后在doPost中你可以简单地调用这个方法,在你的doGet中你可以像这样调用这个方法:

   doEverything(request, response);

这样单个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
}

}

答案 1 :(得分:0)

只是Vincent Ramdhanie回答的扩展:

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

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.
}