Tag文件和jsp很相似,也有不同,主要的不同在directives。Jsp的directive有include,taglib和page,但tag中有include和taglib,没有page,此外还提供了tag,tag替代了jsp中的page,并提供了tld文件中
tag directive有下面属性,均为可选:
此外,derective还有variable和attribute,同tld中的variable和attribute。variable有description, name-given, name-from-attribute,variable-class, declare, scope属性,同tld,此外还有alias,可以定义在一个本地变量名字来使用tag文件内的变量。attribute属性有 description, name, required, rtexprvalue, type, fragment, deferredValue,deferredValueType, deferredMethod和deferredMethodSignature,同tld。
我们写一个简单的tag文件,作为HTML的模板,方便填入HTML的title,编码等常规内容。新建/WEB-INF/tags/template/main.tag文件,如下:
<%@ tag body-content="scriptless" dynamic-attributes="dynamicAttributes" trimDirectiveWhitespaces="true" %>
<%@ attribute name="htmlTitle" type="java.lang.String" rtexprvalue="true" required="true" %>
<%@ include file="/WEB-INF/jsp/base.jspf" %>
>
我们先补充一下base.jspf:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="template" tagdir="/WEB-INF/tags/template" %>
相应的在web.xml中:
*.jsp
*.jspf
UTF-8
true
/WEB-INF/jsp/base.jspf
true
text/html
下面是一个是用该tag的jsp例子hello.jsp。例子中Hello, Template!就是
Hello, Template!
我们将实现一个简单实用的HTML模板,最上是标题,左边是导航栏,右边是具体内容,如下图。
这里我们定义了两个fragment,分别对应HTML Title和导航栏。在官方文档http://docs.oracle.com/javaee/5/tutorial/doc/bnama.html#bnamr中fragment 如下定义。简单地说,fragment是可以包括html,jsp的一组脚本。
(optional) Whether this attribute is a fragment to be evaluated by the tag handler (true) or a normal attribute to be evaluated by the container before being passed to the tag handler.If this attribute is true:You do not specify the rtexprvalue attribute. The container fixes the rtexprvalue attribute at true.You do not specify the type attribute. The container fixes the type attribute at javax.servlet.jsp.tagext.JspFragment.Defaults to false.
将fragment的内容显示出来:
我们重写main.tag文件
<%@ tag body-content="scriptless" trimDirectiveWhitespaces="true" %>
<%@ attribute name="htmlTitle" type="java.lang.String" rtexprvalue="true" required="true" %>
<%@ attribute name="bodyTitle" type="java.lang.String" rtexprvalue="true" required="true" %>
<%@ attribute name="headContent" fragment="true" required="false" %>
<%@ attribute name="navigationContent" fragment="true" required="true" %>
<%@ include file="/WEB-INF/jsp/base.jspf" %>
Customer Support ::
" />
Multinational Widget Corporation
对于登录界面,没有导航栏,实际上navigationCibtebt无实质内容,我们在main.tag的基础上提供loggedOut.tag。main有四个参数必选参数,在loggedOut.tag中,我们固化当中的两个fragment参数,另两个String参数则作为新tag的参数。我们将重点学习通过
<%@ tag body-content="scriptless" trimDirectiveWhitespaces="true" %>
<%@ attribute name="htmlTitle" type="java.lang.String" rtexprvalue="true" required="true" %>
<%@ attribute name="bodyTitle" type="java.lang.String" rtexprvalue="true" required="true" %>
<%@ include file="/WEB-INF/jsp/base.jspf" %>
" />
main.tag是通用的模板,我们可以具体化到实际的项目中,包括:
在这个例子中,我们将展现如果在fragment中使用其他fragment。
<%@ tag body-content="scriptless" trimDirectiveWhitespaces="true" %>
<%@ attribute name="htmlTitle" type="java.lang.String" rtexprvalue="true" required="true" %>
<%@ attribute name="bodyTitle" type="java.lang.String" rtexprvalue="true" required="true" %>
<%@ attribute name="extraHeadContent" fragment="true" required="false" %>
<%@ attribute name="extraNavigationContent" fragment="true" required="false" %>
<%@ include file="/WEB-INF/jsp/base.jspf" %>
">List Tickets
">Create a Ticket
">List Sessions
">Log Out
用户未登录或者登录失败,重定向至login.jsp,如果登录失败,给出失败提示。
<%--@elvariable id="loginFailed" type="java.lang.Boolean"--%>
<%@ taglib prefix="template" tagdir="/WEB-INF/tags/template" %>
You must log in to access the customer support site.
The username or password you entered are not correct. Please try again.
">
Username
Password
在LoginServlet.jsp中:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
... 判断是否用户登录成功 ...
if(登录失败){
request.setAttribute("loginFailed", true);
request.getRequestDispatcher("/WEB-INF/jsp/view/login.jsp").forward(request, response);
}else{ //登录成功
session.setAttribute("username", username);
request.changeSessionId(); //这里注意一下,基于安全,修改了sessionId。
response.sendRedirect(......);
}
}
我们再看一个基于basic tag的例子,ticketForm.jsp
相关链接: 我的Professional Java for Web Applications相关文章