servlet映射url模式中/和/*之间的区别

Can*_*hiu 171 web.xml servlets url-pattern

熟悉的代码:

<servlet-mapping>
    <servlet-name>main</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>main</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

我的理解是/*地图http://host:port/context/*.

怎么样/?它肯定不会映射到http://host:port/contextroot.事实上,它会接受http://host:port/context/hello,但拒绝http://host:port/context/hello.jsp.

任何人都可以解释如何http://host:port/context/hello映射?

Bal*_*usC 260

<url-pattern>/*</url-pattern>

/*上一个servlet覆盖所有其他的servlet,包括由servletcontainer提供诸如默认的servlet和JSP的servlet所有servlet.无论你发出什么样的请求,它都会在那个servlet中结束.因此,这对于servlet来说是一个糟糕的URL模式.通常情况下,你想使用/*一个Filter唯一的.它可以通过调用让请求继续到任何监听更具体的URL模式的servlet FilterChain#doFilter().

<url-pattern>/</url-pattern>

/不覆盖任何其他的servlet.它仅替换所有与任何其他已注册servlet不匹配的请求的servletcontainer的内置缺省servlet.这通常仅在静态资源(CSS/JS /图像/等)和目录列表上调用.servletcontainer的内置默认servlet还能够处理HTTP缓存请求,媒体(音频/视频)流和文件下载简历.通常,您不希望覆盖默认的servlet,因为否则必须处理其所有任务,这并非完全无关紧要(JSF实用程序库OmniFaces有一个开源 示例).因此,这也是servlet的错误URL模式.至于为什么JSP页面没有命中这个servlet,这是因为servletcontainer的内置JSP servlet将被调用,默认情况下已经映射到更具体的URL模式*.jsp.

<url-pattern></url-pattern>

然后还有空字符串URL模式. This will be invoked when the context root is requested. This is different from the <welcome-file>请求任何子文件夹时不调用的方法不同.如果您需要" 主页servlet ",这很可能是您实际需要的URL模式.我只需要承认,我直觉地期望空字符串URL模式 and the slash URL pattern /完全相反地定义,所以我可以理解很多初学者对此感到困惑.但是它就是这样啊.

前控制器

如果你确实打算有一个前控制器servlet,那么你最好映射它像一个更具体的网址模式*.html,*.do,/pages/*,/app/*,等你可以藏起来前端控制器URL模式,并在一个共同的URL模式覆盖静态资源喜欢/resources/*,/static/*等等,借助servlet过滤器.另请参见如何防止映射在/*上的前端控制器servlet处理静态资源.值得注意的是Spring MVC有一个内置的静态资源servlet,所以/如果你为Spring中的静态资源配置一个通用的URL模式,那就是为什么你可以映射它的前端控制器.另请参见如何处理Spring MVC中的静态内容?

  • 谢谢.经过一番研究,我想澄清一个微妙的观点./覆盖Web服务器安装的默认servlet.例如,Tomcat安装一个提供静态资源的DefaultServlet.使用/删除默认servlet作为(最可能不合需要的)副作用. (9认同)
  • @BalusC,你能告诉我`/**`模式表示什么? (2认同)

Can*_*hiu 44

我想用映射规则和一个例子来补充BalusC的答案.

从Servlet 2.5规范映射规则:

  1. 映射确切的URL
  2. 映射通配符路径
  3. 地图扩展
  4. 映射到默认servlet

在我们的示例中,有三个servlet./是我们安装的默认servlet.Tomcat安装两个servlet来为jsp和jspx提供服务.所以要映射http://host:port/context/hello

  1. 接下来没有安装确切的URL servlet.
  2. 接下来没有安装通配符路径servlet.
  3. 接下来不匹配任何扩展名.
  4. 映射到默认servlet,返回.

要映射 http://host:port/context/hello.jsp

  1. 接下来没有安装确切的URL servlet.
  2. 接下来没有安装通配符路径servlet.
  3. 找到扩展servlet,返回.


hak*_*ami 24

也许你需要知道网址是如何映射的,因为我遭受404了数小时的痛苦.有两种处理请求的处理程序.BeanNameUrlHandlerMappingSimpleUrlHandlerMapping.当我们定义a时servlet-mapping,我们正在使用SimpleUrlHandlerMapping.有一两件事,我们需要知道的是,这两个处理程序共享称为共同财产alwaysUseFullPath,默认为false.

false这意味着Spring不会使用完整路径来将URL映射到控制器.这是什么意思?这意味着当你定义一个servlet-mapping:

<servlet-mapping>
    <servlet-name>viewServlet</servlet-name>
    <url-pattern>/perfix/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

处理程序实际上将使用该*部件来查找控制器.例如,以下控制器404在您使用时会遇到错误/perfix/api/feature/doSomething

@Controller()
@RequestMapping("/perfix/api/feature")
public class MyController {
    @RequestMapping(value = "/doSomething", method = RequestMethod.GET) 
    @ResponseBody
    public String doSomething(HttpServletRequest request) {
        ....
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一场完美的比赛,对吧?但为什么呢404.如前所述,默认值为alwaysUseFullPathfalse,这意味着在您的请求中,仅/api/feature/doSomething用于查找相应的Controller,但没有Controller关心该路径.您需要更改您的URL /perfix/perfix/api/feature/doSomethingperfix从MyController基础中删除@RequestingMapping.


heh*_*ehe 8

我认为Candy的回答大多是正确的.我认为有一个小部分.

映射host:port/context/hello.jsp

  1. 接下来没有安装确切的URL servlet.
  2. 找到通配符路径servlet,返回.

我相信为什么"/*"与host:port/context/hello不匹配,因为它将"/ hello"视为路径而不是文件(因为它没有扩展名).


归档时间:

查看次数:

165130 次

最近记录:

8 年,3 月 前