最近在做SSM整合freemarker的时候遇到许多的问题,在网络上搜罗的资料大部分源自复制粘贴,今天终于通过不断调试,把整体的freemarker视图解析器融入到了SSM框架中,本篇文章总结一下Springmvc配置freemarker视图解析器以及jsp与freemarker双视图解析器。从零开始,每一步都会贴出代码,希望能解决您的问题。
idea2018+普通web项目+jdk1.8+tomcat8.5
注:这里可以使用maven项目搭建,这样会省去很大的一部分麻烦,这里我为了演示,故使用普通的项目来搭建。
声明:因为文章字数限制,这里只演示核心的配置与简单的测试,文章后边会有推荐其他博主的文章以帮助你更好的解决问题,如遇到其他问题可以在左侧侧边栏联系我。
这里需要说明一下:
本人使用的是普通的web项目,大家可以为了便捷的开发使用maven项目。
本人创建基本项目后导入文件产生的基本文件结构如下:
下图中的jar包需要导入,两个标注箭头的jar很关键,经常就会忘记导入,导致各种报错。
maven的pom.xml配置:
4.0.0
xxxx
xxx
0.0.1-SNAPSHOT
war
5.0.1.RELEASE
3.4.5
1.7.7
1.2.17
junit
junit
4.11
test
org.springframework
spring-core
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-oxm
${spring.version}
org.springframework
spring-tx
${spring.version}
org.springframework
spring-jdbc
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-aop
${spring.version}
org.springframework
spring-context-support
${spring.version}
org.springframework
spring-test
${spring.version}
org.mybatis
mybatis
${mybatis.version}
org.mybatis
mybatis-spring
1.2.2
javax
javaee-api
7.0
mysql
mysql-connector-java
5.1.30
commons-dbcp
commons-dbcp
1.2.2
jstl
jstl
1.2
log4j
log4j
${log4j.version}
com.alibaba
fastjson
1.1.41
org.slf4j
slf4j-api
${slf4j.version}
org.slf4j
slf4j-log4j12
${slf4j.version}
org.codehaus.jackson
jackson-mapper-asl
1.9.13
commons-fileupload
commons-fileupload
1.3.1
commons-io
commons-io
2.4
commons-codec
commons-codec
1.9
org.aspectj
aspectjweaver
1.8.10
org.freemarker
freemarker
2.3.23
com.fasterxml.jackson.core
jackson-core
2.7.5
com.fasterxml.jackson.core
jackson-databind
2.7.5
com.fasterxml.jackson.core
jackson-annotations
2.7.5
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/bw_practice?useUnicode=true&characterEncoding=utf8&useSSL=false
jdbc.username=root
jdbc.password=123456
注:本人这里使用的数据库连接驱动包版本为5.1.44,druid数据源包版本为1.0.15;数据库连接驱动包若高于等于8的,需要在连接的url后边加上时区(serverTimezone=Asia/Shanghai)等相关配置,否则会遇到数据库报错。
log4j.rootLogger = ERROR,stdout
#MyBatis logging configuration...
log4j.logger.com.bw=TRACE
# Console output...
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{HH:mm:ss} %5p %c - %m%n
我这里面打满了注释,大部分的配置都会有注释,若还有没有明白的,欢迎下方留言。
同时我在这里提供一份比较干净整洁的双解析器模板:
3600
注:在实际开发中单解析器一般都无法满足实际需要,所以双解析器经常是一般配置;若只需要其中一个,就不用提示了吧。
default
*.js
*.css
/img/*
/fonts/*
/font/*
org.springframework.web.context.ContextLoaderListener
spMVC
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath*:springMVC.xml
1
spMVC
/
charset
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
charset
/*
contextConfigLocation
classpath*:applicationContext*.xml
关于mybatis的mapper文件(省略)。
config与ehcache的配置:
mybatis的延迟加载配置也能配置在spring中,但是那样子做不是很推荐。
视图层结构:
controller:
package com.cc.controller;
import com.cc.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.Map;
@Controller
public class UserController {
@Autowired
private UserService service;
@RequestMapping("/index")
public String index(Map map){
map.put("name","张三");
return "index";//index.ftl
}
@RequestMapping("/list")
public String list(Map map){
map.put("name","张三");
return "list";//list.jsp
}
}
页面的话随便写一下够测试使用就可以了。查看是否能够正确的解析视图。
这里全是干货哦:
①:jar缺失问题:
Caused by:
java.lang.NoClassDefFoundError: org/springframework/ui/freemarker/FreeMarkerConfigurationFactory
这个是由于jar包的问题导致的,查看是否缺失我在文章开头部分的jar,第二个原因可能就是jar冲突的问题,更换某些jar版本尝试,也可以在下方留言。
②:视图解析404,页面调试提示:“HTML 文档的字符编码未声明。如果该文件包含 US-ASCII 范围之外的字符,该文件将在某些浏览器配置中呈现为乱码。页面的字符编码必须在文档或传输协议层声明。”
在页面头部加入以下的声明:
③: 不解析ftl或htm,错误解析jsp(只用jsp视图解析)
这个一定是配置时马虎大意导致的,可以对照前文认真检查。本人在配置ftl的后缀格式时写为了:*.ftl,倒至无法解析ftl,修改为 .ftl后恢复正常解析。
1.在视图解析器中有一个
的配置,这个配置表示解析器的优先级别。我们将FreeMarkerViewResolver的级别设为0,将InternalResourceViewResolver的级别设为1。这样,解析器就会优先使用 FreeMarkerViewResolver 进行解析,如果找不到相应的模板,就使用InternalResourceViewResolver进行解析,如果还找不到页面,就会产生一个404错误!
2.InternalResourceViewResolver比较特殊的,只要视图名传给他,都不会再交给下一个order,而是直接forward,所以他的order应该最大,否则后面的视图解析器都不能有机会处理。
搭建最基本的Spring+Spring MVC+MyBatis+freemarker整合框架https://www.52pojie.cn/thread-691159-1-1.html
freemarker、jsp多视图解析器Spring配置https://blog.csdn.net/qq_34021712/article/details/71147364
赠送一图:图片较大,推荐打开一个新的页面或下载进行查看
感谢大家的批评与建议,感谢能够帮助到您。