EL表达式:获取值,JSTL可用作判断、循环
在JSP页面中,可以用在“ ” 里取值并展示,不要当成字符串拼接了。
英文expression language表达式语言。
是直接在jsp页面取值展现用(四大作用域:pageContext-request-session-application(servletContext),${key名}
用于替换域对象.getattribute().方法
JSTL:java server pages standard tag library jsp标签集合 结合EL表达式进行逻辑操作,展示数据
## EL表达式11大内置对象
pageScope:获取pageContext域属性
requestScope:获取request域属性,
sessionScope:获取session域属性,
applicationScope:获取application域属性
param: 可获取url拼接的参数
paramValues: 获得url所有的拼接参数集合
header:
headerValues:
initParam:获取web.xml中内的参数
cookie:用于获取cookie,Map<String,Cookie>,其中key是cookie的name,value是cookie对象,例如${cookie.JSESSIONID.value }就是获取sessionId
pageContext:可以获取JSP九大内置对象request、reponse、session、application ,out等
PS:
如果指定了取值范围,却没有取到值就不显示。
没有指定取值范围,会从最小范围pageContext依次遍历找,直到找到值为止,遍历完四大作用域都没有的话,就不显示。
获取值 时可以用 . 也可以用下标[***]
el表达式取出的值如果为:"“null不存在 这三种情况,不显示,不报错
${door.length} 能这样用的前提是:length属性有get方法。
el表达式取出的值,会自动类型转换
el表达式可以直接用运算符,其中+这个符号只能作算术运算。
判断变量是否为:不存在”"null --------> ${empty k3} ${!empty k4}
${pageScope.k1} //指定范围
${k1} //范围从四大作用域里最小的开始
${requestScope.k2}
${sessionScope.k3}
${applicationScope.k4}
${1+10-3>6&&1+1>3}<br>
${empty k1}
${empty yes} //k1 yes是空? 返回true false
${cookie.JSESSIONID} //地址javax.servlet.http.Cookie@25ba77d
${cookie.JSESSIONID.value}//2D0663184275176B4CC53567D8CDDD24
获取数组或者集合中的元素:
<%
int[] array = new int[]{1,2,3,4,5};
request.setAttribute("array",array);
List<Emp> emps = new ArrayList<>();
emps.add(new Emp(1,"gavin",2000,19));
emps.add(new Emp(2,"marry",3000,29));
emps.add(new Emp(3,"jack",4000,39));
request.setAttribute("emps",emps);
Map<String,String> maps = new HashMap<>();
maps.put("CN","中国");
maps.put("FK","法国");
maps.put("US","美国");
request.setAttribute("maps",maps);
%>
${requestScope.array[0]}
${emps[0].name} <%-- 也可以用 ${emps.get(0)} --%>
${maps.CN} <%-- 也可以用 ${maps["US"]} -->
empty
<%
String s1="";
pageContext.setAttribute("s1", s1);
String s2=null;
pageContext.setAttribute("s2", s2);
String s3="122222";
pageContext.setAttribute("s3", s3);
List list1 =new ArrayList();
pageContext.setAttribute("list1", list1);
%>
<!-- empty关键只要内容是空true -->
${empty s1}<br>
${empty s2}<br>
${empty s3}<br>
${empty list1}<br>
Cookie cookie = new Cookie("username","fage");
cookie.setMaxAge(60*60);
response.addCookie(cookie); //新增cookie,记得要add到response
JSTL:
<h3>条件标签:if</h3>
<c:if test="${8>2 }">
8大于2是成立的
</c:if>
<c:if test="${8<2 }">
8小于2是成立的
</c:if>
<c:set var="score" value="80"></c:set>
<c:choose>
<c:when test="${score>=90 }">优秀</c:when>
<c:when test="${score>=80 }">良好</c:when>
<c:when test="${score>=70 }">中等</c:when>
<c:when test="${score>=60 }">及格</c:when>
<c:otherwise>不及格</c:otherwise>
</c:choose>
userStatus:每个元素对应的相关状态属性
<c:forEach var="stu" items="${students}" varStatus="userStatus">
<tr>
<td>${stu.id}</td>
<td>${stu.name}</td>
<td>${stu.score}</td>
<td>${stu.classes}</td>
<td>${vs.first}</td>
<td>${vs.last}</td>
<td>${vs.count}</td>
<td>${vs.index}</td>
</tr>
</c:forEach>
${userStatus.index} 此项的索引,从0开始
${userStatus.count} 此项的计数序号,从1开始
${userStatus.first} 此项是否是第一项,布尔值
${userStatus.last} 此项是否是最后一项,布尔值
${userStatus.begin} 此次迭代的起始索引,对应<c:foreach>中begin属性值
${userStatus.end} 此次迭代的终止索引,对应<c:foreach>中end属性值
${userStatus.step} 此次迭代的跳跃步伐,对应<c:foreach>中step属性值
禁用COOKIE时,会带上sessionid
以下两种方式都会自动判断有没有禁用cookie而带不带sessionid
1.response.encodeRedirectURL(request.getContextPath() + "/e1.jsp");
禁用COOKIE
2.
<c:url context='${pageContext.request.contextPath}' value='/xxxController' />
上面这句,返回--->/myshop/ttttttttt.jsp;jsessionid=626912669EC070B88139E9E9D48DBF56
//在form表单的action中嵌套动态路径 双引号里包单引号。
<form action="<c:url context='${pageContext.request.contextPath}' value='/xxxController' />">
</form>
JSP:
九大内置对象:
pageContext:可get其它八个对象
RequestDispatcher rd = request.getRequestDispatcher("/a.jsp");//“/”绝对路径
rd.forward(request,response);//转发
response.sendRedirect("a.jsp"); //重定向
pageContext.forward("a.jsp"); //转发
pageContext.include("a.jsp"); //包含
JSP
服务端页面,HTML+JAVA代码,动态生成网页。
JSP脚本,注释,
指令–3个:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
静态包含,物理上多个页面合在一个,注意下面三个网页中定义变量容易有重复的,
这样容易报错
<%@ include file="header.jsp"%>
...
<%@ include file="footer.jsp" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
JSP动作标签
动态包含: 可以防止各个页面内变量重名。
<jsp:include page="index.jsp"/>
实例化对象:
<jsp:useBean id="user" class="com.qf.entity.User"/>
<jsp:useBean id="user" class="com.qf.entity.User" />
<jsp:setProperty name="user" property="name" value="gavin" />
赋值与取值显示:
<jsp:useBean id="user" class="com.qf.entity.User" />
<jsp:setProperty name="user" property="name" value="gavin" />
<jsp:getProperty name="user" property="name" />
<jsp:forward page="index.jsp" />
转发+传参数
<jsp:forward page="index.jsp">
<!-- http请求参数传递-->
<jsp:param name="sex" value="nan" />
</jsp:forward>
JSP四大域对象:可以存值的。
<%
pageContext.setAttribute("name",value);//当前页面作用域有效
%>
pageContext操作其他作用域存、取值
<%
//操作其他作用域存储
pageContext.setAttribute("name",value);//当前页面有效
pageContext.setAttribute("name",value,PageContext.REQUEST_SCOPE);//request作用域
pageContext.setAttribute("name",value,PageContext.SESSION_SCOPE);//session作用域
pageContext.setAttribute("name",value,PageContext.APPLICATION_SCOPE);//application作用域
%>
<%
//操作其他作用域获取
pageContext.getAttribute("name");//当前页面作用域
pageContext.getAttribute("name",PageContext.REQUEST_SCOPE);//request作用域
pageContext.getAttribute("name",PageContext.SESSION_SCOPE);//session作用域
pageContext.getAttribute("name",PageContext.APPLICATION_SCOPE);//application作用域
pageContext.findAttribute("name");//从pageContext,request ,session ,application依次查找
%>