2016-11-20 79 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

相關問題