JavaWeb核心篇(3)——JSP,MVC,三层架构
JavaWeb核心篇(3)——JSP,MVC,三层架构
在本篇文章中我们会学习到JSP,MVC,三层架构
虽然JSP已经快被时代所淘汰,但是在一些老旧的工作场所还是有在使用,所以了解一下也不为过
至于MVC和三层架构,应该是属于核心思想部分
JSP
首先我们先来简单介绍一下JSP:
- 概念:Java Server Pages ,Java服务端页面
- 一种动态的网页技术,其中既可以定义HTML,JS,CSS等静态内容,还可以定义Java代码的动态内容
- JSP = HTML + Java
- JSP的作用:简化开发,避免了在Servlet中直接输出HTML标签的问题
我们先来了解一下未开发JSP之前,Servlet是如何输出HTML标签的:
// Servlet通过writer的write方法进行一行一行的输出:
// 例如:
Writer.write("<html>");
Writer.write("<body>");
Writer.write("username");
Writer.write("</body>");
Writer.write("</html>");
所以在古老版本,JSP的开发实际上很大程度的遍历了编程
JSP快速入门
JSP需要导入jar包才可以使用,这里我们采用Maven来进行操作:
- 导入JSP坐标(注意:使用范围为provided)
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
- 创建JSP文件
- 编写HTML和Java代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>hello jsp</h1>
<%
System.out.println("hello,jsp~");
int i = 3;
%>
<%="hello"%>
<%=i%>
<%!
void show(){}
String name = "zhangsan";
%>
</body>
</html>
JSP原理
在介绍JSP的脚本语法之前,我们先了解一下JSP的原理:
- JSP本质上是一个Servlet
- JSP在被访问时,由JSP容器(Tomcat)将其转换为Java文件(Servlet),在由JSP容器(Tomcat)将其编译,最终对外提供服务的其实是这个字节码文件

