有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaURL模式404

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


共 (2) 个答案

  1. # 1 楼答案

    当使用带有向外映射扩展名(如.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>
    

    并添加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);
        }
    }
    
  2. # 2 楼答案

    我认为3.0中的URI模板不支持url中带有扩展名的@pathvariable。是的

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

    你需要使用目录url模式,就像你在网站上做的那样。xml

    您可以设置spring servlet将忽略映射的路径,如下面的示例https://src.springframework.org/svn/spring-samples/mvc-basic/trunk/ 或 使用网络。这样,对/soft/*等路径的请求将只由spring servlet处理