文档章节

JSP实现Velocity的layout功能

英强
 英强
发布于 2016/03/08 19:02
字数 679
阅读 704
收藏 6

虽然目前工作时的页面开发一直在用Velocity,但其实我的心是属于JSP的,毕竟那是我第一次接触web开发使用的页面模版技术。JSP很多地方都不错:Eclipse支持得很好;JSTL用起来顺手;还能强大的直接调用Java代码(当然,不鼓励这么干);能自定义各种功能强大的标签等等。

这里要有但是了!但是,没有直接提供类似Velocity的layout功能!这导致写页面的时候,很难避免重复的页面代码。对于一个有代码洁癖和强迫症的程序员来说,不能忍!

后来发现了@红薯 曾经写过一个实现该功能的“软件”:http://www.oschina.net/p/jsplayout

看了之后,启发很大。既然有源码,那就可以拿过来改!我改成了一个静态方法,直接调用即可,感觉使用更简单了。代码很少,就不像红薯那么“厚颜无耻”,发布成一个软件了。先上代码。

public class TemplateUtil {

	private static final String WWW_TPL_PATH = "/WEB-INF/template/www/";
	private static final String LAYOUT_PATH = "/WEB-INF/layout/";
	private static final String SCREEN_CONTENT = "screen_content";

	public static void wwwForward(String layout, String template,
			HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {

		BufferedResponse my_res = new BufferedResponse(resp);
		req.getRequestDispatcher(WWW_TPL_PATH + template).include(req, my_res);
		String screenContent = my_res.getScreenContent();
		req.setAttribute(SCREEN_CONTENT, screenContent);
		req.getRequestDispatcher(LAYOUT_PATH + layout).forward(req, resp);
	}

	public static void wwwForward(String template, HttpServletRequest req,
			HttpServletResponse resp) throws ServletException, IOException {

		req.getRequestDispatcher(WWW_TPL_PATH + template).forward(req, resp);
	}

}

/**
 * Response封装
 */
class BufferedResponse extends HttpServletResponseWrapper {

	StringWriter sout;
	PrintWriter pout;

	public BufferedResponse(HttpServletResponse res) {
		super(res);
		sout = new StringWriter();
		pout = new PrintWriter(sout);
	}

	@Override
	public PrintWriter getWriter() throws IOException {
		return pout;
	}

	protected String getScreenContent() {
		return sout.toString();
	}
}

首先有三个常量:WWW_TPL_PATH,LAYOUT_PATH,SCREEN_CONTENT,分别对应页面文件夹,布局文件夹,页面内容变量名。

接着把这么一个layout功能封装成了一个静态方法 wwwForward(String layout, String template, HttpServletRequest req, HttpServletResponse resp)。传入布局文件名,页面文件名,request,response。

然后我们再看下布局文件的例子,命名为layout.jsp。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
    <div>我是头部</div>
    ${screen_content}
    <div>我是尾部</div>
</body>
</html>

这里的${screen_content}对应上面提到的SCREEN_CONTENT,布局文件的路径记得要跟上面定义的LAYOUT_PATH一致。

接着再看下页面怎么写,页面命名为index.jsp,路径在上面提到的WWW_TPL_PATH下。

<p>Hello, World</p>

是的,就是这么简单。

最后,看看servlet怎么写。

public class IndexServlet extends HttpServlet{

    private static final long serialVersionUID = -1703574459593330679L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        TemplateUtil.wwwForward("layout.jsp", "index.jsp", req, resp);
    }
}

部署项目,运行,访问下这个servlet看看效果!

希望对一样喜欢用JSP开发的程序员有所帮助:-),Enjoy it.

© 著作权归作者所有

英强

英强

粉丝 172
博文 29
码字总数 18802
作品 2
深圳
后端工程师
私信 提问
加载中

评论(3)

英强
英强

引用来自“Dreamlu”的评论

不是原创的,不过感觉特别棒,在上家公司就用上了
是的,其实是根据我文中提到的红薯写的那个软件修改而来的
如梦技术
如梦技术
不是原创的,不过感觉特别棒,在上家公司就用上了
如梦技术
如梦技术
[13]可以看看这个:https://git.oschina.net/596392912/jsp-layout
velocity 调用java方法 找不到类

项目结构 velocity tool java类 public class T { public String msg() { return "难道必须没有报名嘛 会疯掉的!"; } public String getMessage() { return "message"; } public String sayH......

无知的小孩
2015/06/20
1K
6
Velocity模板的漏洞

今天在网上搜Velocity的资料,发现了下面的一个关于Velocity的漏洞报告,先贴出来给大家看下: 简要描述: velocity是J2EE的MVC架构最常用的展示层模板文件,由于性能优秀,极多的J2EE应用,...

山哥
2012/03/02
1K
5
三个用于处理JSP页面布局的开源项目

1. Apache Tiles Apache Tiles是一个JavaEE应用的页面布局框架。Tiles框架提供了一种模板机制,可以为某一类页面定义一个通用的模板,该模板定义了页面的整体布 局。布局由可以复用的多个块组...

红薯
2010/04/24
15.7K
13
浅谈jsp、freemarker、velocity区别

以前做web开发页面层用的基本就是就是,最近公司java项目页面层用的技术是velocity。听说jsp要淘汰,也不知道是真是假,但本人还是比较喜欢jsp的,下面是网上查找的javaweb项目页面3种技术的...

cccyb
2017/10/21
0
0
用eclipse创建一个最简单的velocity项目

必备环境: JDK(不低于1.6建议1.7)、 eclipse java EE版 、tomcat(不低于5建议7.0) 为eclipse安装velocity编辑插件: 在Eclipse的Help->Install New Software... 点击“Add加 Veloeclipse,值...

Yason_Luo
2014/01/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

《生活的难题》的读后感3600字范文

《生活的难题》的读后感3600字范文: 假如我们对丑的事物也能够像对待美的事物那般抱持一种开放、接纳的心态,拥有相同的感受力,那么我们便会发现它们都是充满意义的,而这种认识会使生活变...

原创小博客
22分钟前
1
0
Linux learn(四)

7. Linux磁盘与文件系统管理 文件系统通常会将数据放在不同的区块,权限与属性放置到inode中,至于实际数据则放到datab lock区块中,另外,还有一个超级区块(superblock)会记录整个文件系统...

lazy~
29分钟前
1
0
微信公众号开发(四)

微信公众号开发时常需要一个用户授权绑定的过程。关于微信公众号的用户绑定,一般有如下两种实现方式: (1)通过发送短信验证码的方式; (2)使用用户登录时,向后端传递openid的方式。 使...

织梦之魂
今天
4
0
设计模式-工厂模式

工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端...

HOT_POT
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部