tomcat首页welcome-file-list设置与url-pattern匹配规则

welcome-file-list

  1. <welcome-file-list>标签下可以设置多个首页<welcome-file>,容器启动后会在根目录下依次查找匹配的物理存在的文件,返回第一个找到的文件,没有找到报404错误。
<welcome-file-list>
    <welcome-file>a.jsp</welcome-file>
    <welcome-file>b.html</welcome-file>
    <welcome-file>c.html</welcome-file>
  </welcome-file-list>
  1. 首页的路径只能是一个实际存在的物理文件地址,不能将首页设置成Servlet或Controller的地址,再通过来Servlet或Controller返回一个页面,例如以下,tomcat会在根目录下的view文件夹查找addUser文件,找不到则报404.
<welcome-file-list>
  <welcome-file>/view/addUser</welcome-file>
</welcome-file-list>

如果确实需要使用控制器来返回页面,可以通过在页面中跳转到控制器路径来实现。建立首页文件home.html,内容如下,URL为跳转路径,再将该页面设置为主页

<html> 
<head>
  <meta http-equiv="Refresh" content="0; URL=/view/addUser">
</head>
</html>
  1. 可以不设置首页,由SpringMVC来处理根路径应该返回的页面,注意2中是设置首页为控制器路径,此处是不设置首页,不要混淆。不设置首页直接去掉welcome-file-list标签或者
<welcome-file-list>
  <welcome-file></welcome-file>
</welcome-file-list>

对根路径进行映射

@RequestMapping("/")
public String indexPage() throws Exception {
    return "index"; 
    }

url-pattern匹配规则

  • 需要明确
  1. servlet容器中的匹配规则既不是简单的通配,也不是正则表达式,而是特定的规则。所以不要用通配符或者正则表达式的匹配规则来看待servlet的url-pattern。
  2. 当servlet容器接收到浏览器发起的一个url请求后,容器会用url减去当前应用的上下文路径,以剩余的字符串作为servlet映射,如url是http://localhost:8080/appDemo/addUser,其应用上下文是appDemo,容器会将http://localhost:8080/appDemo去掉,用剩下的/addUser部分拿来做servlet的映射匹配
  3. 当有一个servlet匹配成功以后,不会再继续匹配剩下的servlet。
  4. Servlet 2.5开始,一个servlet可以使用多个url-pattern规则。以下3个url-pattern都可以映射到MyServlet
<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/user/users.html</url-pattern>
    <url-pattern>/index.html</url-pattern>
    <url-pattern>/user/addUser.action</url-pattern>
