2011-03-04 33 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。