1.el表达式
表达式语言(Expression Language,简称EL)
EL主要作用:
获取数据:
EL表达式主要用于替换JSP页面中的脚本表达式,检索request、session等web域对象中的数据,访问javabean的属性、list 集合、map集合、数组等。
执行运算:
利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。${user==null}
获取web开发常用对象
EL 表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。
调用Java方法
EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法
<% session.setAttribute("user", new Object()); %>
${"hello" }
${2*2 }
<br>
<% session.getAttribute("user"); %>等价于
${sessionScope.user }
//需求
<!-- 主页 ---
登录成功后--欢迎XX,退出
未登录---登录 注册 -->
<c:if test="${ not empty sessionScope.user}">
欢迎XX<a href="logOut.jsp">退出</a>
</c:if>
<c:if test="${empty sessionScope.user}">
<a href="login.jsp">登录</a>
<a href="register.jsp">注册</a>
</c:if>
(2)Param :表示一个保存了所有请求参数的Map对象 ${map[key]} ${map.key} 等价于 request.getParameter(String name)
paramValues :表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回的是一个string[]
${map[key][index]} ${map.key[index]}
等价于 request.getParameterValus(String name)
//例子
<%="用户名"+request.getParameter("username") %>
<%="密码"+request.getParameter("psw") %>
等价于:
用户名:${param["username"] }
${param.username }
用户名:${paramValues["username"][0] }
<br/>
密码:${param["psw"] } ${param.psw }
密码:${paramValues["psw"][0] } ${paramValues.psw[0] }
(3)运算
${10>9&&100<200 }
${10>9 and 100<200 }
${10 gt 9 and 100 lt 200 }
${"hello" =="wolo" }
${"hello" eq "wolo" }
${"hello"!=null }
${ not empty "hello" }
(4)获取作用域中的信息
${sessionScope.user } 等价于<% session.getAttribute("user"); %>
${requestScope.user } 等价于<% request.getAttribute("user"); %>
${pageScope.user } 等价于<% pageContext.getAttribute("user"); %>
${applicationScope.user } 等价于<% application.getAttribute("user"); %>
可以省略域名XXXScope
(5)获取内置对象的信息
<%=request.getRemoteAddr() %>等价于
${pageContext.request.remoteAddr }
<%=request.getHeader("Host") %>等价于
${header.host } ,${header["host"] }
<%=session.getId() %>等价于
${pageContext.session.id }
<%
//设置cookie
Cookie c1=new Cookie("uname","tom");
Cookie c2=new Cookie("psw","123");
c1.setMaxAge(60);
c2.setMaxAge(60);
response.addCookie(c1);
response.addCookie(c2);
%>
<%
//获取
Cookie[] cooks= request.getCookies();
for(Cookie cook: cooks){
out.print("属性名:"+cook.getName());
out.print("属性值:"+cook.getValue());
}
%>
等价于
//el表达式获取cookie
${cookie.JSESSIONID.value } ${cookie["JSESSIONID"].value }
${cookie.uname.value } ${cookie.psw.value }
//练习:注册页面,请求参数获取
<form action="" >
用户名<input type="text" name="username" >
密码<input type="text" name="psw" >
性别<input type="radio" name="sex" value="男">男
<input type="radio" name="sex" value="女">女
爱好 <input type="checkbox" name="hobby" value="swim">游泳
<input type="checkbox" name="hobby" value="read">看书
<input type="checkbox" name="hobby" value="song">唱歌
<input type="checkbox" name="hobby" value="travel">旅游
<input type="submit" value="注册">
</form>
<table border="1">
<tr><td>用户名</td>
<td>${param.username }</td>
</tr>
<tr><td>密码</td>
<td>${param.psw }</td>
</tr>
<tr><td>性别</td>
<td>${param.sex }</td>
</tr>
<tr><td>爱好</td>
<td>
<c:forEach items="${paramValues.hobby}" var="str">
${str }
</c:forEach>
</td>
</tr>
</table>
2.JSTL标签库
1)导包,webContent下 wib-INF下的lib中,add to build path
jstl.jar
standard.jar
2)在jsp引入标签库
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
core核心库中
(1)通用标签
<c:out> 输出 out.print() <%= %>
<c:set> 设置各种范围域的属性 setAttribute(String name,object value)
<c:remove> 删除各种范围域的属性 removeAttribute(String name)
<c:catch> 异常处理
<c:set> 中scope="{page|request|session|application}"
//例子
<% session.setAttribute("userName", "张三"); %> 等价于
<c:set var="userName" value="张三" scope="session"></c:set>
您好!<c:out value="${userName}" default="游客"/>
<c:remove var="userName" scope="session" />
//例子二:
<jsp:useBean id="user" class="com.edu.User" ></jsp:useBean>"
<c:set property="name" value="李四" target="${user }"></c:set>
<c:out value="${user }"></c:out>
<c:set>属性
property:要修改的属性 javaBean的成员属性
value:存储的值
var: 存储的名 key setAttribute(key,value)
target :要修改的对象
scope: var的作用域 page|request|session|application
//c:catch使用
<c:catch var="errormsg">
<%=10/1 %>
</c:catch>
<c:if test="${empty errormsg }">
没有异常
</c:if>
<c:if test="${ not empty errormsg }">
${errormsg.message }
</c:if>
(2)判断:条件标签
单分支 <c:if>标签
多分支<c:choose>标签
<c:when>标签
<c:otherwise>标签
<c:choose>
<c:when test="${empty sessionScope.userName}">
欢迎您:${sessionScope.userName }
</c:when>
<c:otherwise>
欢迎您:游客
</c:otherwise>
</c:choose>
// 60分以下 不及格 60-70 及格 70-80 良好 80-90 优秀 其他 分数不正确
<c:set var="score" value="56" scope="request" ></c:set>
<c:choose>
<c:when test="${score<60 }"> 不及格 </c:when>
<c:when test="${score<70 }"> 及格 </c:when>
<c:when test="${score<80 }"> 良好 </c:when>
<c:when test="${score<90 }"> 优秀 </c:when>
<c:otherwise>其他 分数不正确</c:otherwise>
</c:choose>
(3)迭代
<c:forEach>
var用于指定将当前迭代到的元素保存到page域中的属性名称;
items指定将要迭代的集合对象;
varStatus表示当前被迭代到的对象的状态信息,包括四个属性:index(表示当前迭代成员的索引值)、count(表示当前已迭代成员的数量)、first(表示当前迭代到的成员是否为第一个)、last(表示当前迭代到的成员是否为最后一个);
begin表示遍历的起始索引,值为整数;
end表示遍历的结束索引,值为整数;
step表示迭代的步长,值为整数。
//1-100所有数
<c:forEach begin="1" end="100" var="i">
</c:forEach>
//1-100 所有偶数
<c:forEach begin="2" end="100" var="i" step="2">
${i }
//遍历集合
<% List<String> list=new ArrayList();
list.add(0, "hello");
list.add(1, "world");
list.add(2, "harbin");
request.setAttribute("strList", list);
%>
<c:forEach items="${strList }" var="aa">
${aa }
</c:forEach>
//遍历map
<% Map<Integer,String> map=new HashMap();
map.put(1,"hello");
map.put(2,"杨慧兰");
map.put(5,"嘻嘻嘻");
request.setAttribute("strMap", map);
<c:forEach items="${strMap }" var="aa" varStatus="mm">
${aa.key }:
${aa.value }
索引:
${mm.index }
</c:forEach>
<c:forTokens> 按照某字符分割字符串,然后遍历
// 遍历字符串
<c:set var="s1" value="2019-7-25" scope="request"></c:set>
<c:forTokens items="${s1 }" delims="-" var="str">
<div style="border:1px solid ;margin:5px"> ${str }</div>
</c:forTokens>
(3)URL相关标签
<c:url>定义地址,并存放在域中
<c:url var="turl" value="login.jsp"></c:url>
<a href="${turl }">跳转到登录页</a>
<c:redirect>重定向
<c:url var="turl" value="login.jsp" ></c:url>
<c:redirect url="${turl }"></c:redirect>
3.I18N标签库 国际化
<%@taglib prefix="fmt" uri=" http://java.sun.com/jsp/jstl/fmt"%>
<fmt:formatDate>
value指定要格式化的日期或时间;
type指定是要输出日期部分还是时间部分,或者两者都输出;
dateStyle指定日期部分的输出格式,该属性仅在type属性取值为date或both时才有效;
timeStyle指定时间部分的输出格式,该属性仅在type属性取值为time或both时才有效;
pattern指定一个自定义的日期和时间输出格式;
timeZone指定当期采用的时区;
var指定格式化结果保存到某个范围域中某个属性的名称;
scope指定格式化结果所保存的范围域。
<fmt:setLocale value="zh_CN" />
<fmt:formatDate value="<%=new Date()%>"/>
<fmt:formatDate value="<%=new Date()%>" pattern="yyyy-MM-dd HH:mm:ss" />
<fmt:formatDate value="<%=new Date()%>" type="both" dateStyle="full"/>
<fmt:formatDate value="<%=new Date()%>" type="both" timeStyle="full"/>
4.自定义标签库(了解)
创建"Hello"标签
<ex:Hello />
要创建自定义的JSP标签,你首先必须创建处理标签的Java类。所以,让我们创建一个HelloTag类,如下所示:
package com.runoob;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;
public class HelloTag extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
JspWriter out = getJspContext().getOut();
out.println("Hello Custom Tag!");
}
}
以下代码重写了doTag()方法,方法中使用了getJspContext()方法来获取当前的JspContext对象,并将"Hello Custom Tag!"传递给JspWriter对象。
编译以上类,并将其复制到环境变量CLASSPATH目录中。最后创建如下标签库:<Tomcat安装目录>webapps\ROOT\WEB-INF\custom.tld。
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>Example TLD</short-name>
<tag>
<name>Hello</name>
<tag-class>com.runoob.HelloTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
接下来,我们就可以在JSP文件中使用Hello标签:
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>
<html>
<head>
<title>A sample custom tag</title>
</head>
<body>
<ex:Hello/>
</body>
</html>