`

SpringMVC+FreeMarker实现半自动静态化

阅读更多

 

 感谢imyourgod的原贴http://topic.csdn.net/u/20090613/12/30302a5d-33c0-4ce4-b9e3-cd503dbafac1.html
这里对freemarker的代码进行了修改,效果:
1,请求.do的URL时直接生成对应的.htm文件,并将请求转发到该htm文件
2,自由控制某个页面是否需要静态化

原理:对org.springframework.web.servlet.view.freemarker.FreeMarkerView类进行扩展

第一步:在web.xml中将*.do请求交给SpringMVC

XML code
<servlet> <servlet-name>demo</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/demo-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>demo</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>


第二步:配置/WEB-INF/demo-servlet.xml
XML code
<!--freemarker页面解析器 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> <property name="suffix" value=".ftl"></property> <property name="contentType" value="text/html;charset=UTF-8" /> <!-- <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" /> --> <!-- 将Spring的FreeMarkerView改成我们扩展的View --> <property name="viewClass" value="com.myview.MyFreeMarkerView" /> <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="freemarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath" value="/WEB-INF/freemarker/"></property> <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="defaultEncoding">UTF-8</prop> </props> </property> </bean>


第三步:新建package,com.myview,新建一个MyFreeMarkerView,继承自org.springframework.web.servlet.view.freemarker.FreeMarkerView,在这里对原类进行扩展
Java code
package com.myview; 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 MyFreeMarkerView 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 template [" + 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; 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改为.htm,稍后将请求转发到此htm文件 requestURI = requestURI.substring(0, requestURI.indexOf(".")) + ".htm"; return requestURI; } }


到这里就基本完成了。
一个Controller类的例子:
Java code
package com.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class IndexController { @RequestMapping("/index") public ModelAndView index(){ ModelAndView mav = new ModelAndView("index"); mav.addObject("title", "网站标题"); //在这里可以控制不生成静态htm mav.addObject("CREATE_HTML", false); return mav; } @RequestMapping("/abc/index") public ModelAndView abcindex(){ ModelAndView mav = new ModelAndView("index"); //默认生成htm文件 mav.addObject("title", "网站标题"); return mav; } }
分享到:
评论
2 楼 a52071453 2012-09-06  
XML 错了 LMX你可以到你的生成目录下面看看你就会发现.HTML静态页面了,还有就是这个静态页面最好是 可以共享的页面 独立自主的 还是不建议生成 比较影响效率
1 楼 lmx 2012-07-26  
你好
请问下 就这个例子来说 怎么验证是否静态化成功了

相关推荐

    手动创建 SpringMvc +SpringDataJpa+Hibernate+ freemarker mavenProject+ 环境切换 webDemo

    在本项目中,我们主要探讨如何手动构建一个基于SpringMVC、Spring Data JPA、Hibernate以及FreeMarker模板引擎的Maven工程,同时实现环境切换功能。这个基础框架为日常开发工作提供了必要的支持。 首先,SpringMVC...

    Maven+SpringMVC+Freemarker Demo

    这个"Maven+SpringMVC+Freemarker Demo"是一个基础的Web应用示例,它展示了如何将这三个强大的工具集成到一起,实现一个简洁高效的开发环境。 **1. Maven** Maven是Apache软件基金会开发的一个项目管理和综合工具,...

    SpringBoot+SpringMVC+Freemarker实现单个上传和多个文件上传

    SpringBoot版本的SpringMVC+Freemarker上传案例,地址是localhost:8888/photo/index进入上传页面,默认是三个文件,自己可以屏蔽两个文件就是单个文件的状态了,首先在电脑的D盘新建一个upload的文件夹,...

    maven+springmvc+spring+hibernate+freemarker

    maven管理项目+springmvc+spring+hibernate+freemarker 集成框架。其中注解格式清晰,hibernate进行了代码封装,对开发效率有了提高,对异常进行了封装。freemarker也有优化,参考common包下。对日期工具类有各种...

    Java基于Spring+SpringMVC+MyBatis实现的学生信息管理系统源码.zip

    Java基于Spring+SpringMVC+MyBatis实现的学生信息管理系统源码,SSM+Vue的学生管理系统。 Java基于Spring+SpringMVC+MyBatis实现的学生信息管理系统源码,SSM+Vue的学生管理系统。 Java基于Spring+SpringMVC+...

    SpringMVC+Freemarker+Hibernate整合范例

    4. **整合流程**:在SpringMVC+Freemarker+Hibernate整合中,通常会首先配置Spring的ApplicationContext,包括DataSource、SessionFactory、HibernateTemplate或JPA的相关配置。接着,定义Controller,处理HTTP请求...

    基于SpringMVC+Hibernate实现的在线购物商城.zip

    基于springmvc+Hibernate实现的在线购物商城.zip基于springmvc+Hibernate实现的在线购物商城.zip基于springmvc+Hibernate实现的在线购物商城.zip基于springmvc+Hibernate实现的在线购物商城.zip基于springmvc+...

    springmvc+freemarker+easyUi 框架

    在 "springmvc+freemarker+easyUi" 的集成应用中,Spring MVC 处理用户的请求,调用业务逻辑,将处理结果封装为模型数据。这些数据随后被传递给 Freemarker 模板,Freemarker 根据模板规则将数据渲染成HTML。最后,...

    springmvc+freemarker+shiro

    在这个"springmvc+freemarker+shiro"的小Demo中,开发者可能已经展示了如何将这三个组件集成到一个项目中。SpringMVC处理HTTP请求,调用业务逻辑,然后将数据传递给FreeMarker模板进行渲染。同时,Shiro负责用户的...

    maven+springMvc+freemarker

    Maven是一个项目管理和综合工具,它通过提供一套标准的项目对象模型(Project Object Model,POM),自动化构建流程,包括编译、测试、文档生成、依赖管理等。Maven的POM定义了项目的配置信息,如依赖关系、构建过程...

    【ssm框架】 spring+springMVC+mySQL+myBatis+freemarker+Maven小示例1

    在SpringMVC中,Freemarker模板文件与Java对象结合,生成最终的视图响应。 **Maven**:Maven是项目管理和综合工具,它定义了项目构建的生命周期,管理项目的依赖关系。在这个小示例中,Maven将帮助我们构建项目,...

    springMVC+freemarker整合实例

    SpringMVC和FreeMarker是两种在Java Web开发中广泛使用的技术。SpringMVC是一个轻量级的、基于组件的Web应用框架,它负责处理HTTP请求并分发到对应的控制器进行处理。而FreeMarker则是一个模板引擎,用于动态生成...

    完善的Spring+SpringMVC+Mybatis+easyUI后台管理系统(RESTful API+redis).zip

    完善的Spring+SpringMVC+Mybatis+easyUI后台管理系统(RESTful API+redis).zip 完善的Spring+SpringMVC+Mybatis+easyUI后台管理系统(RESTful API+redis).zip 完善的Spring+SpringMVC+Mybatis+easyUI后台管理系统...

    springMVC+freemarker框架

    **SpringMVC与FreeMarker框架详解** SpringMVC和FreeMarker是Java Web开发中的两个重要组件,它们在构建高效、可维护的Web应用程序中扮演着关键角色。SpringMVC是Spring框架的一部分,主要负责处理HTTP请求和响应,...

    Spring+SpringMVC+MyBatis+Shiro+MySQL+Redis+Maven实现的通用权限管理系统

    Spring+SpringMVC+MyBatis+Shiro+MySQL+Redis+Maven+EasyUI+Bootstrap实现的通用权限管理系统。 Spring+SpringMVC+MyBatis+Shiro+MySQL+Redis+Maven+EasyUI+Bootstrap实现的通用权限管理系统 Spring+SpringMVC+...

    大型商城网站springmvc+freemarker+velocity+ibatis

    标题 "大型商城网站springmvc+freemarker+velocity+ibatis" 暗示了这是一个基于SpringMVC、Freemarker、Velocity和iBatis框架构建的电子商务平台。这个项目可能是一个B2C(Business-to-Consumer)类型的商城,允许...

    javaweb课设基于SpringBoot+SpringMVC+Mybatis实现的手机销售后台管理系统源码.zip

    javaweb课设基于SpringBoot+SpringMVC+Mybatis实现的手机销售后台管理系统源码.zipjavaweb课设基于SpringBoot+SpringMVC+Mybatis实现的手机销售后台管理系统源码.zipjavaweb课设基于SpringBoot+SpringMVC+Mybatis...

    springMvc+freemarker

    在这个"springMvc+freemarker"的项目中,我们可以看到作者用Spring MVC与FreeMarker模板引擎集成创建了一个示例应用。 首先,Spring MVC框架的主要组件包括DispatcherServlet、Controller、Model、View和...

    SpringMVC+Hibernate+Freemarker 干净的框架

    SpringMVC负责业务流程的控制,Hibernate处理数据持久化,而Freemarker则生成动态的用户界面。这种架构模式有助于团队协作,每个成员可以专注于自己负责的部分,提高开发效率。同时,由于它们都是开源项目,有大量的...

    springmvc+mybatis 和一个简单的freemarker代码生成工具

    在实际项目中,一个简单的代码生成工具可能会利用SpringMVC和MyBatis的组合,通过用户输入的表结构信息,自动生成对应的实体类、Mapper接口、Mapper XML文件以及FreeMarker模板。这样的工具可以极大地提高开发效率,...

Global site tag (gtag.js) - Google Analytics