温馨提醒:
1)本文干货较多,如果只想了解其中的某一部分,也可以利用左边目录进行索引。
2)代码的具体实现可以参考代码中的注释,如果由于注释不清楚而不明白相应原理,可以与作者私聊,欢迎互相交流、进步。
3)文笔有限,如若有对该博客不清楚的地方可以私信作者或者在底下评论,我一定会第一时间回复。
4)码字不易,干货连连,有兴趣的小伙伴点个赞呗,大家相互学习。
一 EL表达式
1 EL表达式定义与作用
EL表达式的格式是:${expression}
EL表达式的作用: EL 表达式是一种在 JSP 页面中获取数据的简单方法,注意,它只能获取数据,而不能设置数据。
2 EL 的内置对象
EL有11个内置对象,其中除了 pageContext 以外,其他 10 个内置对象的类型都是 java.util.Map 类型。
2.1 与 JSP 的四大域对象对应的四个 EL 内置对象
EL 内置对象 | 对应的 JSP 域对象 | 作用 |
---|---|---|
pageScope | pageContext | 从 page 范围域属性空间中查找指定的 key |
requestScope | request | 从 request 范围域属性空间中查找指定的 key |
sessionScope | session | 从 session 范围域属性空间中查找指定的 key |
applicationScope | application | 从 application 范围域属性空间中查找指定的 key |
示例如下:
<body>
<%
pageContext.setAttribute("name", "sharm");
request.setAttribute("age", "24");
session.setAttribute("gender", "man");
application.setAttribute("college", "ZJUT");
%>
name=${applicationScope.name }<br>
age=${pageScope.age }<br>
gender=${sessionScope.gender }<br>
college=${requestScope.college }<br>
<%-- 若没有使用 EL 的内置对象,则查找数据顺序是依次按照由小到大范围从四大域中查找指定名称的属性值--%>
<%
pageContext.setAttribute("name", "sharm");
request.setAttribute("name", "jack");
session.setAttribute("name", "luma");
application.setAttribute("name", "luxi");
%>
name=${name}
</body>
2.2 pageContext 对象
该 pageContext 对象与 JSP 内置的 pageContext 对象是同一个对象。通过该对象,可以获取到request、response、session、servletContext、servletConfig 等对象。注意:这些对象在 EL 里不是内置对象,因此只能通过 pageContext 获取。
例如:在 EL 中使用 ${pageContext.request}
即可获取 request 对象,其底层调用的是 pageContext.getRequest() 方法。同理也可以调用其它对象。
重点:${pageContext.request.contextPath }
代表 web 应用下的根。
2.3 其它对象
参考文章:传送门
3 利用 EL 表达式输出 Bean 对象的普通属性、数组属性、List 集合属性以及 map 集合属性
1 首先在 java 文件夹下建立对应的 JavaBean 文件,内容为:
package sharm.obj;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class People {
// i.需求——输出Person类中普通属性,数组属性。list集合属性和map集合属性。
private String name;
private String[] phones;
private List<String> cities;
private Map<String,Object> map;
public int getAge() {
return 18;
}
public People(String name, String[] phones, List<String> cities, Map<String, Object> map) {
this.name = name;
this.phones = phones;
this.cities = cities;
this.map = map;
}
public People() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String[] getPhones() {
return phones;
}
public void setPhones(String[] phones) {
this.phones = phones;
}
public List<String> getCities() {
return cities;
}
public void setCities(List<String> cities) {
this.cities = cities;
}
public Map<String, Object> getMap() {
return map;
}
public void setMap(Map<String, Object> map) {
this.map = map;
}
@Override
public String toString() {
return "Person{" +
"name=" + name +
", phones=" + Arrays.toString(phones) +
", cities=" + cities +
", map=" + map +
'}';
}
}
2 测试内容为:
<%@ page contentType="text/html; charset=UTF-8" isELIgnored="false" language="java" %>
<%@ page import="sharm.obj.People"%>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="sharm.obj.People" %>
<html>
<head>
<title>JavaBean</title>
</head>
<body>
<%
People person = new People();
person.setName("sharm");
person.setPhones(new String[]{"18610541354","18688886666","18699998888"});
List<String> cities = new ArrayList<String>();
cities.add("北京");
cities.add("上海");
cities.add("杭州");
person.setCities(cities);
Map<String,Object>map = new HashMap<>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
person.setMap(map);
pageContext.setAttribute("p", person);
%>
输出Person:${ p }<br/>
输出Person的name属性:${p.name} <br>
输出Person的pnones数组属性值:${p.phones[2]} <br>
输出Person的cities集合中的元素值:${p.cities} <br>
输出Person的List集合中个别元素值:${p.cities[2]} <br>
输出Person的Map集合: ${p.map} <br>
输出Person的Map集合中某个key的值: ${p.map.key3} <br>
输出Person的age属性:${p.age} <br>
</body>
</html>
二 JavaBean
JavaBean对象用于和数据库的字段做映射,即ORM(对象关系映射)。它的写法有特定的要求,为:
- 必须要有一个无参构造
- 属性必须私有化
- 必须有对应的get/set方法
对应的映射关系为:
- 表—>类
- 字段–>属性
- 行记录---->对象
实例:
people表
id | name | age | address |
---|---|---|---|
1 | sharm1 | 3 | 杭州 |
2 | sharm2 | 18 | 金华 |
3 | sharm3 | 22 | 宁波 |
People类
class People{
private int id;
private String name;
private int age;
private String address;
}
class A{
new People(1,"sharm1",3,"杭州");
new People(2,"sharm2",18,"金华");
new People(3,"sharm3",22,"宁波");
}
三 JSTL
1 定义
JSTL表达式的全称为JSP Standard Tag Library ,即JSP标准标签库。如果说EL表达式主要是为了替换jsp中的表达式脚本,而JSTL则是为了替换jsp中的代码脚本。这会使得整个jsp页面变得更佳简洁。
JSTL包括格式化标签、SQL标签、核心标签等,其中核心标签是重点,其它标签差不多已经被淘汰了。
在JSP页面的头部使用taglib指令引入JSTL,如:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
其中prefix='c’代表了标签的种类,各标签的前缀为:
功能范围 | URI | 前缀 |
---|---|---|
核心标签库 | http://java.sun.com/jsp/jstl/core | c |
格式化标签库 | http://java.sun.com/jsp/jstl/fmt | fmt |
函数标签库 | http://java.sun.com/jsp/jstl/functions | fn |
数据库标签库 | http://java.sun.com/jsp/jstl/sql | sql |
XML标签库 | http://java.sun.com/jsp/jstl/xml | x |
在JSP页面头部对应的taglib指令为:
标签库种类 | taglib指令 |
---|---|
核心标签库 | <%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %> |
格式化标签库 | <%@ taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt” %> |
函数标签库 | <%@ taglib prefix=“fn” uri=“http://java.sun.com/jsp/jstl/functions” %> |
数据库标签库 | <%@ taglib prefix=“sql” uri=“http://java.sun.com/jsp/jstl/sql” %> |
XML标签库 | <%@ taglib prefix=“x” uri=“http://java.sun.com/jsp/jstl/xml” %> |
因为在实际工作中,对于JSTL,不需要把每一个地方都记住,下面,我只介绍一下核心标签库中if标签的使用,关于其它标签可以参考菜鸟教程【传送门】
2 核心标签库中的if标签
标签功能:if语句。
具体注释:见代码注释。
代码实例:
<%@ page contentType="text/html; charset=UTF-8" isELIgnored="false" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>if</title>
</head>
<body>
<h4>if测试</h4>
<hr>
<form action="scope.jsp" method="get">
<%--
EL表达式获取表单中的数据
${param.参数名}
--%>
<input type="text" name="username" value="${param.username}">
<input type="submit" value="登录">
</form>
<%--判断如果提交的用户名是管理员,则登录成功--%>
<%--test是判断条件;var用来接收返回值,true或者false;c:out用于输出在网页上。--%>
<c:if test="${param.username=='sharm'}" var="isAdmin">
<c:out value="管理员欢迎您!"/>
</c:if>
<%--自闭合标签--%>
<c:out value="${isAdmin}"/>
</body>
</html>
四 遇到的问题
1)EL表达式在JSP页面中不起作用。 解决办法:因为在Servlet2.4之前,EL表达式是默认关闭的,所以首先在WEB-INF文件夹的web.xml文件中查看Servlet的版本号,如果发现其版本是在Servlet2.4之前的话,那就需要在JSP页面开头的page标签中加入:isELIgnored=“false”。
如:
<%@ page contentType="text/html; charset=UTF-8" isELIgnored="false" language="java" %>
文章源码
再等一下下,我在上传了……