Freemarker整合SpringMVC与JSP配置详解

前言:

jsp是大家最熟悉的技术
优点:
1、功能强大,可以写java代码
2、支持jsp标签(jsp tag)
3、支持表达式语言(el)
4、官方标准,用户群广,丰富的第三方jsp标签库
5、性能良好。jsp编译成class文件执行,有很好的性能表现
缺点:
jsp没有明显缺点,非要挑点骨头那就是,由于可以编写java代码,如使用不当容易破坏mvc结构。


freemarker
优点:
1、不能编写java代码,可以实现严格的mvc分离
2、性能非常不错
3、对jsp标签支持良好
4、内置大量常用功能,使用非常方便
5、宏定义(类似jsp标签)非常方便
6、使用表达式语言
缺点:
1、不是官方标准
2、用户群体和第三方标签库没有jsp多


选择freemarker的原因:
1、性能。velocity应该是最好的,其次是jsp,普通的页面freemarker性能最差(虽然只是几毫秒到十几毫秒的差距)。但是在复杂页面上(包含大量判断、日期金额格式化)的页面上,freemarker的性能比使用tag和el的jsp好。
2、宏定义比jsp tag方便
3、内置大量常用功能。比如html过滤,日期金额格式化等等,使用非常方便
4、支持jsp标签
5、可以实现严格的mvc分离


下面具体讲解如何配合SpringMVC与JSP搭建Freemarker:

1.maven依赖的引入

<!--freemarker相关-->
        <!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.25-incubating</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>4.3.10.RELEASE</version>
        </dependency>

2.freemarker.properties配置文件的配置

## 如果变量为null,转化为空字符串,比如做比较的时候按照空字符串做比较
classic_compatible=true   
##去掉多余的空格,非常有用
whitespace_stripping=true  
##模板更新事件,设置为1秒,正式环境设置为3600秒
#template_update_delay=3600
##模板更新时间,这里配置是1秒更新一次,正式环境,模板不会改变,可以降这个值很大,提高效率,就是被这个参数害死了,老是不更新
template_update_delay=1  
##中国
locale=zh_CN   
##编码utf8
default_encoding=utf_8 
##url编码utf8
url_escaping_charset=utf_8  
##显示日期格式
date_format=yyyy-MM-dd  
##显示时间格式
time_format=HH:mm:ss    
##显示日期格式
datetime_format=yyyy-MM-dd HH:mm:ss   
##数字显示格式
number_format=0.######    
output_encoding=UTF-8


#template_update_delay=1
boolean_format=true,false
#auto_import="/common/index.ftl" as ui
tag_syntax=auto_detect

3.由于用到jsp与freemarker整合,多视图解析器,必须自定义视图解析器,并继承InternalResourceView类,重写其checkResource方法

public class FtlResourceView extends InternalResourceView {

    @Override
    public boolean checkResource(Locale locale) throws Exception {
        File file = new File(this.getServletContext().getRealPath("/") + getUrl());
        return file.exists();// 判断该页面是否存在
    }
}

4.applicationContext-mvc.xml对视图解析器进行配置

<?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:mvc="http://www.springframework.org/schema/mvc"
	   xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop.xsd
		http://www.springframework.org/schema/mvc 
		http://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context.xsd">
	<!-- 全局context类配置 -->
	<mvc:default-servlet-handler />
	<!-- 激活自动代理功能 -->
	<aop:aspectj-autoproxy proxy-target-class="true" />
	<!-- 启动注解扫描 -->
	<mvc:annotation-driven />
	<context:component-scan base-package="com.pionner17"></context:component-scan>
	<!-- start视图配置 -->

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

    <!-- 配置freeMarker视图解析器 -->
    <bean id="freeMarkerViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
        <property name="contentType" value="text/html;charset=UTF-8"/>
        <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>
        <property name="suffix" value=".ftl"/>
        <property name="cache" value="true"/>
        <property name="exposeSessionAttributes" value="true"/>
        <property name="exposeRequestAttributes" value="true"/>
        <property name="exposeSpringMacroHelpers" value="true"/>
        <!-- 在页面中使用${rc.contextPath}就可获得contextPath -->
        <property name="requestContextAttribute" value="rc"/>
        <property name="order" value="0"/>
    </bean>
    <!-- 配置freeMarker的模板路径 -->
    <bean id="FreeMarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <property name="templateLoaderPath" value="/WEB-INF/ftl/"/>
        <property name="freemarkerVariables">
            <map>
                <entry key="xml_escape" value-ref="fmXmlEscape" />
            </map>
        </property>
        <property name="defaultEncoding" value="UTF-8"/>
        <property name="freemarkerSettings" ref="freemarkerConfig"/>

    </bean>

    <bean id="freemarkerConfig" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
        <property name="location" value="classpath:properties/freemarker.properties"/>
    </bean>
    <bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape"/>
</beans>

controller层不变:

@RequestMapping(value = "/product",method = RequestMethod.GET)
    public ModelAndView product(HttpServletRequest request){
        ModelAndView mv = new ModelAndView();
        mv.setViewName("/product");
        PageBounds pageBounds = new PageBounds(1,5, Order.formString("prod_price.asc"));
        PageList<Product> products = productService.getList(null,pageBounds);
        products.getPaginator().getTotalCount();
        mv.addObject("products",products);
        return mv;
    }

视图层:product.ftl

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
${products[0].vendor.vendAddress}
</body>
</html>

可能出现的异常1:

javax.servlet.ServletException: Could not resolve view with name 'test/product' in servlet with name 'DispatcherServlet'
	org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1237)
	org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1037)
	org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:980)
	org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
	org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	org.sitemesh.webapp.contentfilter.ContentBufferingFilter.bufferAndPostProcess(ContentBufferingFilter.java:169)
	org.sitemesh.webapp.contentfilter.ContentBufferingFilter.doFilter(ContentBufferingFilter.java:126)
	org.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:120)
	org.sitemesh.config.ConfigurableSiteMeshFilter.doFilter(ConfigurableSiteMeshFilter.java:163)

此异常的出现是因为你的controller层的ModelAndView导入的包错了,不要怀疑,就是这个原因,曾经困扰了我好久....

错误的ModelAndView导入:

import org.springframework.web.portlet.ModelAndView;

正确的导入:

import org.springframework.web.servlet.ModelAndView;

可能出现的异常2:

当你重要搞定配置运行了,发现成功了,你好开心啊,然后你动态取数据会发现,这尼玛freemarker视图层数据咋不刷新呢?这是因为你没有配置下面这个参数,不要怀疑,就是这样:

##模板更新时间,这里配置是1秒更新一次,正式环境,模板不会改变,可以降这个值很大,提高效率,就是被这个参数害死了,老是不更新
template_update_delay=1 
到此你已经成功配置好springmvc+jsp+freemarker的整合!!!

觉得对你有帮助就点个赞吧!!

有钱的大爷赞助一下更好了:





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值