Day17 Jsp三大指令9大内置对象;el表达式的使用;jsp的jstl常见核心标签使用(笔记)
文章目录
1.Jsp:本质就是servlet,有三大指令/9大内置对象
前言:Jsp:本质就是servlet
注释:<%–注释–%>
jsp可以写Java代码格式为:<%Java代码%>
jsp的输出表达式:<%=xxxxx%>
1.1 三大指令
page指令,
include指令:静态导入
targlib指令:重点 + 结合jstl核心标签使用
(1) page指令
默认带的两个属性
language:只支持java语言
contentType:当前jsp的页面编码是utf-8
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
buffer:jsp中的html标签都需要被jsp内置对象:JspWriter(字符流) out对象,out对象不断给浏览器写入内容,缓冲区大小默认8kb
errorPage:如果当前页面发生异常,跳转到错误页面上
isErrorPage:当前页面是否是错误页面
isELIgnored:是否忽略jsp的el表达式 ,默认值不会忽略 false
import:导入相关的java类或者接口的包名
<%@ page contentType="text/html;charset=UTF-8" language="java"
buffer="8kb" errorPage="500.jsp" isErrorPage="false" isELIgnored="false" %>
(2) include静态包含指令
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>静态包含</title>
<%--
一般网站:共有页面:头部导航页面,在其他页面上将页面导入进去:静态导入
静态导入:将导入的jsp文件不会被单独翻译和编译,直接就将导入jsp文件内容直接写入到当前jsp文件中,
比较节省内存! (推荐)
--%>
</head>
<body>
<%--@include指令:静态导入
file属性:加载导入的jsp文件,只是将导入的jsp文件的内容写进来
--%>
<%@include file="header.jsp"%><%--导入头部导航页面--%>
<hr/>
<%@include file="main.jsp"%><%--导入轮播图片--%>
</body>
</html>
解释:header.jsp和main.jsp是两个资源
(3) targlib指令:重点 + 结合jstl核心标签使用
<%@taglib%>taglib指令 + 结合jsp的核心标签库 jstl使用---->必须导入jstl.jar包以及依赖包
演示看下边的第五点
1.2 9大内置对象,其中四个都是域对象 :重点四个域对象,其他5个了解一下
jsp的9大内置对象
其中四个域对象:
PageContext pageContext :仅仅是在当前jsp页面中有效 jsp中使用el表达式:pageScope
HttpServletRequest request :在一次请求中有效 requestScope
HttpSession session :在一次会话中有效 sessionScope
ServletContext application :是全局对象:代表整个web应用程序 applicaionScope
其他内置对象:
ServletConfig config:配置对象
JspWriter out:jspWriter—继承Writer:字符输出流对象 对象名称 out
HttpServletResponse response:响应对象:直接响应给浏览器内容
Object page (this):代表是当前jsp对象的地址值引用
Throwable t :代表的异常对象
<body>
<%
//jsp的脚本代码:书写Java代码
response.getWriter().write("hello,jsp内置对象");
out.write("hello,高圆圆") ; //直接给浏览器打印内容
%>
<%--
9大内置对象:使用居多四个域对象
PageContext pageContext :仅仅是在当前jsp页面中有效 jsp中使用el表达式:pageScope
HttpServletRequest request :在一次请求中有效 requestScope
HttpSession session :在一次会话中有效 sessionScope
ServletContext application :是全局对象:代表整个web应用程序 applicaionScope
--%>
<%
//现在给pageContext域对象存了一数据
//pageContext.setAttribute("name","张三") ;
//给request对象存储一个数据
request.setAttribute("name","李四") ;
//给session对象中存储一个数据
session.setAttribute("name","王五") ;
//给application对象存储一个数据
//application.setAttribute("name","老六") ;
%>
<%--没有el表达式之前传统方式获取域对象中属性绑定的内容-%>
<%--使用jsp的输出表达式--%>
<%= (String)pageContext.getAttribute("name")%> <br/>
<%=(String)request.getAttribute("name")%> <br/>
<%=(String)session.getAttribute("name")%><br/>
<%=(String)application.getAttribute("name")%>
<hr/>
<%--
使用jsp的el表达式:目的就是代替上面的写法
${域对象.name属性} 获取指定域对象中属性绑定的内容
--%>
<%--获取pageContext域对象中存储的内容: el表达式内置的pageScope--%>
${pageScope.name} <br/>
<%--获取request域对象中存的内容 el表达式内置对象 requestScope--%>
${requestScope.name} <br/>
<%--获取session域对象中存的内容 el表达式内置对象 sessionScope--%>
${sessionScope.name} <br/>
<%--获取appliction域对象中存的内容 el表达式内置对象 applcationScope--%>
${applicationScope.name} <br/>
<hr/>
<%--
这个四个域对象中在el表达式 pageScope,requestScope,sessionScope,applicationScope
获取每一个域对象属性对应的内容
${name属性名称}--- 会自动的在四个域对象搜索,(从小到大到),有对应的内容,就直接获取
--%>
${name}
</body>
</html>
2.Jsp 里面<% jsp的脚本代码:写Java代码的 %> /<%= jsp的输出表达式%>
<% int i = 10 ; %>
<%=i%>
<%
request.setAttribute("name","高圆圆") ; //给request域对象存储了一个数据
%>
jsp的el表达式 就是代替上面写法 <%=%> jsp的输出表达式:让写法更加简单
${pageScope.name属性值}
${requestScope.name属性值}---->里面有自己的内置对象
${sessionScope.name属性值}
${applicationScope.name属性值}
3.el表达式的使用----el表达式支持 (对象图导航语言Ognl:是Object Graph Navigation Language )
3.1 什么是javaBean规范?
这个类是具体类,必须有私有字段,必须提供对外公共访问setXXX/getXXX
class Student{
private String name ;
public String getName(){ //name----bean属性
return name ;
}
public void setName(String name){
this.name = name ;
}
}
Student s = new Student() ;
s.setName("高圆圆") ;
servlet已经将学生存储到了域对象中 request.setAttribute("student",student) ;
jsp----获取获取信息
${requestScope.student.name}--->调用getName()----->将get()去掉,把N变成小写---name
3.2 el表达式的使用
<html>
<head>
<title>Jsp的javabean导航</title>
<%--
就是使用el表达式的对象图导航语言
就是${绑定的属性名.javabean的bean属性}获取内容
--%>
</head>
<body>
<%
//创建user类对象
User user = new User() ;
user.setUsername("高圆圆") ;
user.setPassword("123456");
//通过request域对象user对象存进去
request.setAttribute("user",user); //将实体对象存到request域中
%>
<%--传统方式--%>
<%=((User)request.getAttribute("user")).getUsername()%> -
<%=((User)request.getAttribute("user")).getPassword()%>
<hr/>
<%--el表达式就是代替上面格式
${域对象中name属性名称.javabean的bean属性}
bean属性:访问getXxx()---将get()去掉 X 变成小写
getUsername() get()去掉,留下Username---U变成小写 username
--%>
<%--操作实体对象:访问JavaBean实体类的方法--%>
${user.username} - ${user.password}
</body>
</html>
4.el表达式的使用-操作字符串-实体-复杂集合数据
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>el表达式的使用_操作字符串_实体_复杂集合数据</title>
</head>
<body>
<%--
操作最基本的字符串数据
--%>
<%
//使用request域对象存储字符串数据
request.setAttribute("msg","hello,JavaEE!") ;
%>
<%--传统方式--%>
<%=(String)request.getAttribute("msg")%><br/>
<%--使用el表达式获取数据:直接从${属性名称}--%>
${msg}
<hr/>
<%--存储实体对象--%>
<%
//创建User对象
User user = new User() ;
//封装user对象
user.setUsername("文章") ;
user.setPassword("123");
//将user对象存储到了request域中
request.setAttribute("user",user);
%>
<%--传统方式--%>
<%=((User)request.getAttribute("user")).getUsername()%> -
<%=((User)request.getAttribute("user")).getPassword()%> <br/>
<%--使用el表示直接获取实体中的bean属性--%>
${user.username} - ${user.password}
<hr/>
<%--
操作List集合数据
--%>
<%
List<User> list = new ArrayList<>() ;
User u1 = new User() ;
u1.setUsername("高圆圆") ;
u1.setPassword("123456") ;
User u2 = new User() ;
u2.setUsername("王宝强") ;
u2.setPassword("123") ;
//添加到list集合中
list.add(u1) ;
list.add(u2) ;
//将List集合存到request域对象中
request.setAttribute("list",list);
%>
<%--
传统方式获取数据
--%>
<%=(((List<User>)request.getAttribute("list")).get(0)).getUsername()%> - <%=(((List<User>)request.getAttribute("list")).get(0)).getPassword()%><br/>
<%=(((List<User>)request.getAttribute("list")).get(1)).getUsername()%> - <%=(((List<User>)request.getAttribute("list")).get(1)).getPassword()%>
<br/>
<%--使用el表达式获取集合数据--%>
${list[0].username} - ${list[0].password} <br/>
${list[1].username} - ${list[1].password} <br/>
<hr/>
<%--
操作Map集合
--%>
<%
//创建Map集合
//key:人的名称
//value:分数值
Map<String,Integer> map = new HashMap<>() ;
map.put("lucy",98) ;
map.put("Tomcat",100) ;
map.put("jacky",80) ;
//将Map集合对象存储到request域中
request.setAttribute("map",map) ;
%>
<%--
传统方式 jsp的输出表达式 map.get("lucy")----获取value
--%>
<%--el表达式方式获取
将key对应的value获取出来
--%>
${map['lucy']} <%--推荐这个方式--%>
<%--${map["lucy"]} --%> <%--推荐这个方式--%>
${map['Tomcat']}
${map["jacky"]}
</body>
</html>
5.jsp的jstl常见核心标签的使用
5.1 c_if标签
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--
1)导入两个jar包jstl-1.2 ,standard-1.1.2
2)导入核心标签库的路径
<%@taglib prefix="c" uri="核心标签库的网络路径"%>
--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>taglib指令</title>
</head>
<body>
<%--就可以使用jstl的core核心库---里面的c标签--%>
<%--常见使用:c:if标签--%>
<%
int number = 15 ;
//number存储request域对象中
request.setAttribute("number",number) ;
%>
<%--
c:if标签就是单独判断类似于Java语言中的if(条件表达式){}
test:属性就是判断 里面${变量名从域对象中获取并且进行判断}
true,执行c:if标签的文本内容
--%>
<c:if test="${number==10}">
<h4>number的结果是10</h4>
</c:if>
<%--没有c:else标签,如果还需要针对不成立结果 需要在书写c:if--%>
<c:if test="${number!=10}">
<h4>条件不成立</h4>
</c:if>
<hr/>
<%--
在el表达式有关键字empty,判断为空---结合c:if标签使用
判断集合或者实体对象是否空
--%>
<%
List<String> list = new ArrayList<>() ;
list.add("hello") ;
list.add("world") ;
list.add("java") ;
//将List存储到request域中
request.setAttribute("list",list);
%>
<c:if test="${ empty list}"> <%--集合为空--%>
<h4>list为空</h4>
</c:if>
<c:if test="${not empty list}"><%--判断集合不为空--%>
${list[0]} - ${list[1]} - ${list[2]}
</c:if>
</body>
</html>
5.2 c_choose_选择判断标签
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--导入taglib,指定的核心标签库--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>c_choose_选择判断标签</title>
</head>
<body>
<%--
Java代码的选择判断语句 /swtich
if(条件表达式1){
语句1;
}else if(条件表达式2){
语句2;
...
} else{
语句n;
}
jsp的jstl核心库中c:choose :选择判断标签
c:when
c:otherwise...
--%>
<%
int weekNum = 0 ;
//将weekNum存储request域中
request.setAttribute("weekNum",weekNum) ;
%>
<c:choose>
<%--选择判断--%>
<%-- test="${域对象中获取数据判断,true,成立,才执行c:when语句}" --%>
<c:when test="${weekNum==1}"> <%-- when相当于case --%>
<h4>星期一</h4>
</c:when>
<c:when test="${weekNum==2}">
<h4>星期二</h4>
</c:when>
<c:when test="${weekNum==3}">
<h4>星期三 </h4>
</c:when>
<c:when test="${weekNum==4}">
<h4>星期四</h4>
</c:when>
<c:when test="${weekNum==5}">
<h4>星期五</h4>
</c:when>
<c:when test="${weekNum==6}">
<h4>星期六</h4>
</c:when>
<c:when test="${weekNum==7}">
<h4>星期日</h4>
</c:when>
<c:otherwise> <%-- 相当于default --%>
<h4>非法数据</h4>
</c:otherwise>
</c:choose>
</body>
</html>
5.3 c_foreach标签
<%--使用taglib指令 导入核心标签库--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>c_foreach标签</title>
<%--
Java中遍历数组或者集合
for(初始化语句;条件表达式;控制体语句){
循环体语句;
}
//针对集合:特有方式 迭代器---被增强for foreach语句
for(集合存储数据类型 变量名 : 集合对象 ){
//使用这个变量
}
jsp的核心标签库:提供了c:foreach标签,类似于java中循环语句
--%>
</head>
<body>
<%
for(int x = 0 ; x< 10 ; x ++){
out.write(x+" ") ;
}
%>
<hr/>
<%--
c:foreach普通用法:普通遍历
begin:角标从多少开始 从0开始
end:结束的角标值
step:类似于Java中的普通for循环控制台语句 1---每次+1
var:代表循环中的变量名
varStatus:循环中的状态属性: 指定属性值 "stataus"
${varStatus的属性值.index}:获取角标值:从0开始 :内置的属性index
${varStatus的属性值.count}:获取序号值 从1开始 :内置属性count
--%>
<c:forEach begin="0" end="9" var="i" step="1" varStatus="status">
<%--取出循环中变量i--%>
<%--${status.index}--%>
${status.count}
${i} <br/>
</c:forEach>
<hr/>
<%--
c:foreach的特殊用法:
var:代表循环中的变量名
items:写法 ${域对象中获取属性对应的内容}
--%>
<%
List<String> list = new ArrayList<>() ;
list.add("张三") ;
list.add("李四") ;
list.add("王五") ;
//将集合存储到request域中
request.setAttribute("list",list);
%>
<%--将list集合从域对象取出来,并遍历数据--%>
<c:forEach var="n" varStatus="status" items="${list}">
${status.count} - ${n} <br/>
</c:forEach>
</body>
</html>