> 文档中心 > MVC开发模式和EL表达式的介绍

MVC开发模式和EL表达式的介绍


前言   🎄:CSDN的小伙伴们大家好,今天跟大家分享一个MVC开发模式,以及EL表达式和JSP标签库,如果这篇文章对你有用,麻烦给我点个小赞以示鼓励吧🎄
  🏡:博客主页:空山新雨后的java知识图书馆
  ☁️:今天天气多云,适合学习
  📝:名言分享:一个能思想的人,才真是一个力量无边的人——巴尔扎克📝
  📖上一篇文章:Cookie和Session📖
  👏欢迎大家一起学习,进步。加油👊
在这里插入图片描述


文章目录

  • 一、MVC开发模式
  • 二、EL表达式
    • 2.1、EL表达式的概念
    • 2.2、EL表达式的语法
    • 2.3、EL表达式的使用方法
      •   2.3.1、运算符
      •   2.3.2、EL表达式获取值的方法
    • 2.4、忽略EL表达式的方法
  • 三、JSTL
    • 3.1、JSTL基本概念和使用方法
    • 3.2、常用的JSTL标签
      •   3.2.1、if
      •   3.2.2、choose
      •   3.3.3、forEach
    • 小案例:通过表格展示集合中的数据

一、MVC开发模式

  MVC开发模式是在JSP文件中糅杂了大量的java代码,和HTML代码的前提下,造成了代码维护工作的难度的提升,因此就有人在java的web开发中使用借鉴MVC开发模式,使得程序更易于开发和维护。
  MVC开发模式是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

  1. M:Model,模型。JavaBean
    * 完成具体的业务操作,如:查询数据库,封装对象
  2. V:View,视图。JSP
    * 展示数据
  3. 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、运算符

分类

  1. 算数运算符: + - * /(div) %(mod)
  2. 比较运算符: > = <= == !=
  3. 逻辑运算符: &&(and) ||(or) !(not)
  4. 空运算符: empty * 功能:用于判断字符串、集合、数组对象是否为null或者长度是否为0 * ${empty list}:判断字符串、集合、数组对象是否为null或者长度为0 * ${not empty
    str}:表示判断字符串、集合、数组对象是否不为null 并且 长度>0

  2.3.2、EL表达式获取值的方法

el表达式只能从域对象中获取值
语法:

  1. ${域名称.键名}:从指定域中获取指定键的值

域名称:

  1. pageScope --> pageContext
  2. requestScope --> request
  3. sessionScope --> session
  4. applicationScope --> application(ServletContext)
  • 举例:在request域中存储了name=张三
  • 获取:
${requestScope.name}
  1. ${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。

代码实例:

<%--  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--> pageContext2. requestScope --> request3. sessionScope --> session4. 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>
  1. 获取对象、List集合、Map集合的值
    1. 对象:${域名称.键名.属性名} * 本质上会去调用对象的getter方法
    2. List集合:${域名称.键名[索引]}
    3. 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表达式
    1. 设置jsp中page指令中:isELIgnored=“true” 忽略当前jsp页面中所有的el表达式
    2. ${表达式} :忽略当前这个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代码

用法:

  1. 导入jstl相关jar包:jar包
  2. 引入标签库:taglib指令:
  3. 使用标签

3.2、常用的JSTL标签

  3.2.1、if

用法与java中的if类似
1. 属性:

  • test 是必须属性,接收boolean表达式
  • 如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容
  • 一般情况下,test属性值会结合el表达式一起使用
    另外,* c:if标签没有else情况,想要else情况,则可以在定义一个c:if标签,写else的情况即可

代码演示:

<html><head>    <title>jstl1标签的介绍——if标签</title></head><body><c:if test="true">    hello jst</c:if><hr><c:if test="false">    hello jst</c:if><hr><%    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><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语句
  使用步骤

  1. 使用choose标签声明 相当于switch声明
  2. 使用when标签做判断 相当于case
  3. 使用otherwise标签做其他情况的声明 相当于default
<html><head>    <title>jstl标签choose演示案例</title></head><body><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:容器中元素的临时变量

代码演示

<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标签实现颜色效果

代码实例:

<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>        <c:forEach items="${list}" varStatus="s" var="user">  <c:if test="${s.count % 2 == 0}">     <tr bgcolor="#fff8dc">        <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">        <td>${s.count}</td>        <td>${user.name}</td>  <td>${user.age}</td>        <td>${user.birStr}</td>     </tr> </c:if>    </c:forEach></table></body></html>

在这里插入图片描述

央视天气网