7.4 JSP doBody动作

7.4 doBody

doBody动作元素只能在tag file中使用,它用来调用一个标签的标签体中的内容。在7.3.5小节中我们已经使用到了doBody动作元素,现在我们来介绍更详细的内容。
doBody动作元素也可以有属性。你可以通过这些属性来指定某个变量来接收标签体中的内容,如果不使用这些指令,那么**doBody动作元素会把标签体之中的内容写到JSP页面的JspWriter上**。

doBody动作元素的属性

doBody动作元素的属性见下表所示,所有的**这些属性都是非必须的**。

属性 描述
var 用于保存标签体内容的变量值,标签体内容会以java.lang.String类型保存到这个var变量内。varvarReader属性只能出现一个
varReader 用于保存标签体内容的变量值,标签体内容会以java.io.Reader类型保存到这个varReader变量内。varvarReader属性只能出现一个
scope 变量保存到的作用域

实例

HTTP Referer简介

HTTP Refererheader的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,**referer告诉服务器当前页面是从哪个页面链接过来的**,服务器藉此可以获得一些信息用于处理。比如从我主页上有一个到朋友主页上的链接,他的服务器可以通过HTTP Referer中统计出每天有多少用户通过点击我主页上的链接访问他的网站。

实例说明

下面的这个例子说明了如何用doBody来调用标签本体内容并将内容保存在一个叫作referer的变量中。

假设你有一个卖玩具的商城网站,并且在多个搜索引擎上做了这个玩具网站的广告。现在你想要知道每个搜索引擎为玩具网站带来的流量有多少转化成了购买行为。为了做到这点,你可以记录每个网站首页访问的referer头部信息,使用一个tag file来将referer头信息保存到session属性中。如果某个用户在后续购买了产品,就可以从session属性中获得referer头信息,并记录在数据库中。
这个例子包含了两个表示搜索引擎的HTML文件(searchEngine.html,searchEngine2.html)、两个JSP文件(main.jsp viewReferer.jsp)以及一个tag file (doBodyDemo.tag)。main.jsp页面是玩具网站的首页,使用了doBodyDemo标签来保存referer头信息。viewReferer.jsp页面用来查看收集到的referer头信息。**如果直接通过URL访问main.jsp,那么referer头信息即为null**。因此你必须通过searchEngine.html来链接到main.jsp页面。

doBodyDemo.tag

1
<jsp:doBody var="referer" scope="session"/>

没错,doBodyDemo.tag只有一行:一个doBody动作元素。它指定了一个叫作referersession属性来保存标签的标签体中的内容。

main.jsp

1
2
3
4
5
6
7
8
9
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
上一个页面的URL:${header.referer}
<br/>
<tags:doBodyDemo>
${header.referer}
</tags:doBodyDemo>
<a href="viewReferer.jsp">显示session中的referer属性</a>

main.jsp页面通过文本和EL表达式输出referer头信息(上一个页面的URL)如下:

1
2
上一个页面的URL:${header.referer}
<br/>

main.jsp页面使用了doBodyDemo标签,标签体也输出了referer头信息:

1
2
3
<tags:doBodyDemo>
${header.referer}
</tags:doBodyDemo>

紧接着,输出一个指向ViewReferer页面的链接:

1
<a href="viewReferer.jsp">显示session中的referer属性</a>

viewReferer.jsp文件

1
2
3
4
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 显示referer有界变量 -->
上一个页面的URL:${sessionScope.referer}

viewReferer.jsp页面通过EL表达式将referer中保存的值打印了出来。

searchEngine.html

1
2
<h3>搜索引擎1</h3>
<a href="main.jsp">访问主页</a>

可以通过以下URL访问 searchEngine.html来查看结果:
http://localhost:8080/app07a/searchEngine.html
结果如下图所示:
这里有一张图片
现在点击这个链接跳转到main.jsp页面,main.jsp中获取的referer头信息将包含searchEngine.htmlURL地址。如下图所示:
这里有一张图片
main.jsp页面调用了doBodyDemo元素标签,doBodyDemo标签中通过doBody动作将内容存储在名为referersession属性中。
接下来,点击main.jsp中的View链接,就可以在viewReferer.jsp页面中看到session中的这个内容了,如下图所示.
这里有一张图片

searchEngine2.html

1
2
<h3>搜索引擎2</h3>
<a href="main.jsp">访问主页</a>

searchEngine2.html用来模拟广告所在的第二个页面
可以通过以下URL访问 searchEngine2.html来查看结果:
http://localhost:8080/app07a/searchEngine2.html
这里有一张图片
点击访问主页链接:即可链接到商城主页(main.jsp)显示效果如下:
这里有一张图片