Java web基础总结九之—— jsp标签

来源:互联网 发布:旅游订票网站php模板 编辑:程序博客网 时间:2024/04/29 17:13

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>

 

 

0 0
原创粉丝点击