MVC

本文探讨MVC模式在Java Web开发中的应用,包括其演变历史、优势及局限性。同时,深入解析EL表达式的功能,如算术运算、逻辑判断及数据获取,并介绍JSTL标签库如何简化JSP页面的逻辑处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MVC开发模式

1.jsp演变历史

​ 1.只有servlet,只能通过response输出标签数据,非常麻烦
​ 2.后来有了jsp,简化了servlet的开发,但是过度使用jsp导致jsp写了大量的java代码又写html标签,造成难于维护
​ 3.后来,java的web开发,借鉴了mvc的开发模式,使得程序的设计更加合理性

2.MVC:

​ 1.M:Model
​ 2.V:View
​ 3.C:Control

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LkEwJzzh-1582618879182)(…/web.assets/ac6eddc451da81cb26660e7e5066d01608243184.gif)]

最典型的MVC就是JSP + servlet + javabean的模式

优点:

耦合性

重用性高

生命周期成本低

缺点:

不适合小型,中等规模的应用程序

花费大量时间将MVC应用到规模并不是很大的应用程序通常会得不偿失。

EL表达式

1.概念:Expression Language表达式语言
2.作用:替换和简化jsp页面中的java语句
3.语法:$(表达式)
4.注意:
	* 忽略jsp中的EL可以page指令中设置iRLIgnore=“true”忽略当前的jsp页面中的所有sl表达式
    	* \ $(表达式) 忽略这个
5.算术
术语定义
算术型+、-(二元)、*、/、div、%、mod、-(一元)
逻辑型and、&&、or、||、!、not
关系型==、eq、!=、ne、<、lt、>、gt、<=、le、>=、ge。可以与其他值进行比较,或与布尔型、字符串型、整型或浮点型文字进行比较。
empty 空操作符是前缀操作,可用于确定值是否为空。
条件型A ?B :C。根据 A 赋值的结果来赋值 B 或 C。
6.获取数据
术语定义
pageScope将页面范围的变量名称映射到其值。例如,EL 表达式可以使用 ${pageScope.objectName} 访问一个 JSP 中页面范围的对象,还可以使用 ${pageScope .objectName. attributeName} 访问对象的属性。
requestScope将请求范围的变量名称映射到其值。该对象允许访问请求对象的属性。例如,EL 表达式可以使用 ${requestScope. objectName} 访问一个 JSP 请求范围的对象,还可以使用 ${requestScope. objectName. attributeName} 访问对象的属性。
sessionScope将会话范围的变量名称映射到其值。该对象允许访问会话对象的属性。例如:${sessionScope. name}
applicationScope将应用程序范围的变量名称映射到其值。该隐式对象允许访问应用程序范围的对象。

实例:

<%
    request.setAttribute("name","zhangsan");
    HttpSession session1 = request.getSession();
    session1.setAttribute("number",7989);
%>
${requestScope.name}
${sessionScope.number}

获取值顺序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u6OlyIOi-1582618879185)(…/web.assets/image-20200212220956374.png)]

7.获取对象、集合、map
对象
<%
    User user=new User();
    request.setAttribute("u",user);
%>
${u.name}			<!--就是调用u.getName()方法-->
${u.age}
${u.birthday}

本质上是在调用对象的getter方法

List集合&Map集合

省略了请求域

<%
    User user=new User();
    request.setAttribute("u",user);
%>
<%
    List list=new ArrayList();
    list.add("hello");
    list.add(user);
    Map map=new HashMap();
    request.setAttribute("list",list);

    map.put("name","张三");
    map.put("age",78);
    map.put("use",user);
    request.setAttribute("map",map);


%>

对象<br>
${u.name}<br>
${u.age}<br>
${u.birthday}<br>

list<br>
list${list}<br>
list[0]${list[0]}<br>
list[1]${list[1]}<br>
list[10]${list[10]}<br>
list[1].name${list[1].name}<br>

<br>

map<br>
map.name${map.name}<br>
map.age${map.age}<br>
map.use.birthday${map.use.birthday}<br>
    

    
    
<%
    String str1="String";
    String str2=null;
    String str3="";
    request.setAttribute("str1",str1);
    request.setAttribute("str2",str2);
    request.setAttribute("str3",str3);
