控制是否执行JSP页面的内容
我们在使用标签时,经常需要控制是否执行标签体内容。例如,判断用户的登录状态,如果用户登录,则执行标签体,否则就不显示。简单标签使用doTag()方法完成判断,如果用户登录,则显示用户名称,如果用户没有登录,则可以抛出javax.servlet.jsp.SkipPageException异常,用于通知JSP容器不再执行标签体内容,这等效于在传统标签的doEndTag()方法中返回SKIP_PAGE常量。
接下来通过显示用户姓名的案例,学习如何使用invoke(Writer out)方法控制标签体内容的执行,具体步骤如下:
(1)编写标签处理器类Welcome.java。Welcome.java的具体实现代码如例1所示。
例1 Welcome.java
1 package cn.itcast.chapter09.simpletag;
2 import java.io.IOException;
3 import javax.servlet.jsp.JspException;
4 import javax.servlet.jsp.PageContext;
5 import javax.servlet.jsp.tagext.SimpleTagSupport;
6 public class Welcome extends SimpleTagSupport {
7 public void doTag() throws JspException, IOException {
8 //获取pageContext对象
9 PageContext pageContext = (PageContext) this.getJspContext();
10 //获取session中名称为user的属性
11 String name = (String)pageContext .getSession()
12 .getAttribute("user");
13 //判断name是否为空,不为空则执行标签体内容
14 if (name != null) {
15 this.getJspBody().invoke(null);
16 }
17 }
18 }
例1的doTag()方法中,检查Session域中是否存在名称为“user”的属性,以此来判断用户是否登录,如果登陆则执行标签体,反之则忽略标签体。
(2)在tld文件中注册标签处理器类。在simpletag.tld文件中增加一个Tag元素,对标签处理器类Welcome进行注册,注册信息如下所示:
<tag>
<name>welcome</name>
<tag-class>cn.itcast.chapter09.simpletag.Welcome</tag-class>
<body-content>scriptless</body-content>
</tag>
由于在<itcast:welcome />标签体中不能包含JSP脚本元素,因此注册信息中将<body-content>元素的值设置为简单标签标签体的默认值scriptless。
(3)编写JSP页面welcome.jsp,用于模拟用户登陆和显示用户信息。welcome.jsp文件如例2所示。
例2 welcome.jsp
1 <%@ page language="java" pageEncoding="GBK"%>
2 <%@taglib uri="/simpleTag" prefix="itcast"%>
3 <html>
4 <head>
5 <title>Welcome Tag</title>
6 </head>
7 <body>
8 <%
9 String username = request.getParameter("username");
10 if (username != null) {
11 session.setAttribute("user", username);
12 }
13 %>
14 欢迎光临本站!
15 <itcast:welcome>
16 亲,您的昵称为:${user }
17 </itcast:welcome>
18 </body>
19 </html>
在例2中,第15~17行代码使用了自定义标签<itcast:welcome>,标签会根据session域中是否有“user”属性来判断第16行的标签体内容是否执行。
(4)启动Tomcat服务器,在浏览器中输入http://localhost:8080/chapter09/welcome.jsp?username=Lee
来访问welcome.jsp页面,浏览器显示的结果如图1所示。
图1 运行结果
从图1中可以看到,由于在URL地址中传入了username参数,<itcast:welcome>标签检测到用户已经登陆,因此显示出了标签体的内容。
(5)重新打开一个浏览器窗口,在地址栏中输入http://localhost:8080/chapter09/welcome.jsp
,这时,浏览器显示的结果如图2所示。
图2 运行结果
从图2可以看到,由于这次访问的URL地址没有传递username参数,<itcast:welcome>标签检测到用户没有登陆,所以没有显示出标签体的内容。