JSP脚本
JSP中可以直接书写HTML代码,因为JSP会自动将文本带入到out的write方法中去
但是Java的内容不能直接输出,需要采用脚本方法
JSP的脚本主要分为三种:
- <% ... %>:
- 内容会直接放到_jspService()方法中去
- 属于正常Java代码,在运行时调用
<%
System.out.println("hello,jsp~");
%>
- <%= ... %>:
- 内容会放到out.print()方法中,作为out.print()的参数
- 作为输出
<=%
"Hello JSP"
%>
- <%! ... %>:
- 内容会放到_jspService()方法之外,被类直接包含
- 作为成员函数或者成员变量
<!%
String name;
void method(){};
%>
注意:在<%%> 中不可以输入HTML,如果想使用for或if等方法需要在{}之间插入%><%来结束脚本内容来书写HTML标签
代码示例:
<%@ page import="com.itheima.pojo.Brand" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
// 查询数据库
List<Brand> brands = new ArrayList<Brand>();
brands.add(new Brand(1,"三只松鼠","三只松鼠",100,"三只松鼠,好吃不上火",1));
brands.add(new Brand(2,"优衣库","优衣库",200,"优衣库,服适人生",0));
brands.add(new Brand(3,"小米","小米科技有限公司",1000,"为发烧而生",1));
%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<input type="button" value="新增"><br>
<hr>
<table border="1" cellspacing="0" width="800">
<tr>
<th>序号</th>
<th>品牌名称</th>
<th>企业名称</th>
<th>排序</th>
<th>品牌介绍</th>
<th>状态</th>
<th>操作</th>
</tr>
<%
for (int i = 0; i < brands.size(); i++) {
Brand brand = brands.get(i);
%>
<tr align="center">
<td><%=brand.getId()%></td>
<td><%=brand.getBrandName()%></td>
<td><%=brand.getCompanyName()%></td>
<td><%=brand.getOrdered()%></td>
<td><%=brand.getDescription()%></td>
<%
if(brand.getStatus() == 1){
//显示启用
%>
<td><%="启用"%></td>
<%
}else {
// 显示禁用
%>
<td><%="禁用"%></td>
<%
}
%>
<td><a href="#">修改</a> <a href="#">删除</a></td>
</tr>
<%
}
%>
</table>
</body>
</html>
JSP缺点
我们之前说到JSP已经被时代所淘汰,所以我们现在来谈论一下JSP的缺点:
- 书写麻烦,特别对于复杂的页面
- 阅读麻烦
- 复杂度高,运行时需要依赖各种环境
- 占用内存和磁盘,JSP会自动生成Java和class文件占磁盘,运行的是class文件占内存
- 调试困难,出错后需要找到自动生成的Java代码调试
- 不利于团队协作,现在一般都是前后端分离,技术不协调
最开始由Servlet单独运作,到后来由JSP单独运作,再后来由Servlet和JSP合作运行:
- Servlet:负责逻辑处理,封装数据
- JSP:负责获得数据,便于展现数据
到了如今已经基本完全被HTML和Ajax替代
EL表达式
EL表达式是一种表达式语言,用于简化JSP页面的Java代码:
- 主要功能:获得数据
- 语法:${expression}
${brands}:表示获得域(request)中存储的key为brands的数据
然后我们来介绍一下JavaWeb中的四大域对象:
- page:当前页面有效
- request:当前请求有效
- session:当前会话有效
- application:当前应用有效
EL表达式获得数据,会依次从这四个域中寻找,直到找到为止
域值范围: page < request < session < application
JSTL标签
我们使用JSTL标签需要先导入jar包,这里我们同样使用Maven导入:
- 导入坐标
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
- 在JSP页面上导入JSTL标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- 使用即可
<c:if>
</c:if>
因为JSTL并不常用,我们在这里只介绍简单的if和for循环:
- if语句
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--
c:if:来完成逻辑判断,替换java if else
--%>
<%--
<c:if test="true">
<h1> true </h1>
</c:if>
<c:if test="false">
<h1> false </h1>
</c:if>
--%>
<c:if test="${status ==1}">
启用
</c:if>
<c:if test="${status ==0}">
禁用
</c:if>
</body>
</html>
- for语句
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<input type="button" value="新增"><br>
<hr>
<table border="1" cellspacing="0" width="800">
<tr>
<th>序号</th>
<th>品牌名称</th>
<th>企业名称</th>
<th>排序</th>
<th>品牌介绍</th>
<th>状态</th>
<th>操作</th>
</tr>
<!--
c:forEach -> for(int i : nums)
items -> nums
var -> i
varStatus -> 状态码;
varStatus有两个属性,
status.index 属性:当前迭代的元素在集合中的索引,从 0 开始。
status.count 属性:当前迭代的元素是集合中第几个元素,从 1 开始。
-->
<c:forEach items="${brands}" var="brand" varStatus="status">
<tr align="center">
<%--<td>${brand.id}</td>--%>
<td>${status.count}</td>
<td>${brand.brandName}</td>
<td>${brand.companyName}</td>
<td>${brand.ordered}</td>
<td>${brand.description}</td>
<c:if test="${brand.status == 1}">
<td>启用</td>
</c:if>
<c:if test="${brand.status != 1}">
<td>禁用</td>
</c:if>
<td><a href="#">修改</a> <a href="#">删除</a></td>
</tr>
</c:forEach>
</table>
<hr>
<!--
c:forEach -> 对标普通循环
begin:开始数
end:结束数
var:当前数
step:步长(begin = begin + step)
-->
<c:forEach begin="1" end="10" step="1" var="i">
<a href="#">${i}</a>
</c:forEach>
</body>
</html>
MVC模式
首先我们先来了解一下MVC:
- MVC是一种分层开发的模式
- M:Model,业务模型,处理业务
- V:View,视图,页面展示
- C:Controller,控制器,处理请求,调用模型和视图
MVC优点:
- 责任单一,互不影响
- 有利于分工协作
- 有利于组件重用

三层架构

