请访问https://blog.csdn.net/shuair/article/details/86645707,
==以下是当年写的,理解的不够准确==
最近在看springmvc,也对springmvc有了新的认识。没什么经验,也许有地方理解错了
前提,使用tomcat启动
问题0:
经过视图解析器后,后缀是.html都找不到页面
警告: No mapping found for HTTP request with URI [/start/WEB-INF/html/404.html] in DispatcherServlet with name 'springmvc',但是你会发现这个路径下是有那个页面的。
个人观点及解决办法:
当我们在地址栏输入一个路径的时候,servlet会识别,进入controller方法,返回一个地址,进入视图解析器,这时候会变成一个完整的路径(后缀.html),感觉就是这个路径是对的,但是就是找不到页面。这个跟tomcat默认的servlet有关,到tomcat路径下的web.xml里面找,至少有两个可用的servlet,一个名字是default,另外一个名字是jsp,看下这两个servlet的配置
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
可以看到default只能拦截/,就是不能拦截带后缀的,但是经过视图解析器后的路径必须要用default拦截(可能是有什么配置吧),所以可以在自己项目的web.xml里面添加一个配置
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
这样就可以访问了。
还有一种方法就是在视图解析器用freemarker,然后后缀配置为.html,这样也可以(注意要把页面添加到freemarker配置的路径下,至于为什么可以,可能有配置吧)。
问题1:
只输入项目名的时候,不能访问到自己想要的页面
个人观点及解决办法:
有人说我在controller的方法上配置里注解/,但还是不行。这是因为在tomcat的web.xml里面还有一个配置。
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
类似于默认访问吧。新建的项目默认都有一个index.jsp,只输入项目名会进入这个页面,那就好理解了,通过上面默认的servlet,可以看出来index.html没有任何servlet拦截,index.htm也是,index.jsp会被名为jsp的servlet拦截,通过这个servlet内部的配置,找到index.jsp的真实位置,然后展示出来。这个时候只要在项目的web.xml里面添加一个配置就可以了
<welcome-file-list>
<welcome-file>index</welcome-file>
</welcome-file-list>
但是要注意的是,这里配了index,在我们自己配置的springmvc的servlet里面的url-pattern里也得配置/index,不然也是找不到了,虽然我们url-pattern可能已经配了/,那也不行。都配置好了,controller的方法上加入注解index,就可以访问自己想要的页面了。
这里有个发现,就是只有自己配置了welcome-file-list,就可以使用/了,除了前面说的那种index都配好的,情况下,都可以进入controller配置/注解的方法。比如,前面说的,把url-pattern里面配置的/index去掉,再访问,就会进入使用/注解的方法。
重新认识这个问题==2018-02-01==重新认识
首先说<url-pattern>/</url-pattern>,/和/*的差别,/也是可以拦截带后缀的请求的,只是优先级较低,要所有servlet都匹配失败才会进行匹配。/*上来就会匹配带后缀的
配置为/看结果
0、访问http://localhost:8080/start/ ,只访问项目名(如果在自己的web.xml里面配置welcome-file,这时可以被注解为/的方法拦截),没有能够拦截的servlet,所以使用tomcat里面web.xml默认的welcome-file,就是index.html,这个时候仍然是没有可以拦截的,所以springmvc的servlet启用第二轮,即拦截带后缀的,也就自然进入了注解配置为index的方法。
1、访问http://localhost:8080/start/index.jsp,tomcat中名为jsp的servlet可以拦截。
2、访问http://localhost:8080/start/index.sss,仍然没有可以拦截的servlet,springmvc启用第二轮拦截,进入了注解配置为index的方法
配置为/*看结果
0、访问http://localhost:8080/start/ ,会匹配注解为/的方法
1、访问http://localhost:8080/start/index.jsp,匹配注解为index的方法
2、访问http://localhost:8080/start/index.sss,匹配注解为index的方法
【疑问】访问http://localhost:8080/start/index.jsp为什么不走名为jsp的servlet,load-on-startup调小也不行