Jsp2.0自定义标签(第三天)——EL表达式的使用
1、提出问题:
我们经常会看到这样的jsp页面代码:
浏览器显示:
为什么会在页面输出:Hello World ,${per}究竟是如何找到“Hello World”的呢?
2、分析问题:
要想解决上述疑问,首先要试试自己能不能自定义出上面的标签。
比如我想定义<myout:demo print="${per}"/>拥有打印出EL表达式值的功能。
同前面几章一样,自定义标签我分为几个部分:
第一部分:定义标签的地方(*.tld)。
<?xml version="1.0" encoding="utf-8"?> <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>1.0</tlib-version> <short-name>myout</short-name> <!-- 这就是比上面的demo.tld文件多添加了一行 --> <uri>/demo</uri> <tag> <name>demo</name> <tag-class>com.tag.support.ElTagDemo</tag-class> <body-content>empty</body-content> <attribute> <name>print</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
第二部分:tld文件中的实现类
import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.SimpleTagSupport; public class ElTagDemo extends SimpleTagSupport{ private String print; public String getPrint() { return print; } public void setPrint(String print) { this.print = print; } @Override public void doTag() throws JspException, IOException { this.getJspContext().getOut().write(print.toString()); } }
第三部分:前台页面。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="myTag" uri="/demo" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% request.setAttribute("per","Hello World"); %> <myTag:demo print="${per}"/> </body> </html>
浏览器显示:
注意:这里直接把"per"(姑且成为key)在作用域中对应的值“Hello World”(姑且叫value)赋给了属性print,所有在后台直接打印print属性就行了。
但是这与前面第二天的例子不一样,前面是把“arr”字符串赋给了属性items,所以要取出”arr”对应的值还要通过
调用jspContext.getAttribute(items);方法,这里要注意一下。
扩充:如果前台页面变成这样呢?看代码
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="myTag" uri="/demo" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% UserInfo user = new UserInfo(); user.setName("jack"); user.setAge(11); request.setAttribute("per",user); %> <myTag:demo print="${per}"/> </body> </html>
这样在后头自定义标签处理类中就要把print的类型定义为UserInfo