spring MVC项目中,欢迎页首页根路径到底是怎么设置的

spring MVC项目中,欢迎页首页根路径到底是怎么设置的  

0. 问题: 如何改mvc中项目的欢迎页,或者叫做根路径

这个项目是通过mvn建立的,整个项目的原型就是spring_mvc_jpa_deom_archetype。框架早早建成,即可看到效果。假如项目名称叫做mvn_mvc,其效果如下:

访问根路径

http://localhost:8080/mvn_mvc/

自动跳转到如下路径

http://localhost:8080/mvn_mvc/spring/

接下来的访问都是带着"spring"这个前缀的

http://localhost:8080/mvn_mvc/spring/person/list

很显然不想带着这个“spring”前缀,改名或干掉,直接位于/ 下

问题就是怎么修改这个默认的路径!

1. 缺省的流程

先看看缺省的根路径流程:

web.xml 中什么没有配置任何有关欢迎页的信息!其实这时等效于如下配置:这个会由Web容器最先访问!

//-未指定欢迎页时,缺省等于如下配置。这个应该不同的Web服务器可以设置,但大多数都如此-

<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.html文件,进行了跳转:

<html> <head>   <meta http-equiv="Refresh" content="0; URL=spring/"> </head> </html>

跳转到的url全路径就相当于 http://localhost:8080/mvn_mvc/spring/这个路径就会由mvc 的DispatcherServlet来处理。为什么呢,是因为web.xml中进行了如下url配置:

<servlet>         <servlet-name>appServlet</servlet-name>         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>         <init-param>             <param-name>contextConfigLocation</param-name>             <param-value>/WEB-INF/spring/app/servlet-context.xml</param-value>         </init-param>         <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping>         <servlet-name>appServlet</servlet-name>         <url-pattern>/spring/*</url-pattern> </servlet-mapping>

此时, http://localhost:8080/mvn_mvc/spring/,根据此规则,就会对应为MVC 路径路由中的 /。也就是HomeController。

@Controller public class HomeController {     @RequestMapping(value = "/", method = RequestMethod.GET)     public String home(Model model)     {                return "home";     } }

然后找到对应的home.jsp。

整个流程如此。其实缺省为什么设置这么一个spring路径。主要目的是为了提升spring对url的处理效率。spring/下的分支都交由spring来处理,其它的就可以交由web 服务器。

如果一切都交给spring处理,我们就要将 / 进行拦截。嗯,一定会由很多静态资源、或者其它动态jsp是另有用途,也会先被spring拦截,然后再当做另外来处理。可以是可以,但是效率上就会觉得多了一步。

但是,另一方面,我们在规划url时,可能会尽可能的减短,以方便用户的输入;同时,规划url时,才不会考虑spring的效率呢,也就是url设计先行。这个时候,通常不会有spring这个特定的路径;也就是spring要将就url的规划。也就是要对 / 进行拦截了。

2. 如何直接对根路径进行拦截

还是直接说流程吧:

必须在web.xml中加入如下:

<welcome-file-list>     <welcome-file></welcome-file> </welcome-file-list>

此时,web服务器就知道,根路径不要web服务器来处理,而是由程序自身来处理。这时,index.html也就不起作用了。

然后,根路径就被 HomeCtroller拦截了;因为其中配置了对"/"的映射。

或者,没有controller,只有view,也可以简化,在servlet的配置文件中加入:

<mvc:view-controller path="/" view-name="index"/>

如果同时都有。反正只会有一个起作用。一般是先扫描的起作用。谁会先扫描到,就是看和<mvc:annotation-driven />比较,谁在前面。


难道是mvn tomcat:run 运行时,存在缓存!!!所以每次修改配置文件时,并没有立刻生效。记得之前用mvn tomcat:run或者mvn jetty:run 或者eclipse中的mavent调试,都试过,都不正常的!这次就直接发布到Tomcat6中,每次直接改配置文件,重启,查看。居然就全好了。

  • maven jetty:run运行时,改web.xml 不知道是否会有缓存影响,不能立刻生效;多刷新浏览器。
  • 可以看看项目启动日志,里面每个url映射到哪个controller,都有输出。
  • <mvc:annotation-driven />最好不要多次调用,调用一次,全包扫描一次,会发现日志中出现一遍扫描映射纪录
  • 对路径拦截,/ 和 /* 还是有什么区别。参考:http://bluxte.net/musings/2006/03/29/servletpath-and-pathinfo-servlet-api-weirdness


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值