前言 🎄:CSDN的小伙伴们大家好,今天跟大家分享一个MVC开发模式,以及EL表达式和JSP标签库,如果这篇文章对你有用,麻烦给我点个小赞以示鼓励吧🎄
🏡:博客主页:空山新雨后的java知识图书馆
☁️:今天天气多云,适合学习
📝:名言分享:一个能思想的人,才真是一个力量无边的人——巴尔扎克📝
📖上一篇文章:Cookie和Session📖
👏欢迎大家一起学习,进步。加油👊
文章目录
一、MVC开发模式
MVC开发模式是在JSP文件中糅杂了大量的java代码,和HTML代码的前提下,造成了代码维护工作的难度的提升,因此就有人在java的web开发中使用借鉴MVC开发模式,使得程序更易于开发和维护。
MVC开发模式是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
- M:Model,模型。JavaBean
* 完成具体的业务操作,如:查询数据库,封装对象- V:View,视图。JSP
* 展示数据- C:Controller,控制器。Servlet
* 获取用户的输入
* 调用模型
* 将数据交给视图进行展示
MVC开发模式的优缺点:
- 优缺点:
1. 优点:
1. 耦合性低,方便维护,可以利于分工协作
2. 重用性高
2. 缺点:
1. 使得项目架构变得复杂,对开发人员要求高
二、EL表达式
2.1、EL表达式的概念
Expression Language 表达式语言,主要是用于替换和简化jsp页面中java代码的编写
2.2、EL表达式的语法
${表达式}
2.3、EL表达式的使用方法
2.3.1、运算符
分类
- 算数运算符: + - * /(div) %(mod)
- 比较运算符: > < >= <= == !=
- 逻辑运算符: &&(and) ||(or) !(not)
- 空运算符: empty * 功能:用于判断字符串、集合、数组对象是否为null或者长度是否为0 * ${empty list}:判断字符串、集合、数组对象是否为null或者长度为0 * ${not empty
str}:表示判断字符串、集合、数组对象是否不为null 并且 长度>0
2.3.2、EL表达式获取值的方法
el表达式只能从域对象中获取值
语法:
- ${域名称.键名}:从指定域中获取指定键的值
域名称:
- pageScope --> pageContext
- requestScope --> request
- sessionScope --> session
- applicationScope --> application(ServletContext)
- 举例:在request域中存储了name=张三
- 获取:
${requestScope.name}
- ${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。
代码实例:
<%--
Created by IntelliJ IDEA.
User: wang
Date: 2022/3/15
Time: 11:31
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>el表达式获取值的演示</title>
</head>
<body>
<%--
2. 获取值
1. el表达式只能从域对象中获取值
2. 语法:
1. ${域名称.键名}:从指定域中获取指定键的值
* 域名称:
1. pageScope --> pageContext
2. requestScope --> request
3. sessionScope --> session
4. applicationScope --> application(ServletContext)
* 举例:在request域中存储了name=张三
* 获取:${requestScope.name}
2. ${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。
--%>
<%--在域中存储值--%>
<%
session.setAttribute("name", "娇小汉子李四");
request.setAttribute("name", "法外狂徒张三");
session.setAttribute("age", "22");
application.setAttribute("hobby", "playGame");
pageContext.setAttribute("Professional", "student");
%>
<%--通过el表达式来获取值--%>
<%--语法一: ${域名称.键名}:从指定域中获取指定键的值--%>
<h3>el表达式获取值</h3>
${requestScope.name}<br>
${sessionScope.age}<br>
${applicationScope.hobby}<br>
${pageScope.Professional}<br>
<h3>el表达式获取不存在的值的效果演示</h3>
<%--获取不存在的值会返回一个空字符串--%>
<hr>
<%--${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。
我们存储了两个name值,那么一个在session域中,一个在request域中,session比request于大,因此
会先访问到张三
--%>
<h3>演示第二种语法</h3>
${name}
</body>
</html>
- 获取对象、List集合、Map集合的值
- 对象:${域名称.键名.属性名} * 本质上会去调用对象的getter方法
- List集合:${域名称.键名[索引]}
- Map集合: * ${域名称.键名.key名称} * ${域名称.键名[“key名称”]}
代码实例:
<%@ page import="com.study.El.User" %>
<%@ page import="java.util.Date" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %><%--
Created by IntelliJ IDEA.
User: wang
Date: 2022/3/15
Time: 14:50
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>测试获取对象的值</title>
</head>
<body>
<h3>
获取user对象的值
</h3>
<%--首先设置user对象的值--%>
<%
User user = new User();
user.setName("张三");
user.setAge(34);
user.setBirthDate(new Date());
request.setAttribute("user", user);
// 演示list集合的获取,首先new一个list集合对象
ArrayList arrayList = new ArrayList();
arrayList.add("111");
arrayList.add("222");
//list集合中存储一个对象
arrayList.add(user);
request.setAttribute("list", arrayList);
//演示map集合
HashMap<Object, Object> map = new HashMap<>();
map.put("one", "一");
map.put("two", "二");
map.put("user", user);
request.setAttribute("map", map);
%>
<%--演示获取user对象的属性的值
*setter 或 getter 方法, 去掉set, get,首字母变小写
例如:getName --> Name --> name;
--%>
${requestScope.user.name}<br>
${requestScope.user.age}<br>
${requestScope.user.birthDate}<br>
可以发现date属性的格式不太好看,那么可以通过在类中提供一个逻辑视图的方法,
来显示好看的格式
<br>
${requestScope.user.birStr}
<h3>演示获取list集合对象</h3>
${requestScope.list[0]}<br>
${requestScope.list[1]}<br>
<%--获取list集合中的user对象的属性依旧是一样的格式--%>
${requestScope.list[2].name}<br>
<%--如果获取list集合的时候超出了界限,那么会显示空字符串,不会报错,是因为el表达式内部优化好了。--%>
\${requestScope.list[3]}<br>
<h3>演示获取map集合对象</h3>
${requestScope.map.one}<br>
<%--如果key为数字,是无法被解析的--%>
\${requestScope.map."2"}
${requestScope.map["user"].name}<br>
${requestScope.map.user.name}
</body>
</html>
2.4、忽略EL表达式的方法
- jsp默认支持el表达式的。如果要忽略el表达式
- 设置jsp中page指令中:isELIgnored=“true” 忽略当前jsp页面中所有的el表达式
- ${表达式} :忽略当前这个el表达式
<%--
Created by IntelliJ IDEA.
User: wang
Date: 2022/3/15
Time: 11:05
To change this template use File | Settings | File Templates.
--%>
<%--还有一种方法就是在指令中来忽略所有的el表达式
isELIgnored="true":表示忽略所有的el表达式
如果值为true,则不忽略
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false"%>
<html>
<head>
<title>el表达式基本语法演示</title>
</head>
<body>
<%--基本语法--%>
${3>4}<%--这个表达式会在浏览器页面中输出false--%>
<%--忽略单个el表达式的方法--%>
\${3>4}<%--这个表达式会原样输出--%>
</body>
</html>
三、JSTL
3.1、JSTL基本概念和使用方法
概念
JavaServer Pages Tag Library JSP标准标签库
是由Apache组织提供的开源的免费的jsp标签 <标签>
作用:
用于简化和替换jsp页面上的java代码
用法:
- 导入jstl相关jar包:jar包
- 引入标签库:taglib指令: <%@ taglib %>
- 使用标签
3.2、常用的JSTL标签
3.2.1、if
用法与java中的if类似
1. 属性:
- test 是必须属性,接收boolean表达式
- 如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容
- 一般情况下,test属性值会结合el表达式一起使用
另外,* c:if标签没有else情况,想要else情况,则可以在定义一个c:if标签,写else的情况即可
代码演示:
<%@ page import="java.util.ArrayList" %><%--
Created by IntelliJ IDEA.
User: wang
Date: 2022/3/15
Time: 16:28
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--前缀名默认使用c,引用路径为下方这个,版本较高--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>jstl1标签的介绍——if标签</title>
</head>
<body>
<%--基本使用--%>
<%--test属性为true,则在页面中展示标签体的内容,--%>
<%--test属性为false,则在页面中不展示标签体的内容--%>
<c:if test="true">
hello jst
</c:if>
<hr>
<c:if test="false">
hello jst
</c:if>
<hr>
<%--一般情况下可以配合el表达式来进行使用--%>
<%--例如判断集合是否为空,如果为空,可以遍历集合,如果不为空,提示不为空--%>
<%
ArrayList<Object> list = new ArrayList<>();
// list.add("1111");
request.setAttribute("list", list);
int number = 3;
request.setAttribute("number", number);
%>
<c:if test="${not empty list}">
集合可以做遍历操作
</c:if>
<hr>
<%--如果想要相反的效果,就只能用test来做,不能使用else--%>
<c:if test="${empty requestScope.list}">
集合为空,不能遍历
</c:if>
<hr>
<%--同理,也可以使用该方法来完成对数字奇偶进行判断--%>
<c:if test="${requestScope.number % 2 == 0}">
该数字是偶数
</c:if>
<c:if test="${requestScope.number % 2 != 0}">
该数字为奇数
</c:if>
</body>
</html>
3.2.2、choose
类似于java中的Switch语句
使用步骤
- 使用choose标签声明 相当于switch声明
- 使用when标签做判断 相当于case
- 使用otherwise标签做其他情况的声明 相当于default
<%--
Created by IntelliJ IDEA.
User: wang
Date: 2022/3/15
Time: 16:45
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>jstl标签choose演示案例</title>
</head>
<body>
<%--演示一个案例,数字对应的星期数
1. 使用choose标签声明 相当于switch声明
2. 使用when标签做判断 相当于case
3. 使用otherwise标签做其他情况的声明 相当于default
--%>
<%
int number = 3;
request.setAttribute("number",number);
%>
<c:choose>
<c:when test="${number == 1}">星期一</c:when>
<c:when test="${number == 2}">星期二</c:when>
<c:when test="${number == 3}">星期三</c:when>
<c:when test="${number == 4}">星期四</c:when>
<c:when test="${number == 5}">星期五</c:when>
<c:when test="${number == 6}">星期六</c:when>
<c:when test="${number == 7}">星期日</c:when>
<c:otherwise>数字输入有误</c:otherwise>
</c:choose>
</body>
</html>
3.3.3、forEach
相当于java中的for循环
有两种用法
1、相当于java中的普通for循环
属性:
属性:
begin:开始值
end:结束值
step:步长
varStatus:循环状态对象
index:容器中的索引,从0开始
count:循环次数,从1开始
2、相当于java中增强for
属性:
item:容器对象
var:容器中元素的临时变量
代码演示
<%@ page import="java.util.ArrayList" %><%--
Created by IntelliJ IDEA.
User: wang
Date: 2022/3/16
Time: 9:23
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>foreach循环测试</title>
</head>
<body>
<%--
3. foreach:相当于java代码的for语句
1、完成重复的操作
for(int i = 0; i < 10; i++){
}
属性:
begin:开始值
end:结束值
step:步长
varStatus:循环状态对象
index:容器中的索引,从0开始
count:循环次数,从1开始
2、遍历容器
List<User> list;
for(User user: list) {
}
属性:
item:容器对象
var:容器中元素的临时变量
--%>
<c:forEach begin="1" end="10" var="i" step="2" varStatus="s">
${s.index} ${s.count} ${i}<br>
</c:forEach>
<hr>
<%
ArrayList<Object> list = new ArrayList<>();
list.add("111");
list.add("222");
list.add("333");
request.setAttribute("list", list);
%>
<c:forEach items="${list}" var="str" varStatus="s">
${s.index} ${s.count} ${str}<br>
</c:forEach>
</body>
</html>
小案例:通过表格展示集合中的数据
效果如下:
分析:
1、首先可以通过将数据存储到集合中,发送到request域中
2、通过EL表达式获取到存储的集合对象
3、使用JSTL标签foreach遍历
4、通过if标签实现颜色效果
代码实例:
<%@ page import="java.util.ArrayList" %>
<%@ page import="com.study.El.User" %>
<%@ page import="java.util.Date" %><%--
Created by IntelliJ IDEA.
User: wang
Date: 2022/3/16
Time: 9:56
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>表格小案例</title>
</head>
<body>
<%
ArrayList<Object> list = new ArrayList<>();
list.add(new User("张三", 15, new Date()));
list.add(new User("张四", 14, new Date()));
list.add(new User("张五", 55, new Date()));
list.add(new User("张六", 25, new Date()));
//将数据存储到request域中
request.setAttribute("list", list);
%>
<%--实现表格的动态添加--%>
<table border="1" width="500" align="center">
<tr>
<%-- 表头行--%>
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
<th>日期</th>
</tr>
<%-- 表格行,动态的获取list中的数据--%>
<c:forEach items="${list}" varStatus="s" var="user">
<%-- 为每一行动态的添加背景色,通过if标签实现,奇数一种颜色,偶数一种颜色--%>
<c:if test="${s.count % 2 == 0}">
<tr bgcolor="#fff8dc">
<%-- count作为编号--%>
<td>${s.count}</td>
<%-- 获取对象中的属性--%>
<td>${user.name}</td>
<td>${user.age}</td>
<%--获取有格式的日期--%>
<td>${user.birStr}</td>
</tr>
</c:if>
<c:if test="${s.count % 2 != 0}">
<tr bgcolor="#b8860b">
<%-- count作为编号--%>
<td>${s.count}</td>
<%-- 获取对象中的属性--%>
<td>${user.name}</td>
<td>${user.age}</td>
<%--获取有格式的日期--%>
<td>${user.birStr}</td>
</tr>
</c:if>
</c:forEach>
</table>
</body>
</html>