JSP自制标签。以一只真正的菜鸟角度来审视自制标签。。。

来源:互联网 发布:全国各省经纬度数据 编辑:程序博客网 时间:2024/05/01 23:09

声明我是个新手,文章中有什么写得不正确的欢迎大家指出。共同学习,一起进步。

首先明白:自制标签是一种将动态内容加入到jsp页面的一种方法。类似的方法还有5种,在后面的文章我会介绍。它的好处是:使用起来像HTML标签一样,有利于增强jsp页面的表现逻辑(方便不太懂java的美工吧).

要使用自制标签我们要进行以下3个步骤(其实就是制作自制标签库的3的成员):

1、创建标签库句柄类,它定义了自制标签的行为。

很多术语听上去很高深翻译过来很简单的。所谓句柄类是个啥我也不清楚。但可以肯定的这一步就是写个java类,这个类定义系统看见这个标签的具体行为。

2创建TLD(标签库描述),它把xml元素名字映射到tag实现。

创建个.tld文件。文件的内容和性质和xml很类似

3、jsp页面,写好了自制标签,也配置好了当然就是要使用它了

实例这个实例通过自制标签,把一个user类的信息显示在前台页面。

1、

user

Public class User(){

private String  userName;

private String email;

private int age;

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

}

标签库句柄类

package cn.bl.tag;

import java.io.IOException;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.JspWriter;

import javax.servlet.jsp.tagext.TagSupport;

public class UserTag extends TagSupport {

private User user;

public int doStartTag() throws JspException {

// 获取写出对象

JspWriter out = this.pageContext.getOut();

try {

if (user == null) {

out.println("没找到对应的用户");

// 返回这个函数说明你已经标签数据写进jsp页面了

return SKIP_BODY;

else {

out.println("<strong algin='center'>第一次用自制标签,向jsp写数据。请大家多多指教</strong>");

out.println("<hr>");

out.println("<table width='500px' align='center' border='1'>");

out.println("<tr>");

out.println("<td>用户名</td>");

out.println("<td>年龄</td>");

out.println("<td>邮箱</td>");

out.println("</tr>");

out.println("<tr>");

out.println("<td>" + user.getName() + "</td>");

out.println("<td>" + user.getAge() + "</td>");

out.println("<td>" + user.getEmil() + "</td>");

out.println("</tr>");

out.println("</table>");

}

catch (IOException e) {

throw new JspException(e.getMessage());

}

return SKIP_BODY;

}

// getter and setters

public User getUser() {

return user;

}

public void setUser(User user) {

this.user = user;

}

@Override

public int doEndTag() throws JspException {

return EVAL_PAGE;

}

@Override

public void release() {

super.release();

this.user = null;

}

}

2创建TLD(标签库描述)

WEB-INF下新建。

在新建时会让你填入写参数,填入的参数和下面配置文件里的参数是对应的。

<?xml version="1.0" encoding="UTF-8"?>

<taglib version="2.0" 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 web-jsptaglibrary_2_0.xsd">

 <tlib-version>1.0</tlib-version>

 <short-name>ff</short-name>

 <uri>/firsttag</uri>

 <tag>

  <name>showUser</name>

  <tag-class>cn.bl.tag.UserTag</tag-class>//对应你句柄类所在的包

  <body-content>empty</body-content>

 <attribute>

  <name>user</name>

  <required>false</required>

  <rtexprvalue>true</rtexprvalue>

  </attribute> 

 </tag> 

</taglib>

然后在xml里配置

<jsp-config>

    <taglib>

      <taglib-uri>/firsttag</taglib-uri>

      <taglib-location>/WEB-INF/firsttag.tld</taglib-location>

    </taglib>

  </jsp-config>

3、jsp显示

注意引入语句

<%@ page language="java" import="java.util.*,cn.bl.tag.*" pageEncoding="UTF-8"%>

<%@ taglib uri="/firsttag" prefix="ff"%>

<%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

<!-- 创建需要展现User的实例(用于测试数据) -->

    <%

    User user = new User();

    user.setName("曾花卷");

    user.setAge(33);

    user.setEmil("ssf@dd.com");

    pageContext.setAttribute("userinfo", user);  

    %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <base href="<%=basePath%>">

    

    <title>My JSP 'index.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">

<meta http-equiv="cache-control" content="no-cache">

<meta http-equiv="expires" content="0">    

<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

<meta http-equiv="description" content="This is my page">

<!--

<link rel="stylesheet" type="text/csshref="styles.css">

-->

  </head>

  

  <body>

  

    <!-- 给标签设置user属性绑定要展现的UserInfo对象  -->

<ff:showUser user="${pageScope.userinfo}" />

</body>

</html>

看看效果吧