前言:
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的整合!!!
觉得对你有帮助就点个赞吧!!
有钱的大爷赞助一下更好了: