java之 JSP & el & jstl
0x01、JSP入门
jsp执行流程:
-
第一次访问的xxx.jsp时候,服务器收到请求,JspServlet会去查找对应的jsp文件
-
找到之后,服务器会将这个jsp文件转换成java文件(Servlet)
-
服务器编译java文件,生成class文件
-
服务器运行class文件,生成动态的内容
-
服务器收到内容之后,返回给浏览器
1、JSP基本语法
我们可以通过JSP脚本在JSP页面上编写Java代码. 一共有三种方式:
类型 | 翻译成Servlet对应的部分 | 注意 |
---|---|---|
<%...%>:Java程序片段 | 翻译成Service()方法里面的内容, 局部的 | |
<%=...%>:输出表达式 | 翻译成Service()方法里面的内容,相当于调用out.print() | 输出表达式不能以;结尾 |
<%!...%>:声明成员变量(肯定不用) | 翻译成Servlet类里面的内容 |
- eg
<%
for(int i = 0; i < 10;i++){
out.print("i="+i);
%>
<hr/>
<%
}
%>
注释类型 |
---|
HTML注释 |
JAVA注释 //; /* */ |
JSP注释; <%--注释内容--%> |
0x02、EL表达式
Expression Language:表达式语言, jsp2.0之后内置在jsp里面
目的:为了使JSP写起来更加简单, 取值(取的域对象里面存的值)更加简单。(代替脚本 <% %>)
- 语法:${el表达式}
- 作用:
- 获取域对象里面的数据
- 执行运算
1、EL获取简单数据类型(基本类型,字符串)
语法:
${requestScope|sessionScope|applicationScope.属性名};
快捷写法: ${属性名}
, 属性名就是存在域对象里面的key
实例代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>使用EL表达式获取域对象中的简单类型的数据</title>
</head>
<body>
<%
//往域对象存值
application.setAttribute("msg","applicationValue");
//session.setAttribute("msg","sessionValue");
//request.setAttribute("msg","requestValue");
//在我们开发过程中,是否会往多个域对象中存放同一个key??? 这是不会的
//所以我们用el表达式获取域对象里面的数据,还可以简化成${key} 获取范围最小的域对象中的这个key对应的值
%>
获取的application域对象中的msg=${applicationScope.msg}<br>
获取session域对象中的msg=${sessionScope.msg}<br>
获取request域对象中的msg=${requestScope.msg}<br>
获取存放在域对象中的msg=${msg}
</body>
</html>
3.2获取数组
语法: ${key[下标]} key就是域对象里面存的key
3.3获取list
语法:
${list属性名[index]}
${list属性名.get(index)};
list属性名就是存入域对象里面的key
3.4获取Map
语法:
${map属性名.键}
${map属性名.get("键")}
map属性名就是存入域对象里面的key
3.5 获取bean
语法:${key.javabean属性}
依赖getxxx()方法; eg: getPassword()---去掉get-->Password()----首字母小写--->password
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>使用EL表达式获取存储在域对象中的复杂类型的数据</title>
</head>
<body>
<%
//往域对象中存放数组类型的数据
String[] arr = {"张三","李四","王五","赵六","田七","狗娃"};
request.setAttribute("arr", arr);
//往域对象中存放一个集合
List<String> list = new ArrayList<String>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("赵六");
list.add("田七");
request.setAttribute("list", list);
//往域对象中存放一个map
Map<String,String> map = new HashMap<String,String>();
map.put("name", "张三");
map.put("password", "123456");
map.put("nickname", "张三丰");
request.setAttribute("map", map);
//往域对象中存放一个pojo对象
User user = new User(1, "jay", "台湾省");
request.setAttribute("user",user);
%>
获取存放在request域对象中的数组中的第三个元素:${arr[2]}<br>
<%--
在el表达式中,只要是根据下标获取元素,都可以写[index]
--%>
获取存放在request域对象中的集合中的第四个元素:${list[3]}<br>
<%--
在el表达式中,只要是根据对应的属性的get方法去获取数据,都可以写成".属性名" 或者 ["属性名"]
--%>
获取存储在request域对象中的map中的nickname:${map.nickname}<br>
获取存放在request域对象中的user的address属性的值:${user.address}
</body>
</html>
0x03、JSTL标签库
在jsp页面需导入才可使用
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
1、if标签
- 语法
<c:if test="el表达式${..}">
</c:if>
- 代码实例
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>jstl的if标签</title>
</head>
<body>
<%
//往域对象中存储age
request.setAttribute("age",19);
%>
<c:if test="${age >= 18}">
已成年
</c:if>
<c:if test="${age < 18}">
未成年
</c:if>
</body>
</html>
2、choose标签
实例:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>jstl中的choose标签的使用介绍</title>
</head>
<body>
<%
request.setAttribute("course","PHP");
%>
<c:choose>
<%--
一个when标签表示一个条件
--%>
<c:when test="${course == 'Java'}">
学习Java
</c:when>
<c:when test="${course == 'Android'}">
学习Android
</c:when>
<c:when test="${course == 'C++'}">
学习C++
</c:when>
<c:otherwise>
学习,学个屁!!!
</c:otherwise>
</c:choose>
</body>
</html>
3、foreach标签
语句格式:
<%--
jstl中的forEach标签是用来代替for循环语句
目标1: 在浏览器上显示0-9的数字
begin属性: 从哪个下标开始遍历, 如果不写默认是从0开始
end属性: 到哪个下标结束遍历,如果不写默认是遍历到集合/数组的最后一个元素
step属性: 表示遍历时候的步长,默认步长是1
var属性: 表示将遍历的结果存放进域对象时候的key
--%>
<c:forEach begin="0" end="9" step="1" var="i">
${i}
</c:forEach><br>
(一)、遍历集合
<%
//往域对象存储一个集合
List<String> list = new ArrayList<String>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("赵六");
list.add("田七");
request.setAttribute("list", list);
%>
<c:forEach begin="0" end="9" step="1" var="i">
${i}
</c:forEach><br>
<%--
通过items属性指定遍历域对象里面的list
通过var属性指定遍历出来的每个数据存储到域对象时候的key
--%>
<c:forEach items="${list}" var="username">
${username}
</c:forEach>
-
c:forEach中的varStatus属性。
指向一个字符串,该字符串引用一个对象。 map.put("vs",一个对象);
这个对象记录着当前遍历的元素的一些信息:
index:返回索引。从0开始
count:返回计数。从1开始
last:是否是最后一个元素
first:是否是第一个元素
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>forEach 标签的varStatus属性的介绍</title>
</head>
<body>
<%
//往域对象存储一个集合
List<String> list = new ArrayList<String>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("赵六");
list.add("田七");
request.setAttribute("list", list);
%>
<%--
forEach标签的varStatus属性:指定将遍历出来的每一个元素的状态存储进域对象时候的key
遍历出来的每一个元素都有一些状态(属性),比如:
下标 index:
计数 count:
当前元素的值 current:
是否是第一个元素:
是否是最后一个元素
--%>
<table border="1" cellspacing="0" width="700" align="center">
<tr>
<th>下标</th>
<th>计数</th>
<th>姓名</th>
<th>是否是第一个元素</th>
<th>是否是最后一个元素</th>
</tr>
<c:forEach items="${list}" varStatus="vst">
<tr>
<td>${vst.index}</td>
<td>${vst.count}</td>
<td>${vst.current}</td>
<td>${vst.first}</td>
<td>${vst.last}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
4、总结
- 简单使用
<c:foreach begin="从哪里开始" end="到哪里结束" var="每次遍历的赋值变量" step="步长">
//每遍历一次 foreach里面就执行一次
</c:foreach>
- 复杂使用
<c:foreach items="使用el从域对象里面取出集合" var="每次遍历的赋值变量" varStatus="遍历的状态">
//每遍历一次 foreach里面就执行一次
</c:foreach>