app开发者平台在数字化时代的重要性与发展趋势解析
572
2022-11-05
jsP自定义标签
1.在JSP页面中,我们可以嵌入java代码来执行逻辑操作。但是一旦当页面复杂,java代码的大量嵌入势必会导致页面结构混乱,难以维护。但是我们的确需要需要这样的逻辑处理模块来完成页面的逻辑处理,JSP为了解决这一难题,使得页面与代码最大程度上的分离,开发了自定义标签。
2.首先标签我们再熟悉不过了,在Html中,我们使用各种各样的标签在页面中嵌入相应的内容。但是我们使用的都是一套规范好的标签,比如说超链接a,我们是不是可以自己做一个标签b,也让具有a同样的功能。当然是可以的,JSP提供了这样的机制。我们把这个叫做JSP自定义标签,当然了,使用自定义标签不是为了解决我们前边提出的做一个超链接b这种没有什么意义的问题,他是为了我们简化JSP页面,在最大程度上使得java代码与页面分离。我们首先看一下如何实现自定义标签然后再讨论这其中的原理。
3.我们知道标签一般分为两种,即有标签体和无标签体的。我们这里实现的都是没有标签体的,原理是一样的,既然是入门嘛,我们挑一个简单的来。
4.实现一个简单的无标签体的标签,功能是调用这个标签就可以输出一句话。首先给出自定义标签的三个步骤。
一:建立一个java类,继承TagSupport方法(或者实现Tag接口)。复写其中的doEndTag()方法。
二:在tld文件中配置这个标签
三:jsp页面中调用这个标签。在这里面步骤而可能是新手最容易出错的。我们重点的看一下这一点。
(1)首先建立一个MyTag类,我们先简单一点,采用继承TagSupport的方式。代码如下:
package Tag;import java.io.IOException;import javax.servlet.jsp.JspException; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.TagSupport; /*TagSupport的写法相对来说比较简单, * 直接继承一个TagSupport然后再复写doEndTag()方法 * * */ public class MyTag2 extends TagSupport{ public int doEndTag() throws JspException { //直接复写方法 String str="Hello JSP Tag"; try { pageContext.getOut().print(str); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return super.doEndTag(); } }
这个很简洁,解释一个地方,就是pageContext,这是一个内建对象,我们可以直接获取到它,然后调用对应的方法输出。这里就算是完成了。接下来是配置这个标签。
(2)建立tld文件,这个tld文件是自定义标签的配置文件,我们在这里面要定义标签的各种属性。新建xml文件,将后缀名改为.tld。然后看代码:
<%@ taglib uri="prefix="h" %>
OK,到这里我们的任务已经完成了,到在Tomcat上部署一下在浏览器调用JSP就可以看到输出的Hello了。
5.什么?这个标签也太low了吧,没错,他就是很low,我们来做一个有趣的。做一个下拉的列表。什么?杀鸡焉用宰牛刀?做个列表我还用的着自定义吗?这不是自找代码写嘛,别急我还没说完,我们做一个动态的下拉列表。列表项可以根据后台的数据库的数据的数量增加,数据从数据库获取。当然了,我们只是演示一下原理,数据的获取我就不做了,有兴趣的可以再做一下。
假设我们这里有一个这样的需求:一个公司需要招聘员工,在网站上发布自己的需求,求职者可以在投递自己的简历的时候选择自己感兴趣的职位,但是随着时间的流逝有的职位已经招满了,就不需要出现在选项中。所以我们需要做一个下拉列表,这个列表可以动态的修改,如果这个职位已经满了,那么就从数据库中移除(或者关闭这个接口)。下拉列表中不再显示。面对这个需求,我们需要怎么实现呢?不能每一次更新就重新在做一个页面吧,那样工作量太大。我们可以使用自定义标签来完成这个需求。
(1)首先我们建立一个人员类,这和类有id与position两个属性,对应的数据库中建立这个表。我们在这里为了简便就不从数据库获取数据了,只是演示原理。建立一个people的java bean,代码如下:
package Tag;public class People { int id; String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } (2)建立标签的后台处理类,代码如下:package Tag;import java.io.IOException; import java.util.ArrayList; import java.util.List;import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.TagSupport;public class MyTag4 extends TagSupport { public int doEndTag() throws JspException { try { ArrayList list=(ArrayList)this.list(); String str=""; pageContext.getOut().print(str); } catch (Exception e) { System.out.println(e); // TODO Auto-generated catch block e.printStackTrace(); } return super.doEndTag(); } private ArrayList list() { ArrayList list=new ArrayList(); People p1=new People(); p1.setId(1); p1.setName("CEO"); People p2=new People(); p2.setId(2); p2.setName("CFO"); People p3=new People(); p3.setId(3); p3.setName("CMO"); People p4=new People(); p4.setId(4); p4.setName("HR"); list.add(p1); list.add(p2); list.add(p3); list.add(p4); return list; } }
(3)在tid文件中配置:
(2)在tld文件中配置:注意这里的配置有一点小小的区别,我们需要给属性单独的配置,其他的配置方式不变:具体代码如下
我写了注释,就不在解释每个配置的相关的属性。
<%@ taglib uri="prefix="h" %>
7.在上边我们实现了不带标签体的自定义标签,我们可以感受到这种方式的便捷,这样一来我们的java代码就可以最大程度上放在后台而不用直接写在页面上。当然喽,大牛们其实1还是很体贴的,就像是c++的stl一样,经常使用的东西其实有人给我们做好了,封装好了,我们拿来直接用就可以了。在JSP标签中也是这样,大牛们已经将常用的标签给我们写好了:JSTL。我们下一节再讨论如何使用这个东东,这里的结尾我们还是要回答一下文章开头提出来的问题:JSP标签的实现底层。我们知道:JSP嵌入java代码实际上就是被转给化成了servlet,三种不同的<%!%><=%%><%%>嵌入的代码在servlet中对应生成的的代码的位置不同,其实这里的原理也是如此,
当浏览器发来请求后,会将这个请求交给JSP翻译成的servlet来处理,自定义标签对应servlet中一个方法的调用,这个方法主要步骤如下
1,产生标签处理类的实例对象
2,将pageContext传入给标签处理类对象
3,看标签是否有父标签,如果有则将父标签传递给标签处理器类。如果没有的话则传入null。
4,调用标签处理类的doStartTag()方法来对应开始标签
5,执行一段标签体
6,执行doEndTag(),对应的是结束标签。
7,一般调用标签处理器类的release()方法来回收标签工作时的相关资源。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~