JSP标签也称之为Jsp Action,在前面讲过,jsp的设计目的就是作为表现层。我们希望JSP页面仅用作数据显示模块,不要嵌套任何java代码引入任何业务逻辑,但在实际开发中不引入一点业务逻辑是不可能的,但引入业务逻辑会导致页面出现难看java代码。jsp的标签就是为了解决这个问题。所以jsp页面中也内置了一些标签(这些标签叫做jsp标签),开发人员使用这些标签可以完成页面的一些业务逻辑。我们也可以开发自定义标签,使jsp页面不出现一行java代码。
jsp的内置标签是sun公司在jsp页面中也内置的一些标签,不需要通过taglib指令导入标签库,直接可以使用的。下面是一些常用的内置标签。
<jsp:include>标签的作用是把另外一个资源的输出内容插入进当前JSP页面的输出内容之中,由于是在JSP页面执行时的引入,所以被称为动态引入。
语法:<jsp:include page="URL | <%=expression%>"flush="true|false" />
page属性用于指定被引入资源的相对路径,它也可以通过执行一个jsp表达式来获得。flush属性指定在插入其他资源的输出内容时,是否先将当前JSP页面的已输出的内容刷新到客户端。
<jsp:include>与include指令有很大的区别。<jsp:include>标签是动态引入,<jsp:include>标签涉及到的2个JSP页面会被翻译成2个servlet,这2个servlet的内容在执行时进行合并。而include指令是静态引入,涉及到的2个JSP页面会被翻译成一个servlet,其内容是在源文件级别进行合并。他们的共同点是,它们都会把两个JSP页面内容合并输出,所以这两个页面不要出现重复的HTML架构标签,否则输出给客户端的内容将会是一个格式混乱的HTML文档。
<jsp:forward>标签用于把请求转发给另外一个资源。语法:
<jsp:forwardpage="URL | <%=expression%>" />
其中的page属性用于指定请求转发到的资源的相对路径,它也可以通过执行一个表达式来获得。
<jsp:param>标签可以看做是前两个标签的子标签。当使用<jsp:include>和<jsp:forward>标签引入或将请求转发给其它资源时,可以使用<jsp:param>标签向这个资源传递参数。<jsp:param>标签的name属性用于指定参数名,value属性用于指定参数值。在<jsp:include>和<jsp:forward>标签中可以使用多个<jsp:param>标签来传递多个参数。
与<jsp:include>标签组合使用时的语法:
<jsp:includepage="URL | <%=expression%>">
<jsp:paramname="parameterName" value="parameterValue|<%= expression%>" />
</jsp:include>
与<jsp:forward>标签组合使用时的语法:
<jsp:forwardpage="URL | <%=expression%>">
<jsp:paramname="parameterName" value="parameterValue|<%= expression%>" />
</jsp:include>
<jsp:useBean>标签用于在指定的域范围内查找指定名称的JavaBean对象:如果存在则直接返回该JavaBean对象的引用。如果不存在,则实例化一个新的JavaBean对象并将它以指定的名称存储到指定的域范围中。
常用语法:
<jsp:useBeanid="beanName" class="package.class"
scope="page|request|session|application"/>
其中的id属性用于指定JavaBean实例对象的引用名称和其存储在域范围中的名称。class属性用于指定JavaBean的完整类名(即必须带有包名)。scope属性用于指定JavaBean实例对象所存储的域范围,值只能是page、request、session和application等四个值中的一个,默认值是page。
JSTL是JSP StandardTag Library的缩写。它是SUN公司发布的一个针对JSP开发的新组件。JSTL允许你使用标签(tags)来进行JSP页面开发,而不是使用java代码方式开发。JSTL几乎能够做到传统JSP java代码能做的任何事情。
JSTL标签根据其功能可以分为以下几种类型:
核心标签以c为前缀,需要使用taglib指令导入标签库:
<%@ tagliburi="http://java.sun.com/jsp/jstl/core" prefix="c" %>
举个常见的例子,<c:remove>标签:
<c:remove>标签用于删除四个Web域中的属性。
其语法格式如下:
<c:remove var="varName"
[scope="{page|request|session|application}"]/>
JSTL格式标签可以用来格式化和显示文本,日期,时间和数字的,进行国际化操作。以fmt为前缀,需要使用taglib指令导入标签库:
<%@ taglibprefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
例如,格式化数字的<fmt:formatNumber>标签:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
 <html>
