我有一个名为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中调用我的方法。
答案 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.
}