`

Servlet 3.0 开发手记之---使用Freemarker替代JSP,更快更轻更高效

阅读更多

曾经写过一篇博文《很轻的,Servlet + Freemarker 组合体,没有那么硬~ 》,不过那是基于Servlet 2.× 系列的,今天谈谈如何在Servlet 3.0 下使用Freemarker进行更快的开发方式。

Servlet 3.0的强大、简单的,摆脱以前的约束,重构类名还得需要到web.xml中手动修改,如今再也没有那么多烦恼,当然这仅仅是一个侧面而已,就已经说明了其强大。

Freemarker强大的模板化能力,据说解析速度超越JSP,让讨厌JSP+ JAVA混合体编程的人得到一种解脱,身心的。还有一点就是快速的模型填充,不需要随处可见的JAVA代码,任何角落都是。

总之:Servlet 3.0 + Freemarker, 超级轻的MVC组合,让人愉悦。

闲话短说,先来一个Servlet + JSP组合体:

TemplateTestAction.java

@WebServlet("/test1")
public class TemplateTest1Action extends HttpServlet {
	private static final long serialVersionUID = 6576879808909808L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String id = "1688";
		
		String title = "使用freemarker";
		String content = "这是测试";
		
		request.setAttribute("blog", new UserBlog(id, title, content, new Date()));
		
		request.getRequestDispatcher("/WEB-INF/pages/template1.html").forward(request, response);
	}
}
 

 

@WebServlet("/test ")
public class TemplateTestAction extends HttpServlet {
private static final long serialVersionUID = 88687687987980L;
      
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String id = "1687 ";

String title = "JSP测试 ";
String content = "这是JSP测试 ";

request.setAttribute("blog ", new UserBlog(id, title, content, new Date()));

request.getRequestDispatcher("/WEB-INF/pages/template.jsp ").forward(request, response);
}
}

对应JSP:

<%@page import="java.text.SimpleDateFormat"%>
<%@page import="com.demo.UserBlog"%>
<%@ 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>JSP + Servlet</title>
</head>
<body>
	<%UserBlog blog = (UserBlog)request.getAttribute("blog"); %>
	<h1>ID : <%=blog.getId() %></h1>
	<h5>TITLE : <%=blog.getTitle() %></h5>
	<p>DATETIME : <%=new SimpleDateFormat("yyyy-MM-dd HH:mm").format(blog.getDate()) %></p>
	<div>
	CONTENT : <br/>
	<p><%=blog.getContent() %></p>
	</div>
</body>
</html>
 

 

看看代码,以前大家也都是这么写过来的。

对比一下Servlet + Freemarker :

@WebServlet("/test1")
public class TemplateTest1Action extends HttpServlet {
	private static final long serialVersionUID = 6576879808909808L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String id = "1688";
		
		String title = "使用freemarker";
		String content = "这是测试";
		
		request.setAttribute("blog", new UserBlog(id, title, content, new Date()));
		
		request.getRequestDispatcher("/WEB-INF/pages/template1.html").forward(request, response);
	}
}
 

 

Servlet代码没有发生什么变化,只是这次转向了html文件:

<!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>Freemaker模板测试1</title>
</head>
<body>
	<h1>ID : ${blog.id}</h1>
	<h5>TITLE : ${blog.title}</h5>
	<p>DATETIME : ${blog.date?string("yyyy-MM-dd HH:mm")}</p>
	<div>CONTENT : <br />
	<p>${blog.content}</p>
	</div>
</body>
</html>
 

 

请再次对比一下JSP 和 html文件的区别,您会选择写HTML还是JSP页面呢 ?

 

要想让TemplateTest1Action转向HTML页面生效,您需要配置一个Freemarker的控制器,用以解析html页面。

这里控制器为:TemplateController.java 文件:

@WebServlet(
		urlPatterns = {"*.html"}, // 需要定义Freemarker解析的页面后缀类型
		asyncSupported = false, 
		loadOnStartup = 0, 
		name = "templateController", 
		displayName = "TemplateController", 
		initParams = {
			@WebInitParam(name = "TemplatePath", value = "/"),
			@WebInitParam(name = "NoCache", value = "true"),//定义是否缓存
			@WebInitParam(name = "ContentType", value = "text/html; charset=UTF-8"),// 定义内容类型 
			@WebInitParam(name = "template_update_delay", value = "0"), // 开发环境中可设置为0
			@WebInitParam(name = "default_encoding", value = "UTF-8"),
			@WebInitParam(name = "number_format", value = "0.##########")
		} 
)
public class TemplateController extends FreemarkerServlet {
	private static final long serialVersionUID = 8714019900490761087L;	
}

 

这里仅仅需要继承FreemarkerServlet,再加上一些注解即可,内容代码不用写。当然也可以省去

TemplateController,直接在web.xml文件中配置:

  <servlet>
    <servlet-name>freemarker</servlet-name>
    <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
    <init-param>
      <param-name>TemplatePath</param-name>
      <param-value>/</param-value>
    </init-param>
    <init-param>
      <param-name>NoCache</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>ContentType</param-name>
      <param-value>text/html; charset=UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>template_update_delay</param-name>
      <param-value>0</param-value>
    </init-param>
    <init-param>
      <param-name>default_encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>number_format</param-name>
      <param-value>0.##########</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>freemarker</servlet-name>
    <url-pattern>*.html</url-pattern>
  </servlet-mapping>

 

 

记得把 freemarker-2.3.13.jar 文件扔进WEB-INF/lib 目录下。

 

项目源代码下载地址:

下载地址

 

接下来一篇将体验一下Servlet 3.0 的WebFragment功能,支持组件、功能的插拔,使之可以模块化构造一个站点服务,大的跨越,一个变革,必将受益开发者社区。

 

0
0
分享到:
评论
5 楼 sp42 2014-11-15  
Jonney 写道
不一定非要把java代码写在jsp里啊,你可以用el+jstl。

对 这样更轻
4 楼 lihang999 2012-12-29  
我使用servlet+freemarker这种方式遇到了一个页面跳转的问题,我在csdn上已经寻求解决办法了。劳驾您移步看看怎么解决:http://bbs.csdn.net/topics/390332653?page=1#post-393345689
3 楼 Jonney 2010-07-03  
不一定非要把java代码写在jsp里啊,你可以用el+jstl。
2 楼 mercyblitz 2010-07-03  
对于页面解释型的技术,意义不大! 脱离Servlet框架才是正解。
1 楼 javaDevil 2010-07-03  
在你这个例子差别不大

相关推荐

    基于servlet3.0手写springmvc

    5. **ViewResolver**:视图解析器,负责根据视图名查找实际的视图对象,如JSP、FreeMarker或Thymeleaf。 6. **IoC (Inversion of Control)**:依赖注入是Spring框架的核心特性之一,它使得对象之间的依赖关系可以在...

    spring mvc 3.0-mybatis-freemarker整合

    在本项目中,我们主要探讨的是如何将Spring MVC 3.0、MyBatis 3 和 Freemarker 2.3 这三个强大的技术框架整合在一起,以构建一个高效且灵活的Web应用程序。以下是对这些技术及其整合过程的详细说明: **Spring MVC ...

    spring-boot-starter-freemarker-1.5.4.RELEASE.jar

    spring-boot-starter-freemarker-1.5.4.RELEASE.jar

    freemarker.jar

    camel-freemarker-1.6.4.jar, camel-freemarker-2.8.1.jar, com.springsource.freemarker-2.3.15.jar, com.springsource.freemarker-sources-2.3.15.jar, freemarker-1.4.1.jar, freemarker-2-3-18.jar, freemarker-...

    FreeMarKer+jsp使用(Struts2+Servlet).

    需要注意的是,FreeMarker模板中的Struts2标签使用`&lt;@s.tagname&gt;`,而在JSP中则是`&lt;s:tagname&gt;`。此外,如果遇到中文乱码问题,可以在Struts2的配置文件(如`struts.xml`)中设置字符编码: ```xml ...

    -Panda_face-使用FreeMarker模板引擎实现一个自动代码生成工具,该工具可以

    -Panda_face-使用FreeMarker模板引擎实现一个自动代码生成工具,该工具可以根据数据库表自动生成实体、dao、servlet和简单的表单页面

    freemarker-2.3.22

    在这个"freemarker-2.3.22"的压缩包中,包含了Freemarker 2.3.22版本的相关资源,有助于我们深入了解和使用这个库。 首先,`README.txt`通常包含项目的基本信息、安装指南和快速入门等内容。在这个版本中,它可能...

    spring_servlet3:Spring MVC Servlet 3.0博客的源代码-mvc source code

    通过研究 `spring_servlet3` 项目的源代码,开发者能够更好地掌握 Spring MVC 与 Servlet 3.0 的整合,提升 Web 应用的开发能力。同时,这也是一种很好的学习资源,可以帮助开发者了解现代 Java Web 应用的架构和...

    spring-boot-starter-freemarker-2.0.0.RELEASE

    spring-boot-starter-freemarker-2.0.0.RELEASE

    JavaEE源代码 freemarker-2.3.8

    JavaEE源代码 freemarker-2.3.8JavaEE源代码 freemarker-2.3.8JavaEE源代码 freemarker-2.3.8JavaEE源代码 freemarker-2.3.8JavaEE源代码 freemarker-2.3.8JavaEE源代码 freemarker-2.3.8JavaEE源代码 freemarker-...

    spring-boot-starter-freemarker-1.3.3.RELEASE.jar

    首先,我们来看"spring-boot-starter-freemarker-1.3.3.RELEASE.jar",这是Spring Boot官方提供的一个启动器(Starter),用于简化与Freemarker的集成。Freemarker是一个强大的、轻量级的、基于模板的语言,常用于...

    freemarker-2.3.31-API文档-中文版.zip

    赠送jar包:freemarker-2.3.31.jar; 赠送原API文档:freemarker-2.3.31-javadoc.jar; 赠送源代码:freemarker-2.3.31-sources.jar; 赠送Maven依赖信息文件:freemarker-2.3.31.pom; 包含翻译后的API文档:...

    freemarker-2.3.23jar

    总的来说,`freemarker-2.3.23.jar`作为Freemarker的一个版本,是Java Web开发中的重要工具,它提供了灵活、高效的模板引擎,帮助开发者将数据和视图分离,降低了前端与后端的耦合度,提高了代码的可维护性和可扩展...

    IDEA+Maven+SpringBoot之Web入门(freemarker,jsp)

    在IT行业中,开发Web应用程序是常见的任务之一,而SpringBoot框架因其简洁、高效的特点,成为许多开发者首选的工具。在这个项目中,我们将深入探讨如何在IntelliJ IDEA(IDEA)环境中,结合Maven构建工具,利用...

    SpringMVC 全注解实现 servlet3.0以上的容器支持.docx

    ### SpringMVC全注解实现Servlet 3.0以上容器支持 #### 一、SpringMVC入门 **1.1 Request的处理过程** 在Web开发领域,每一个用户的交互行为都会触发一个HTTP请求(Request),而SpringMVC框架则是管理这些请求...

    jsp、freemarker、velocity简介和对比

    ### jsp、freemarker、velocity简介和对比 在Java Web开发领域,模板引擎是连接后端业务逻辑与前端展示层的重要桥梁。本文将重点介绍三种常用的Java Web模板引擎:JSP(Java Server Pages)、Freemarker以及...

    javax-servlet-api-3.0.1.jar

    7. `javax.servlet.jsp`包:虽然不是直接包含在Servlet API中,但通常与Servlet一起使用,提供了一个用于创建动态网页的简化的编程模型,如JSP页面。 在实际开发中,`javax-servlet-api-3.0.1.jar`通常作为项目的...

    SpringMVC-Spring-Mybatis-Freemarker整合

    【SpringMVC-Spring-Mybatis-Freemarker整合】是一个常见的Java Web开发技术栈,主要涉及了四个关键组件:Spring MVC(模型-视图-控制器)、Spring(核心框架)、Mybatis(持久层框架)以及Freemarker(模板引擎)。...

    freemarker-ide-0.9.14.rar

    它通过集成到IDE中,使得开发者能够更高效地进行Freemarker模板的编写和调试,从而提高整体的开发效率。在Java Web开发中,熟练掌握Freemarker和这类辅助工具,对于提升项目质量和开发速度都有显著帮助。

    SpringMVC精品资源--使用SpringMVC+MyBatis+FreeMarker 创建简单的CMS内容发布系统.zip

    SpringMVC是Spring框架的一部分,专门用于处理Web应用程序的请求-响应模型,而MyBatis是一个轻量级的持久层框架,FreeMarker则是一个动态模板引擎,用于生成HTML或其他格式的输出。以下将详细阐述这三者的核心概念、...

Global site tag (gtag.js) - Google Analytics