自定义标签

一、创建自定义标签基本步骤

1、步骤

标签处理类(标签也是一个对象,那么就需要先有类!)

tld文件,它是一个xml

页面中使用<%@taglib%>来指定tld文件的位置

2、标签处理类

SimpleTag接口

  • void doTag():每次执行标签时都会调用这个方法;
  • JspTag getParent():返回父标签(非生命周期方法)
  • void setParent(JspTag):设置父标签
  • void setJspBody(JspFragment):设置标签体
  • void setJspContext(JspContext):设置jsp上下文对象,它的子类是PageContext

  其中doTag()会在其他三个方法之后被Tomcat调用。

3、配置tld文件

tld文件一般都放到WEB-INF之下,这样保证客户端访问不到。

<tag>
       <name>MyTag1</name>   指定当前标签的名称
       <tag-class>tag.MyTag1</tag-class>  指定当前标签的标签处理类
       <body-content>empty</body-content> 指定标签体的类型,我们这里使用的是空标签。
</tag>

4、页面中指定tld文件位置

 二、标签体内容

1、标签体内容

  • empty:无标签体。
  • JSP:jsp2.0已经不再支持这个类型。表示标签体内容可以是:Java脚本,可以是标签,可以是EL表达式。
  • scriptless:只能是EL表达式,也可以是其他标签。
  • tagdependent:标签体内容不会被执行,而是直接赋值标签处理类。

2、不再执行标签下面内容的标签。

  • 在标签处理类中的doTag()使用SkipPageException来结束。
  • Tomcat会调用标签处理类的doTag()方法,然后Tomcat会得到SkipPageException,它会跳过本页面其他内容。

三、标签属性

步骤:

1、给你的标签处理类添加属性。

为标签处理类添加属性,属性至少要且一个set方法,这个set方法会在doTage()方法之前被Tomcat执行,所在doTage()中就可以使用属性了。

2、在tld文件中对属性进行配置。

<attribute>
    <name>test</name>  指定属性名
    <required>true</required>  指定属性是否为必需的
    <rtexprvalue>true</rtexprvalue> 指定属性是否可以使用EL表达式
</attribute>

四、示例:

 1 package tag;
 2 
 3 import javax.servlet.jsp.JspContext;
 4 import javax.servlet.jsp.JspException;
 5 import javax.servlet.jsp.PageContext;
 6 import javax.servlet.jsp.tagext.JspFragment;
 7 import javax.servlet.jsp.tagext.JspTag;
 8 import javax.servlet.jsp.tagext.SimpleTag;
 9 import java.io.IOException;