</servlet-mapping>
  • 三种写法
  1. 精确匹配。形如/add。
    注:/user//index也是精确匹配,其中的不是通配符而是字符。只有/user//index才能匹配上,/user/a/index,/user/b/index都是无法匹配的。
  2. 路径匹配。形如/,/user/,以以/开头,/*结尾
  3. 扩展名匹配。形如*.do
    注以上三种匹配不能组合混用。
  4. 默认匹配/,当以上都无法匹配时,就是用默认的Servlert。优先级最低

匹配优先级
精确匹配>路径匹配(长路径优先级大于短路径优先级)>扩展名匹配>缺省匹配

  • /* 与 /
    “/* ”属于路径匹配,并且可以匹配所有request,由于路径匹配的优先级仅次于精确匹配,所以“/”会覆盖所有的扩展名匹配,很多404错误均由此引起,一般只用于filter的url-pattern。
    “/”默认匹配模式,优先级最低,不会覆盖其他任何url-pattern,只是会替换servlet容器的内建default servlet ,该模式同样会匹配所有request(除了jsp文件)。
    配置“/”后,会拦截诸如http://localhost:8080/appDemo/user/addUser.actionhttp://localhost:8080/appDemo/user/updateUser的格式的请求,但是并不会拦截http://localhost:8080/appDemo/user/users.jsphttp://localhost:8080/appDemo/index.jsp,这是因为servlet容器有内置的“
    .jsp”匹配器,而扩展名匹配的优先级高于缺省匹配,所以才会有上述现象。
    /*与/都会拦截.css,.js,.html等静态资源。

如何访问到静态的文件,如jpg,js,css?

方案一:激活Tomcat的defaultServlet来处理静态文件

 <servlet-mapping>
  <servlet-name>default</servlet-name>
  <url-pattern>*.jpg</url-pattern>
  </servlet-mapping>
  <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>
  特点:1.  要配置多个,每种文件配置一个。
  2.  要写在DispatcherServlet的前面, 让 defaultServlet先拦截请求,这样请求就不会进入Spring了。
  3. 高性能。
  备注:
  Tomcat, Jetty, JBoss, and GlassFish 自带的默认Servlet的名字 -- "default"
  Google App Engine 自带的 默认Servlet的名字 -- "_ah_default"
  Resin 自带的 默认Servlet的名字 -- "resin-file"
  WebLogic 自带的 默认Servlet的名字  -- "FileServlet"
  WebSphere  自带的 默认Servlet的名字 -- "SimpleFileServlet"

方案二: 在spring3.0.4以后版本提供了<mvc:resources mapping="" location="" /> 使用方法:

<!-- 对静态资源文件的访问 -->
  <mvc:resources mapping="/images/**" location="/images/" />
  images/**映射到 ResourceHttpRequestHandler进行处理,location指定静态资源的位置.可以是web application根目录下、jar包里面,这样可以把静态资源压缩到jar包中。cache-period 可以使得静态资源进行web cache
  如果出现下面的错误,可能是没有配置<mvc:annotation-driven />的原因。
  报错WARNING: No mapping found for HTTP request with URI [/mvc/user/findUser/lisi/770] in DispatcherServlet with name 'springMVC'
  使用<mvc:resources/>元素,把mapping的URI注册到SimpleUrlHandlerMapping的urlMap中,
  key为mapping的URI pattern值,而value为ResourceHttpRequestHandler,
  这样就巧妙的把对静态资源的访问由HandlerMapping转到ResourceHttpRequestHandler处理并返回,所以就支持classpath目录,jar包内静态资源的访问.
  另外需要注意的一点是,不要对SimpleUrlHandlerMapping设置defaultHandler.因为对static uri的defaultHandler就是ResourceHttpRequestHandler,
  否则无法处理static resources request.

方案三 ,使用<mvc:default-servlet-handler/>

<mvc:default-servlet-handler/>
  会把"/**" url,注册到SimpleUrlHandlerMapping的urlMap中,把对静态资源的访问由HandlerMapping转到 org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler 处理并返回.
  DefaultServletHttpRequestHandler使用就是各个Servlet容器自己的默认Servlet.
  补充说明:多个HandlerMapping的执行顺序问题:
  DefaultAnnotationHandlerMapping的order属性值是:0
  < mvc:resources/ > 自动注册的 SimpleUrlHandlerMapping 的order属性值是: 2147483646
  <mvc:default-servlet-handler/>自动注册 的SimpleUrlHandlerMapping 的order属性值是: [2147483647](http://zhidao.baidu.com/question/1883800724917404028.html?gossl=http%3A%2F%2Fwww.baidu.com%2Fs%3Fwd%3D2147483647%26tn%3D44039180_cpr%26fenlei%3Dmv6quAkxTZn0IZRqIHckPjm4nH00T1Y1nWmznWF-m1whrAmduW6v0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnH63n16snjTzPjbkP1fsPj0zr0)
  spring会先执行order值比较小的。当访问一个a.jpg图片文件时,先通过 DefaultAnnotationHandlerMapping 来找处理器,一定是找不到的,因为我们没有叫a.jpg的Action。然后再按order值升序找,由于最后一个 SimpleUrlHandlerMapping 是匹配 "/**"的,所以一定会匹配上,就可以响应图片。 访问一个图片,还要走层层匹配。不知性能如何?
  最后再说明一下,方案二、方案三 在访问静态资源时,如果有匹配的(近似)总拦截器,就会走拦截器。如果你在拦截中实现权限检查,要注意过滤这些对静态文件的请求。
  如何你的DispatcherServlet拦截 *.do这样的URL后缀,就不存上述问题了。还是有后缀方便。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 197,814评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,124评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 144,814评论 0 327
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,924评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,815评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,562评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,944评论 3 388
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,582评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,859评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,881评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,700评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,493评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,943评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,115评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,413评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,978评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,182评论 2 339

推荐阅读更多精彩内容