丶男儿当自强的gravatar头像
丶男儿当自强 2015-07-11 23:55:44

spring MVC开发中静态页面访问路径为什么出错?

今天在搭建springMVC项目练手的时候,碰到一个之前没遇到过的问题,在这里请教一下各位大神。

问题是这样,在web.xml中配置dispatcherServlet时,拦截所有请求,在页面上的资源加载和访问,请求路径都是写的相对路径,但是在经过controller返回页面的时候,此时所有的请求路径(包括静态资源)都会给我自动加上一个类似于struts中的namespace字段,导致路径异常访问不了

描述不是太清楚,大家配合截图,应该能更明了

项目结构:maven项目

spring MVC开发中静态页面访问路径为什么出错?

项目首页:在这里是没有任何问题,因为这里是直接访问jsp页面,而并非是经过后台返回页面

spring MVC开发中静态页面访问路径为什么出错?

spring MVC开发中静态页面访问路径为什么出错?

学校controller:访问学生列表,从这里返回到前端list页面

spring MVC开发中静态页面访问路径为什么出错?

学生列表:前端jsp页面,图中的js加载路径中加入“../”,直接从根目录获取js,这样也是没问题的

spring MVC开发中静态页面访问路径为什么出错?spring MVC开发中静态页面访问路径为什么出错?

若是js看不太明显,这里大家可以看到,只要是访问http://localhost:8080/SSM/school/*.action之后,此时页面上的所有请求访问都会被限制到http://localhost:8080/SSM/school这里,因为写的是绝对路径

spring MVC开发中静态页面访问路径为什么出错?

不知道大家有没有看明白。其实这个问题说起来也没有什么恶劣的影响,解决办法也很简单,我们只需要将项目的path设置“/”,这样直接访问http://localhost:8080即可,不用带上项目名称SSM,在所有的请求里面,也只需要在前面加上一个“/”。但是有一个问题,若是一台服务器上发布了一个以上的项目,这时候http://localhost:8080就不能确定到底访问的是哪一个项目了,所以就还是需要加上项目名称来区分,可是这样又会出现上述问题,好纠结,求大神指点一下。(之前一直没发现,是因为之前的项目中path就直接是“/”)

spring MVC开发中静态页面访问路径为什么出错?

所有回答列表(9)
最代码官方的gravatar头像
最代码官方  LV168 2015年7月12日

你的这个提问涉及的路径问题挺多,也是有些开发者经常会遇到的问题,按我的经验给你说下。

1.java web容器中项目部署时的访问路径

一般网站部署后,访问路径是不带项目名称的,比如最代码的服务器部署目录:/data/www/zuidaima/,在tomcat的conf/server.xml中host的访问配置是:

<Host name="localhost"  appBase="webapps"
            unpackWARs="false" autoDeploy="false"
            xmlValidation="false" xmlNamespaceAware="false">
   <Context docBase="/data/www/zuidaima/" path="/">
</Host>

这样http的访问地址就是http://www.zuidaima.com/

而在eclipse jee集成tomcat版本本地开发时,eclipse的配置中path的配置是带有项目路径的

spring MVC开发中静态页面访问路径为什么出错?

所以访问的时候除了要有端口外,还得带上项目路径,比如:http://localhost:8080/zuidaima/

建议Path设置为空,这样本地debug时,所有访问路径和线上是一致的,不会出现线上访问404的情况。

2.mvc开发中view层中访问路径的问题

比如jsp中配置静态页面的地址:

<link href="/resource/css/bootstrap.min.css" rel="stylesheet" />

则该文件在项目的本地目录则是:/data/www/zuidaima/resource/css/bootstrap.min.css,则其通过http访问是http://www.zuidaima.com/resource/css/bootstrap.min.css

其中/resource/css/bootstrap.min.css以/开头则表示是相对于项目根目录而言,则本地访问中,根目录配置是:/data/www/zuidaima/,而web网页http访问中根路径是http://www.zuidaima.com/。

但是如果出现resource/css/bootstrap.min.css的不以/开头的配置,则其访问路径是相对于当前访问目录而言的,比如在最代码首页,分享页,这样配置,所有文件都是可以访问的,因为首页当前目录就是/根目录,但是如果访问比如:http://www.zuidaima.com/user/2318804493993984.htm,这样访问就404错误,http真实访问目录是:http://www.zuidaima.com/user/resource/css/bootstrap.min.css,这样对照到服务器资源明显就是错误的路径,所以出现这样的配置:

<link href="../resource/css/bootstrap.min.css" rel="stylesheet" />

相当于http://www.zuidaima.com/user/../resource/css/bootstrap.min.css,这样和http://www.zuidaima.com/resource/css/bootstrap.min.css是一个作用,是否有点豁然贯通了?

所以建议在web开发中,尽量是用相对路径的根目录配置法,这样一目了然,http访问路径和服务器配置路径是一一对应的,当然在很多情况下,静态资源和动态请求是分开域名提供服务的,比如最代码的css是:http://static.zuidaima.com/resource/css/bootstrap.min.css,这样如果不在同一个域名那只能通过绝对路径访问了。

评论(5) 最佳答案
丶男儿当自强的gravatar头像
丶男儿当自强  LV13 2015年7月12日

可是对于我的.action请求而言,并不能在访问的时候控制访问根路径,只能针对js这种静态资源才可以,还是说我理解错您的意思了?

weixiaoba的gravatar头像
weixiaoba  LV5 2015年7月12日

在你的springmvc的配置文件中添加如下配置,设置静态资源访问uri

resources/请按自己实际替换

 

<!--设置静态资源访问  -->
    <mvc:resources location="/resources/" mapping="/resources/**"/>

jia881109的gravatar头像
jia881109 2015年7月13日

顶顶顶~

wangjt的gravatar头像
wangjt  LV1 2015年7月15日

调转路径设置的正确吗?

枫ˇ叶的gravatar头像
枫ˇ叶  LV9 2015年7月16日

把school_list放到webinf下面试试

DrSoul的gravatar头像
DrSoul  LV4 2015年7月16日

这是个常识性的问题,绝对路径和相对路径!!!

shengke的gravatar头像
shengke  LV17 2015年7月16日

在请求路径前面加上项目地址就行了<%=request.getContextPath()%>/

<form method="get" action="<%=request.getContextPath()%>/login.do">

<script src="<%=request.getContextPath()%>/css/bower_components/jquery/dist/jquery.min.js"></script>

ccpual的gravatar头像
ccpual  LV3 2015年7月16日

嗯~就是路径使用问题,这个我也遇到过,你在浏览器调试审查元素的时候就能看出来,引用js,css一定要注意路径写法问题。

顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友