Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java URL模式404_Java_Spring_Spring Mvc - Fatal编程技术网

Java URL模式404

Java URL模式404,java,spring,spring-mvc,Java,Spring,Spring Mvc,servlet映射中的url模式有问题。我正在使用Spring3.0和带注释的控制器。我用Spring的DispatcherServlet映射了*.do。我试图使用带有url-/test.do/{username}的@PathVariable。这是一个404。尝试了几次尝试和错误,但都无济于事。url模式“/”起作用,但我的应用程序的其他部分(CSS、图像等)被破坏了。当使用带有映射扩展名(如.do、.html等)的url到spring时,所有url都将由spring处理。因此,您需要将静态资源

servlet映射中的url模式有问题。我正在使用Spring3.0和带注释的控制器。我用Spring的DispatcherServlet映射了*.do。我试图使用带有url-/test.do/{username}的@PathVariable。这是一个404。尝试了几次尝试和错误,但都无济于事。url模式“/”起作用,但我的应用程序的其他部分(CSS、图像等)被破坏了。

当使用带有映射扩展名(如.do、.html等)的url到spring时,所有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>

我认为3.0中的URI模板不支持url中带有扩展名的@pathvariable,比如.do

您需要像在web.xml中那样使用目录url模式/或/soft/

您可以设置SpringServlet将忽略映射的路径,如以下示例所示, 或
使用web.xml,这样对路径(如/soft/*)的请求将仅由spring servlet处理。

请在此处发布映射?还有DispatcherServlet配置?还有什么不了解scanDefaltServlet和包装的。你能详细说明一下吗?你已经实施了吗?你的问题解决了吗?基本上,scanDefaultServlet可以找到要使用的默认servlet(取决于web服务器使用的内容)。然后,它将使用
/static/*
url模式从默认的sources文件夹或根目录(在本例中是您的css文件夹或js)获取资源。
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);
    }
}