%>
empty<br>
${empty str1}<br>
${empty str2}<br>
${empty str3}<br>

str1为null或者为""时返回true

8.隐式对象
  • el表达式中有11个隐式对象
    • 和jsp中的内置对象使用相同,只是jsp通过方法返回参数值,el表达式通过属性调用对象的getter方法
  • pageContext获取jsp其他8个内置对象
 <script>
    window.onload=function(){
    var img= document.getElementById("checkCode");
    img.onclick=function(){
    var date =new Date().getTime();
    img.src="${pageContext.request.contextPath}/checkCodeImagServlet?"+date;//***
    }
     }
    </script>

在这里插入图片描述
在这里插入图片描述

JSPL

Java server pages standarded tag library,即JSP标准标签库

作用:

EL 的出现就是为了简化js中的java代码,简化的方面主要是取值得阶段,相关逻辑功能,el是不能实现的。
jspl送js标准标签库,可以在jsp页面中使用标签的形式完成业务逻辑的功能。
jspl出现的目的主要是想代替jsp页面中的脚本代码,他有五个库,其中最核心的是core库,简化是c。
使用步骤:

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

常用的JSTL标签
if :相当于java的if语句
choose :相当于java中的switch语句
foreach :相当于for语句

JSTL 库安装

Apache Tomcat安装JSTL 库步骤如下:

从Apache的标准标签库中下载的二进包(jakarta-taglibs-standard-current.zip)。

官方下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
本站下载地址:jakarta-taglibs-standard-1.1.2.zip
下载 jakarta-taglibs-standard-1.1.2.zip 包并解压,将 jakarta-taglibs-standard-1.1.2/lib/ 下的两个 jar 文件:standard.jar 和 jstl.jar 文件拷贝到 /WEB-INF/lib/ 下。

JSTL的使用:

< c:if > 标签
  <c:if test="true">
    没有问题
  </c:if>
choose标签
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

  <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>
foreach
  <c:forEach  var="str" begin="5" end="673" step="75" varStatus="s">
    <br>${str},${s.index},${s.count}<br>
  </c:forEach>

属性描述是否必要默认值
items要被循环的信息
begin开始的元素(0=第一个元素,1=第二个元素)0
end最后一个元素(0=第一个元素,1=第二个元素)Last element
step每一次迭代的步长1
var代表当前条目的变量名称
varStatus代表循环状态的变量名称

实例:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="com.el.User" %>
<%@ page import="java.util.Date" %>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    List list = new ArrayList();
    list.add(new User("张三",34,new Date()));
    list.add(new User("李四",44,new Date()));
    list.add(new User("lili",54,new Date()));
    list.add(new User("哈哈",87,new Date()));
    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}" var="var" varStatus="v">
        <tr>
            <th>${v.count}</th>
            <th>${var.name}</th>
            <th>${var.age}</th>
            <th>${var.birthday}</th>
        </tr>
    </c:forEach>
</table>

实例:

<%
    List list = new ArrayList();
    list.add(new User("张三",34,new Date()));
    list.add(new User("李四",44,new Date()));
    list.add(new User("lili",54,new Date()));
    list.add(new User("哈哈",87,new Date()));
    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}" var="var" varStatus="v">
            <tr bgcolor="${(v.count mod 2)==0?"#8987":"blue"}">
                <th>${v.count}</th>
                <th>${var.name}</th>
                <th>${var.age}</th>
                <th>${var.birthday}</th>
            </tr>
    </c:forEach>

三层架构

三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rJwe8MJR-1582618879189)(…/web.assets/image-20200213223254759.png)]

  1. 需求
  2. 设计:
    1.技术选型:
    2.数据库的设计:
    3.开发:
    1. 环境搭建
      1.创建数据库环境
      2.创建项目,导入需要的jar包

    2. 编码

4.测试
5.部署运维

实例:用户数据查询

在这里插入图片描述

构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)

[外链图片转存中…(img-rJwe8MJR-1582618879189)]

  1. 需求
  2. 设计:
    1.技术选型:
    2.数据库的设计:
    3.开发:
    1. 环境搭建
      1.创建数据库环境
      2.创建项目,导入需要的jar包

    2. 编码

4.测试
5.部署运维

实例:用户数据查询

[外链图片转存中…(img-v5KKSFp4-1582618879190)]

javabean

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值