jsp标签是什么
sun公司制定的一种用来替换jsp页面中的java代码的一种技术,通过使用简单的标签(类似于html标签)来代替java代码,jsp页面会变得更加简洁,利于维护。
EL表达式是什么
是一套简单的计算规则,一般用于给jsp标签的属性赋值,也可以直接输出。
EL表达式的基本语法 ${ el表达式 }
第一种:访问bean属性
${str};找到绑定名为str的对应的值
1. ${ user.name }:
jsp引擎会依次从pageContext、request、session、application查找绑定名为user的对象,如果找到了就不再向下查找,否则,继续向下查找。找到后,调用该对象的getName(),方法并输出其值;
1)如果依据绑定名称找不到数据,输出””;
2)如果值为null,会输出””;
3)如果属性名错误,会报错
2. 也可以使用${ user["name"] },效果相同。
允许[ ]里面出现绑定名,${ user[propname] },注意propname没有引号,表示变量。还允许[ ]里面出现下标(从1开始),用于访问数组中的的某个元素的值
<body style="font-size:30px;font-style:italic;"> <% User user = new User(); user.setName("tom"); user.setAge(20); user.setInterest(new String[]{"cooking","snooker","football"}); request.setAttribute("user",user); %> name:${user["name"]}<br/> <% request.setAttribute("propname","name"); %><br/> name:${user[propname]}<br/> interest:${user.interest[0]} </body>
3.指定查找的范围
${pageScope.user.name} 只到request中去找,不再依次到4个范围查找了
${requestScope.user.name}
${sessionScope.user.name}
${applicationScope.user.name}
第二种:获得请求参数值
a、${ param.username }等价于request.getParameter("username");
b、${ paramValues.interest }等价于request.getParameterValues("interest");
<html> <body style="font-size:30px;font-style:italic;"> username:${param.username}<br/> city:${paramValues.city[1]} </body> </html>
第三种:进行简单的计算,计算的结果可以用来给jsp标签的属性赋值,也可以直接输出
1. 算数运算 + - * /,但要注意,“+”不能连接字符串,+操作只能求和。
2. 关系运算 "==" , "!=" , ">" , "<" ,">=" , "<=" 可以使用对应的"eq","nq","lt","gt","le","ge"代替。
3. 逻辑运算 "&&","||","!",可以使用"and","or","not"代替。
4. empty运算 判断一个字符串是否为空,集合内容是否为空,以及绑订的对象是否存在。 以下四种情况,结果为true: 1)空字符串 2)空的集合 3)null值 4)找不到值
<body style="font-size:30px;font-style:italic;"> 算术运算: ${1+1}<br/> ${"100" + "200"}<br/> 关系运算: ${1>0}<br/> <%request.setAttribute("str","abc");%> ${"abc" == str}<br/> 逻辑运算:
${1<3 && 2>0 }<br/> empty运算:<br/> 空字符串: ${empty ""}<br/> 空的集合: <% List list1 = new ArrayList();request.setAttribute("list1",list1);%> ${empty list1 }<br/> null值: ${empty null}<br/>
<% request.setAttribute("obj",null); %>
${empty obj}<br/>
找不到值: ${empty aaa} </body>
jsp核心标签的使用
jstl(java standard taglib )java标准标签库。sun制定了标签规范,但没有任何的实现。早期都是自己实现开发这些标签。后来,apache开发一些常用的标签,捐献给了sun,sun将其命名为jstl。
编程步骤
1. 需要将jstl标准标签库相关的jar文件copy到WEB-INFlib。 jstl.jar ,standard.jar。注意:在J2EE5中不需要导入这两个jar包。J2EE5中已经包含了这两个jar包。J2EE1.4中需要导入这两个jar包。
2. 在jsp文件当中,使用taglib指令导入标签。<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
注意:uri命名空间:为了区分同名元素。
package也相当于命名空间。容器会根据命名空间的描述去找相应的标签文件。uri的值在standard.jar->META-INF->c.tld文件中<uri>标记中
prefix属性:命名空间的前缀。因为有很多的标签,不需要都导入。这里用的是核心标签。prefix="c"表示以c为开头的。即导入了c.tld和c-1.0.tld文件中的标签。
运行原理
容器根据前缀找到命令空间,找到tld文件。(标签描述文件)。标签实际上就是一个占位符(什么都做不了),在标签的描述文件中根据标签名对应的标签类
<c:if> ---> prefix=”c”--->uri-->c.tld--->IfTag
<name>if</name>
<tag-class>
org.apache.taglibs.standard.tag.rt.core.IfTag
</tag-class>
然后实例化标签类,执行标签类中的方法
使用标签
<c:if test="" var="" scope="">
标签体:可以是html,java代码(少写)</c:if>
test属性:当值为true,容器会执行标签体的内容,为false,则不执行。test属性一般使用el表达式来赋值。
var属性:指定一个绑订名。
scope属性:指定一个绑订范围。
var属性和scope属性用于将test的结果绑订到指定的对象上。绑定对象可以是:pageContext,request,session,application。
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <html> <body style="font-size:30px;font-style:italic;"> <% User user = new User(); user.setName("龙儿"); user.setGender("m"); request.setAttribute("user",user); %> 姓名:${user.name}<br/> 性别:<c:if test="${user.gender == 'm'}">男</c:if> <c:if test="${user.gender =='f'}">女</c:if><br/> 性别:<c:if test="${user.gender =='m'}" var="rs" scope="request">男</c:if> <c:if test="${!rs}">女</c:if> </body>
<c:choose>
用于分支,当某个条件满足,执行某一个分支。每一个分支条件用when标签来表示。
<c:when test=""> 可出现多次,只用于<c:choose>。test属性: 当值为true,执行标签体的内容
<c:otherwise> 只出现1次,只用于<c:choose> 当其它分支都不满足条件,则执行该标签体的内容。
<body style="font-size:30px;font-style:italic;"> <% User user = new User(); user.setName("龙儿"); user.setGender("x"); request.setAttribute("user",user); %> 性别:<c:choose> <c:when test="${user.gender == 'm'}">男</c:when> <c:when test="${user.gender == 'f'}">女</c:when> <c:otherwise>保密</c:otherwise> </c:choose> </body>
<c:forEach items="" var="" varStatus="">
用于遍历集合。
items属性:指定要遍历的集合。
var属性: 指定一个绑订名,jsp引擎会从集合当中取一个对象,绑订到 pageContext对象上。
varStatus属性:指定一个绑订名,对应的绑订值是一个java对象,封装了遍历时的一些信息,包括当前遍历的对象的下标(index)以及是第几次(count)遍历。
<body style="font-size:30px;font-style:italic;"> <table border="1" width="60%" cellpadding="0" cellspacing="0"> <tr> <td>姓名</td> <td>性别</td> <td>index</td> <td>count</td> </tr> <c:forEach items="${users}" var="u" varStatus="s"> <tr class="row${s.index % 2 + 1}"> <td>${u.name}</td> <td>${u.gender}</td> <td>${s.index}</td> <td>${s.count}</td> </tr> </c:forEach> </table> </body>
<c:url>
当用户禁止cookie以后,会自动在地址后面添加sessionId。当使用绝对路径时,会自动在地址前添加应用名。value属性:指定地址。在表单提交、链接当中,可以使用该标签。
<c:set var="" scope="" value="">绑订一个对象到指定的范围。value属性: 绑订值。
<c:remove var="" scope=""> 解除绑订
<c:catch var="">处理异常,会将异常信息封装成一个对象,绑订到pageContext对象上。
<c:import url="">url指定一个jsp文件的地址,jsp会在运行时调用这个jsp。
<c:redirect url="">重定向到另外一个地址。url属性指定重定向的地址。
<c:out value="" default="" escapeXml="">
用于输出el表达式的值。
value属性: 指定输出的值
default属性: 指定缺省值。
escapeXml属性: 设置成true,会将value中的特殊字符替换成相应的实体。缺省值就是true。
自定义标签
step1、先写一个java类,继承SimpleTagSupport类
step2、覆盖 doTag方法,在该方法里面,编写相应的处理逻辑。
step3、在.tld文件里面,描述这个标签。注意该文件请放在WEB-INF文件下(与web.xml同级),运行时会自动加载
JSP页面
想要定义一个<c1:hello >的jsp标签。有两个属性:info(要打印的内容),qty(打印次数)
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@taglib prefix="c1" uri="http://www.test.com/mytag" %> <html> <body> <c1:hello info="hello wold" qty="100" /> </body> </html>
java类 HelloTag类
/** * 标签有哪一些属性,标签类也会有对应的属性, * 并且属性名称要一致,类型匹配,要有对应的set方法。 */ public class HelloTag extends SimpleTagSupport { private String info; private int qty; public HelloTag() { System.out.println("HelloTag's constructor..."); } 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("HelloTag's doTag..."); PageContext ctx = (PageContext)getJspContext(); // pageContext提供了获得其它八个隐含对象的方法。 JspWriter out = ctx.getOut(); for(int i = 0; i < qty; i++){ out.println(info + "<br/>"); } } }
tld描述文件 myTag.cld
<?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"> <!-- 定义 taglib指令中的uri和prefix属性 --> <tlib-version>1.1</tlib-version> <short-name>c1</short-name> <uri>http://www.test.com/mytag</uri> <!---开始定义标记 --> <tag> <!-- 标记名 --> <name>hello</name> <!-- 处理这个Tag的相应的类的名称 --> <tag-class>tag.HelloTag</tag-class> <!-- 可以有三个值:empty、scriptless、JSP empty: 标签没有标签体。 scriptless:标签可以有标签体,但是,标签体的内容不能够出现java代码(<% %>,<%= %>,<%! %>)。 JSP:标签有标签体,并且,标签体的内容可以是java代码。 但是,只有复杂标签技术才支持。简单标签技术只支持 empty,scriptless。 --> <body-content>empty</body-content> <!--开始定义标记的属性---> <attribute> <!-- 属性的名称 --> <name>info</name> <!-- 表示这个属性是不是必须的 --> <required>true</required> <!-- 当rtexprvalue为true,表示可以动态赋值,即可以使用el表达式来赋值 --> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>qty</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
如果使用javaee5.0,如何使用el表达式和jstl
1. 程序使用的规范应该与容器使用的规范一致。比如:javaee5.0对应的servlet规范是servlet2.5,tomcat6.0实现了servlet2.5规范。javaee1.4对应的servle规范是servlet2.4,tomcat5.5实现了servlet2.4规范。
2. 不再需要拷贝jstl对应的jar包。