本文为JavaWeb基础JSTL & EL表达式相关知识介绍,Java全栈学习路线可参考:【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引,内含最全Java全栈学习技术清单~
jsp标签的分类:
内置标签(动作标签)
<!--语法:-->
<jsp:forward page="/MyJsp001.jsp"></jsp:forward>
<!--相当于java代码:-->
request.getRequestDispatcher("/MyJsp001.jsp?name=jxf").forward(request, response);
<!--注意:但是java代码的转发可以通过url带参数的方式进行传递参数,而转发标签需要借助于下面的<jsp:param>标签实现参数传递-->
<!--语法:-->
<jsp:param value="jxf" name="name"/> <%-- 传递一个名为name,值为jxf的参数,参数一般作为其他标签的子标签使用--%>
<!--结合<jsp:forward>标签用法:-->
<jsp:forward page="/MyJsp001.jsp">
<jsp:param value="jxf" name="name"/>
</jsp:forward>
<!--语法:-->
<jsp:include page="/MyJsp001.jsp">
<jsp:param value="jxf" name="name"/><%--可以将参数传递给包含进来的页面--%>
</jsp:include>
与@inclue包含指令的区别:
(1)首先是语法不同:
(2)jsp:include可以传递参数,<%@inclue%>不可以
(3)jsp:include:包含页面与被包含页面分别编译为两个java源文件,在运行时引用;<%@inclue%>:包含页面与被包含页面合并编译为一个java源文件
导入jar包文件
在jsp页面添加taglib指令
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
使用JSTL标签
if标签的几个属性:
代码示例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--使用tablib指令指向jstl标签库,定义前缀名prefix--%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--
在test中可写入条件判断(仅有test支持使用el标签),
var定义属性名,scope声明作用范围(默认为page,即PageContext域对象);
将该标签的test返回结果自动赋值给var,再由scope决定哪个域对象可以调用;--%>
<c:if test="${10<20}" var="qwe" scope="application">
test判断为true:内容可显示!<br/>
</c:if>
scope指定了作用域,其他域对象获取不到==>
${pageScope.qwe}<br/>
上面指定的是application应用程序域对象==>
${qwe}
</body>
</html>
启动服务器,页面显示:
test判断为true:内容可显示!
scope指定了作用域,其他域对象获取不到==>
上面指定的是application应用程序域对象==> true
forEach对Java中的集合与数组进行遍历
forEach标签的几个属性:
代码示例:
<%
ArrayList<String> people = new ArrayList<>();
people.add(0, "张三");
people.add(1, "李四");
people.add(2, "王五");
people.add(3, "赵六");
people.add(4, "丁一");
people.add(5, "胡二");
request.setAttribute("list", people);
%>
<%--
var,每一次遍历出来的变量
items,要遍历的对象
begin, 开始位置
end, 结束位置
step, 步长
--%>
<c:forEach var="people" items="${list}">
<c:out value="${people}"/>
<br>
</c:forEach>
<hr>
<c:forEach var="people" items="${list}" begin="1" end="3" step="2">
<c:out value="${people}"/>
<br>
</c:forEach>
forTokens 用于迭代分隔字符串
有以下属性:
代码示例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--指定导入的jstl标签库,定义前缀名prefix--%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--forTokens 遍历字符串,进行分割--%>
<%
String str="学习,forTokens,标,签,Q,WE,R12,3X10:100,500,IO,:,的,";
request.setAttribute("str",str);
%>
<%--使用forTokens分割字符串--%>
<%-- items:需要遍历的字符串; delims:定义分隔符 ; var: 接收每次分割的字符 --%>
<c:forTokens items="${str}" delims="," var="ch">
${ch}<br/>
</c:forTokens>
</body>
</html>
启动服务器,页面显示:
学习
forTokens
标
签
Q
WE
R12
3X10:100
500
IO
:
的
格式化日期标签有以下属性:
代码示例:
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--指定导入的jstl标签库;定义前缀名prefix--%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--将当前时间赋值给请求对象的自定义属性now;--%>
<%
request.setAttribute("now",new Date());
%>
<%--value: 指定要格式化的目标, pattern:设置格式化的格式(规则)--%>
<fmt:formatDate value="${now}" pattern="yyyy年MM月dd日 HH时mm分ss秒"/>
</body>
</html>
启动服务器,页面显示:
2022年10月19日 19时30分45秒
代码示例:
<body>
<%
request.setAttribute("key", "value");
%>
<%-- 表达式脚本输出key1的值 --%>
<%=request.getAttribute("key1")%>
<%-- EL表达式输出key1的值 --%>
${key1}
<%-- 表达式脚本输出null值时页面显示null
EL表达式输出null值时页面什么都不显示(空串)--%>
</body>
启动服务器,页面显示:
null
代码示例:
<body>
<%
//向四个域对象中都保存相同key的值
request.setAttribute("key", "request");
session.setAttribute("key", "session");
application.setAttribute("key", "application");
pageContext.setAttribute("key", "pageContext");
%>
<%-- 使用EL表达式输出key的值 --%>
${key}
</body>
启动服务器,页面显示:
pageContext
代码示例:
创建Person类
public class Person {
private String name;
private String city;
public int age;
//以及全参、空参构造器,各属性的getter/setter方法
}
在web目录下创建Test.jsp
<body>
<%
Person person = new Person();
person.setName("JayChou");
person.setCity("上海");
person.setAge(35);
pageContext.setAttribute("p", person);
%>
<%--EL表达式中对象名.属性名不找属性的值,而是找名字对应的getXxx方法,没有此方法会报错--%>
输出Person:${ p }<br/>
输出Person的name属性:${p.name} <br>
输出Person的city属性:${p.city} <br>
输出Person的age属性:${p.city} <br>
</body>
启动服务器,页面显示:
输出Person:Person{name=JayChou,city=上海,age=35}
输出Person的name属性JayChou
输出Person的city属性:上海
输出Person的age属性:35
语法:${运算表达式}
EL表达式支持以下运算符:
(1) pageScope、requestScope、sessionScope、applicationScope对象的使用
<body>
<%
pageContext.setAttribute("key1", "pageContext1");
pageContext.setAttribute("key2", "pageContext2");
request.setAttribute("key2", "request");
session.setAttribute("key2", "session");
application.setAttribute("key2", "application");
%>
<%-- 获取特定域中的属性 --%>
${ pageScope.key1 } <br>
${ applicationScope.key2 }
<%-- 若直接获取key1或key2依然按照之前范围从小到大检索,无法获取指定域 --%>
</body>
(2) pageContext对象的使用
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%-- 先通过pageContext对象获取request、session对象,再获取以下内容 --%>
<%--
获取请求的协议:request.getScheme()
获取请求的服务器ip或域名:request.getServerName()
获取请求的服务器端口号:request.getServerPort()
获取当前工程路径:request.getContextPath()
获取请求的方式:request.getMethod()
获取客户端的ip地址:request.getRemoteHost()
获取会话的唯一标识:session.getId()
--%>
1.协议: ${ pageContext.request.scheme }<br>
2.服务器ip:${ pageContext.request.serverName }<br>
3.服务器端口:${ pageContext.request.serverPort }<br>
4.获取工程路径:${ pageContext.request.contextPath }<br>
5.获取请求方法:${ pageContext.request.method }<br>
6.获取客户端ip地址:${ pageContext.request.remoteHost }<br>
7.获取会话的id编号:${ pageContext.session.id}<br>
</body>
</html>
运行结果:
(3) param、paramValues对象的使用
<body>
获取请求参数username的值:${ param.username } <br>
获取请求参数password的值:${ param.password } <br>
获取请求参数中第一个hobby的值:${ paramValues.hobby[0] } <br>
获取请求参数中第二个hobby的值:${ paramValues.hobby[1] } <br>
<%-- 有多个同名的key时使用paramValues的索引值决定获取哪一个,使用param只可获取第一个 --%>
使用param获取hobby的值:${ param.hobby } <br>
</body>
运行结果:
浏览器地址栏输入:http://localhost:8080/MyTest/Test.jsp?username=Jaychou&password=123&hobby=sing&hobby=dance
(4) header、headerValues对象的使用
<body>
输出请求头[user-Agent]的值:${ header["User-Agent"] }<br>
输出请求头中第一个[user-Agent]的值:${ headerValues["User-Agent"][0] }<br>
</body>
(5) cookie对象的使用
<body>
获取Cookie的名称:${ cookie.JSESSIONID.name } <br>
获取Cookie的值:${ cookie.JSESSIONID.value } <br>
</body>
(6) initParam对象的使用
在web.xml中写参数 (修改了web.xml中内容之后,需要重启服务才可生效):
<context-param>
<param-name>usernameparam-name>
<param-value>rootparam-value>
context-param>
<context-param>
<param-name>urlparam-name>
<param-value>jdbc:mysql:///testparam-value>
context-param>
test.jsp:
<body>
输出<Context-param>username的值:${ initParam.username } <br>
输出<Context-param>url的值:${ initParam.url } <br>
</body>
Java全栈学习路线可参考:【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引,内含最全Java全栈学习技术清单~