设为首页 收藏本站
查看: 800|回复: 0

[经验分享] spring MVC项目中,欢迎页首页根路径到底是怎么设置的

[复制链接]

尚未签到

发表于 2017-2-28 11:09:46 | 显示全部楼层 |阅读模式
0. 问题: 如何改mvc中项目的欢迎页,或者叫做根路径
  一个东西快弄完了,就剩下一个问题,应该是个小问题。就是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>
  <metahttp-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
publicclassHomeController
{
    @RequestMapping(value ="/", method =RequestMethod.GET)
    publicString 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-controllerpath="/"view-name="index"/>
  如果同时都有。反正只会有一个起作用。一般是先扫描的起作用。谁会先扫描到,就是看和<mvc:annotation-driven />比较,谁在前面。
3. 为什么要去他大爷的
  终于明白事后诸葛亮真的很容易当,完全忘记了事前猪一样!
  这个流程很简单,但是在弄清楚之前却浪费了一个周末去解决。还记得到处网上找,或者下源代码断点研究,或者参考例子对照配置。直到今天上午都没有头绪。始终找不到规律,没有把对根路径的拦截给实现。然后中午按时出去吃个饭,吃完饭回来又摆弄下电脑,发现正在运行的那个项目,一切都尽随心所欲,正常的太不正常。
  难道是mvn tomcat:run 运行时,存在缓存!!!所以每次修改配置文件时,并没有立刻生效。记得之前用mvn tomcat:run或者mvn jetty:run 或者eclipse中的mavent调试,都试过,都不正常的!这次就直接发布到Tomcat6中,每次直接改配置文件,重启,查看。居然就全好了。
  得出如此结论,第一句话,就是maven的大爷遭殃了。
  不过其它一些东西也值得借鉴:

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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-348364-1-1.html 上篇帖子: [Mahout] 完整部署过程 下篇帖子: 一个故事讲清楚NIO
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表