代码之家  ›  专栏  ›  技术社区  ›  Rahul Garg

在映射全局前端控制器servlet时如何访问静态资源/*

  •  61
  • Rahul Garg  · 技术社区  · 17 年前

    /* .

    <servlet>       
      <servlet-name>home</servlet-name>         
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>     
    </servlet>  
    <servlet-mapping>       
      <servlet-name>home</servlet-name>         
      <url-pattern>/*</url-pattern>     
    </servlet-mapping>
    

    /res/

    19 回复  |  直到 11 年前
        1
  •  75
  •   BalusC    11 年前

    将控制器servlet映射到更具体的位置 url-pattern 喜欢 /pages/* ,将静态内容放在特定文件夹中,如 /static 并创建一个 Filter 听着 /* 其透明地继续任何静态内容的链,并向控制器servlet分派其他内容的请求。

    简而言之:

    <filter>
        <filter-name>filter</filter-name>
        <filter-class>com.example.Filter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    <servlet>
        <servlet-name>controller</servlet-name>
        <servlet-class>com.example.Controller</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>controller</servlet-name>
        <url-pattern>/pages/*</url-pattern>
    </servlet-mapping>
    

    过滤器中包含以下内容 doFilter() :

    HttpServletRequest req = (HttpServletRequest) request;
    String path = req.getRequestURI().substring(req.getContextPath().length());
    
    if (path.startsWith("/static")) {
        chain.doFilter(request, response); // Goes to default servlet.
    } else {
        request.getRequestDispatcher("/pages" + path).forward(request, response);
    }
    

    不,这不会结束 /pages 在浏览器地址栏中。它是完全透明的。如有必要,您可以 "/static" "/pages" init-param

        2
  •  43
  •   Joaquín L. Robles    15 年前

    春季3.0.4.发布 你可以使用更高的

    <mvc:resources mapping="/resources/**" location="/public-resources/"/>
    

    如图所示 Spring Reference .

        3
  •  21
  •   casey    15 年前

    您所做的就是在web.xml中添加一个欢迎文件

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
    

    <servlet-mapping>
        <servlet-name>MainActions</servlet-name>
        <url-pattern>/main</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>MainActions</servlet-name>
        <url-pattern>/index.html</url-pattern>
    </servlet-mapping>
    

        4
  •  17
  •   user112483 user112483    17 年前

    如果你使用Tomcat,你可以将资源映射到默认的servlet:

    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/static/*</url-pattern>
    </servlet-mapping>
    

    并使用url http://{context-path}/static/res/访问您的资源。..

        5
  •  16
  •   GO.exe    14 年前

    在多个servlet映射定义中提供具有适当后缀的静态内容解决了发布的一个答案中的一条评论中提到的安全问题。引用如下:

    以下是我解决这个问题的方法:

    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.js</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.css</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.jpg</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>
    
        6
  •  12
  •   Dillon Ryan Redding Gandalf    9 年前

    <servlet-mapping>       
      <servlet-name>home</servlet-name>             
      <url-pattern>/app/*</url-pattern>     
    </servlet-mapping>
    

        7
  •  9
  •   digitaljoel    13 年前

    mvc:resources mvc:default-servlet-handler 如spring文档中所述,以实现这一点。

    http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-static-resources

        8
  •  6
  •   Bill    16 年前

    如果你通读tomcat文档,他们会提到True Apache(httpd)在处理静态内容方面比Apache tomcat更好,因为它是专门为此而构建的。我的猜测是因为Tomcat默认使用org.apache.catalina.servlets。DefaultServlet用于处理静态请求。由于它全部封装在JVM中,而Tomcat旨在作为Servlet/JSP容器,因此他们可能没有将该类编写为超级优化的静态内容处理程序。它就在那里。它完成了工作。够好了。

        9
  •  3
  •   Nick Johnson    16 年前

        10
  •  2
  •   Tim Post Samir J M Araujo    14 年前

    我用 Tuckey URL 这很酷。

    它有如何设置web应用程序的说明。我已经用我的Spring MVC web应用程序设置了它。当然,在我想使用注释进行Spring 3验证之前,一切都很好,比如 @Email @Null 对于域对象。

    当我添加Spring mvc指令时:

    < mvc:annotation-driven  /> 
    < mvc:default-servlet-handler />
    

    < mvc:default-servlet-handler /> 取代了Tuckey,我仍在努力解决这个问题。

        11
  •  1
  •   alamar    17 年前

    其他两种可能性:

    实例化Google App Engine使用的FileServlet类,并在需要在给定URL处提供静态文件时调用该FileServlet上的服务(请求、响应)。

        12
  •  1
  •   MStodd    16 年前

    将不希望触发servlet处理的文件夹添加到 <static-files>

    /

    /页数/<.jsp文件>

    /css

    <静态文件>

        13
  •  1
  •   sebut    14 年前

    而不是“/*” 在我的主Servlet中,我现在只听专用的语言前缀 “EN”、“EN/*”、“DE”、“DE/*”

    静态内容由默认Servlet提供,空根请求转到index.jsp,它用默认语言调用我的主Servlet:

    <jsp:included page=“/EN/”/>

        14
  •  1
  •   Jules    12 年前

    <mvc:default-servlet-handler />
    

    spring MVC servletbean定义文件对我有效。它将任何未由注册的MVC控制器处理的请求传递给容器的原始默认处理程序,该处理程序应将其作为静态内容。只要确保你没有注册处理所有事情的控制器,它应该会正常工作。不知道为什么@logixplayer建议重写URL;仅使用Spring MVC就可以实现他想要的效果。

        15
  •  1
  •   Matheus Borges Teixeira    12 年前

    (这里提到的解决方案使用XML映射,我使用了带有注释@WebServlet的3.0版本)

    我在使用Jetty,发生的事情是服务器识别了文件,而不是列出了目录,但当被要求提供资源时,我的Servlet却接管了控制权。所有其他静态内容不受影响。

        16
  •  0
  •   QaZ    10 年前

    <servlet>
      <servlet-name>DefaultServlet</servlet-name>
      <servlet-class>org.eclipse.jetty.servlet.DefaultServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
      <servlet-name>DefaultServlet</servlet-name>
      <url-pattern>/css/*</url-pattern>
    </servlet-mapping>
    
        17
  •  0
  •   Jekin Kalariya    10 年前
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
    <mvc:default-servlet-handler/>
    </beans>
    

    @Override
        public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
            configurer.enable();
        }
    
        18
  •  0
  •   Mike Beaumont    7 年前

    关于Tomcat,很大程度上取决于特定的版本。有一个bug修复 https://bz.apache.org/bugzilla/show_bug.cgi?id=50026 这意味着默认servlet的servlet映射(“/”除外)在Tomcat 6.0.29(及更早版本)中的行为与更高版本不同。

        19
  •  -1
  •   David Bullock    6 年前

    在Servlet规范的“12.2映射规范”一节中,它说:

    仅包含/字符的字符串表示

    /* 做:

    getServletContext().getNamedDispatcher("/").forward(req,res);
    

    在Tomcat和Jetty中,调用 getServletContext().getNamedDispatcher('/') null '/*'

    推荐文章