`
tigers20010
  • 浏览: 48604 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

2009-12-13传智播客java web——传统标签与简单标签(转载)

阅读更多

如果大家对文章内容有不理解的地方,尽情留言或QQ(1357208561) 讨论。让大家共同进步。 
                                                                                                                                                                                                                                                                                                                                                                                 ——tigers20010




除了JavaMail今日是JavaWeb部分的最后一天了,还有三天的时间是做个小项目。将之前学习的所有知识串起来,准备迎接高级部分。嘿嘿!终于到了高级部分!


         今日主要内容是JSP自定义标签与JSTL,之前有使用过JSTL,十分的方便,还有EL。也有学过自定义EL函数,但个人感觉EL自定义函数没有JSP的自定义标签有趣。


一、JSP自定义标签


我们知道,JSP在被访问时会被JSP引擎翻译为Servlet程序,即JSP就是Servlet程序。我们可以在JSP中插入Java代码,但是在JSP页面中使用<%...%>嵌入JAVA代码,使用页面编写起来十分混乱,更不利于以后的维护。因为,JSP自定义标签可以优雅的解决这一问题。JSTL也正是SUN为些开发的一个标签库,接下来让我们来编写自己的自定义标签。


定义JSP自定义标签,需要四个步骤:

1.        编写一个实现Tag接口的Java类(标签处理器类),覆盖其中的doStartTag方法,在doStartTag方法中编写标签的功能代码。

2.        编写标签库描述符(tld)文件,在tld文件中对自定义标签进行描述。

3.        在WEB应用中部署和安装自定义标签库。

4.        在JSP页面中导入和使用自定义标签。


在以前的JSP页面编写中,我们有使用过“<cc:if test=”逻辑表达方式”>”和<cc:froEach var=”变量” items=”集合、列表、数组”>。下面我们就来实现与这两个JSP标签类似功能的自定义JSP标签。


1.编写<cc:if test=”…”>…</cc:forEach>自定义标签:

IfTag.java,标签处理器:

import javax.servlet.jsp.*;

import javax.servlet.jsp.tagext.Tag;



public class IfTag implements Tag {

    private boolean test;


    public void setTest(boolean test) {

       this.test = test;

    }  

    public int doStartTag() throws JspException {

       if(this.test)

           return Tag.EVAL_BODY_INCLUDE;

       return Tag.SKIP_BODY;

    }

    public int doEndTag() throws JspException {

       // TODO Auto-generated method stub

       return 0;

    }

    public Tag getParent() {

       // TODO Auto-generated method stub

       return null;

    }

    public void release() {

       // TODO Auto-generated method stub

    }

    public void setPageContext(PageContext arg0) {

       // TODO Auto-generated method stub

    }

    public void setParent(Tag arg0) {

       // TODO Auto-generated method stub

    }

}


1.        “private boolean test;”,这个成员名称必须与JSP中自定义标签的属性名称相同,JSP引擎会通过“setTest”方法,将属性值传递过来。

2.        “doStartTag()”当自定义标签开始被执行时,JSP引擎会调此方法。在此方法中可以“Tag.EVAL_BODY_INCLUDE”告诉JSP引擎继续向下执行标签体中的内容,如果返回“Tag.SKIP_BODY”JSP引擎将不执行标签体中的内容。

3.        “doEndTag()”当标签体被执行完成后,会调用些方法。

4.        “getParent()”返回父标签。

5.        “release()”,当标签处理器被销毁前会调用此方法,可以在此方法中释放。但这个处理器被JSP引擎实例化后,一般不会被释放而是保存在内存中,留以后用。服务器被关闭时,会被释放。

6.        “setPageContext(PageContext arg0)”,JSP引擎将JSP页面的运行环境,通过此方法传递给自定义标签处理器。

7.        “setParent(Tag arg0)”,如果标签有父标签时,JSP引擎会将父标签对象传递进来。



MyEl.tld,自定义标签描述文件。

<?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 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">

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

    <short-name>SimpleTagLibrary</short-name>

    <uri>/SimpleTagLibrary</uri>

   

    <tag>

       <name>myIf</name>

       <tag-class>cn.itcast.cc.jsptag.IfTag</tag-class>

       <body-content>JSP</body-content>

       <attribute>

           <name>test</name>

           <required>true</required>

           <rtexprvalue>true</rtexprvalue>

       </attribute>

    </tag>

</taglib>


1.        tld文件在工程中的存放位置,与web.xml存位置相同。

2.        “<uri>”设置tld描述文件的URI,URI用于在JSP页面中引入此tld文件。

3.        “<tag>”定义一个自定义标签。

4.        “<name>”自定义标签名。

5.        “<tag-class>”自定义标签处理器类,就是上边编写的类。

6.        “<body-content>”自定义标签的标签体内容。(也可以设置为“empty”等)

7.        “<attribute>”为自定义标签添加一个属性。

8.        “<name>”自定义标签属性名。

9.        “<required>”true为必须指定此属性,false此属性可为空。

10.     “<rtexprvalue>”设置属性为静态的或是动态的。如果为false即静态的,静态的属性值JSP引擎会将它自动转换(必须是java的8种基本数据类型),比如<cc:MyIf test=”122”>JSP引擎会自动将“123”转换为整数型,所以处理器的类成员可以定义为int型。如果为true即动态的,如果设置为将类型设置为Object可以接收任意数据类型的属性。



Index.jsp,在JSP页面中引入自定义标签,并调用自定义标签:

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

<%@taglib prefix="cc" uri="/SimpleTagLibrary" %>

<html>

  <head>

  </head>

 

  <body>

    <cc:myIf test="${2>1}">

       自定义逻辑判断标签!

    </cc:myIf>

  </body>

</html>




2.编写<cc:foEach var=”temp” items=”list”>…</cc:forEach>自定义标签:

forEahTag.java,继承自SimpleTagSupport,这个简单简化了Tag接口的操作。

import java.io.IOException;

import java.util.*;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.SimpleTagSupport;



public class forEahTag extends SimpleTagSupport {



    // 记录 items="xxx" 中的list对象

    private List items;

    // 记录 var="xxx"中的变量名称

    private String var;



    public void setItems(List items) {

       this.items = items;

    }



    public void setVar(String var) {

       this.var = var;

    }

    // SimpleTagSupport简化了Tag接口的操作,在此只需要覆盖doTag方法即可实现forEach。

    @Override

    public void doTag() throws JspException, IOException {

       Iterator iter = this.items.iterator();

       while (iter.hasNext()) {

           // 将单个对象设置到Context域中,在JSP页面中可以使用${var}获取对象。

           this.getJspContext()

                  .setAttribute(this.var, iter.next());

           // 调用执行标签体,需要一个输出流参数,

           // 设置为null时JSP引擎自动将其替换为this.getJspContext().getOut()

           this.getJspBody().invoke(null);

       }

    }

}




“this.getJspBody()”返回JspFragment对象,JspFragment代表一个标签体。JspFragment中不能包含JSP脚本元素。JspFragment.invoke就是调用标签体。如果不调用此方法,就是忽略标签体。


forEach也可以使用实现TagSupport接口实现,当标签体被调用时,首先会调用“doStartTag”方法(只会调用一次),可以在这个方法里先输出第一个成员。然后执行标签体,最后调用“doAfterBody”方法,它是重点。在这个方法里再输出下一个成员然后判断是不是到了list尾,如果到了list结尾则返回IterationTag. SKIP_BODY;。如果没有到list结尾则返回IterationTag. EVAL_BODY_AGAIN;,继续重复执行标签体,实现对list的遍历!


MyEl.tld,添加如下内容:

    <tag>

       <name>myForEach</name>

       <tag-class>cn.itcast.cc.jsptag.forEahTag</tag-class>

       <body-content>scriptless</body-content>

       <attribute>

           <name>var</name>

           <required>true</required>

           <rtexprvalue>true</rtexprvalue>

       </attribute>

       <attribute>

           <name>items</name>

           <required>true</required>

           <rtexprvalue>true</rtexprvalue>

       </attribute>

    </tag>


         “<body-content>scriptless</body-content>”指定标签体内为非脚本代码。



Index.jsp添加如下内容:

<%

       List list = new ArrayList();

       list.add("一");

       list.add("二");

       list.add("三");

       this.getServletContext().setAttribute("list",list);

     %>

    <cc:myForEach items="${list}" var="temp">

       ${temp }

    </cc:myForEach>


         在JSP页面插入的代码,是向List对象中插入成员,然后添加到ServletContext域中,${list}在ServletContext域中获取list对象。



         3.JSP自定义标签高级部分:

修改标签内容的标签<cc:htmlFilter>与<cc:readFile>两个标签配合使用。

ReadFileTag.java

public class ReadFileTag extends SimpleTagSupport {

    // 记录文件路径

    private String src;

      

    public void setSrc(String src) {

       this.src = src;

    }



    @Override

    public void doTag() throws JspException, IOException {

       // 获取到文件的全路径

       PageContext pc = (PageContext) this.getJspContext();

       ServletContext sc = pc.getServletContext();

       String file = sc.getRealPath(src);

       // 使用字符缓冲流读取文件

       BufferedReader reader = new BufferedReader(new FileReader(file));

       String line = null;

       while((line = reader.readLine()) != null){

           // 写到输出流

           this.getJspContext().getOut().write(line + "\r\n");

       }     

    }

}


         注意代码中的写到输出流,这个输出流是父标签传递进来的输出流。



HtmlFilter.java

public class HtmlFilter extends SimpleTagSupport {



    @Override

    public void doTag() throws JspException, IOException {

       // 调用子标签,并将输出流传递进去。

       CharArrayWriter caw = new CharArrayWriter(); 

       this.getJspBody().invoke(caw);

       //这里之所以要写义一个输出流,是为了实现Html字符的转换

       this.getJspContext().getOut().write(filter(caw.toString()));

       System.out.println(caw.toString());

    }

   

    // Html字符转换

    public static String filter(String message) {



        if (message == null)

            return (null);



        char content[] = new char[message.length()];

        message.getChars(0, message.length(), content, 0);

        StringBuffer result = new StringBuffer(content.length + 50);

        for (int i = 0; i < content.length; i++) {

            switch (content[i]) {

            case '<':

                result.append("&lt;");

                break;

            case '>':

                result.append("&gt;");

                break;

            case '&':

                result.append("&amp;");

                break;

            case '"':

                result.append("&quot;");

                break;

            default:

                result.append(content[i]);

            }

        }

        return (result.toString());

    }

}


         调用标签体时,之所以传递一个自定义的输出流。是因为,使用这个输出流,获取读到的html文件的内容。然后将流中的html字符转换后,再输出到JSP页面。


         二、JSTL标签

         1.jstl标签分为:

         核心标签库

国际化标签

数据库标签

XML标签

JSTL函数

         因为在JSP页面中最好不要访问数据库和XML文件,这样太不安全了而且程序逻辑混乱,所以就没有讲解这方面的使用。



         2.jstl常用的标签:

         (1).<c:out>标签:用于输出一段文本内容到pageContext对象当前保存的“out”对象中。

         (2). <c:set>标签:用于设置各种Web域中的属性,或者设置Web域中的java.util.Map类型的属性对象或JavaBean类型的属性对象的属性。

         (3). <c:remove>标签:用于删除各种Web域中的属性。

         (4). <c:catch>标签:用于捕获嵌套在标签体中的内容抛出的异常。

         (5). <c:if test=“”>标签:可以构造简单的“if-then”结构的条件表达式。

         (6). <c:choose>标签:用于指定多个条件选择的组合边界,它必须与<c:when>和<c:otherwise>标签一起使用。

         (7). <c:forEach>标签:用于对一个集合对象中的元素进行循环迭代操作,或者按指定的次数重复迭代执行标签体中的内容。

         (8). <c:param>标签:它可以嵌套在<c:import>、<c:url>或<c:redirect>标签内,为这些标签所使用的URL地址附加参数。此标签自动进行URL编码。

         (9). <c:url>标签:用于在JSP页面中构造一个URL地址,其主要目的是实现URL重写。还记得URL重写是什么吗?当session被禁用时,URL重写就是为解决这一问题的!

         (10). <c:redirect>标签:用于将当前的访问请求转发或重定向到其他资源。

      

         OK,上面是常用的标签,使用方法去查手册吧!东西太多了。老方今天特别提到一个标签,是佟老师特别指出的。它在Structs中使用较多——C:check permission。



         比如,一个管理页面,有好多管理选项。但管理选项需要根据用户的权限进行显示,此时自定义一个检查标签,将User做为参数传递给标签处理器。标签处理器查看User的权限,然后确定是否执行标签体。(标签体中的内容为显示相应的管理选项)



         OK,明天就要老方就开始编写一个将JavaSeb基础部分的所有内容融会到一起的WEB应用用例。估计使用1天多点的时间。然后同学们有近两天的个人实现时间。大家对此都十分期待!终于应用这段时间所学的知识,写个像样的东西出来。



         加油!

 

 

分享到:
评论

相关推荐

    Java项目-基于SSM的传智播客网上书城项目源码(设计以及实现论文).zip

    总结,基于SSM的传智播客网上书城项目不仅展示了SSM框架的强大功能,还为Java Web开发的学习者提供了宝贵的实战经验。通过对该项目的源码分析和实践,开发者能够提升自己的技术水平,更好地应对实际工作中的挑战。

    JavaWeb 视频教程 传智播客 第10天 共28天

    在本JavaWeb视频教程系列中,传智播客为我们提供了深入理解Web开发的宝贵资源,尤其在第10天的内容中,重点讲解了Java Web中的核心概念——HttpServletRequest和HttpServletResponse接口。这两个接口是Servlet API的...

    JavaWeb 视频教程 传智播客 第21天 共28天

    在本JavaWeb视频教程系列中,我们专注于传智播客的第21天课程,整个教程涵盖28天的学习内容,旨在深入理解并掌握JavaWeb开发的核心技术。在这个阶段,我们将重点讨论JavaWeb中的一个重要组件——过滤器(Filter)。...

    【传智播客.Net培训】ppt课件:html基础加强(pdf格式)

    - 这种类型的页面通常内容固定不变,适用于信息相对固定的场景,如简单的介绍页面或公告等。 - **动态页面**: - 动态页面则是指服务器根据用户请求动态生成的HTML页面。这类页面的内容可以根据不同的请求或用户...

    传智播客.Net培训—C#编程基础

    ### 传智播客.NET培训—C#编程基础 #### C#语言概述 **1.1 Microsoft .NET —— 一场新的革命** - **1.1.1 什么是.NET** 2000年6月22日,微软公司宣布了其下一代计算平台计划——Microsoft .NET(以下简称.NET...

    传智播客 方立勋 javaweb 完全笔记

    ### 传智播客方立勋JavaWeb完全笔记知识点概览 #### Eclipse 使用与调试技巧 **1.1 Eclipse 的使用** - **介绍**: Eclipse 是一款功能强大的集成开发环境(IDE),广泛应用于 Java 开发中。 - **核心功能**: - ...

    node.js 传智播客 第1天第1部分共2部分 共8天

    《Node.js基础教程——传智播客第1天课程概览》 Node.js,作为一款基于Chrome V8引擎的JavaScript运行环境,以其高效、异步I/O和非阻塞I/O的特点,在Web开发领域占据了一席之地。在传智播客的这8天课程中,我们将...

    于洋spring

    《于洋spring——传智播客深度解析》 在IT领域,Spring框架是Java开发中的一个核心组件,它以其灵活性、可扩展性和模块化设计深受开发者喜爱。"于洋spring"是传智播客推出的一系列关于Spring框架的教程,旨在帮助...

    传智播客_Springmvc+Mybatis由浅入深全套视频代码

    本教程涵盖了两个关键的Java Web开发框架——SpringMVC和Mybatis的全面解析,旨在帮助开发者从基础知识到深入实践,全面提升对这两项技术的理解和应用能力。 首先,让我们从SpringMVC开始。SpringMVC是Spring框架的...

    深入体验Java Web开发内幕

    【作者简介】  张孝祥中国著名IT培训教育专家,具有多年软件开发和教学经验,直接面授培训过数以万计的软件开发人员,深受学员们的好评和喜爱,现任北京传智播客教育科技有限公司(www.itcastn.cn)的教学总监...

    传智播客ssh+ssm五大框架笔记.zip

    【标题】"传智播客ssh+ssm五大框架笔记.zip"所涵盖的是Java Web开发中的两种主流框架组合——Spring、Struts2和Hibernate(SSH)以及Spring MVC和MyBatis(SSM)。这些框架在现代企业级应用开发中扮演着重要角色,...

    javaWeb传智播客网上书城项目源码(设计以及实现LW)(实用).zip

    《JavaWeb传智播客网上书城项目源码:设计与实现详解》 在JavaWeb开发领域,构建一个网上书城系统是一项常见的实践任务,它能够帮助开发者掌握Web应用的基本架构、数据库设计、用户交互以及服务器端编程等关键技能...

    javaWeb传智播客网上书城项目源码(设计以及实现论文).zip

    本项目——“传智播客网上书城”就是一个典型的JavaWeb应用实例,它涵盖了从设计到实现的全过程,为学习者提供了宝贵的实践资料。 1. **项目结构分析** 该项目分为多个模块,如“文档”、“goods”和“论文”等。...

    崔希凡javaweb笔记day08-day13

    崔希凡老师的javaweb笔记涵盖了从day08到day13的重要学习内容,这是传智播客官网上一套详尽的视频教程的配套资料。这些笔记和源码旨在帮助学员深入理解JavaWeb开发的核心技术,提升编程技能。以下是根据这些天的笔记...

    02_传智播客巴巴运动网_购物_结算_送货模块的分析

    在本课程"02_传智播客巴巴运动网_购物_结算_送货模块的分析"中,我们主要探讨的是电子商务网站中一个关键部分——购物、结算和送货模块的设计与实现。这一模块对于任何在线零售平台来说都是至关重要的,因为它直接...

    java面试笔试题库java软件设计java笔试题大集合及答案文档资料合集300MB.zip

    java面试笔试题库java软件设计java笔试题大集合及答案文档资料合集300MB“ 100家大公司java笔试题汇总.doc 125条常见的java 面试笔试题大汇总.pdf 2011最新整理java经典代码.doc 25个经典的Spring面试问答.docx 8张...

    java面试笔试资料java笔试题大集合及答案题库java笔试题汇总资料188个合集.zip

    java面试笔试资料java笔试题大集合及答案题库java笔试题汇总资料188个合集 100家大公司java笔试题汇总.doc 125条常见的java 面试笔试题大汇总.pdf 2011最新整理java经典代码.doc 25个经典的Spring面试问答.docx ...

    java面试笔试题库java学习笔记开发教程互联网公司面试资料大全合集.zip

    Java开发与技术挑战——关于技术的技术思考.docx Java框架研发思考.docx Java程序员们最常犯的10个错误.docx java程序员的就业指导(重点).docx Java程序员面试宝典 .pdf java笔试题大集合及答案 Java经典项目集锦....

    spring笔记.rar

    《Spring框架深度解析——基于传智播客左慈老师培训笔记》 在Java开发领域,Spring框架无疑是最具影响力和广泛使用的轻量级框架之一。它以其强大的功能、灵活的设计和丰富的生态系统,成为了企业级应用开发的首选。...

    javaee 习题答案.docx完整详细

    Java EE 框架整合开发入门到实战——Spring+SpringMVC+MyBatis(微课版)习题答案详细解析 Java EE 框架整合开发入门到实战——Spring+SpringMVC+MyBatis(微课版)习题答案详细解析中,涵盖了 Spring 框架的核心...

Global site tag (gtag.js) - Google Analytics