第一步:新建立一个web项目
第二步:引入需要的jar包
spring.web-3.0.5.jar
freemarker-2.3.16.jar
spring.web.servlet-3.0.5.jar
依赖包
jcl-over-slf4j-1.6.1.jar
第三步:配置web.xml
- <!-- Spring 上下文参数 -->
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:applicationContext.xml</param-value>
- </context-param>
- <!-- Spring 容器启动器 -->
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- <servlet>
- <servlet-name>springmvc</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <!--为DispatcherServlet建树映射 -->
- <servlet-mapping>
- <servlet-name>springmvc</servlet-name>
- <url-pattern>/*</url-pattern>
- </servlet-mapping>
四、添加applicationContext.xml文件
src/applicationContext.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="cms_test" class="com.jeecms.cms.action.directive.TestCms"/>
<bean id="freemarkerConfig"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer" >
<property name="templateLoaderPath" value="/WEB-INF/view/" />
<property name="freemarkerVariables">
<map>
<!-- 自定义标签 -->
<entry key="cms_test" value-ref="cms_test"/>
</map>
</property>
<property name="freemarkerSettings">
<props>
<prop key="template_update_delay">0</prop>
<prop key="default_encoding">UTF-8</prop>
<prop key="number_format">0.##########</prop>
<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
<prop key="classic_compatible">true</prop>
<prop key="template_exception_handler">ignore</prop>
</props>
</property>
</bean>
</beans>
-
五、添加spring MVC的servlet配置文件,命名规则(servlet-name+servlet.xml)
WEB-INF/springmvc-servlet.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<!--视图解释器 -->
<bean id="cms_test" class="com.jeecms.cms.action.directive.TestCms"/>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="suffix">
<value>.ftl</value>
</property>
<property name="contentType" value="text/html;charset=UTF-8"></property>
</bean>
<!-- 地址转发器 -->
<bean name="HelloAction" class="com.qisentech.springmvc.action.HelloWordController" />
<bean id="urlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<!-- 映射URL地址 -->
<prop key="/hello.do">HelloAction</prop>
</props>
</property>
</bean>
</beans>
六、创建控制器Controller类com.qisentech.springmvc.action.HelloWordController.java
/*
* 文 件 名 : com.qisentech.springmvc.action.HelloWordController.java
* 创建日期 : 2013-8-7 11:40:04
* 创 建 者 : yuyong
*/
package com.qisentech.springmvc.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
/**
* <p>Title: </p>
*
* <p>Description: </p>
*
* @author yuyong
* @version 1.0
*/
public class HelloWordController implements Controller {
public ModelAndView handleRequest(HttpServletRequest hsr
, HttpServletResponse hsr1) throws Exception {
ModelAndView mv = new ModelAndView("hello");
mv.addObject("title", "Spring MVC And Freemarker");
mv.addObject("content", " Hello world , test my first spring mvc ! ");
return mv;
}
}
七、将控制器交给Spring MVC进行拦截
添加以下内容到springmvc-servlet.xml
见5的<!-- 地址转发器 -->
八、建立一个自定义标签package com.jeecms.cms.action.directive;
import java.io.IOException;
import java.io.Writer;
import java.util.Map;
import freemarker.core.Environment;
import freemarker.template.TemplateDirectiveBody;
import freemarker.template.TemplateDirectiveModel;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
public class TestCms implements TemplateDirectiveModel {
public void execute(Environment env, Map params, TemplateModel[] loopVars,
TemplateDirectiveBody body) throws TemplateException, IOException {
if (!params.isEmpty()) {
throw new TemplateModelException(
"parameters 此处没有值!");
}
if (loopVars.length != 0) {
throw new TemplateModelException(
" variables 此处没有值!");
}
if (body != null) {
//执行nested body 与FTL中 <#nested> 类似。
body.render(new UpperCaseFilterWriter(env.getOut()));
} else {
throw new RuntimeException("missing body");
}
}
private static class UpperCaseFilterWriter extends Writer {
private final Writer out;
UpperCaseFilterWriter (Writer out) {
this.out = out;
}
public void write(char[] cbuf, int off, int len)
throws IOException {
char[] transformedCbuf = new char[len];
for (int i = 0; i < len; i++) {
transformedCbuf[i] = Character.toUpperCase(cbuf[i + off]);
}
out.write(transformedCbuf);
}
public void flush() throws IOException {
out.flush();
}
public void close() throws IOException {
out.close();
}
}
}
九、在applicationContext.xml中进行配置<property name="freemarkerVariables">
<map>
<!-- 自定义标签 -->
<entry key="cms_test" value-ref="cms_test"/>
</map>
</property><bean id="cms_test" class="com.jeecms.cms.action.directive.TestCms"/>
十、在hello.ftl中引用并且显示<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>${title}</title>
</head>
<body>
${content}
dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
<@cms_test>
bar
<#list ["red", "green", "blue"] as color>
${color}
</#list>
baaz
</@cms_test>
</body>
</html>