Java for Web学习笔记(三六):自定义tag(4)自定义Tag文件

Tag文件中的Directives

Tag文件和jsp很相似,也有不同,主要的不同在directives。Jsp的directive有include,taglib和page,但tag中有include和taglib,没有page,此外还提供了tag,tag替代了jsp中的page,并提供了tld文件中的配置功能。

tag directive有下面属性,均为可选:

  • pageEncoding:同page中的含义,定义tag输出的编码。
  • isELIgnored:同page中的含义,要求container不计算EL表达式,缺省为false。
  • language:同page中的含义,目前只支持java。
  • deferredSyntaxAllowedAsLiteral:同page中的含义,要求container忽略和不对延迟EL语法进行解析。
  • trimDirectiveWhitespaces:同page中的含义,将directives周围的空格trim掉。
  • import:同page中的含义,可以引入java类,多个通过逗号分隔。
  • descriptiondisplay-namesmall-iconlarge-icon:通tld中的定义,略
  • body-content:是tld种的body-content的替代,但略有差异,有效值为empty, scriptless和tagdependent,没有jsp,即在tag文件中不允许使用scriptlets和expressions。缺省值为scriptless。
  • dynamic-attributes:同tld,表明是否允许动态属性,缺省为空,即不支持动态属性。如果需要设置,则设置为你需要获得所有动态变量的EL名字,这个EL是Map类型,key是动态变量的名字,value是动态变量的值。
  • example:同tld,但在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。

一个简单的HTML模板Tag

我们写一个简单的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" %>





         
     >

     
     	
     	
        <c:out value="${fn:trim(htmlTitle)}" />
    

    
    
        
    

我们先补充一下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模板

更为复杂的的tag文件:main.tag

我们将实现一个简单实用的HTML模板,最上是标题,左边是导航栏,右边是具体内容,如下图。

Java for Web学习笔记(三六):自定义tag(4)自定义Tag文件_第1张图片

这里我们定义了两个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 :: <c:out value="${fn:trim(htmlTitle)}" />
		" />
		
	
	
		

Multinational Widget Corporation

如何设置fragment:loggedOut.tag

对于登录界面,没有导航栏,实际上navigationCibtebt无实质内容,我们在main.tag的基础上提供loggedOut.tag。main有四个参数必选参数,在loggedOut.tag中,我们固化当中的两个fragment参数,另两个String参数则作为新tag的参数。我们将重点学习通过对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" %>
<%@ include file="/WEB-INF/jsp/base.jspf" %>

	
	
		" />		
	
	
	
	
	
		
	

具体化导航栏:basic.tag

main.tag是通用的模板,我们可以具体化到实际的项目中,包括:

  1. 将headContent映射为extraHeadContent。
  2. 将navigationContent具体化为通用的导航链接加上extraNavigationContent。

在这个例子中,我们将展现如果在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

使用tag

用户未登录或者登录失败,重定向至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


        
Subject


Body


Attachments



相关链接: 我的Professional Java for Web Applications相关文章

你可能感兴趣的:(JAVA,读书笔记,愷风(Wei)之Java,for,Web学习笔记)