一、springMVC、freemarker页面半自动静态化
2016-06-02 14:55
615 查看
说明:刚刚接到公司的通知,实现(半自动化),即通过参数控制是否需要静态化页面[b](哪里我说错了,勿喷!谢谢)
1,请求.do的URL时直接生成对应的.htm文件,并将请求转发到该htm文件
2,自由控制某个页面是否需要静态化[/b]
![](https://images2015.cnblogs.com/blog/897287/201606/897287-20160602141831477-301992355.jpg)
如果看图不懂的呢,说白了这个中技术就是:java对象+ftl模型=输出html视图
1、在sprinMVC中:MVC框架中的View层组件、Html页面静态化、代码生成工具
2、为什么要用FreeMarker:简单容易学、逻辑分离明确
3、FreeMarker优点:FreeMarker不依赖于Servlet,网络或Web 环境(没一毛钱关系)
maven
一、web.xml配置(配置大部分都一样)
![](https://images2015.cnblogs.com/blog/897287/201606/897287-20160602142520446-1710104633.jpg)
二、在springMVC文件中配置freemarker视图解析器
![](https://images2015.cnblogs.com/blog/897287/201606/897287-20160602142916117-567481301.jpg)
三、建立模型文件(freemarker完全支持el表达式语言)
我的目录是:WebContent/WEB-INF/view/index.ftl,建立一个文件后缀为ftl即可!
四、编写视图解析器(FreeMarkerViewUtil.java),继承自org.springframework.web.servlet.view.freemarker.FreeMarkerView在这里对原类进行扩展
五、测试类(Controller)
访问:http://localhost:1010/springMVC_FreeMarker/home/index1.do,访问index1.do才会生成html文件,生成的html文件是根据@RequestMapping("index1")name决定的.
如果不需要生成静态化页面
![](https://images2015.cnblogs.com/blog/897287/201606/897287-20160602144434774-944467533.jpg)
文件目录
1,请求.do的URL时直接生成对应的.htm文件,并将请求转发到该htm文件
2,自由控制某个页面是否需要静态化[/b]
![](https://images2015.cnblogs.com/blog/897287/201606/897287-20160602141831477-301992355.jpg)
如果看图不懂的呢,说白了这个中技术就是:java对象+ftl模型=输出html视图
1、在sprinMVC中:MVC框架中的View层组件、Html页面静态化、代码生成工具
2、为什么要用FreeMarker:简单容易学、逻辑分离明确
3、FreeMarker优点:FreeMarker不依赖于Servlet,网络或Web 环境(没一毛钱关系)
maven
<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.20</version> </dependency> <dependency> <groupId>freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.8</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.2.4.RELEASE</version> </dependency>
一、web.xml配置(配置大部分都一样)
![](https://images2015.cnblogs.com/blog/897287/201606/897287-20160602142520446-1710104633.jpg)
二、在springMVC文件中配置freemarker视图解析器
![](https://images2015.cnblogs.com/blog/897287/201606/897287-20160602142916117-567481301.jpg)
<!--FreeMarker视图解析器 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> <property name="suffix" value=".ftl" /> <property name="contentType" value="text/html;charset=UTF-8"></property> <property name="viewClass" value="com.freemarker.Controller.FreeMarkerViewUtil" /> <property name="exposeRequestAttributes" value="true" /> <property name="exposeSessionAttributes" value="true" /> <property name="exposeSpringMacroHelpers" value="true" /> </bean> <bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape" /> <!-- Freemarker配置 --> <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath" value="/WEB-INF/view/" /> <property name="freemarkerVariables"> <map> <entry key="xml_escape" value-ref="fmXmlEscape" /> </map> </property> <property name="freemarkerSettings"> <props> <prop key="template_update_delay">1</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>
三、建立模型文件(freemarker完全支持el表达式语言)
我的目录是:WebContent/WEB-INF/view/index.ftl,建立一个文件后缀为ftl即可!
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>演示${title}</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <#list users as user> 测试..............username : ${user.username} 测试..............password : ${user.password} </#list> </body> </html>
四、编写视图解析器(FreeMarkerViewUtil.java),继承自org.springframework.web.servlet.view.freemarker.FreeMarkerView在这里对原类进行扩展
package com.freemarker.Controller; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.Locale; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.support.RequestContextUtils; import org.springframework.web.servlet.view.freemarker.FreeMarkerView; import freemarker.template.SimpleHash; import freemarker.template.Template; import freemarker.template.TemplateException; public class FreeMarkerViewUtil extends FreeMarkerView { @Override protected void doRender(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception { // Expose model to JSP tags (as request attributes). exposeModelAsRequestAttributes(model, request); // Expose all standard FreeMarker hash models. SimpleHash fmModel = buildTemplateModel(model, request, response); if (logger.isDebugEnabled()) { logger.debug("Rendering FreeMarker 模版 [" + getUrl() + "] in FreeMarkerView '" + getBeanName() + "'"); } // Grab the locale-specific version of the template. Locale locale = RequestContextUtils.getLocale(request); /* * 默认生成静态文件,除非在编写ModelAndView时指定CREATE_HTML = false, 这样对静态文件生成的粒度控制更细一点 * 例如:ModelAndView mav = new ModelAndView("search"); * mav.addObject("CREATE_HTML", false); */ if (Boolean.FALSE.equals(model.get("CREATE_HTML"))) { processTemplate(getTemplate(locale), fmModel, response); } else { createHTML(getTemplate(locale), fmModel, request, response); } } public void createHTML(Template template, SimpleHash model, HttpServletRequest request, HttpServletResponse response) throws IOException, TemplateException, ServletException { // 站点根目录的绝对路径 String basePath = request.getSession().getServletContext().getRealPath("/"); String requestHTML = this.getRequestHTML(request); // 静态页面绝对路径 String htmlPath = basePath + requestHTML; System.out.println("静态页面绝对路径===========>>:"+htmlPath); File htmlFile = new File(htmlPath); if (!htmlFile.getParentFile().exists()) { htmlFile.getParentFile().mkdirs(); } if (!htmlFile.exists()) { htmlFile.createNewFile(); } Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlFile), "UTF-8")); // 处理模版 template.process(model, out); out.flush(); out.close(); /* 将请求转发到生成的htm文件 */ request.getRequestDispatcher(requestHTML).forward(request, response); } /** * 计算要生成的静态文件相对路径 因为大家在调试的时候一般在Tomcat的webapps下面新建站点目录的, * 但在实际应用时直接布署到ROOT目录里面,这里要保证路径的一致性。 * * @param request * HttpServletRequest * @return /目录/*.htm */ private String getRequestHTML(HttpServletRequest request) { // web应用名称,部署在ROOT目录时为空 String contextPath = request.getContextPath(); // web应用/目录/文件.do String requestURI = request.getRequestURI(); // basePath里面已经有了web应用名称,所以直接把它replace掉,以免重复 requestURI = requestURI.replaceFirst(contextPath, ""); // 将.do改为.html,稍后将请求转发到此html文件 requestURI = requestURI.substring(0, requestURI.indexOf(".")) + ".html"; return requestURI; } }
五、测试类(Controller)
package com.freemarker.Controller; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import com.spring.vo.User; @Controller @RequestMapping("/home") public class FreeMarkerController { @RequestMapping("index1") public ModelAndView Add(HttpServletRequest request, HttpServletResponse response) { ModelAndView mav = new ModelAndView("index"); User user = new User(); user.setUsername("<h2>小明=========================================================></h2>"); user.setPassword("<a href='https://www.hao123.com/'>百度</a>"); List<User> users = new ArrayList<User>(); users.add(user); mav.addObject("users", users); return mav; } @RequestMapping("index2") public ModelAndView index() { ModelAndView mav = new ModelAndView("index"); mav.addObject("title", "网站标题"); //说明:在这里可以控制不生成静态htm mav.addObject("CREATE_HTML", false); return mav; } }
访问:http://localhost:1010/springMVC_FreeMarker/home/index1.do,访问index1.do才会生成html文件,生成的html文件是根据@RequestMapping("index1")name决定的.
如果不需要生成静态化页面
mav.addObject("CREATE_HTML", false);
![](https://images2015.cnblogs.com/blog/897287/201606/897287-20160602144434774-944467533.jpg)
文件目录
![](https://images2015.cnblogs.com/blog/897287/201606/897287-20160602144851617-1901198842.jpg)
相关文章推荐
- Eclipse GBK批量转UTF-8插件
- 定时器(Spring定时器)使用
- 【Java多线程】同步辅助类CountDownLatch
- Spring切面通知执行的顺序(Advice Order)
- Struts2的国际化和访问资源文件的几种方式
- Maven学习记录(三)--实战引入Spring支持
- 使用springmvc,jsp,结合网页文本编辑器kindEditor实现基本博客编辑功能
- springmvc之下载文件
- 笔记:深入理解java虚拟机-1走进java
- 如何在Eclipse中加载Android源码
- SLF4J(Simple logging facade for Java)【整理】
- 【转】一个不错的eclipse反编译插件
- Java工程师成神之路
- MyEclipse 下载与破解
- Eclipse添加中文javadoc
- 深入Spring:自定义ViewResolver
- Struts2实现CRUD(增 删 改 查)功能实例代码
- Nexus的权限管理
- DelegatingFilterProxy管理过滤器详解
- 电脑卡,eclipse Android stadio 卡,什么都卡解决方法