前一章讲到页面静态化当中freeMarker标签的使用,这一章我们使用spring mvc结合freeMarker处理大型网站页面静态化.
第一步:引入除spring mvc 所需的jar包(之前系列的文章讲过,大家可以看之前的文章),还需要引入freemarker-xxx.jar commons-logging-xxx.jar
第二步:扩展FreeMarkerView,使我们可以控制是否生成静态页面以及生成的静态页面存放的位置.
package gd.hz; 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 ExFreeMarkerView extends FreeMarkerView { @Override protected void doRender(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception { exposeModelAsRequestAttributes(model, request); SimpleHash fmModel = buildTemplateModel(model, request, response); if (logger.isDebugEnabled()) { logger.debug("Rendering FreeMarker template [" + getUrl() + "] in FreeMarkerView '" + getBeanName() + "'"); } Locale locale = RequestContextUtils.getLocale(request); /* * 在这里我们默认生成静态文件,当ModelAndView有指定STATIC_HTML = false时,就不会输出HTML文件 * 例如:ModelAndView modelAndView = new ModelAndView("htmlTest"); * modelAndView.addObject("STATICHTML", false); */ if(Boolean.FALSE.equals(model.get("STATIC_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); } /** * 计算要生成的静态文件相对路径. */ 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; } }
这里我们取出STATIC_HTML的值,当为false是就不生成静态页面.
而getRequestHTML()方法是生成静态页面的相对路径,这里我们可以灵活处理,可以决定静态页面的存放路径.
第三步:配置spring mvc配置文件,这里我的文件名为springmvc.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" 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-scan base-package="gd.hz.controller"></context:component-scan> <!-- 将上面两个注解和并 --> <mvc:annotation-driven /> <!--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="gd.hz.ExFreeMarkerView" /> <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="/ftl/"></property> <property name="freemarkerVariables"> <map> <entry key="xml_escape" value-ref="fmXmlEscape" /> </map> </property> <property name="freemarkerSettings"> <props> <prop key="template_update_delay">10</prop> <prop key="defaultEncoding">UTF-8</prop> </props> </property> </bean> <!-- 下面要声明在模版后面 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- JSP页面存放的位置 --> <property name="prefix" value="/jsp/" /> <property name="suffix" value=".jsp" /> </bean> </beans>
这里页面额外说明的是,如果我们想一个网站有使用freeMarker和jsp时,也可以在配置文件中声明如:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- JSP页面存放的位置 --> <property name="prefix" value="/jsp/" /> <property name="suffix" value=".jsp" /> </bean>
这句话要声明在使用freeMarker配置下面,这样当处sping 找不到相关页面模板时就会找相关名称的jsp页面.另外还需要声明使用我们扩展的ExFreeMarkerView.
第四步:创建测试页:
模板页:
<!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> </head> <body> ${content} </body> </html>
JSP页面:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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> </head> <body> 我是从jsp过来的.${content } </body> </html
第五步:Controller
package gd.hz.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller("indexController") public class IndexController { @RequestMapping("index") public ModelAndView index(){ ModelAndView modelAndView = new ModelAndView("index"); modelAndView.addObject("content", "网站标题"); //当设置false时不生成静态页面 modelAndView.addObject("STATIC_HTML", false); return modelAndView; } @RequestMapping("html/index") public ModelAndView htmlIndex(){ ModelAndView modelAndView = new ModelAndView("index"); //默认是生成静态页面的 modelAndView.addObject("content", "网站标题"); return modelAndView; } //jsp测试 @RequestMapping("jsp/index") public ModelAndView jspindex(){ ModelAndView modelAndView = new ModelAndView("test"); modelAndView.addObject("content", "网站标题"); return modelAndView; } }
首先看一下第一个请求,这里我们声明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.更加...
自己写的模拟在线考试系统,虽然只是个demo(其实就是木有用数据库,用的一个静态集合模拟的,方便快速部署),但是建模和架构都是完整的,包含war和源码,只需把war部署到tomcat服务器中就可以运行
NULL 博文链接:https://1151461406.iteye.com/blog/2390768
七、spring mvc 如何访问到静态的文件,如jpg,js,css 八、spring mvc 请求如何映射到具体的Action中的方法 九、 spring mvc 中的拦截器: 十、 spring mvc 如何使用拦截器 十一、 spring mvc 如何实现全局的异常处理...
spring mvc 核心类与接口 spring mvc 核心流程图 ...spring mvc 如何访问到静态的文件,如jpg,js,css? spring mvc 处理ajax请求 spring mvc 转发与重定向 如何给spring3 MVC中的Action做JUnit单元测试?
1、采用Spring MVC的静态加载缓存功能,在首页将Javascript文件、CSS文件和图片等静态资源文件加载进来放进内存,极大提高ExtJS的加载速度。 2、三种皮肤主题:经典、灰色和海王星,支持多浏览器和多分辨率。 3、...
1、采用Spring MVC的静态加载缓存功能,在首页将Javascript文件、CSS文件和图片等静态资源文件加载进来放进内存,极大提高ExtJS的加载速度。 2、三种皮肤主题:经典、灰色和海王星,支持多浏览器和多分辨率。 3、...