您的位置:首页 > 编程语言 > Java开发

SpringMVC与Freemark整合,多视图完美展示详细完美解决

2015-09-25 10:25 537 查看
在霍金与他的伙伴出的新书中<大设计>有这么一个故事:
金鱼生活在盛满水的圆形缸体中,金鱼看到的外部世界是扭曲的图景。它获得的真实世界的图景也许和我们的不同,但我们如何知道我们的图景就是正确的呢?
我们很可能处在一个巨大的金鱼缸中。真实世界的图景不是唯一的,金鱼眼中看到的,和人类眼中看到的,同样有效。


最近换了份工作,这边的开发环境是2个java,一个UI设计,一个安卓开发,后期听说还会有陆续找UE。在新项目中,由于人员少,发现项目的架构太乱,于是按照自己的经验整合了一遍,在SpringMVC与Freemark整合的时候,老是莫名其妙的出现问题,本质原因不是配置文件的问题,不是代码书写的问题,不是自己不理解的问题,终究是jar包版本以及和jar的问题,在此说下我的出问题在于:

实际应该是:

<!-- freemark -->
		<dependency>
			<groupId>org.freemarker</groupId>
			<artifactId>freemarker</artifactId>
			<version>${freemark-version}</version>
		</dependency>


而我犯得错误是:

<!-- freemark -->
		<dependency>
			<groupId>freemarker</groupId>
			<artifactId>freemarker</artifactId>
			<version>${freemark-version}</version>
		</dependency>


接下来说下在Spring+SpringMVC的项目中如何整合Freemarl,本文适合具备SpringMVC的基础的人观看,不然是看的不大明白的。

先整合好Spring+SpringMVC的项目,再次不在叙说。

整合好之后再导入freemark的jar,我用的maven项目,pom依赖如下:

<!-- 版本定义 -->
	<properties>
		<spring-version>4.2.1.RELEASE</spring-version>
		<freemark-version>2.3.20</freemark-version>
	</properties>


<!-- freemark -->
		<dependency>
			<groupId>org.freemarker</groupId>
			<artifactId>freemarker</artifactId>
			<version>${freemark-version}</version>
		</dependency>


接下来在spring-mvc.xml中整合freemark:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	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.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">
	<context:component-scan base-package="com.lgy.controller"
		use-default-filters="false">
		<context:include-filter type="annotation"
			expression="org.springframework.stereotype.Controller" />
		<context:include-filter type="annotation"
			expression="org.springframework.web.bind.annotation.ControllerAdvice" />
	</context:component-scan>
	<mvc:annotation-driven />

	<!-- 静态资源映射 -->
	<mvc:resources mapping="/static/**" location="/WEB-INF/static/" />

	<!-- 设置freeMarker的配置文件路径 -->
	<bean id="freemarkerConfiguration" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
		<property name="location" value="classpath:config/freemark/freemarker.properties" />
	</bean>

	<!-- 配置freeMarker的模板路径 -->
	<bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape" />
	<bean id="freemarkerConfig"
		class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
		<property name="freemarkerSettings" ref="freemarkerConfiguration" />
		<property name="templateLoaderPath" value="/WEB-INF/jsp/" />
		<property name="freemarkerVariables">
			<map>
				<!-- 设置一些常用全局变量 -->
				<entry key="xml_escape" value-ref="fmXmlEscape" />
			</map>
		</property>
	</bean>

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

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


重点说下如下配置文件:

1.

<!-- 设置freeMarker的配置文件路径 -->
	<bean id="freemarkerConfiguration" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
		<property name="location" value="classpath:config/freemark/freemarker.properties" />
	</bean>


这段配置是配置一些常用的freemark的设置项,我在相应的位置配置的内容如下:

template_update_delay=0
default_encoding=utf-8
number_format=0.##########
datetime_format=yyyy-MM-dd HH:mm:ss
classic_compatible=true
template_exception_handler=ignore


2.

<!-- 配置freeMarker的模板路径 -->
	<bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape" />
	<bean id="freemarkerConfig"
		class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
		<property name="freemarkerSettings" ref="freemarkerConfiguration" />
		<property name="templateLoaderPath" value="/WEB-INF/jsp/" />
		<property name="freemarkerVariables">
			<map>
				<!-- 设置一些常用全局变量 -->
				<entry key="xml_escape" value-ref="fmXmlEscape" />
			</map>
		</property>
	</bean>
说明:

freemarkerSetting:设置项应用

templateLoaderPath:模板文件所在的位置

freemarkerVariables:设置一些全局变量 例如我设置了<entry key="me" value="wo" /> 则可以在页面中${me] 获取到这个值

3.

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


视图解析器:

1.suffix 后缀名为.ftl的文件

2.requestContextAttribute 在页面中可以使用request这个对象 如:${request.contextPath} 就可以获取到项目路径

*重点说下<property name="order" value="0" />

这段熟悉设置代表了在多视图的情况下,优先匹配的顺序。

测试:

controller:

@Controller
@RequestMapping("/freemark")
public class FreeMarkController {
	@RequestMapping("/toJsp")
	public String testToJsp(HttpServletRequest request) {
		request.setAttribute("username", "feng");
		return "test";
	}
}


view视图

1.jsp

<%@ page language="java" pageEncoding="utf-8" isELIgnored="false" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>jsp页面</title>
</head>
<body>
	这是一个jsp页面
</body>
</html>


2.ftl

<#assign base="sss" />
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>freemark页面</title>
</head>
<body>
	   哈哈···${username}  ${request.contextPath}
	 ${xml_escape}  ${me}
</body>
</html>


2个文件在同一目录下/WEB-INF/jsp/ 目录下,会优先找ftl文件,若没有则在找jsp页面,完毕!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: