EL:表达式语言
等价于<%= %>,只负责输出,不做任何数据处理,如果没有找到输出的值,则输出""
jsp2.0提供了el和jstl
1. EL语法
输出常量
${"admin"}<br>
在pageContext,request,session,application中寻找user变量<br>
找到立即输出,不向后继续寻找<br>
<%
request.setAttribute("user","admin");
session.setAttribute("user","admin11");
%>
${user}<br>
<%
String array[]={"hello","student"};
pageContext.setAttribute("array",array);
%>
array[0]=${array[0]}<br>
<%
List<Student> list=new ArrayList<Student>();
list.add(new Student("admin","beijing",20));
session.setAttribute("list",list);
%>
list[0]=${list[0]}<br>
<%
Map<String,String> map=new HashMap<String,String>();
map.put("name", "admin");
map.put("age", "20");
application.setAttribute("map",map);
%>
age=${map.email}<br>
email=${map["email"]}<br>
.和[]的区别:.后的名称必须是符合java合法标识符规范的名称,如果不规范,那么必须使用[]
2. 运算符
加减乘除
${2+3}
${"2"+"3"}
${4 div 2}
${5 mod 3}
比较运算符
${2>3},${2 gt 3 }
${2<3},${2 lt 3 }
${2==3},${2 eq 3}
${2!=3},${2 ne 3}
${2>=3},${2 ge 3}
${2<=3},${2 le 3}
逻辑运算符
${2>3&&true},${2>3 and true }
${2>3||true},${2>3 or true }
${!false},${not false }
三目运算符
${true?1:3}
empty:判断是否为null
${empty user123},${user123==null}
3. 内置对象(11个)
和范围相关的
pageScope、requestScope、SessionScope、applicationScope
<%
List<String> list=new ArrayList<String>();
list.add("abc");
list.add("hello");
request.setAttribute("list1",list);
session.setAttribute("list",list);
%>
不会向下寻找
${requestScope.list[0]}
等价于<%
List<String> list1=(List<String>)request.getAttribute("list1");
String str=list1.get(0);
out.print(str);
%>
和页面相关的
param,paramValues
param==>request.getParameter();
paramValues==>request.getParameterValues()
${param.name}等价于<%out.print(request.getParameter("name")); %>
${paramValues.like[0]}等价于<%String[] likes=request.getParameterValues("like");
for(String s:likes){out.print(s);}%>
和请求头相关
header,headerValues
header==>request.getHeader(key);
headerValues==>request.getHeaderValues(key);
${header.Accept}
${headerValues.Accept[0]}
cookie
cookie==>cookie.getValue()
${cookie.JSESSIONID.value}
initParam需要配置xml
<context-param>
<param-name>pwd</param-name>
<param-value>123</param-value>
</context-param>
initParam==>application.getInitParameter();
${initParam.pwd}
pageContext
${pageContext.request.contextPath}
${pageContext.session.id}
JSTL:JAVA标准标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
set:在某个域中设置属性
scope范围:page、request、session、application
<c:set var="str" value="hello" scope="request">
等价于<%request.setAttribute("str", "hello"); %>
</c:set>
out:输出属性值
<c:out value="${requestScope.str}"></c:out>
remove:删除属性值,如果多个域中定义相同的属性,不指定范围,删除全部,删除之后变为空的字符串,什么都不显示
<c:remove var="str" scope="request"/>
catch:捕获异常
<c:catch var="e">
<%
String name=null;
int n=name.length();
%>
</c:catch>
<c:set var="age" value="20" scope="request"></c:set>
<c:if test="${requestScope.age==20}">
</c:if>
<c:choose>
<c:when test="${age<20 }">
小于20
</c:when>
<c:when test="${age>20 }">
大于20
<c:otherwise>
等于20
</c:otherwise>
</c:when>
</c:choose>
<c:forEach var="i" begin="1" end="10" step="2">
${i}
</c:forEach>
<%
List<String> list =new ArrayList<>();
for(int i=1;i<=10;i++){
list.add(""+i);
}
request.setAttribute("list", list);
%>
<c:forEach var="str" items="${requestScope.list}" varStatus="status">
${str},
</c:forEach>
分割输出
<c:forTokens items="a:b:c:d" delims=":" var="str">
${str}
</c:forTokens>
包含页面
<c:import url="a.jsp">
<c:param name="name" value="admin">传到包含的页面用${param.name}获取</c:param>
</c:import>
重定向
<c:redirect url="a.jsp"></c:redirect>
定义url,如果cookie被禁用,实现url重写,没禁用,正常处理
<c:url var="myurl" value="a.jsp" scope="">
<a href="${myurl}"></a>
</c:url>