10 
11 /**
12  * 自定义标签
13  */
14 public class MyTag1 implements SimpleTag {
15     private PageContext pageContext;
16     private JspFragment body;
17     /**
18      * 所有的setXXX()方法都会在doTag()方法之前被Tomcat调用。
19      * 所有doTag()中就可以使用Tomcat传递过来的对象了。
20      * */
21     @Override
22     public void doTag() throws JspException, IOException {
23         pageContext.getOut().print("Hello Tag!");
24     }
25     @Override
26     public void setParent(JspTag jspTag) {}
27     @Override
28     public JspTag getParent() {return null; }
29     @Override
30     public void setJspContext(JspContext context) {
31         this.pageContext = (PageContext) context;
32     }
33     @Override
34     public void setJspBody(JspFragment body) {
35         this.body = body;
36     }
37 }
 1 package tag;
 2 
 3 import javax.servlet.jsp.JspException;
 4 import javax.servlet.jsp.tagext.SimpleTagSupport;
 5 import java.io.IOException;
 6 
 7 /**
 8  * SimpleTagSupport它实现了SimpleTag接口。
 9  * 它已经把所有的Tomcat传递的数据都保存起来了,而且还提供了get方法子类调用。
10  */
11 public class MyTag2 extends SimpleTagSupport {
12     @Override
13     public void doTag() throws JspException, IOException {
14         this.getJspContext().getOut().print("Hello 第二次");
15     }
16 }
 1 package tag;
 2 
 3 import javax.servlet.jsp.JspException;
 4 import javax.servlet.jsp.tagext.SimpleTagSupport;
 5 import java.io.IOException;
 6 import java.io.Writer;
 7 
 8 public class MyTag3 extends SimpleTagSupport {
 9     @Override
10     public void doTag() throws JspException, IOException {
11         Writer out = this.getJspContext().getOut();//获取当前jsp页面的输出流
12         out.write("****************************<br/>");
13         this.getJspBody().invoke(out);//执行标签体内容,把结果写到指定的流中,即页面上
14         out.write("<br/>****************************");
15     }
16 }
 1 package tag;
 2 
 3 import javax.servlet.jsp.JspException;
 4 import javax.servlet.jsp.SkipPageException;
 5 import javax.servlet.jsp.tagext.SimpleTagSupport;
 6 import java.io.IOException;
 7 
 8 public class MyTag4 extends SimpleTagSupport {
 9     @Override
10     public void doTag() throws JspException, IOException {
11         this.getJspContext().getOut().print("只能看到我,下面什么都没有!");
12         throw new SkipPageException();//抛出这个异常后,在本标签后面的内容,将看不到。
13     }
14 }
 1 package tag;
 2 
 3 import javax.servlet.jsp.JspException;
 4 import javax.servlet.jsp.tagext.SimpleTagSupport;
 5 import java.io.IOException;
 6 
 7 /**
 8  * 有属性的标签
 9  */
10 public class MyTag5 extends SimpleTagSupport {
11     private boolean test;
12 
13     /**
14      * 这个方法会有Tomcat来调用,并在doTage()之前
15      * */
16     public void setTest(boolean test) {
17         this.test = test;
18     }
19     @Override
20     public void doTag() throws JspException, IOException {
21         /**
22          * 执行标签体
23          * */
24         if (test) {
25             this.getJspBody().invoke(null);//如果传递的输出流为null,表示使用的就是当前页面的out。
26         }
27     }
28 }
 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 
 3 <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
 4         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 5         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
 6         version="2.0">
 7 
 8     <tlib-version>1.0</tlib-version>
 9     <short-name>itcast</short-name>
10     <uri>http://www.itcast.cn/tags/it-1.0</uri>
11     <tag>
12         <name>MyTag1</name>
13         <tag-class>tag.MyTag1</tag-class>
14         <body-content>empty</body-content>
15     </tag>
16     <tag>
17         <name>MyTag2</name>
18         <tag-class>tag.MyTag2</tag-class>
19         <body-content>empty</body-content>
20     </tag>
21     <tag>
22         <name>MyTag3</name>
23         <tag-class>tag.MyTag3</tag-class>
24         <body-content>scriptless</body-content>
25     </tag>
26     <tag>
27         <name>MyTag4</name>
28         <tag-class>tag.MyTag4</tag-class>
29         <body-content>empty</body-content>
30     </tag>
31     <tag>
32         <name>MyTag5</name>
33         <tag-class>tag.MyTag5</tag-class>
34         <body-content>scriptless</body-content>
35         <attribute>
36             <name>test</name>
37             <required>true</required>
38             <rtexprvalue>true</rtexprvalue>
39         </attribute>
40     </tag>
41 </taglib>
 1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 2 <%@ taglib prefix="it" uri="/WEB-INF/tlds/itcast.tld" %>
 3 <html>
 4   <head>
 5     <title>$Title$</title>
 6   </head>
 7   <body>
 8 
 9 <it:MyTag5 test="${empty param.xxx}">
10   <h1><it:MyTag4/></h1>
11 </it:MyTag5>
12   <h1><it:MyTag1/></h1>
13   <h1><it:MyTag2/></h1>
14   <hr/>
15     <%
16     request.setAttribute("xxx","zhangsan");
17     %>
18   <h3><it:MyTag3>${xxx}</it:MyTag3></h3>
19   <h3><it:MyTag3>字符串®</it:MyTag3></h3>
20 
21   </body>
22 </html>

