为了账号安全,请及时绑定邮箱和手机立即绑定

SpringMVC集成FreeMarker以及多视图问题解决

标签:
Java

声明:同是新手,哪里不对可以指正,谢谢。

首先我用的maven的web项目。其中引入的jar包
<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <!-- spring相关依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.7.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.39</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.3.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.3.7.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>4.3.7.RELEASE</version>
        </dependency>

        <!-- 日志 -->

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.21</version>
        </dependency>
        <!-- freeMarker -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.23</version>
        </dependency>

        <!-- 工具类,非必需 -->
        <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
            <version>3.2.2</version>
        </dependency>

    </dependencies>

此处需要注意的是:

  1. 暂时不要引入mybatis的jar包,因为该实例没有配置datasource,引入后会直接导致tomcat无法启动。

  2. 不要少了spring-context-support.jar不然在配置freemarderConfig时会有“No setter
    found for property 'templateLoaderPath' ”错误。

 <!--   错误   No setter found for                        property 'templateLoaderPath' in class
'org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer'    -->
<bean id="freemarderConfig"
    class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
    <property name="templateLoaderPath" value="/ftl/"/>  
第二步:配置web.xml

在这里需要加入spring的核心监听器

org.springframework.web.context.ContextLoaderListener

,以及springMVC的请求分发器

org.springframework.web.servlet.DispatcherServlet

web.xml代码如下:


  <display-name>FreeMarkerT</display-name>

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring/applicationContext.xml</param-value>
  </context-param>

    <!-- Bootstraps the root web application context before servlet initialization -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

  <!-- The front controller of this Spring Web application, responsible for handling all application requests -->
    <servlet>
        <servlet-name>springDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/beans/spring-*.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- Map all requests to the DispatcherServlet for handling -->
    <servlet-mapping>
        <servlet-name>springDispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
第三步:指定spring-MVC的视图解析器和spring解析器

在这里需要注意的就是要让FreeMarker的解析器优先级高一些,这样就会优先解析ftl文件。
这个比较简单,这个也不用多说了,大家看一下,有注释。
!!!要注意!!! :定义模版所在的位置(freeMarkerConfigurer的templateLoaderPath属性)后,此处定义后就不能在freeMarkerviewResolver中定义prifix属性,不然会提示 找不到模版!!!

<mvc:annotation-driven></mvc:annotation-driven>
    <mvc:default-servlet-handler></mvc:default-servlet-handler>
    <mvc:resources mapping="/resources/**" location="/webapp/resources/"></mvc:resources>
    <context:component-scan base-package="com.ming.shiroT.controller"></context:component-scan>

    <!--JSP视图解析器-->
    <bean id="viewResolverJsp" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp"/>
        <property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceView"/>
        <property name="order" value="1"/>
    </bean>

    <!-- 配置freeMarker视图解析器 -->
    <bean id="viewResolverFtl" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>
        <property name="contentType" value="text/html; charset=UTF-8"/>
        <property name="exposeRequestAttributes" value="true" />
        <property name="exposeSessionAttributes" value="true" />
        <property name="exposeSpringMacroHelpers" value="true" />
        <property name="cache" value="true" />
        <property name="suffix" value=".ftl" />
        <property name="order" value="0"/>
    </bean>

    <!-- 配置freeMarker的模板路径 -->
    <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <property name="templateLoaderPath" value="/WEB-INF/views/"/>
        <property name="freemarkerVariables">
            <map>
                <entry key="xml_escape" value-ref="fmXmlEscape" />
            </map>
        </property>
        <property name="defaultEncoding" value="UTF-8"/>
        <property name="freemarkerSettings">
            <props>
                <prop key="template_update_delay">3600</prop>
                <prop key="locale">zh_CN</prop>
                <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
                <prop key="date_format">yyyy-MM-dd</prop>
                <prop key="number_format">#.##</prop>
            </props>
        </property>
    </bean>

    <bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape"/>
第四步:定义一个Controller用于不同请求的跳转
/*
     * freeMarker需要返回一个ModelAndView对象,其中可以添加多种数据类型
     */
    @RequestMapping(value="haha",method=RequestMethod.GET)
    public ModelAndView index(){
        System.out.println("进入Index");
        ModelAndView mv = new ModelAndView("index");  
        mv.addObject("message", "Spring MVC And Freemarker");  
        mv.addObject("name", " Hello world , test my first spring mvc ! ");
        String[] s = {"数组1","数组2"};
        List<String> list = Arrays.asList(s);
        mv.addObject("list", list);
        return mv;  
    }
    /*
     * SpringMVC的测试方法
     */
    @RequestMapping(value="home",method=RequestMethod.GET)
    public String home(){
        System.out.println("这里是Home");
        return "home";
    }
第五步:写一个模版ftl文件

注意事项:

  1. 该文件需要放在上面指定的目录下,我上面写的是:(“/WEB-INF/view/”)目录。
  2. 名称与Controller中MovdelAndView相同。我定义的为(”index“),所以模版的名称为:index.ftl
  3. 取集合时,ModelAndView中定义的集合名称和s模版中的<#list list(此处为集合名) as a>保持一致

  4. ${r"代码内容"},这种形式可将代码原样输出到html页面上。

具体内如下 :

     <html>  
      <head>  
            <title>freemarker测试</title>  
        </head>  
        <body>  
        FreeMarker
            <h1>${message},${name}</h1>  
        <p>这里是集合的遍历方法</p>
        <ol>
            <li>list是集合名称</list>
            <li>a是每个元素的名称</list>
            <li>通过${r'${a}'}形式取出即可显示</li>
            </ol>
        <#list list as a>
            ${a}
        </#list>
        </body>  
    </html>  
最后,让我把项目打包分享给能看到最后的勇士们!

war和原项目都有,有什么问题及时交流,谢谢。
分享码:pt95
下载地址:FreeMarkerT1

大家看一下结果:
运行结果

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
25
获赞与收藏
212

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消