2011-03-04 67 views
0

在servlet映射中遇到url-pattern的問題。我正在使用spring 3.0並使用帶註釋的控制器。我用Spring的DispatcherServlet映射了* .do。我試圖使用@PathVariable與URL - /test.do/{username}這是投擲404.試過幾次試驗和錯誤,並沒有幫助。 url-patter「/」的作品,但我的應用程序的其他部分被破壞(CSS,圖像等)URL模式404

+0

請你可以在這裏發佈你的映射?還有DispatcherServlet配置? – Nilesh 2011-03-04 08:41:37

回答

2

當使用帶有out映射擴展名(如.do,.html等)的url來彈出時,將在春季處理。因此您需要將您的靜態資源映射到另一個URL並使用其他servlet進行處理。

例如:舊的CSS將映射到http://localhost:8080/css/style.css和你的CSS將映射到http://localhost:8080/static/css/style.css

,並添加servlet映射爲/static/*網址

 <!-- Servlet for static resource --> 
    <servlet> 
     <servlet-name>static</servlet-name> 
     <servlet-class>com.jegbagus.servlet.DefaultServlet</servlet-class>  
    </servlet> 

    <servlet-mapping> 
     <servlet-name>basic</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

    <!-- Mapper for static resource --> 
    <servlet-mapping> 
     <servlet-name>static</servlet-name> 
     <url-pattern>/static/*</url-pattern> 
    </servlet-mapping> 

和處理那些靜態的請求添加的servlet。

package com.jegbagus.servlet; 

import java.io.*; 

import javax.servlet.*; 
import javax.servlet.http.*; 

public class DefaultServlet extends HttpServlet 
{ 
    private static final long serialVersionUID = 1L; 

    // Tomcat, Jetty, JBoss, and GlassFish 
    private static final String COMMON_DEFAULT_SERVLET_NAME = "default"; 

    // Resin 
    private static final String RESIN_DEFAULT_SERVLET_NAME = "resin-file"; 

    // WebLogic 
    private static final String WEBLOGIC_DEFAULT_SERVLET_NAME = "FileServlet"; 

    // WebSphere 
    private static final String WEBSPHERE_DEFAULT_SERVLET_NAME = "SimpleFileServlet"; 


    public String scanDefaultServlet(){ 
     if(this.getServletContext().getNamedDispatcher(COMMON_DEFAULT_SERVLET_NAME) != null) { 
      return COMMON_DEFAULT_SERVLET_NAME; 
     } else if(this.getServletContext().getNamedDispatcher(RESIN_DEFAULT_SERVLET_NAME) != null) { 
      return RESIN_DEFAULT_SERVLET_NAME; 
     } else if(this.getServletContext().getNamedDispatcher(WEBLOGIC_DEFAULT_SERVLET_NAME) != null){ 
      return WEBLOGIC_DEFAULT_SERVLET_NAME; 
     } else if(this.getServletContext().getNamedDispatcher(WEBSPHERE_DEFAULT_SERVLET_NAME) != null){ 
      return WEBSPHERE_DEFAULT_SERVLET_NAME; 
     } else { 
      throw new IllegalStateException("Cannot determine what Server you currently use"); 
     }  
    } 

    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     doGet(req, resp); 
    } 

    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
    { 
     RequestDispatcher rd = getServletContext().getNamedDispatcher(this.scanDefaultServlet()); 
     HttpServletRequest wrapped = new HttpServletRequestWrapper(req) { 
       public String getServletPath() {return "";} 
     }; 
     rd.forward(wrapped, resp); 
    } 
} 
+0

什麼不明白scanDefaltServlet和包裝。你能否詳細說明一下?你已經實現了 – 2011-03-04 16:48:40

+0

嗎?你的問題解決了嗎?基本上scanDefaultServlet找到您的默認servlet使用(取決於您的Web服務器使用什麼)。比它將通過'/ static/*'url模式從默認源文件夾或根(在這種情況下是您的css文件夾或js)獲取資源。 – 2011-03-04 17:14:08

+0

謝謝!現在我明白了,它的工作原理 – 2011-03-07 00:32:12

0

我不認爲在3.0中的URI模板支持@擴展名爲.do的url中的@pathvariable。

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-uri-templates

您需要使用目錄的網址模式,比如你做了/或者/柔和/在你的web.xml。

您可以設置該彈簧servlet將忽略像在下面的示例中的映射的路徑,https://src.springframework.org/svn/spring-samples/mvc-basic/trunk/ 或 使用web.xml中,使得到的路徑的請求,諸如/軟/ *將僅由處理春天servlet。