前一章讲到页面静态化当中freeMarker标签的使用,这一章我们使用spring mvc结合freeMarker处理大型网站页面静态化.
第一步:引入除spring mvc 所需的jar包(之前系列的文章讲过,大家可以看之前的文章),还需要引入freemarker-xxx.jar commons-logging-xxx.jar
第二步:扩展FreeMarkerView,使我们可以控制是否生成静态页面以及生成的静态页面存放的位置.
-
packagegd.hz;
-
-
importjava.io.BufferedWriter;
-
importjava.io.File;
-
importjava.io.FileOutputStream;
-
importjava.io.IOException;
-
importjava.io.OutputStreamWriter;
-
importjava.io.Writer;
-
importjava.util.Locale;
-
importjava.util.Map;
-
-
importjavax.servlet.ServletException;
-
importjavax.servlet.http.HttpServletRequest;
-
importjavax.servlet.http.HttpServletResponse;
-
-
importorg.springframework.web.servlet.support.RequestContextUtils;
-
importorg.springframework.web.servlet.view.freemarker.FreeMarkerView;
-
-
importfreemarker.template.SimpleHash;
-
importfreemarker.template.Template;
-
importfreemarker.template.TemplateException;
-
-
publicclassExFreeMarkerViewextendsFreeMarkerView{
-
@Override
-
protectedvoiddoRender(Map<String,Object>model,
-
HttpServletRequestrequest,HttpServletResponseresponse)
-
throwsException{
-
-
exposeModelAsRequestAttributes(model,request);
-
-
SimpleHashfmModel=buildTemplateModel(model,request,response);
-
-
if(logger.isDebugEnabled()){
-
logger.debug("RenderingFreeMarkertemplate["+getUrl()+"]inFreeMarkerView'"+getBeanName()+"'");
-
}
-
-
Localelocale=RequestContextUtils.getLocale(request);
-
-
-
-
-
-
-
if(Boolean.FALSE.equals(model.get("STATIC_HTML"))){
-
processTemplate(getTemplate(locale),fmModel,response);
-
}else{
-
createHTML(getTemplate(locale),fmModel,request,response);
-
}
-
}
-
-
publicvoidcreateHTML(Templatetemplate,SimpleHashmodel,HttpServletRequestrequest,
-
HttpServletResponseresponse)throwsIOException,TemplateException,ServletException{
-
-
StringbasePath=request.getSession().getServletContext().getRealPath("/");
-
StringrequestHTML=this.getRequestHTML(request);
-
-
-
StringhtmlPath=basePath+requestHTML;
-
-
FilehtmlFile=newFile(htmlPath);
-
-
if(!htmlFile.getParentFile().exists()){
-
htmlFile.getParentFile().mkdirs();
-
}
-
-
-
-
-
if(!htmlFile.exists()){
-
htmlFile.createNewFile();
-
Writerout=newBufferedWriter(newOutputStreamWriter(newFileOutputStream(htmlFile),"UTF-8"));
-
-
template.process(model,out);
-
out.flush();
-
out.close();
-
}
-
-
request.getRequestDispatcher(requestHTML).forward(request,response);
-
}
-
-
-
-
-
privateStringgetRequestHTML(HttpServletRequestrequest){
-
-
-
StringcontextPath=request.getContextPath();
-
-
-
StringrequestURI=request.getRequestURI();
-
-
-
requestURI=requestURI.replaceFirst(contextPath,"");
-
-
-
requestURI=requestURI.substring(0,requestURI.indexOf("."))+".htm";
-
-
returnrequestURI;
-
}
-
}
这里我们取出STATIC_HTML的值,当为false是就不生成静态页面.
而getRequestHTML()方法是生成静态页面的相对路径,这里我们可以灵活处理,可以决定静态页面的存放路径.
第三步:配置spring mvc配置文件,这里我的文件名为springmvc.xml
-
<?xmlversion="1.0"encoding="UTF-8"?>
-
<beansxmlns="http://www.springframework.org/schema/beans"
-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"
-
xmlns:context="http://www.springframework.org/schema/context"
-
xmlns:mvc="http://www.springframework.org/schema/mvc"
-
xsi:schemaLocation="
-
http://www.springframework.org/schema/beans
-
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
-
http://www.springframework.org/schema/context
-
http://www.springframework.org/schema/context/spring-context-3.0.xsd
-
http://www.springframework.org/schema/mvc
-
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
-
-
<context:component-scanbase-package="gd.hz.controller"></context:component-scan>
-
-
-
<mvc:annotation-driven/>
-
-
-
-
<beanid="viewResolver"
-
class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
-
<propertyname="suffix"value=".ftl"></property>
-
<propertyname="contentType"value="text/html;charset=UTF-8"/>
-
-
-
<propertyname="viewClass"value="gd.hz.ExFreeMarkerView"/>
-
<propertyname="exposeRequestAttributes"value="true"/>
-
<propertyname="exposeSessionAttributes"value="true"/>
-
<propertyname="exposeSpringMacroHelpers"value="true"/>
-
</bean>
-
-
<beanid="fmXmlEscape"class="freemarker.template.utility.XmlEscape"/>
-
-
-
<beanid="freemarkerConfigurer"
-
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
-
-
<propertyname="templateLoaderPath"value="/ftl/"></property>
-
<propertyname="freemarkerVariables">
-
<map>
-
<entrykey="xml_escape"value-ref="fmXmlEscape"/>
-
</map>
-
</property>
-
<propertyname="freemarkerSettings">
-
<props>
-
<propkey="template_update_delay">10</prop>
-
<propkey="defaultEncoding">UTF-8</prop>
-
</props>
-
</property>
-
</bean>
-
-
-
<bean
-
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
-
-
<propertyname="prefix"value="/jsp/"/>
-
<propertyname="suffix"value=".jsp"/>
-
</bean>
-
</beans>
这里页面额外说明的是,如果我们想一个网站有使用freeMarker和jsp时,也可以在配置文件中声明如:
-
<bean
-
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
-
-
<propertyname="prefix"value="/jsp/"/>
-
<propertyname="suffix"value=".jsp"/>
-
</bean>
这句话要声明在使用freeMarker配置下面,这样当处sping 找不到相关页面模板时就会找相关名称的jsp页面.另外还需要声明使用我们扩展的ExFreeMarkerView.
第四步:创建测试页:
模板页:
-
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
-
<html>
-
<head>
-
<metahttp-equiv="Content-Type"content="text/html;charset=UTF-8">
-
<title></title>
-
</head>
-
<body>
-
${content}
-
</body>
-
</html>
JSP页面:
-
<%@pagelanguage="java"contentType="text/html;charset=UTF-8"
-
pageEncoding="UTF-8"%>
-
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
-
<html>
-
<head>
-
<metahttp-equiv="Content-Type"content="text/html;charset=UTF-8">
-
<title></title>
-
</head>
-
<body>
-
我是从jsp过来的.${content}
-
</body>
-
</html
第五步:Controller
-
packagegd.hz.controller;
-
-
importorg.springframework.stereotype.Controller;
-
importorg.springframework.web.bind.annotation.RequestMapping;
-
importorg.springframework.web.servlet.ModelAndView;
-
-
@Controller("indexController")
-
publicclassIndexController{
-
-
@RequestMapping("index")
-
publicModelAndViewindex(){
-
ModelAndViewmodelAndView=newModelAndView("index");
-
modelAndView.addObject("content","网站标题");
-
-
-
modelAndView.addObject("STATIC_HTML",false);
-
-
returnmodelAndView;
-
}
-
-
@RequestMapping("html/index")
-
publicModelAndViewhtmlIndex(){
-
ModelAndViewmodelAndView=newModelAndView("index");
-
-
modelAndView.addObject("content","网站标题");
-
returnmodelAndView;
-
}
-
-
-
@RequestMapping("jsp/index")
-
publicModelAndViewjspindex(){
-
ModelAndViewmodelAndView=newModelAndView("test");
-
modelAndView.addObject("content","网站标题");
-
returnmodelAndView;
-
}
-
}
首先看一下第一个请求,这里我们声明STATIC_HTML=false,不生成静态页面.第二个请求,我们生成的静态页面,根据ExFreeMarkerView中的定义,会跳转到静态页面.
第三个请求,因为没有test.ftl,这样spring 会去找test.jsp页面,所发请求会到test.jsp.
经过上面的三种方法,我们使用在进行大型网站开发时,可以灵活运用,可以在页面的某些数据变化少的地方进行部分页面静态化.也可以根据需求,只请求JSP页面.
分享到:
相关推荐
七、spring mvc 如何访问到静态的文件,如jpg,js,css? 八、spring mvc 请求如何映射到具体的Action中的方法? 九、spring mvc 中的拦截器: 十、spring mvc 如何使用拦截器? 十一、spring mvc 如何实现全局的异常...
二、spring mvc 核心类与接口 三、spring mvc 核心流程图 四、spring mvc DispatcherServlet说明 五、spring mvc 双亲上下文的说明 六、springMVC-mvc.xml 配置文件片段讲解 七、spring mvc 如何访问到静态的文件,...
七、spring mvc 如何访问到静态的文件,如jpg,js,css? 八、spring mvc 请求如何映射到具体的Action中的方法? 九、spring mvc 中的拦截器: 十、spring mvc 如何使用拦截器? 十一、spring mvc 如何实现全局的异常...
本地化:Spring MVC的本地化解析器 本地化:Spring MVC的本地化解析器 LocaleChangeInterceptor:通过URL参数指定 静态资源处理 静态资源处理:使REST风格的URL成为实现 静态资源处理:原理 静态资源处理:如何配置? ...
thymeleaf,我个人认为是个比较好的模板,性能也比一般的,比如freemaker的要高,而且把将美工和程序员能够结合起来,美工能够在浏览器中查看静态效果,程序员可以在应用服务器查看带数据的效果。 thymeleaf是一个...
Spring MVC和springboot静态资源处理.rar
本地化:Spring MVC的本地化解析器 LocaleChangeInterceptor:通过URL参数指定 静态资源处理 静态资源处理:使REST风格的URL成为实现 静态资源处理:原理 静态资源处理:如何配置? 静态资源处理:如何配置? 物理...
支持REST风格的URL 添加更多注解,可完全注解驱动 引入HTTP输入输出转换器...和数据转换、格式化、验证框架无缝集成 对静态资源处理提供特殊支持 更加灵活的控制器方法签名,可完全独立于Servlet API
spring mvc+spring+Mybatis架构 Mybatis分页功能 伪静态配置 spring mvc访问静态资源
ssm(spring+spring mvc+mybatis+maven)高仿bilibili视频网站项目实例 里面包含论坛, 购物商城 网页 后台管理的java项目集成 演示地址: http://106.75.216.49/bilibili/ (服务器不太稳定,可以尝试刷新,感谢...
Spring MVC 3.0新特性: 1.支持REST风格的URL 2.添加更多注解,可完全注解驱动 3.引入HTTP输入输出转换器(HttpMessageConverter)和数据转换、格式化、验证框架无缝集成 4.对静态资源处理提供特殊支持 5.更加...
NULL 博文链接:https://1151461406.iteye.com/blog/2390768
spring mvc 核心类与接口 spring mvc 核心流程图 ...spring mvc 如何访问到静态的文件,如jpg,js,css? spring mvc 处理ajax请求 spring mvc 转发与重定向 如何给spring3 MVC中的Action做JUnit单元测试?
七、spring mvc 如何访问到静态的文件,如jpg,js,css 八、spring mvc 请求如何映射到具体的Action中的方法 九、 spring mvc 中的拦截器: 十、 spring mvc 如何使用拦截器 十一、 spring mvc 如何实现全局的异常处理...
1、采用Spring MVC的静态加载缓存功能,在首页将Javascript文件、CSS文件和图片等静态资源文件加载进来放进内存,极大提高ExtJS的加载速度。 2、三种皮肤主题:经典、灰色和海王星,支持多浏览器和多分辨率。 3、...
1、采用Spring MVC的静态加载缓存功能,在首页将Javascript文件、CSS文件和图片等静态资源文件加载进来放进内存,极大提高ExtJS的加载速度。 2、三种皮肤主题:经典、灰色和海王星,支持多浏览器和多分辨率。 3、...
数据库在项目里面的一个sql文件里面 1、采用Spring MVC的静态加载缓存功能,在首页将Javascript文件、CSS文件和图片等静态资源文件加载进来放进内存,极大提高ExtJS的加载速度。 2、三种皮肤主题:经典、灰色和海王...