7.1 EL表达式获取域中数据
EL表达式概述:
EL 全名为Expression Language,它提供了在JSP中简化表达式的方法,让JSP的代码更加简化,可以嵌入在jsp页面内部,减少jsp脚本的编写
EL从域中取数据:
jsp脚本:<%=request.getAttribute(name)%>
EL表达式替代上面的脚本:${requestScope.name}
EL最主要的作用是获得四大域中的数据,格式:
${EL表达式}
EL获得pageContext域中的值:
${pageScope.key}
EL获得request域中的值:
${requestScope.key}
EL获得session域中的值:
${sessionScope.key}
EL获得application域中的值:
${applicationScope.key}
EL从四个域中获得某个值${key}:
同样是依次从pageContext域,request域,session域,application域中获得属性,在某个域中获取后将不再向后寻找
<%@ page import="net_zixue.bean.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
pageContext.setAttribute("name","张三");
//在脚本中存一下数据
request.setAttribute("name","小明");
// 在session中存一个对象user
User user=new User();//创建一个uesr对象
user.setName("小红");
user.setSex("女");
// 设置到session的作用域中
session.setAttribute("user",user);
// 创建一个集合,将集合存入到application中
List<User> list=new ArrayList<>();
User user1=new User();
user1.setName("小强");
user1.setSex("男");
User user2=new User();
user2.setName("小丽");
user2.setSex("女");
//将这两个用户加入到集合中
list.add(user1);
list.add(user2);
// 加入到application域中
application.setAttribute("list",list);
%>
<%--通过jsp脚本形式,java代码获取数据--%>
<%=request.getAttribute("name")%>
<%--获取session域--%>
<%
User user3 = (User) session.getAttribute("user");
String name = user3.getName();
out.write(name);
%>
<%--获取application中的list对象--%>
<%
List<User> list1 = (List<User>) application.getAttribute("list");
User user4 = list1.get(0);
out.write(user4.getName());
// 遍历list集合
for (User user5 : list1) {
}
%>
<%--EL表达式从区域中获取数据的方式--%>
${requestScope.name}
${sessionScope.user.name}
${applicationScope.list[0].name}
${name}
${user.name}
${list[0].name}
<%--EL执行表达式--%>
${1+1}
<%--关系运算--%>
${2>1}
${2 eq 2}
<%--逻辑运算--%>
${2>1 || 3>2}
<%--三元表达式--%>
${3>2 ? true:false}
${3>2 ? "正确":"呜呜"}
<%--判断对象是否为空--%>
${empty name}
</body>
</html>
package net_zixue.bean;
public class User {
//user的三个属性
private String name;
private String sex;
private String id;
//get和set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
pageContext可以向指定的其他域中存取数据:
- setAttribute(String name,Object obj,int scape)
- getAttribute(String name,int scape)
- removeAttribute(String name,int scape)
- findAttribute(String name)//获取顺序依次从pageContext域,request域,session域,application域中获取属性
可以获得其他8大隐式对象:
例如:pageContext.getRequest()
pageContext.getSession()
7-2 EL的内置对象
EL的内置对象:
pageScope,requestScope,sessionScope,applicarionScope-------获取JSP中域中的数据
param,paramValues ----接收参数。相当于request.getParameter() request.getParameterValues()
header.headerValues -----获取请求头信息。 相当于request.getHeader(name)
initParam -----获取全局初始化参数。相当于this.getServletContext().getInitParameter(name)
cookie -----WEB开发中cookie。相当于request.getCookies()---->cookie.getName()------>cookie.getValue()
pageContext —WEB开发中的pageContext。pageContext获取其他八大对象
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--假如http请求中传入了一个username的参数--%>
<%
request.getParameter("userName");
%>
<%--EL的内置对象--%>
${param.userName}
${header.host}
<%--获取项目路径--%>
${pageContext.request.contextPath}
<%--JSP主要用来展示数据,sevlet主要用来处理数据--%>
</body>
</html>
7-3 EL的执行表达式
<%--EL表达式从区域中获取数据的方式--%>
${requestScope.name}
${sessionScope.user.name}
${applicationScope.list[0].name}
${name}
${user.name}
${list[0].name}
<%--EL执行表达式--%>
${1+1}
<%--关系运算--%>
${2>1}
${2 eq 2}
<%--逻辑运算--%>
${2>1 || 3>2}
<%--三元表达式--%>
${3>2 ? true:false}
${3>2 ? "正确":"呜呜"}
<%--判断对象是否为空--%>
${empty name}
7-4 JSTL的简介与基本配置
JSTL简介:
JSTL,JSP标准标签库,可以嵌入在jsp页面中使用标签的形式完成业务逻辑等功能,jstl出现的目的同EL一样也是要代替jsp页面中的脚本代码,jstl标准标准标签库有5个子库,但随着发展,目前常使用的是它的核心库。
下载jstl标签库以OTD文件:
在项目下创建lib目录:
- 首先,在IDEA下创建lib目录用来存放第三方的jar文件
- 找到lib目录下的standard.jar和jstl.jar文件,复制文件,把它们粘贴在WEB_INF/lib目录下
7-5 JSTL-if标签
jstl的标签:
<c:if>标签专门用于完成JSP界面中的条件判断
<c:if test=“表达式”>
//表达式成立执行语句
</c:if>
其中test是返回boolean的条件
<%@ page import="net_zixue.bean.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--<c:if test="1+1==2">
表达式成立,执行内部语句
</c:if>--%>
<%--使用JSTL的时候需要配合EL表达式--%>
<%--jstl标签不能独自执行运算--%>
<%--<c:if test="${1+1==2}">
表达式成立,执行内部语句
</c:if>--%>
<c:if test="${requestScope.follow eq 1}">
<%-- 字符串等于用eq--%>
<%-- 没有else标签--%>
取消关注
<%--如果test等于true 则会执行内部代码,如果是false则不会执行内部代码--%>
</c:if>
<c:if test="${requestScope.follow eq 0}">
关注
<%--如果test等于true 则会执行内部代码,如果是false则不会执行内部代码--%>
</c:if>
<%
List<User> list=new ArrayList<>();
User user1=new User();
user1.setName("小强");
user1.setSex("男");
User user2=new User();
user2.setName("小丽");
user2.setSex("女");
list.add(user1);
list.add(user2);
// 第一种遍历输出
for (int i = 0; i < list.size(); i++) {
System.out.println(i);
}
request.setAttribute("list",list);//把list加入到一个域对象里
for (User user : list) {
System.out.println(user.getName());
}
%>
<%--var变量的意思--%>
<c:forEach begin="0" end="${list.size()-1}" var="i">
<%-- el表达式--%>
${list[i].name}
</c:forEach>
<%--items代表的是一个集合或者是数组--%>
<%--var代表集合里面的每一个元素--%>
<c:forEach items="${list}" var="user">
${user.name}
</c:forEach>
</body>
</html>
package net_zixue.JSP;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "FollowServlet", value = "/follow")
public class FollowServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 关注的时候传一个参数follow=1 不关注的时候传follow=0
String follow = request.getParameter("follow");//获取请求参数
request.setAttribute("follow",follow); //将值放到request域中
request.getRequestDispatcher("/jstl/jstl.jsp").forward(request,response); //转发到JSP页面
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
7-6 JSTL-forEach标签
JSTL的forEach标签:
<c:forEach>用来循环遍历集合对象中的元素,如List、Map、数组等和java代码中的for循环一样,它也有两种形式
<%@ page import="net_zixue.bean.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--<c:if test="1+1==2">
表达式成立,执行内部语句
</c:if>--%>
<%--使用JSTL的时候需要配合EL表达式--%>
<%--jstl标签不能独自执行运算--%>
<%--<c:if test="${1+1==2}">
表达式成立,执行内部语句
</c:if>--%>
<c:if test="${requestScope.follow eq 1}">
<%-- 字符串等于用eq--%>
<%-- 没有else标签--%>
取消关注
<%--如果test等于true 则会执行内部代码,如果是false则不会执行内部代码--%>
</c:if>
<c:if test="${requestScope.follow eq 0}">
关注
<%--如果test等于true 则会执行内部代码,如果是false则不会执行内部代码--%>
</c:if>
<%
List<User> list=new ArrayList<>();
User user1=new User();
user1.setName("小强");
user1.setSex("男");
User user2=new User();
user2.setName("小丽");
user2.setSex("女");
list.add(user1);
list.add(user2);
// 第一种遍历输出
for (int i = 0; i < list.size(); i++) {
System.out.println(i);
}
request.setAttribute("list",list);//把list加入到一个域对象里
for (User user : list) {
System.out.println(user.getName());
}
%>
<%--var变量的意思--%>
<c:forEach begin="0" end="${list.size()-1}" var="i">
<%-- el表达式--%>
${list[i].name}
</c:forEach>
<%--items代表的是一个集合或者是数组--%>
<%--var代表集合里面的每一个元素--%>
<c:forEach items="${list}" var="user">
${user.name}
</c:forEach>
</body>
</html>
7-7 案例:实现商品列表展示
package net_zixue.JSP;
import net_zixue.bean.Phone;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@WebServlet(name = "PhoneListServlet", value = "/phoneList")
public class PhoneListServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通过servlet从数据库中获取数据,我们这里暂时通过手动创建数据
Phone phone=new Phone(); //创建手机的对象 alt+enter选择bean目录下的包
//手动设置数据
phone.setName("iphone6");
phone.setId(001);
phone.setImage("https://img10.360buyimg.com/n7/jfs/t277/193/1005339798/768456/29136988/542d0798N19d42ce3.jpg");//图片的地址
phone.setPrice("3900");
Phone phone1=new Phone();
phone1.setName("坚果pro");
phone1.setId(002);
phone1.setPrice("1799");
phone1.setImage("https://img13.360buyimg.com/n7/jfs/t5377/56/1578379545/209772/32105f74/5911bcbdN7afa707b.jpg");
Phone phone2=new Phone();
phone2.setName("vivo x9");
phone2.setPrice("2345");
phone2.setId(003);
phone2.setImage("https://img12.360buyimg.com/n7/jfs/t6067/340/2101390376/231820/750cc50e/593aa83fN8b0829fc.jpg");
Phone phone3=new Phone();
phone3.setName("oppo A57");
phone3.setId(004);
phone3.setPrice("1399");
phone3.setImage("https://img10.360buyimg.com/n7/jfs/t4978/185/135948089/78285/f6a84203/58db6fa4N354322d9.jpg");
Phone phone4=new Phone();
phone4.setName("诺基亚6");
phone4.setId(005);
phone4.setPrice("1699");
phone4.setImage("https://img11.360buyimg.com/n7/jfs/t4930/86/192598423/86027/36a57ccf/58dcbfa5N5c41cbfd.jpg");
Phone phone5=new Phone();
phone5.setName("小米MIX");
phone5.setId(006);
phone5.setPrice("3999");
phone5.setImage("https://img13.360buyimg.com/n7/jfs/t4264/215/455518113/309855/38fe41f1/58b4fc81N1d924112.jpg");
List<Phone> list=new ArrayList<>();
list.add(phone);
list.add(phone1);
list.add(phone2);
list.add(phone3);
list.add(phone4);
list.add(phone5);
//把数据传送给jsp
//把数据存放在request域中
request.setAttribute("list",list);
//将数据转发给jsp页面
request.getRequestDispatcher("/phone_list.jsp").forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
package net_zixue.bean;
public class Phone {
private int id;
private String name;
private String image;
private String price;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
}
<%--
Created by IntelliJ IDEA.
User: 随身汀
Date: 2021/5/9
Time: 18:58
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--jstl用来遍历数据--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<%--接收数据--%>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>商品列表</title>
<%-- 配置前端的css文件--%>
<%-- <link rel="stylesheet" href="css/bootstrap.min.css" type="text/css" />--%>
<%-- <script src="js/jquery-1.11.3.min.js" type="text/javascript"></script>--%>
<%-- <script src="js/bootstrap.min.js" type="text/javascript"></script>--%>
<!-- 引入自定义css文件 style.css -->
</head>
<body>
<%--动态显示界面里的数据--%>
<%--将得到的数据替换掉里面写死的数据--%>
<%--遍历一下放在request域中的list集合--%>
<c:forEach items="${list}" var="phone">
<div class="col-md-2" style="height:250px">
<%-- 替换图片的地址--%>
<img src="${phone.image}" width="170" height="170" style="display: inline-block;">
</a>
<%-- 替换手机的名字--%>
<p>
<a href="product_info.html" style='color: green'>${phone.name}</a>
</p>
<%-- 替换价格--%>
<p>
<font color="#FF0000">商城价:¥${phone.price}</font>
</p>
</div>
</c:forEach>
</body>
</html>
<%--在实际开发中,通过servlet来获取数据传递给jsp,jsp用来显示数据--%>