2016-11-20 67 views
1

嗨,请原谅我的英语,为什么从一个servlet派发到另一个servlet会加倍pathInfo?

我有一个主要servlet调度所有用户操作,一个管理对DAO Java类的请求。第一个动作(点击菜单)的作品,并给我正确的URL:projet/admin/groupes/gerer(project/admin/bands/manage)。第二个动作(点击按钮)将pathInfo加倍:projet/admin/groupes/admin/groupes/creer(create)。

如果我参加了双通道进去,它的工作原理,但它不是一个很好的解决方案

呼叫来的servlet从一个JavaScript(如果我尝试再次单击菜单上的,它的三倍!):

switch (name) { 
    case 'Groupe':       // Click on band menu from administration side 
     console.log('JS: Click on admin menu Groupe'); 
     var url = "admin/groupes/gerer"; 
     location.href = url; 
     break; 

    case 'Creer':       // Click on 'Creer' button from liste-groupe page 
     console.log('JS : click on Creer'); 
     var url = "admin/groupes/creer"; 
     location.href = url; 
     break; 

    default: 
     console.log('JS: no click source'); 
} 

带有urlPattern的主要servlet:“/ admin/groupes/*”,我应该在第二种情况下写“/ creer”。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    pathInfo = request.getPathInfo(); 
    servletPath = request.getServletPath(); 
    System.out.println("BandController, pathInfo: " + pathInfo); // TEST CODE 
    System.out.println("BandController, servletPath: " + servletPath); // TEST CODE 

    switch (pathInfo) { 

     // Dispatch to the management servlet 
     case "/gerer": 
      System.out.println("BandController : groupes (menu) > BandManagement"); // TEST CODE 
      dispatch = request.getRequestDispatcher("/action/gerer/listergrp"); 
      dispatch.forward(request, response); 
      break; 

     // FIXME fix double URL call! 
     case "/admin/groupes/creer" : 
      System.out.println("BandController : liste-groupes.jsp > nouvellefiche.jsp"); // TEST CODE 
      dispatch = request.getRequestDispatcher("/WEB-INF/jsp/admin/nouvellefiche.jsp"); 
      dispatch.forward(request, response); 
      break; 

     default: 
      System.out.println("BandController : page 404."); // TEST CODE 
      break; 

} 

我希望这是足够的信息,我尝试了几种不同类型的路径中没有成功的RequestDispatcher。我只是找到这个话题Understanding URL mapping using DispatcherServlet using alwaysUseFullPath property,谈论双重道路,但不明白答案。

感谢所有帮助(顺便说一下我是一个Java初学者!)

回答

1

那是因为你没有引用在JavaScript中的上下文路径调用。将您的JS代码更改为:

switch (name) { 
    case 'Groupe': // Click on band menu from administration side 
     console.log('JS: Click on admin menu Groupe'); 
     var url = "${pageContext.request.contextPath}/admin/groupes/gerer"; 
     location.href = url; 
     break; 

    case 'Creer': // Click on 'Creer' button from liste-groupe page 
     console.log('JS : click on Creer'); 
     var url = "${pageContext.request.contextPath}/admin/groupes/creer"; 
     location.href = url; 
     break; 

    default: 
     console.log('JS: no click source'); 
} 

这样,您将始终保证请求URL将从项目上下文路径中形成。


编辑:

如果你是从一个JS文件进行调用,将EL将无法正常工作,一旦它不是一个JSP页面中,直接。对于这一点,你可以存储在一个隐藏的输入字段昂上下文路径在你的JavaScript代码获取它的值:

HTML:

<input type="hidden" id="contextPath" value="${pageContext.request.contextPath}"/> 

JS:

var contextPath = document.getElementById('contextPath').value; 
switch (name) { 
    case 'Groupe': 
     var url = contextPath; 
     location.href = url; 
     break; 

// ... 
+0

您好并感谢您的回答。 我今天早上才想到,我可能需要添加路径上下文!因为当我使用<%= request.getContextPath()%>将表单直接发送到我的主要servlet时,它仍然有效(我仍然需要了解EL!) 因此,它看起来像在JavaScript文件中使用EL ?它不适合我,但也许我错过了一步? – Klarow

+0

(抱歉,首先使用StackOverFlow ...我无法编辑) 浏览器尝试访问此URL:**/$%7BpageContext.request.contextPath%7D/admin/groupes/gerer ** – Klarow

+0

发生这种情况因为JS文件无权访问请求范围obj。看看我的编辑。 :) – bosco

相关问题