zoukankan      html  css  js  c++  java
  • 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等资源
    上面的五种方法各有所长,适用于不同的场景。具体用哪种看自己所需要的场景

  • 相关阅读:
    noi 2011 noi嘉年华 动态规划
    最小乘积生成树
    noi 2009 二叉查找树 动态规划
    noi 2010 超级钢琴 划分树
    noi 2011 阿狸的打字机 AC自动机
    noi 2009 变换序列 贪心
    poj 3659 Cell Phone Network 动态规划
    noi 2010 航空管制 贪心
    IDEA14下配置SVN
    在SpringMVC框架下建立Web项目时web.xml到底该写些什么呢?
  • 原文地址:https://www.cnblogs.com/zhaoyan001/p/6381430.html
Copyright © 2011-2022 走看看