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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring MVC开发中静态页面访问路径为啥出错相关的知识,希望对你有一定的参考价值。

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>
参考技术A

spring MVC开发中静态页面访问路径出错的原因有很多种,原因也很复杂,下面分析几种常见并给出相应分析和解决方案:

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

 

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

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

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

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

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

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


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

  

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

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

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

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

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

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

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

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

参考技术B 出错的情况多了:
javascript写错了
url拼错了
数据错误

Spring MVC程序中怎么得到静态资源文件css,js,图片文件的路径问题

问题描述
在用springmvc开发应用程序的时候。对于像我一样的初学者,而且还是自学的人,有一个很头疼的问题。那就是数据都已经查出来了,但是页面的样式仍然十分简陋,加载不了css.js,图片等资源文件,如果你输入某个css的文件在浏览器中得到的直接是404错误(例如http://localhost:8080/iMax_view/css/classify.css),表示路径肯定没有错,这是因为你在web.xml中配置的springservlet

]<!-- springmvc前端控制器,rest配置 -->  
<servlet>  
    <servlet-name>springmvc_rest</servlet-name>  
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
    <!-- contextConfigLocation配置springmvc加载的配置文件(配置处理器映射器、适配器等等) 如果不配置contextConfigLocation,默认加载的是/WEB-INF/servlet名称-serlvet.xml(springmvc-servlet.xml) -->  
    <init-param>  
        <param-name>contextConfigLocation</param-name>  
        <param-value>classpath:spring/springmvc.xml</param-value>  
    </init-param>  
</servlet>  
<servlet-mapping>  
    <servlet-name>springmvc_rest</servlet-name>  
    <url-pattern>/</url-pattern>  
</servlet-mapping></span>

这里的这个配置/表示servlet已经拦截了所有的请求,包括css,js等的请求所以请求不到css,js等静态资源
解决方法 1
使用spring mvc resource去读取静态文件
在你的mvc-dispatcher-servlet.xml(springmvc.xml个人的命名不一样)文件里加入如下代码

<!-- 静态资源解析
    包括 :js、css、img、..
     -->
     <mvc:resources location="/js/" mapping="/js/**"/>
     <mvc:resources location="/img/" mapping="/img/**"/>`
     <mvc:resources location="/css/" mapping="/css/**"/>`

这样配置以后就可以访问你的css文件了,这时候你输入(例如http://localhost:8080/iMax_view/css/classify.css)就可以看到你的css代码了
但是这样配置对于新手来说可能会遇到spring加载Resources遇到ConversionFailedException异常这个问题(注意是debug)虽然这个问题不影响程序的使用但是总是不好看的(目前我还没有解决)
后来在网上查才知道是由于配置了

 <!-- 自定义参数绑定 -->
    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <!-- 转换器 -->
        <property name="converters">
            <list>
                <!-- 日期类型转换 -->
                <bean class="cn.itcast.ssm.controller.converter.CustomDateConverter"/>
            </list>
        </property>
    </bean>

这就是导致哪个问题出现的原因,转换失败。出现以下问题但是不影响程序使用(目前我知道的)

[code]org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.util.ArrayList<?> to type java.util.List<org.springframework.core.io.Resource> for value ‘[/css/]‘; nested exception is org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type java.lang.String to type org.springframework.core.io.Resource
    at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:41)
    at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:169)
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:161)
    at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:450)
    at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:496)
    at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:490)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1437)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1396)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1132)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:522)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:607)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:647)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:598)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:661)
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:517)
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:458)
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:138)
    at javax.servlet.GenericServlet.init(GenericServlet.java:158)
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1231)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1144)
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:817)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668)
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:283)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2463)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2452)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:744)

解决方法 2 采用defaultservlet
在web.xml里面配置

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/static/*</url-pattern>
</servlet-mapping>

这样做了之后,所有前缀为css 的请求都交给default servlet 去处理。这样访问css文件就可以访问了
解决方法 3 通过文件扩展名进行处理
在web.xml中配置

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.css</url-pattern>
</servlet-mapping>

解决方法 4 对springservlet 不用restful风格,在url上加上前缀
在web.xml中修改配置

<servlet-mapping> 
    <servlet-name>mvc-dispatcher</servlet-name> 
    <url-pattern>/app</url-pattern> 
</servlet-mapping>

这样做的目的就是让拦截器值拦截以/app开头的url,不去拦截其它的一些资源
解决方法 5 对springservlet不用restful风格 ,在url上加上后缀
在web.xml中修改配置

<servlet-mapping> 
    <servlet-name>mvc-dispatcher</servlet-name> 
    <url-pattern>*.do</url-pattern> 
</servlet-mapping>

这样做的目的是让拦截器只拦截*.do 的url,不拦截css,js等资源
上面的五种方法各有所长,适用于不同的场景。具体用哪种看自己所需要的场景














以上是关于spring MVC开发中静态页面访问路径为啥出错的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot 默认静态资源路径与手动配置访问路径的方法

(转)Spring MVC中处理静态资源的多种方法

Spring MVC中处理静态资源的多种方法

Spring MVC程序中怎么得到静态资源文件css,js,图片文件的路径问题

spring mvc 怎么访问css里面的图片路径

设置 Spring JPA 项目以在 MVC 项目中使用 - 创建 bean 时出错