<head>
  <title>JSTL fmt:formatNumberTag</title>
</head>
<body>
<h3>NumberFormat:</h3>
<c:setvar="num" value="120000.2309" />
<p>FormattedNumber: <fmt:formatNumber value="${num}"
           type="currency"/></p>
</body>
</html>FormattedNumber: £120,000.23
JSTL的SQL标签库标签可以用来代替操作关系型数据库的java代码,
以sql为前缀,需要使用taglib指令导入标签库:
<%@ taglibprefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
例如,使用<sql:setDataSource>标签配置数据库的数据源:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/sql"prefix="sql"%>
<html>
<head>
<title>sql Tag</title>
</head>
<body>
 
<sql:setDataSourcevar="snapshot" driver="com.mysql.jdbc.Driver"
     url="jdbc:mysql://localhost:3306/test"
     user="root"  password="root"/>
</body>
</html>JSTL XML标记用于在jsp中创建和操作XML文档。可以实现XML解析,转换XML数据等。以xml为前缀,需要使用taglib指令导入标签库:
<%@ taglib prefix="x"uri="http://java.sun.com/jsp/jstl/xml" %>
还需要把XercesImpl.jar和xalan.jar这两个jar包复制到<Tomcat安装目录> 的\lib目录。由于使用的比较少,就不多说了.
要开发自定义的标签移除jsp页面中的java代码,需要完成以下两个步骤:首先编写一个实现Tag接口的Java类(标签处理器类)。然后编写标签库描述符(tld)文件,在tld文件中对标签处理器类进行描述。
JSP引擎将遇到自定义标签时,首先创建标签处理器类的实例对象,然后按照JSP规范定义的通信规则依次调用下面的方法。
public voidsetPageContext(PageContext pc), JSP引擎实例化标签处理器后,将调用setPageContext方法将JSP页面的pageContext对象传递给标签处理器,标签处理器以后可以通过这个pageContext对象与JSP页面进行通信。
public void setParent(Tag t),setPageContext方法执行完后,WEB容器接着调用的setParent方法将当前标签的父标签传递给当前标签处理器,如果当前标签没有父标签,则传递给setParent方法的参数值为null。
public int doStartTag(),调用了setPageContext方法和setParent方法之后,WEB容器执行到自定义标签的开始标记时,就会调用标签处理器的doStartTag方法。
public int doEndTag(),WEB容器执行完自定义标签的标签体后,就会接着去执行自定义标签的结束标记,此时,WEB容器会去调用标签处理器的doEndTag方法。
public void release(),通常WEB容器执行完自定义标签后,标签处理器会驻留在内存中,为其它请求服务器,直至停止web应用时,web容器才会调用release方法。
由于实现Tag接口完成自定义标签有些繁琐,所以在JSP 2.0中定义了一个更为简单的SimpleTag接口来实现标签的功能。实现SimpleTag接口的标签通常称为简单标签。
HelloworldTag.java代码如下:
public class HelloworldTag implements Tag {
	private PageContext pageContext;
	
	public int doStartTag() throws JspException {
		
		HttpServletRequest request = (HttpServletRequest) 
pageContext.getRequest();
		JspWriter out = pageContext.getOut();
		
		String string = "Hello World";
    	try {
			out.write(string);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
		
		return 0;
	}
	
	public int doEndTag() throws JspException {
		return 0;
	}
	public Tag getParent() {
		return null;
	}
	public void release() {
	}
	public void setPageContext(PageContext arg0) {
		this.pageContext = arg0;
	}
	public void setParent(Tag arg0) {
	}
}(2). 在web-inf/目录下新建tld文件,并且在tld文件中对标签处理器进行描述。
hello.tld文件:
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
    
    <description>A tag library exercising SimpleTag handlers.</description>
    <tlib-version>1.0</tlib-version>
    <short-name>SimpleTagLibrary</short-name>
    <uri>/hello</uri>
    
   <tag>
        <name>helloWorld</name>  
		<tag-class>com.cc.HelloworldTag</tag-class>
		<body-content>empty</body-content>
    </tag>
</taglib>(3). 在jsp页面中使用taglib指令导入标签库,并使用自定义标签。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="/hello" prefix="hello" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>输出hello world</title>
  </head>
  
  <body>
     输出:<hello:helloWorld/>
  </body>
</html>
原文地址:http://blog.csdn.net/qfycc92/article/details/45788065