Java Web基础——自定义标签和JSTL

因为在Struts2中使用到了很多该框架的自定义标签的使用,所以在此特别梳理了一下有关的知识体系


标签(动作)的一般语法为:<prefix:标签名 属性表列>,如<jsp:include page="copyright.jsp" />,该标签的作用是把copyright.jsp页面的输出包含到当前页面的输出中

我们先来看一下常用的标准JSP动作动作指令,又可以叫做标签指令:

  • jsp:include 在当前页面包含另一个页面的输出
  • jsp:forward 将请求转发到指定的页面
  • jsp:usebean 查找或者创建一个JavaBeans对象
  • jsp:setProperty 设置JavaBeans的属性值
  • jsp:getProperty 返回JavaBeans的属性值
  • jsp:plugin 在JSP页面嵌入一个插件(如Applet)

以上的这些标准标签是JSP中内置的,所以不需要特别的生命便可使用。当然我们也可以根据需要定义自定义标签以实现特定的效果,下面我将系统的介绍自定义标签的创建和使用流程:


所谓自定义标签就是用Java语言开发的程序的,以特定的格式在JSP页面中使用的标签,自定义标签又被叫做自定义动作(Custom Action)。

我们这里主要介绍如何利用JSP2.0中的扩展标签API进行开发,而不再介绍传统JSP1.x中标签的开发,JSP2.0中简单的自定义标签开发更加简洁和使用。



一.简单自定义标签API的层次结构

标签类层次结构
  • Jsp接口是一个接口,该接口没有定义任何方法,只起到接口表示和类型安全的作用
  • SimpleTag接口用来实现结点的自定义标签,接口中定义了5个生命周期方法,下面我们会详细介绍
  • SimpleTagSupport类实现了SimpleTag接口,并且还定义了另外三个方法



二.自定义标签的开发步骤

  • 创建标签处理类
  • 创建标签库描述文件TLD(Tag Library Discriptor)
  • 在JSP页面中引入标签库和使用标签

下面我们将创建使用一个实现将标签体打印五次的自定义标签,并在之后说明其相关原理。

标签处理类

public class HelloTag implements SimpleTag {

	JspContext context = null;
	JspTag parent = null;
	JspFragment jspBody = null;
	
	@Override
	public void doTag() throws JspException, IOException {
		StringWriter sw = new StringWriter();
		jspBody.invoke(sw);
		String bodyContent = sw.toString();
		JspWriter out = context.getOut();
		for(int i=0;i<5;i++){
			out.println(bodyContent);
		}
	}
	@Override
	public JspTag getParent() {
		return parent;
	}
	@Override
	public void setJspBody(JspFragment jspBody) {
                this.jspBody=jspBody;
        }
	@Override
	public void setJspContext(JspContext jspContext) {
		context = jspContext;
	}
	@Override
	public void setParent(JspTag parent) {
		this.parent = parent;
	}
}

标签库描述文件 sampleLib.tld,放在WEB-INF或者其子文件夹中

<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">
	<tlib-version>2.0</tlib-version>
	
	<short-name>hello</short-name>
	<uri>/testPath</uri>
	
	<tag>
		<name>hello</name>
		<tag-class>com.mytream.HelloTag</tag-class>
		<body-content>scriptless</body-content>
	</tag>
</taglib>


在JSP页面中使用该标签

hello.jsp

<%@ page contentType="text/html" %>
<%@ taglib prefix="test"  uri="/testPath" %>
<html>
  <head>
    <title>Test Custom Tag</title>
  </head>
  <body>
    	<test:hello>good</test:hello>
  </body>
</html>

访问hello.jsp页面,我们将会看到good被连续打印了5遍,这是我们在doTag()方法中所做的操作,当然该标签的解析过程要比这复杂的多,下面我讲一一介绍。



三.容器解析自定义标签的过程

解析自定义标签流程图
上图不一定符合UML规范,仅仅是为了帮助理解。从上图我们可以看到tomcat容器在对JSP页面进行转换的过程中,一旦遇到用户自定义的标签便要通过如上三步进行解析并执行该标签所代表的动作。
1.通过标签的前缀找到该标签所对应的uri,该uri并不表示资源的具体位置,而是通过它可以建立与TLD文件中所定义标签的映射。在WEB-INF/下的TLD文件中找到<tag>标签中的<name>对应的<tag-class>,
也就是需要创建的类的对象的名字。利用反射机制创建HelloTag的示例
2.调用HelloTag的setXXX()方法,根据JSP页面中属性对应的值对HelloTag对象的属性值进行设置,这样我们就可以在自己定义的这些类中使用这些属性值了
3.调用HelloTag的doTag()方法,执行用户定义的相关操作



四.使用标准标签库JSTL(JSP Standard Tag Library)

既然我们能够自定义标签,我们当然也能够使用已经定义好的其他好的标签。
JSTL为我们提供了庞大的标签库,使用JSTL可以提高开发的效率,参考之前自定义标签的操作,要使用JSTL标签要进行如下操作:
  • 从<CATALINA_HOME>\webapps\examples\WEB-INF\lib中将jstl.jar和standard.jar文件复制到自己的项目中的WEB-INF\lib目录中
  • 在使用JSTL标签前进行声明,即用taglib指令来引用标签库,如<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  • 使用,如<C:out value="Welcome to using JSTL" />将会输出Welcome to using JSTL.
JSTL相当庞大,共提供了5个库,如下表所示
JSTL库及使用的URI与前缀
库名称使用的URI前缀
核心标签库http://java.sun.com/jsp/jstl/corec
XML标签库http://java.sun.com/jsp/jstl/xmlx
国际化和格式化库http://java.sun.com/jsp/jstl/fmtfmt
SQL标签库http://java.sun.com/jsp/jstl/sqlsql
函数库http://java.sun.com/jsp/jstl/functionsfn









至于如何使用JSTL标签库,有太多的参考资料了,暂时不再列叙














  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值