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中的静态内容?
Can*_*hiu 44
我想用映射规则和一个例子来补充BalusC的答案.
从Servlet 2.5规范映射规则:
在我们的示例中,有三个servlet./是我们安装的默认servlet.Tomcat安装两个servlet来为jsp和jspx提供服务.所以要映射http://host:port/context/hello
要映射 http://host:port/context/hello.jsp
hak*_*ami 24
也许你需要知道网址是如何映射的,因为我遭受404了数小时的痛苦.有两种处理请求的处理程序.BeanNameUrlHandlerMapping和SimpleUrlHandlerMapping.当我们定义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/doSomething或perfix从MyController基础中删除@RequestingMapping.
我认为Candy的回答大多是正确的.我认为有一个小部分.
映射host:port/context/hello.jsp
我相信为什么"/*"与host:port/context/hello不匹配,因为它将"/ hello"视为路径而不是文件(因为它没有扩展名).
| 归档时间: |
|
| 查看次数: |
165130 次 |
| 最近记录: |