网址格式404

时间:2011-03-04 03:52:47

标签: java spring spring-mvc

servlet映射中的url-pattern存在问题。我使用的是Spring 3.0并使用带注释的控制器。我已经使用Spring的DispatcherServlet映射了* .do。我试图将@PathVariable与url一起使用 - /test.do/{username}这是一个404.尝试了一些试验和错误,它没有帮助。 url-patter“/”可以正常工作,但我的应用程序的其他部分已被破坏(CSS,图像等)

2 个答案:

答案 0 :(得分:2)

当使用带有映射扩展名的url(例如.do,.html等)来弹出时,所有的URL都将由spring处理。因此,您需要将静态资源映射到另一个URL并使用其他servlet进行处理。

示例:您的旧css将映射到http://localhost:8080/css/style.css,您的css将映射到http://localhost:8080/static/css/style.css

并为/static/* url

添加servlet映射
     <!-- 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);
    }
}

答案 1 :(得分:0)

我认为3.0中的URI模板不支持url中的@path变量,扩展名为.do。

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

您需要使用目录网址模式,就像在web.xml中使用/或/ soft /一样。

您可以设置一个弹出servlet将忽略映射的路径,如下例所示https://src.springframework.org/svn/spring-samples/mvc-basic/trunk/ 要么 使用web.xml,以便对路径(如/ soft / *)的请求仅由spring servlet处理。