servlet映射url模式中/和/*的差异

servlet映射url模式中/和/*的差异

熟悉的代码:

<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>

我的理解是/*映射到http://host:port/context/*.

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

有人能解释一下http://host:port/context/hello地图?


海绵宝宝撒
浏览 1236回答 3
3回答

MM们

我想用映射规则和一个例子来补充BalusC的答案。Servlet 2.5规范中的映射规则:映射精确URL映射通配符路径地图扩展映射到默认servlet在我们的示例中,有三个servlet。/是我们安装的默认servlet。Tomcat安装两个servlet来服务jsp和jspx。所以要绘制地图http://host:port/context/hello没有安装确切的URL servlet,下一步。没有安装通配符路径servlet,下一步。不匹配任何扩展,下一步。映射到默认servlet,返回。地图http://host:port/context/hello.jsp没有安装确切的URL servlet,下一步。没有安装通配符路径servlet,下一步。找到扩展servlet,返回。

饮歌长啸

也许您也需要知道URL是如何映射的,因为我遭受了404好几个小时。有两种处理程序处理请求。BeanNameUrlHandlerMapping和SimpleUrlHandlerMapping..当我们定义servlet-mapping,我们正在使用SimpleUrlHandlerMapping..我们需要知道的一件事是,这两个处理程序共享一个称为alwaysUseFullPath默认为false.false这里意味着Spring将不使用Mapp的完整路径,也就是控制器的url。什么意思?这意味着当您定义servlet-mapping:<servlet-mapping> &nbsp;&nbsp;&nbsp;&nbsp;<servlet-name>viewServlet</servlet-name> &nbsp;&nbsp;&nbsp;&nbsp;<url-pattern>/perfix/*</url-pattern></servlet-mapping>处理程序将实际使用*找到控制器的一部分。例如,下面的控制器将面临一个404使用/perfix/api/feature/doSomething@Controller()@RequestMapping("/perfix/api/feature")public&nbsp;class&nbsp;MyController&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;@RequestMapping(value&nbsp;=&nbsp;"/doSomething",&nbsp;method&nbsp;=&nbsp;RequestMethod.GET)&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;@ResponseBody &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;doSomething(HttpServletRequest&nbsp;request)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.... &nbsp;&nbsp;&nbsp;&nbsp;}}这是一个完美的匹配,对吗?但为什么404..如前所述,默认值为alwaysUseFullPath是假的,这意味着在您的请求中,只有/api/feature/doSomething用于查找相应的控制器,但没有任何Controller关心该路径。您需要将url更改为/perfix/perfix/api/feature/doSomething或移除perfix来自MyController基地@RequestingMapping.
打开App,查看更多内容
随时随地看视频慕课网APP