`
a137268431
  • 浏览: 143933 次
文章分类
社区版块
存档分类
最新评论

Spring mvc系列八之 页面静态化(二)

 
阅读更多

前一章讲到页面静态化当中freeMarker标签的使用,这一章我们使用spring mvc结合freeMarker处理大型网站页面静态化.

第一步:引入除spring mvc 所需的jar包(之前系列的文章讲过,大家可以看之前的文章),还需要引入freemarker-xxx.jar commons-logging-xxx.jar

第二步:扩展FreeMarkerView,使我们可以控制是否生成静态页面以及生成的静态页面存放的位置.

Java代码收藏代码
  1. packagegd.hz;
  2. importjava.io.BufferedWriter;
  3. importjava.io.File;
  4. importjava.io.FileOutputStream;
  5. importjava.io.IOException;
  6. importjava.io.OutputStreamWriter;
  7. importjava.io.Writer;
  8. importjava.util.Locale;
  9. importjava.util.Map;
  10. importjavax.servlet.ServletException;
  11. importjavax.servlet.http.HttpServletRequest;
  12. importjavax.servlet.http.HttpServletResponse;
  13. importorg.springframework.web.servlet.support.RequestContextUtils;
  14. importorg.springframework.web.servlet.view.freemarker.FreeMarkerView;
  15. importfreemarker.template.SimpleHash;
  16. importfreemarker.template.Template;
  17. importfreemarker.template.TemplateException;
  18. publicclassExFreeMarkerViewextendsFreeMarkerView{
  19. @Override
  20. protectedvoiddoRender(Map<String,Object>model,
  21. HttpServletRequestrequest,HttpServletResponseresponse)
  22. throwsException{
  23. exposeModelAsRequestAttributes(model,request);
  24. SimpleHashfmModel=buildTemplateModel(model,request,response);
  25. if(logger.isDebugEnabled()){
  26. logger.debug("RenderingFreeMarkertemplate["+getUrl()+"]inFreeMarkerView'"+getBeanName()+"'");
  27. }
  28. Localelocale=RequestContextUtils.getLocale(request);
  29. /*
  30. *在这里我们默认生成静态文件,当ModelAndView有指定STATIC_HTML=false时,就不会输出HTML文件
  31. *例如:ModelAndViewmodelAndView=newModelAndView("htmlTest");
  32. *modelAndView.addObject("STATICHTML",false);
  33. */
  34. if(Boolean.FALSE.equals(model.get("STATIC_HTML"))){
  35. processTemplate(getTemplate(locale),fmModel,response);
  36. }else{
  37. createHTML(getTemplate(locale),fmModel,request,response);
  38. }
  39. }
  40. publicvoidcreateHTML(Templatetemplate,SimpleHashmodel,HttpServletRequestrequest,
  41. HttpServletResponseresponse)throwsIOException,TemplateException,ServletException{
  42. //站点根目录的绝对路径
  43. StringbasePath=request.getSession().getServletContext().getRealPath("/");
  44. StringrequestHTML=this.getRequestHTML(request);
  45. //静态页面绝对路径
  46. StringhtmlPath=basePath+requestHTML;
  47. FilehtmlFile=newFile(htmlPath);
  48. if(!htmlFile.getParentFile().exists()){
  49. htmlFile.getParentFile().mkdirs();
  50. }
  51. /**
  52. *如果静态页面已经存在,就不再创建静态页面.
  53. */
  54. if(!htmlFile.exists()){
  55. htmlFile.createNewFile();
  56. Writerout=newBufferedWriter(newOutputStreamWriter(newFileOutputStream(htmlFile),"UTF-8"));
  57. //处理模版
  58. template.process(model,out);
  59. out.flush();
  60. out.close();
  61. }
  62. /*将请求转发到生成的htm文件*/
  63. request.getRequestDispatcher(requestHTML).forward(request,response);
  64. }
  65. /**
  66. *计算要生成的静态文件相对路径.
  67. */
  68. privateStringgetRequestHTML(HttpServletRequestrequest){
  69. //web应用名称,部署在ROOT目录时为空
  70. StringcontextPath=request.getContextPath();
  71. //web应用/目录/文件.do
  72. StringrequestURI=request.getRequestURI();
  73. //basePath里面已经有了web应用名称,所以直接把它replace掉,以免重复
  74. requestURI=requestURI.replaceFirst(contextPath,"");
  75. //将.do改为.htm,稍后将请求转发到此htm文件
  76. requestURI=requestURI.substring(0,requestURI.indexOf("."))+".htm";
  77. returnrequestURI;
  78. }
  79. }

这里我们取出STATIC_HTML的值,当为false是就不生成静态页面.

而getRequestHTML()方法是生成静态页面的相对路径,这里我们可以灵活处理,可以决定静态页面的存放路径.

第三步:配置spring mvc配置文件,这里我的文件名为springmvc.xml

Xml代码收藏代码
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <beansxmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xsi:schemaLocation="
  7. http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  9. http://www.springframework.org/schema/context
  10. http://www.springframework.org/schema/context/spring-context-3.0.xsd
  11. http://www.springframework.org/schema/mvc
  12. http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
  13. <!--开启注解扫描功能-->
  14. <context:component-scanbase-package="gd.hz.controller"></context:component-scan>
  15. <!--将上面两个注解和并-->
  16. <mvc:annotation-driven/>
  17. <!--freemarker页面解析器-->
  18. <beanid="viewResolver"
  19. class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
  20. <propertyname="suffix"value=".ftl"></property>
  21. <propertyname="contentType"value="text/html;charset=UTF-8"/>
  22. <!--<propertyname="viewClass"value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>-->
  23. <!--将Spring的FreeMarkerView改成我们扩展的View-->
  24. <propertyname="viewClass"value="gd.hz.ExFreeMarkerView"/>
  25. <propertyname="exposeRequestAttributes"value="true"/>
  26. <propertyname="exposeSessionAttributes"value="true"/>
  27. <propertyname="exposeSpringMacroHelpers"value="true"/>
  28. </bean>
  29. <beanid="fmXmlEscape"class="freemarker.template.utility.XmlEscape"/>
  30. <!--配置Freemarker-->
  31. <beanid="freemarkerConfigurer"
  32. class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  33. <!--模版页面存放的位置-->
  34. <propertyname="templateLoaderPath"value="/ftl/"></property>
  35. <propertyname="freemarkerVariables">
  36. <map>
  37. <entrykey="xml_escape"value-ref="fmXmlEscape"/>
  38. </map>
  39. </property>
  40. <propertyname="freemarkerSettings">
  41. <props>
  42. <propkey="template_update_delay">10</prop>
  43. <propkey="defaultEncoding">UTF-8</prop>
  44. </props>
  45. </property>
  46. </bean>
  47. <!--下面要声明在模版后面-->
  48. <bean
  49. class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  50. <!--JSP页面存放的位置-->
  51. <propertyname="prefix"value="/jsp/"/>
  52. <propertyname="suffix"value=".jsp"/>
  53. </bean>
  54. </beans>

这里页面额外说明的是,如果我们想一个网站有使用freeMarker和jsp时,也可以在配置文件中声明如:

Xml代码收藏代码
  1. <bean
  2. class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  3. <!--JSP页面存放的位置-->
  4. <propertyname="prefix"value="/jsp/"/>
  5. <propertyname="suffix"value=".jsp"/>
  6. </bean>

这句话要声明在使用freeMarker配置下面,这样当处sping 找不到相关页面模板时就会找相关名称的jsp页面.另外还需要声明使用我们扩展的ExFreeMarkerView.

第四步:创建测试页:

模板页:

Html代码收藏代码
  1. <!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <head>
  4. <metahttp-equiv="Content-Type"content="text/html;charset=UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. ${content}
  9. </body>
  10. </html>

JSP页面:

Java代码收藏代码
  1. <%@pagelanguage="java"contentType="text/html;charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <metahttp-equiv="Content-Type"content="text/html;charset=UTF-8">
  7. <title></title>
  8. </head>
  9. <body>
  10. 我是从jsp过来的.${content}
  11. </body>
  12. </html

第五步:Controller

Java代码收藏代码
  1. packagegd.hz.controller;
  2. importorg.springframework.stereotype.Controller;
  3. importorg.springframework.web.bind.annotation.RequestMapping;
  4. importorg.springframework.web.servlet.ModelAndView;
  5. @Controller("indexController")
  6. publicclassIndexController{
  7. @RequestMapping("index")
  8. publicModelAndViewindex(){
  9. ModelAndViewmodelAndView=newModelAndView("index");
  10. modelAndView.addObject("content","网站标题");
  11. //当设置false时不生成静态页面
  12. modelAndView.addObject("STATIC_HTML",false);
  13. returnmodelAndView;
  14. }
  15. @RequestMapping("html/index")
  16. publicModelAndViewhtmlIndex(){
  17. ModelAndViewmodelAndView=newModelAndView("index");
  18. //默认是生成静态页面的
  19. modelAndView.addObject("content","网站标题");
  20. returnmodelAndView;
  21. }
  22. //jsp测试
  23. @RequestMapping("jsp/index")
  24. publicModelAndViewjspindex(){
  25. ModelAndViewmodelAndView=newModelAndView("test");
  26. modelAndView.addObject("content","网站标题");
  27. returnmodelAndView;
  28. }
  29. }

首先看一下第一个请求,这里我们声明STATIC_HTML=false,不生成静态页面.第二个请求,我们生成的静态页面,根据ExFreeMarkerView中的定义,会跳转到静态页面.

第三个请求,因为没有test.ftl,这样spring 会去找test.jsp页面,所发请求会到test.jsp.

经过上面的三种方法,我们使用在进行大型网站开发时,可以灵活运用,可以在页面的某些数据变化少的地方进行部分页面静态化.也可以根据需求,只请求JSP页面.

分享到:
评论

相关推荐

    Spring MVC入门教程

    七、spring mvc 如何访问到静态的文件,如jpg,js,css? 八、spring mvc 请求如何映射到具体的Action中的方法? 九、spring mvc 中的拦截器: 十、spring mvc 如何使用拦截器? 十一、spring mvc 如何实现全局的异常...

    Spring MVC 教程 快速入门 深入分析

    二、spring mvc 核心类与接口 三、spring mvc 核心流程图 四、spring mvc DispatcherServlet说明 五、spring mvc 双亲上下文的说明 六、springMVC-mvc.xml 配置文件片段讲解 七、spring mvc 如何访问到静态的文件,...

    SpringMVC框架架构介绍

    七、spring mvc 如何访问到静态的文件,如jpg,js,css? 八、spring mvc 请求如何映射到具体的Action中的方法? 九、spring mvc 中的拦截器: 十、spring mvc 如何使用拦截器? 十一、spring mvc 如何实现全局的异常...

    Spring MVC 3.0实战指南.ppt

    本地化:Spring MVC的本地化解析器 本地化:Spring MVC的本地化解析器 LocaleChangeInterceptor:通过URL参数指定 静态资源处理 静态资源处理:使REST风格的URL成为实现 静态资源处理:原理 静态资源处理:如何配置? ...

    spring mvc整合thymeleaf示例

    thymeleaf,我个人认为是个比较好的模板,性能也比一般的,比如freemaker的要高,而且把将美工和程序员能够结合起来,美工能够在浏览器中查看静态效果,程序员可以在应用服务器查看带数据的效果。 thymeleaf是一个...

    Spring MVC和springboot静态资源处理.rar

    Spring MVC和springboot静态资源处理.rar

    Spring3MVC注解教程.ppt

    本地化:Spring MVC的本地化解析器 LocaleChangeInterceptor:通过URL参数指定 静态资源处理 静态资源处理:使REST风格的URL成为实现 静态资源处理:原理 静态资源处理:如何配置? 静态资源处理:如何配置? 物理...

    Spring MVC 3.0实战指南

    支持REST风格的URL 添加更多注解,可完全注解驱动 引入HTTP输入输出转换器...和数据转换、格式化、验证框架无缝集成 对静态资源处理提供特殊支持 更加灵活的控制器方法签名,可完全独立于Servlet API

    spring mvc+spring+mybatis架构实例

    spring mvc+spring+Mybatis架构 Mybatis分页功能 伪静态配置 spring mvc访问静态资源

    ssm(spring+spring mvc+mybatis+maven)高仿bilibili视频网站项目实例

    ssm(spring+spring mvc+mybatis+maven)高仿bilibili视频网站项目实例 里面包含论坛, 购物商城 网页 后台管理的java项目集成 演示地址: http://106.75.216.49/bilibili/ (服务器不太稳定,可以尝试刷新,感谢...

    Spring MVC 3.0实战指南--陈雄华

    Spring MVC 3.0新特性: 1.支持REST风格的URL 2.添加更多注解,可完全注解驱动 3.引入HTTP输入输出转换器(HttpMessageConverter)和数据转换、格式化、验证框架无缝集成 4.对静态资源处理提供特殊支持 5.更加...

    第四章 Spring MVC Rest风格的url、静态资源标签

    NULL 博文链接:https://1151461406.iteye.com/blog/2390768

    Spring_MVC_教程_快速入门_深入分析

    spring mvc 核心类与接口 spring mvc 核心流程图 ...spring mvc 如何访问到静态的文件,如jpg,js,css? spring mvc 处理ajax请求 spring mvc 转发与重定向 如何给spring3 MVC中的Action做JUnit单元测试?

    SpringMVC入门教程

    七、spring mvc 如何访问到静态的文件,如jpg,js,css 八、spring mvc 请求如何映射到具体的Action中的方法 九、 spring mvc 中的拦截器: 十、 spring mvc 如何使用拦截器 十一、 spring mvc 如何实现全局的异常处理...

    最新JAVA通用后台管理系统(ExtJS 4.2+Hibernate 4.1.7+Spring MVC 3.2.8)Eclipse版本

    1、采用Spring MVC的静态加载缓存功能,在首页将Javascript文件、CSS文件和图片等静态资源文件加载进来放进内存,极大提高ExtJS的加载速度。 2、三种皮肤主题:经典、灰色和海王星,支持多浏览器和多分辨率。 3、...

    Extjs4.0通用后台管理系统源码完整大型项目(ExtJS 4.2+Hibernate 4.1.7+Spring MVC 3.2.8)

    1、采用Spring MVC的静态加载缓存功能,在首页将Javascript文件、CSS文件和图片等静态资源文件加载进来放进内存,极大提高ExtJS的加载速度。 2、三种皮肤主题:经典、灰色和海王星,支持多浏览器和多分辨率。 3、...

    Extjs4.0通用后台管理系统源码完整大型项目(ExtJS 4.2+Hibernate 4.1.7+Spring MVC

    数据库在项目里面的一个sql文件里面 1、采用Spring MVC的静态加载缓存功能,在首页将Javascript文件、CSS文件和图片等静态资源文件加载进来放进内存,极大提高ExtJS的加载速度。 2、三种皮肤主题:经典、灰色和海王...

Global site tag (gtag.js) - Google Analytics