Java web基础总结九之—— jsp标签
JSP标签也称之为Jsp Action,在前面讲过,jsp的设计目的就是作为表现层。我们希望JSP页面仅用作数据显示模块,不要嵌套任何java代码引入任何业务逻辑,但在实际开发中不引入一点业务逻辑是不可能的,但引入业务逻辑会导致页面出现难看java代码。jsp的标签就是为了解决这个问题。所以jsp页面中也内置了一些标签(这些标签叫做jsp标签),开发人员使用这些标签可以完成页面的一些业务逻辑。我们也可以开发自定义标签,使jsp页面不出现一行java代码。
一.jsp的内置标签
jsp的内置标签是sun公司在jsp页面中也内置的一些标签,不需要通过taglib指令导入标签库,直接可以使用的。下面是一些常用的内置标签。
1. <jsp:include>标签
<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文档。
2. <jsp:forward>标签
<jsp:forward>标签用于把请求转发给另外一个资源。语法:
<jsp:forwardpage="URL | <%=expression%>" />
其中的page属性用于指定请求转发到的资源的相对路径,它也可以通过执行一个表达式来获得。
3. <jsp:param>标签
<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>
4. <jsp:useBean>标签
<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标签库
JSTL是JSP StandardTag Library的缩写。它是SUN公司发布的一个针对JSP开发的新组件。JSTL允许你使用标签(tags)来进行JSP页面开发,而不是使用java代码方式开发。JSTL几乎能够做到传统JSP java代码能做的任何事情。
JSTL标签根据其功能可以分为以下几种类型:
1. 核心标签(Core Tags)
核心标签以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}"]/>
2. 格式化标签(Formatting tags),也称为国际化标签。
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
3. SQL标签(SQL tags)
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>
4. XML标签(XML tags)
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文件中对标签处理器类进行描述。
1. 实现了Tag接口的自定义标签处理器的执行流程
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接口的标签通常称为简单标签。
2. 实现一个简单的输出HelloWorld的自定义标签。
(1).首先编写一个实现了Tag接口的标签处理器类。
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>