我们对上面三层进行简单的解释:
- 表现层:接受请求,封装数据,调用业务逻辑层,响应数据
- 业务逻辑层:对业务逻辑进行封装,组合数据访问层层中基本功能,形成复杂的业务逻辑功能
- 数据访问层:对数据库的CRUD基本操作
结束语
好的,关于JSP和MVC三层架构我们就到这里
附录
该文章属于学习内容,具体参考B站黑马程序员陈老师的JavaWeb课程
这里附上链接:01-JSP概述&快速入门&原理_哔哩哔哩_bilibili
JavaWeb核心篇(3)——JSP,MVC,三层架构的更多相关文章
- MVC三层架构编程(Dao、service、servlet 之间的关系)
木哈哈~先开心一会儿,人生的第一篇博客aaa.我一定好好写.不过之前也没怎么看别人写过,还是有点小激动呢,加油.好好总结,会总结的宝宝才会有提高! 今天想总结一下mvc三层架构模型编程,宝宝学习不怎么 ...
- Angular JS从入门基础 mvc三层架构 常用指令
Angular JS从入门基础 mvc模型 常用指令 ★ 最近一直在复习AngularJS,它是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJS有着诸多特性,最为核心 ...
- 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理
服务器文档下载zip格式 刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...
- MVC三层架构搭建
MVC三层架构搭建 项目主要是用三层来搭建项目,三层分为表现层,数据层和业务层.项目用了目前比较流行的IOC架构.目前流行的IoC 框架有AutoFac,Unity,Spring.NET等,项目中选用 ...
- JavaWeb核心篇(2)——Request和Response
JavaWeb核心篇(2)--Request和Response 上篇文章中提及到了Servlet,在Servlet中我们主要继承了HTTPServlet类,在HTTPServlet类中我们会接触到两个 ...
- MVC三层架构模式编程思想 JSP-Servlet-JavaBean
MVC(Mdodel-View-Controller)编程模式.把一个Java应用分成三层:模型层.视图层.控制层,各层分别实现各层的功能,整个过程见下图就一目了然了. watermark/2/tex ...
- Asp.Net MVC三层架构之autofac使用教程
开发环境:vs2015..net4.5.2.mvc5.ef6 Autofac简介 IOC控制反转(Inversion of Control,缩写为IOC),Autofac是一个开源的依赖注入框架,Au ...
- MVC——三层架构笔记、1
三层架构MVC笔记1. DAL——数据访问层:(专门与数据库交互,增删查改的方法都在这:需引用MODEL层) BLL——业务逻辑层:(页面与数据库之间的桥梁:需引用DAL.MODEL层) MODEL— ...
- 软件架构设计学习总结(18):MVC三层架构在各框架(jsp+servlet + Struts1+ Struts2+ springMVC)中的特征
1.基于web开发中最原始的jsp+Servlet 图形化理解jsp+servlet结构: 1.从结构上分析jsp+servlet图解原理: 在基于mvc设计模式下的最原始的jsp+Servlet ...
随机推荐
- Centos8安装NextCloud记录
今天在网上学习了这个Nextcloud 网盘的搭建,被折磨的快崩溃了.始终是找不到答案,我在网上查了2天的资料 还是没有找到答案,今天这里总结一下安装的下面的总结: 原文出处在官网:CentOS 8 ...
- osx系统使用技巧集锦
6.禁用dashboard defaults write com.apple.dashboard mcx-disabled -boolean YES && killall Dock 5 ...
- HTML 超文本标记语言 (Hyper Text Markup Language)
1.HTML是什么 HTML指的超文本标记语言(Hyper Text Markup Language),是一种用来描述网页的语言.超文本指的是除了可以包含文字之外,还可以包含图片.链接.音乐.视频.程 ...
- c# 反射专题—————— 介绍一下是什么是反射[ 一]
前言 为什么有反射这个系列,这个系列后,asp net 将会进入深入篇,如果没有这个反射系列,那么asp net的源码,看了可能会觉得头晕,里面的依赖注入包括框架源码是大量的反射. 正文 下面是官方文 ...
- paddlespeech asr 使用教程
目录 安装 paddle框架安装 软件源安装 源码安装 快速使用 下载测试使用的音频 非流式命令行接口(CLI) 非流式Server服务 流式Server服务 指令详解 打印paddlespeech_ ...
- Java开发学习(十一)----基于注解开发bean作用范围与生命周期管理
一.注解开发bean作用范围与生命周期管理 前面使用注解已经完成了bean的管理,接下来将通过配置实现的内容都换成对应的注解实现,包含两部分内容:bean作用范围和bean生命周期. 1.1 环境准备 ...
- 【摸鱼神器】UI库秒变低代码工具——表单篇(二)子控件
上一篇介绍了表单控件,这一篇介绍一下表单里面的各种子控件的封装方式. 主要内容 需求分析 子控件的分类 子控件属性的分类 定义 interface. 定义子控件的的 props. 定义 json 文件 ...
- 0. 西门子 WinCC 组态软件 -- 概述
西门子 WinCC 组态软件 -- 概述 1.西门子WinCC各产品线及定位 WinCC是由SIEMENS(西门子)公司开发的SCADA(数据采集与监控)系统,能高效控制自动化过程,具有极强的开放性和 ...
- 网格动物UVA1602
题目大意 输入n,w,h(1<=n<=10,1<=w,h<=n).求能放在w*h网格里的不同的n连块的个数(平移,旋转,翻转算一种) 首先,方法上有两个,一是打表,dfs构造连 ...
- VMware Workstation是可以跟hyper-v 共存的!
VMware Workstation是可以跟hyper-v 共存的! 神奇的事情 之前一直不知道这个事情,后来发现,原来是可以的,震惊了我的双眼. 我之前一直用的是桌面的Docker Desktop ...