关于freemarker在获取静态资源的路径问题处理(${resPath}的正确解析)

说明:如今我们在开发web项目的时候,前端的页面肯定会引入一些静态的资源。使用一些路径配置(像 ${resPath}/static/plugins/demo.js   这种就是)  来代替一些死板的路径写法 (像  ../../../static/plugins/demo.js 这种),不难看出我们用${resPath}就代替了资源的根路径的 。 好了下面就看如何操作。

我所遇到的问题是${resPath}在引入的时候解析出错。

1.这是我用idea写freemarker的页面 引入js和css 的写法

看一下springMVC关于freeMarker配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.3.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">

    <!--扫描-->
    <context:component-scan base-package="com.ready.contorller"></context:component-scan>
    <!--开启注解-->
    <mvc:annotation-driven />
    <!--springMVC添加properties-->
    <context:property-placeholder location="classpath:platform.properties" />
    <!--访问静态资源设置-->
    <mvc:default-servlet-handler />

    <!-- html视图解析器 必须先配置freemarkerConfig,注意html是没有prefix前缀属性的-->
    <bean id="freeMarkerConfigurer"
          class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <property name="templateLoaderPath" value="\WEB-INF\views"></property>
        <property name="defaultEncoding" value="utf-8" />
        <property name="freemarkerSettings">
            <props>
                <prop key="template_update_delay">1</prop>
                <prop key="locale">zh_CN</prop>
                <prop key="datetime_format">yyyy-MM-dd</prop><!-- 时间格式化 -->
                <prop key="date_format">yyyy-MM-dd</prop>
                <prop key="number_format">#.##</prop>
            </props>
        </property>
        <!--静态资源访问路径-->
        <property name="freemarkerVariables">
            <map>
                 <entry key="resPath" value="${resources.server}"/>
            </map>
        </property>

    </bean>


    <bean id="freeMarkerViewResolver"
          class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
        <property name="cache" value="true" />
        <!--<property name="prefix" value="" />&lt;!&ndash; 上面已经配了,这里就不用配啦 &ndash;&gt;-->
        <property name="suffix" value=".ftl" />
        <property name="contentType" value="text/html;charset=UTF-8" />
        <property name="allowSessionOverride" value="true" />
        <property name="allowRequestOverride" value="true" />
        <property name="exposeSpringMacroHelpers" value="true" />
        <property name="exposeRequestAttributes" value="true" />
        <property name="exposeSessionAttributes" value="true" />
        <property name="requestContextAttribute" value="request" />
    </bean>

</beans>

主要看这一段我定义的 ${resPath}

下面是 获取resources.server 的配置文件 

文件内容

#资源路径

resources.server=http://127.0.0.1:8080/ready/

再看一下spring的配置

<?xml version="1.0" encoding="UTF-8"?>
<beans
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:c="http://www.springframework.org/schema/c"
        xmlns:cache="http://www.springframework.org/schema/cache"
        xmlns:util="http://www.springframework.org/schema/util"
        xmlns:task="http://www.springframework.org/schema/task"
        xmlns:oxm="http://www.springframework.org/schema/oxm"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:lang="http://www.springframework.org/schema/lang"
        xmlns:jee="http://www.springframework.org/schema/jee"
        xmlns:jdbc="http://www.springframework.org/schema/jdbc"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/oxm
		http://www.springframework.org/schema/oxm/spring-oxm-4.3.xsd
		http://www.springframework.org/schema/mvc
		http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
		http://www.springframework.org/schema/jee
		http://www.springframework.org/schema/jee/spring-jee-4.3.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-4.3.xsd
		http://www.springframework.org/schema/aop
		http://www.springframework.org/schema/aop/spring-aop.xsd
		http://www.springframework.org/schema/util
		http://www.springframework.org/schema/util/spring-util-4.3.xsd
		http://www.springframework.org/schema/jdbc
		http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd
		http://www.springframework.org/schema/cache
		http://www.springframework.org/schema/cache/spring-cache-4.3.xsd
		http://www.springframework.org/schema/task
		http://www.springframework.org/schema/task/spring-task-4.3.xsd
		http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
		http://www.springframework.org/schema/lang
		http://www.springframework.org/schema/lang/spring-lang-4.3.xsd
		http://www.springframework.org/schema/tx
		http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">

        <!--开启注解-->
        <context:annotation-config />
        <!-- 自动扫描web包 ,将带有注解的类 纳入spring容器管理 -->
        <context:component-scan base-package="com.*">
                <!--controller由springMVC自己扫描-->
                <context:exclude-filter type="annotation" 
                expression="org.springframework.stereotype.Controller" />
        </context:component-scan>

        <!--引入jdbc.properties文件-->
        <bean id="placeholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
                <property name="ignoreUnresolvablePlaceholders" value="true"/>
                <property name="locations">
                        <list>
                                <value>classpath:jdbc.properties</value>
                                <value>classpath:platform.properties</value>
                        </list>
                </property>
        </bean>

        <!--Spring2.5 以后,引入了简化的引入外部文件的方式
        <context:property-placeholder location="classpath:db.properties"/>-->

        <!--配置数据源-->
        <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
                <property name="driverClassName" value="${jdbc.driver}" />
                <property name="url" value="${jdbc.url}" />
                <property name="username" value="${jdbc.username}" />
                <property name="password" value="${jdbc.password}" />
        </bean>
        <!--配置sessionFactory-->
        <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
                <!--这里引入数据源-->
                <property name="dataSource" ref="dataSource" />

                <property name="packagesToScan">
                        <list>
                                <value>com.ready.entity</value>
                        </list>
                </property>
                <property name="hibernateProperties">
                        <props>
                                <!--数据库方言-->
                                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
                                <prop key="hibernate.show_sql">true</prop>
                                <!--表的生成策略-->
                                <prop key="hibernate.hbm2ddl.auto">update</prop>
                                <prop key="hibernate.format_sql">true</prop>
                        </props>
                </property>
        </bean>

        <!--事务-->
        <tx:advice id="txAdvice" transaction-manager="transactionManager">
                <tx:attributes>
                        <tx:method name="save*" propagation="REQUIRED"/>
                        <tx:method name="update*" propagation="REQUIRED" />
                        <tx:method name="delete*" propagation="REQUIRED" />
                        <tx:method name="select*" read-only="true"/>
                </tx:attributes>
        </tx:advice>

        <!--配置事务容器-->
        <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
                <property name="sessionFactory" ref="sessionFactory" />
        </bean>

        <!--启动事务注解-->
        <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />

</beans>

主要看着一段

<!--引入properties文件-->
        <bean id="placeholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
                <property name="ignoreUnresolvablePlaceholders" value="true"/>
                <property name="locations">
                        <list>
                                <value>classpath:jdbc.properties</value>
                                <value>classpath:platform.properties</value>
                        </list>
                </property>
        </bean>

我引入了全部的 properties文件。

那么问题就在于在spring配置xml中 我引入了,按理来说就${resPath}就应该起作用,但是我编译之后系统就报错,找不到js,css. 原因是${resPath}解析失败。

之后我怎么想都找不到原因,突然我脑子一闪,是不是springMVC.xml根本不知道${resPath}来源。然后我在springMVC.xml 也引入了 platform.properties   代码如下:

<!--springMVC添加properties-->
    <context:property-placeholder location="classpath:platform.properties" />

然后重新启动服务 路径就正确显示出来了。

希望写这边博客能帮助和我一样遇到这个问题的小伙伴们!!!

猜你喜欢

转载自blog.csdn.net/weixin_41762316/article/details/82801025
今日推荐