转载于:https://www.cnblogs.com/gdwkong/p/7631748.html

J2EE高级培训师面试题 时间:120分钟 一,填空题 1) 每个Servlet都必须实现()接口 a) javax.servlet.Servlet; b) javax.servlet.HttpServlet; c) javax.servlet.GenericServlet; d) javax.servlet.http.Servlet; 2) 利用JavaMail API发送邮件的过程中,()能获取正确的session对象。 a) Session mailsession=Session.getInstance(); b) Session mailsession=Session.getInstance(objProperties); c) Session mailsession = request.getSession(); d) Session mailsession= request.getInstance(objProperties); 参考答案 b 3) 下面是一JSP页面的代码,请问输出结果是().  function display(){  if(i == 1) {      alert("Is 1");    } else if(i==2) {  alert("Is 2"); }else{      alert("Is other");    }  }  display (); a) 什么也不输出。 b) 弹出内容为“Is 1”的对话框。 c) 弹出内容为“Is 2”的对话框。 d) 当第一次访问这个程序时,弹出一个内容为"Is other"的对话框,从第二次开始,每次访问这个程序都弹出内容为“Is 2”的对话框。 e 当第一次访问这个程序时,弹出一个内容为"Is 1"的对话框,从第二次开始,每次访问这个程序都弹出内容为“Is 2”的对话框。 参考答案 a 4) 下面是一JSP页面的片断代码,请问页面输出结果是(). a) Hello b) World c) HelloWorld d) 什么也不输出 参考答案 d 5) aa.jsp文件如下: <% for(;I++ 两个客户依次使用浏览器浏览aa.jsp,且每个客户只浏览一次,那么,第2个客户的浏览器将显示什么? e a) 0 1 b) 1 2 c) 3 4 d) 5 6 e) 什么也没有 6) 如果用JSP开发一个聊天程序,不用数据库存储聊天纪录,请问聊天记录最好存储在()中。 a) request b) page c) session d) application 参考答案 d 7) 在web.xml中,有如下代码: 30 对于以下描述,正确的是: b a) 定义了默认的会话超时时长。时长为30秒。 b) 可以使用HttpSession接口的getMaxInactiveInterval()方法把该值取出来。 c) 定义了默认的会话超时时长。时长为30小时。 d) 可以使用Session的getMaxInactiveInterval()方法把该值取出来。 8) 对于标记,描述不正确的是() a) 一般来说,是、标记的子标记。 b) 如果aa.jsp有代码:,则在next.jsp中可以使用request.getParameter("name");把属性name的值取出来。 c) 如果aa.jsp有代码:,则在next.jsp中可以使用request.getAttribute("name");把属性name的值取出来。 d) 如果标记放在标记外,也就是不作为标记的子标记,则使用浏览器查看时会显示错误页面。 9) aa.jsp与bb.jsp属于同一应用,在aa.jsp中使用标记,在bb.jsp中要把beanName这个bean对象变量所引用的对象取出来。那么对于以下描述,正确的是: c a) 在bb.jsp中仅使用代码:mybean bc = session.getAttribute("beanName"); 取出beanName所引用的对象。 b) 在bb.jsp中取beanName所引用的对象前,先要使用导入mypackage.mybean。 c) 在bb.jsp中,对于使用session的getAttribute方法取出的beanName所引用的对象,要进行强制型转换。 d) 在bb.jsp中使用session的getAttribute方法取出的对象和aa.jsp中的beanName所引用的对象无关。 10) 用JSP2.0表达式语法在JSP页面上正确显示10+20的结果的是()。 a) ${10+20} b) ${10+20}; c) $(10+20) d) $(10+20); 参考答案 a 11) 编写自定义标签处理后,需要编写一个()去描述。 a) .tag 文件 b) .tld 文件 c) .dtd文件 d) .xml 文件 12) 关于Tag File说法不正确的是()。 a) Tag File是JSP2.0新增的功能 b) Tag File是JSP1.2增的功能 c) Tag File 可以让网页开发人员直接使用JSP语法制作标签 d) Tag File的扩展名可以 .tag 参考答案 b 13) 关于Servlet Filter,下列说法正确的有()。 a) Filter 其实就是一个Servlet b) Filter 可以产生response c) Filter可以在servlet被调用之前截获request d) Filter可以用来处理统一认证,过滤不雅字句等。 参考答案 c,d 14) 会话Bean的状态的说法正确的有(a)。 a) 有状态会话Bean的状态是借助于序列化保存下来的 b) 有状态会话Bean被激活后会恢复挂起前的状态 c) 无状态会话Bean不能有属性 d) 有状态会话Bean的所有属性在挂起的时候都会被保存下来 参考答案 15) 关于EJB组成部分的说法不正确的是 (ab) a) 每一个EJB的实例对象对应于一个JNDI名字,通过JNDI名字找到相应的实例 b) 所有EJB都包含Home接口,远程接口,Bean三个部分 c) Bean必须实现远程接口中的方法 d) 远程接口实现了RMI的Remote接口 参考答案 16) 下列关于RMI远程接口定义正确的是 d a) public interface Demo {public long test() throws java.rmi.RemoteException;} b) Public interface Demo extends Remote {public long test() } c) interface Demo extends Remote {public long test() throws java.rmi.RemoteException;} d) public interface Demo extends Remote {public long test() throws java.rmi.RemoteException;} 参考答案 17) 下列选项中能获得UserTransaction的是ab a) 通过上下文的.getUserTransaction()方法拿到UserTransaction b) 通过查找JNDI名为javax.transaction.UserTransaction的拿到UserTransaction c) new 一个UserTransaction对象 d) 不需要实例化,直接使用接口中的方法即可 参考答案 18) 关于事务,下列说法不正确的事 a a) EJB支持平面式和嵌入式两种事务模型 b) 平面式事务模型是指要么操作都成功,如果失败,所有操作都回滚 c) EJB有Bean管理事务和容器管理事务两种方式 d) BMT方式也可以使用JTA来控制事务边界 参考答案 19) 关于消息确认描述正确的是 ac a) 在创建消息会话的时候能指定消息的确认方式 b) AUTO_ACKNOWLEDGE方式能确认之前收到的所有消息 c) Client_ACKNOWLEDGE方式需要显示调用方法ACKNOWLEDGE方法来显式的确认消息 d) Client_ACKNOWLEDGE方式可以确认所有的消息 参考答案 20) 关于消息Bean事务描述正确的是 c a) MDB支持RequiresNew事务方式 b) MDB支持Mandatory事务方式 c) NotSupported方式在容器回调OnMessage方法之后才启动事务 d) MDB不支持Required事务属性 参考答案 21) 关于WSDL不正确的说法是 bc a a) 用来描述Web服务的XML文件 b) 全称是WEB SERVICES DEFINITION LANGUAGE c) 客户端调用时直接用WSDL文件中的地址就可以了 d) SOAP协议可以基于多种底层协议 二,简答题 1:简述四种会话跟踪技术以及他们的优缺点 2:请结合轻量级框架Struts,Spring和重量级框架EJB谈谈轻量级架构和重量级架构的区别? 3:说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法 4:如何给weblogic指定大小的内存?如何设定的weblogic的热启动模式(开发模式)与产品发布模式? 三,代码题 1:请写出JavaMail发送邮件的关键代码 2:设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 3:用冒泡法对10个数排序(由小到大)例如: 54,12,-6,6,22,-7,9,0,999,79 4:有一个登录页面,上面有用户名(name),密码(password)两个字段,对应数据库表User中的两个字段,请用Struts+EJB实现上述登陆场景!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值