jsp标签和el表达式
1.jsp标签什么
sun公司指定的一种用来替换jsp中的jav代码的技术规范,jsp标签语法类似与html(有属性,有开始标签,结束标签,结束标记,有标签体)
优点:可易于维护,高复用,jsp页面简洁
2.表达式是什么
是一套简单的运算规则,用于给jsp标签的属性赋值,也可脱离jsp标签直接使用
3.如何写一个el表达式
方式一
${user.username}
执行过程--容器会pageContext,ServletContext,request,response依次查找绑定的沪剧的绑定值名是user的对象,找到后调用getUsername并且输出
指定查找的范围
可以使用pageContextScope,requestScope,responseScope,sessionScope来指定查找的范围,例如:usename:${sessionScope.user2.username}
方式二
${user['username']}
两个特殊用法:
[ ]里面允许出现绑定名,例如:${user[prop]}
[ ]里面允许出现从0开始的元素的下标的查找,例如:${user2.interets[0]}
3.做一些简单的运算
计算的结果可以给jsp赋值,也可直接输出
算术运算: +,-,*,/,%
逻辑运算: &&,|| ,!
关系运算:>,<,>=,<=,==,!=
empty运算: empty----用于判空(如果是空就返回true,不是空就返回false),特殊情况的true----找不到绑定名和直接null的时间也会是true
4.el表达式读取参数值
${param.username}等价与request.getParameter("username");
${paramValues.interset}等价与request.getParameterValues("interset");
5.jstl(java standard tag lib)标准标签库
1.jstl是什么--apache开发的一套jsp标签,后来捐献给了sun,sun将其命名为jstl(即标准标签库)
jsp标签的执行过程
容器依据别名(比如"c")找到对应的命名空间(比如
"http://java.sun.com/jsp/jstl/core"),然后依据命名空间找到jsp标签的描述文件(比如找到c.tld),接下来,就可以依据jsp标签名(比如"if")找到对应的标签类(比如"IfTag"),
最后调用该标签类的方法。
2.如何使用:导包-------使用taglib指令导入要使用的标签库
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
uri:指定标签的命名空间
prefix:命名空间的别名
<c:if test="${user.gender != 'm'}" var="" scope="">女</c:if>
var:指定绑定名
scope:指定查找域
4.几个核心的标签
1.if标签:<c:if test="">标签体</c:if>:当test的值为true时,容器会执行标签体的内容,test的属性可以使用el表达式赋值
2.choose标签: <c:choose>
<c:when test=""></c:when>
<c:otherwise></c:otherwise>
</c:choose>
when可以出现1此或者多次,相当于else if语句,当test属性时true的时间,执行标签体的内容,otherwise可出现0次或者1次,表示列外,最后一个值
3.<c:forEach items="" var="" varStatus=""></c:forEach>:用于编历集合或者数组
items:用于指定属性要遍历的集合或者数组,可以使用el表达式来赋值,也就是绑定名
var:用于指定绑定名:绑定范围是pageContext,该标签每次从集合或者数组元素中取一个元素,然后绑定到pageContext上
varStatus:用于绑定名,绑定的值是一个对象(方法有 count【数量】和index【下标】)
6.自定义标签(分为简单标签技术和复杂标签技术)
1.写一个java类,继承SimpleTagSupport类
package beanjstl;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
* 自定义标签
* 继承SimpleTagSupport
* 重写doTag方法
* 标签有那些属性,标签类就有那些属性,属性名要一致,类型要匹配,并且有对用的set方法
* @author soft01
*
*/
public class HelloKity extends SimpleTagSupport{
public HelloKity() {
System.out.println("HelloKity的构造器");
}
private String info;
private int qty;
public void setInfo(String info) {
System.out.println("setinfo方法:"+info);
this.info = info;
}
public void setQty(int qty) {
System.out.println("setqty方法:"+qty);
this.qty = qty;
}
@Override
public void doTag() throws JspException, IOException {
System.out.println("doTag方法");
//通过继承SimpleTagSupport类提供的方法来获得pageContext对象
PageContext ptxt = (PageContext)getJspContext();
JspWriter out = ptxt.getOut();
for(int i=1;i<=qty;i++){
out.println(info+"<br/>\r\n");
}
}
}
2.ovrride doTag方法
@Override
public void doTag() throws JspException, IOException {
System.out.println("doTag方法");
//通过继承SimpleTagSupport类提供的方法来获得pageContext对象
PageContext ptxt = (PageContext)getJspContext();
JspWriter out = ptxt.getOut();
for(int i=1;i<=qty;i++){
out.println(info+"<br/>\r\n");
}
}
}
3.在.tld文件里面描述标签【后缀名必须是tld结尾的】
jsp页面的代码【
<%@ taglib uri="test" prefix="d"%>
<d:hello info="Hello Kitty" qty="${1 + 10}"/>
】
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<description>JSTL 1.1 core library</description>
<display-name>JSTL core</display-name>
<tlib-version>1.1</tlib-version>
<short-name>d</short-name>
<uri>test</uri>
<tag>
<description><!-- 描述这个标签是做什么的 -->
Catches any Throwable that occurs in its body and optionally
exposes it.
</description>
<name>hello</name><!-- d:hello -->
<tag-class>beanjstl.HelloKity</tag-class><!-- 类的路径 -->
<!-- body-content 标签体的内容
empty:该标签没有标签体
scriptless:该标签有标签体,但是不能有java代码(<% %>,<%= %>,<%! %)
JSP:该标签有标签体,标签体里面的内容可以是java代码,但是复杂标签技术才支持该值
-->
<body-content>empty</body-content>
<attribute><!-- 属性描述 -->
<description><!-- 属性的说明 -->
</description>
<name>info</name><!-- 属性名 -->
<required>true</required><!--true代表必须赋值-->
<rtexprvalue>true</rtexprvalue><!-- true代表这个属性可以动态赋值,动态赋值就是可以使用el表达式赋值 -->
</attribute>
<attribute><!-- 属性描述 -->
<description><!-- 属性的说明 -->
</description>
<name>qty</name><!-- 属性名 -->
<required>true</required><!--true代表必须赋值-->
<rtexprvalue>true</rtexprvalue><!-- true代表这个属性可以动态赋值,动态赋值就是可以使用el表达式赋值 -->
</attribute>
</tag>
</taglib>
4.标签的执行过程
容器依据标签的命名空间找到标签的描述文件,接下来依据标签的名称找到对应的标签类,然后将该类实例化,然后调用该标签类的set方法完成属性的赋值操作,最后调用标签类的doTag方法。