Spring集成
添加maven依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.2.17.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>3.2.17.RELEASE</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
配置xml视图解析器
<!-- springMVC核心servlet -->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springMVC.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
配置springMVC.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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation
="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
<!-- 自动扫描指定包下的组件 -->
<context:component-scan base-package="com.oilchem" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 加载 properties 文件 -->
<context:property-placeholder location="classpath:*.properties"/>
<!-- MVC注解支持 -->
<mvc:annotation-driven/>
<!-- 处理controller映射不到的文件 -->
<mvc:default-servlet-handler/>
<!-- 一定要放在viewResolver的前面,这样就先去找freemarker的 -->
<bean id="freeMarkerConfigurer"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/ftl/"/>
<property name="defaultEncoding" value="utf-8" />
<property name="freemarkerSettings">
<props>
<prop key="template_update_delay">1</prop>
<prop key="locale">zh_CN</prop>
<prop key="datetime_format">yyyy-MM-dd</prop><!-- 时间格式化 -->
<prop key="date_format">yyyy-MM-dd</prop>
<prop key="number_format">#.##</prop>
</props>
</property>
</bean>
<bean id="freeMarkerViewResolver"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="cache" value="true" />
<property name="prefix" value="" /><!-- 上面已经配了,这里就不用配啦 -->
<property name="suffix" value=".ftl" />
<property name="contentType" value="text/html;charset=UTF-8" />
<property name="allowSessionOverride" value="true" />
<property name="allowRequestOverride" value="true" />
<property name="exposeSpringMacroHelpers" value="true" />
<property name="exposeRequestAttributes" value="true" />
<property name="exposeSessionAttributes" value="true" />
<property name="requestContextAttribute" value="request" />
</bean>
<!-- 视图解释类 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/view/"/>
<property name="suffix" value=".jsp"/>
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
</bean>
<!-- 文件上传 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
<!-- @AspectJ支持 -->
<aop:aspectj-autoproxy/>
<!-- 全局异常处理 -->
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="defaultErrorView" value="/common/error"/>
<property name="warnLogCategory" value="WARN"/>
</bean>
<!-- <bean id="exceptionHandler" class="com.oilchem.spring.exception.MyExceptionHandler"/>-->
</beans>
总结
上面的操作可以归纳为以下几点
- 添加spring集成必要的jar包
- 配置web.xml中的视图解析器的配置路径,这个springmvc也要求的配置
- 在配置文件中,添加处理springMVC 视图解析器外 的freemarker视图解析器
配置完成后编写模板
- 根据freemarker视图解析器的配置 需要将模板文件配置在如下地址
<property name="templateLoaderPath" value="/ftl/"/>
- 内容如下
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>${username}</h1>
</body>
</html>
编写Controller
@RequestMapping("/toTest")
@ResponseBody
public ModelAndView toTest() {
ModelAndView mv = new ModelAndView();
mv.addObject("username", "test");
mv.setViewName("test");//模板名称
return mv;
}
spring集成后的模板 可以拿到域参数,Spring 自动的将域内的参数设置到了对接数据中;
分析
- 我们知道freemarker 是一个文本模板引擎,为什么能拿到各个域里的参数呢,我们如果不使用spring的管理 自己建立模板会拿到域中参数吗?结果是拿不到的。spring 在管理模板和数据绑定时,自动的绑定了域中参数。这也是freemarker相对jsp缺失的重要一块特性,spring提供了,那freemarker就具备替换jsp的能力了。当然我们自己封装域数据到模板也能达到此效果。
文件生成测试
基本使用
- 在测试Controller中定义如下方法
@RequestMapping("/createPageTest")
@ResponseBody
public String createPageTest(HttpServletRequest request) {
String servletPath = request.getSession().getServletContext().getRealPath("/") + "freemarkerCreate/test.html";
File targetFile = new File(servletPath);
if (!targetFile.getParentFile().exists()) {
targetFile.getParentFile().mkdirs();
}
Configuration configuration = new Configuration(Configuration.getVersion());
configuration.setServletContextForTemplateLoading(request.getServletContext(), "ftl");
try {
Template testTem = configuration.getTemplate("test.ftl");
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("username", "HelloWorld");
FileWriter writer = new FileWriter(targetFile);
testTem.process(paramMap, writer);
writer.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
return "zhengque";
}
执行后服务器会根据模板和数据生成静态的html页面
此时可以通过静态地址请求测试了
最后
- 请熟练掌握freemark语法
https://www.jianshu.com/p/c488709d6430