一、JSP
在上一篇文章中我们对JSP做了一个初步的了解,所以此文中我将不再重复之前发布的内容,如果有同学想了解的话可以点击我🚩
1.JSP中的指令
JSP指令是用来设置整个JSP页面相关的属性的,如网页的编码方式和脚本语言。
它语法格式如下:
<%@ directive attribute=“value” %>
指令可以有很多个属性,它们以 键值对 的形式存在,并用逗号隔开。
JSP中的三种指令标签:
指令 描述
<%@ page … %> 定义网页依赖属性,比如脚本语言、error页面、缓存需求等等
<%@ include … %> 包含其他文件
<%@ taglib … %> 引入标签库的定义
page指令
Page 指令为容器提供当前页面的使用说明。一个JSP页面可以包含多个page指令。
Page指令的语法格式:
<%@ page attribute=“value” %>
page指令有如下属性值:
属性 描述
buffer 指定out对象使用缓冲区的大小,默认8kb
autoFlush 控制out对象的 缓存区
contentType 指定当前JSP页面的MIME类型和字符编码,等同于response.setContentType()
errorPage 指定当JSP页面发生异常时需要转向的错误处理页面
isErrorPage 指定当前页面是否可以作为另一个JSP页面的错误处理页面
extends 指定servlet从哪一个类继承
import 导入要使用的Java类
info 定义JSP页面的描述信息
isThreadSafe 指定对JSP页面的访问是否为线程安全
language 定义JSP页面所用的脚本语言,默认是Java
session 指定JSP页面是否使用session
isELIgnored 指定是否执行EL表达式
isScriptingEnabled 确定脚本元素能否被使用
Include指令
JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。
Include指令的语法格式如下:
<%@ include file=“文件相对 url 地址” %>
include指令中的文件名实际上是一个相对的 URL 地址。
如果您没有给文件关联一个路径,JSP编译器默认在当前路径下寻找。
top.jsp文件中加入<h2>这是include头</h2>,在body.jsp中测试
测试结果:
Taglib指令
JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合。
Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。
Taglib指令的语法:
<%@ taglib uri=“uri” prefix=“prefixOfTag” %>
2.JSP中的注释
HTML注释:
:只能注释HTML代码片段
带有JSP表达式的注释:
在HTML注释中可以嵌入JSP表达式,注释格式如下:
包含该注释语句的 JSP 页面被请求后,服务器能够识别注释中的 JSP 表达式,从而来执行该表达式,而对注释中的其他内容不做任何操作。
当服务器将执行结果返回给客户端后,客户端浏览器会识别该注释语句,所以被注释的内容不会显示在浏览器中。
<%String name="XYQ";%>
<table><tr><td>欢迎登录:<%=name%></td></tr></table>
访问该页面后,将会在客户端浏览器中输出以下内容:
欢迎登录:XYQ
通过查看HTML源代码,看到如下内容:
<table><tr><td>欢迎登录:XYQ</td></tr></table>
1
2
隐藏注释:
<%--注释内容--%>
3.JSP中的内置对象
在JSP页面中不需要创建,直接使用的对象
对象 真实类型 说明
request javax.servlet.http.HttpServletRequest 获取用户请求信息
response javax.servlet.http.HttpServletResponse 响应客户端请求,并将处理信息返回到客户端
out javax.servlet.jsp.JspWriter 输出内容到 HTML 中
session javax.servlet.http.HttpSession 用来保存用户信息
application javax.servlet.ServletContext 所有用户共享信息
config javax.servlet.ServletConfig 这是一个 Servlet 配置对象,用于 Servlet 和页面的初始化参数
pageContext javax.servlet.jsp.PageContext JSP 的页面容器,用于访问 page、request、application 和 session 等的属性
page javax.servlet.jsp.HttpJspPage 类似于 Java 类的 this 关键字,表示当前 JSP 页面
exception java.lang.Throwable 该对象用于处理 JSP 文件执行时发生的错误和异常;只有在 JSP 页面的 page 指令中指定 isErrorPage 的取值 true 时,才可以在本页面使用 exception 对象。
二、MVC开发模式
MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。
M:Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。通俗来讲就是用来完成具体的业务操作,如:查询数据库,封装对象。
V:View(视图) - 视图代表模型包含的数据的可视化。展示数据。
C:Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。通俗来说就是获取用户的输入,调用模型,将数据交给视图进行展示。
实现
优点:
耦合性低,方便维护,可以利用于工协作、重用性高、生命周期成本低、部署快、可维护性高
缺点:
使得项目架构变得复杂,对开发人员要求高
EL表达式
前面的 JSP 页面中,我们经常使用 JSP 表达式来输出变量或者页面之间传递的参数,大大降低了页面的可读性。
为了简化 JSP 页面,JSP 2.0 新增了 EL(Expression Language)表达式语言。EL 提供了更为简洁、方便的形式来访问变量和参数,不仅可以简化 JSP 页面代码,还会使开发者的逻辑变得更加清晰 。
EL 表达式语法如下:
{开头,以}结束,中间为合法的表达式。
示例
${param.name} 表示获取参数 name 的值,它等同于
<%=request.getParameter(‘name’) %>
EL算术表达式
算术运算符用来进行加、减、乘、除和求余,EL 表达式算术运算符如下:
EL算术运算符 说明 范例 结果
- 加 ${5+2} 7
- 减 ${5-2} 3
- 乘
{5/2} 2
% 或 mod 求余 ${5%2} 1
注意:EL 的+运算符与 Java 的+运算符不一样,它无法实现两个字符串的连接运算。如果该运算符连接的两个值不能转换为数值型的字符串,则会拋出异常;反之,EL 会自动将这两个字符转换为数值型数据,再进行运算。
EL比较运算符
比较运算符用来实现两个表达式的比较,进行比较的表达式可以是数值型或字符串。EL 表达式比较运算符如下:
EL比较运算符 说明 范例 结果
== 或 eq 等于 {6 eq 6}
{“A” eq “a”} true false
!= 或 ne 不等于 {6 ne 6}
{“A” ne “a”} false true
< 或 lt 小于 {3 lt 8}
{“A” lt “a”} true true
或 gt 大于
{3 gt 8}
{“A” gt “a”} false false
<= 或 le 小于等于{3 le 8}
{“A” le “a”} true true
= 或 ge 大于等于{3 ge 8}
{“A” ge “a”} false false
EL逻辑运算符
逻辑运算符两边的表达式必须是布尔型(Boolean)变量,其返回结果也是布尔型(Boolean)。EL 表达式逻辑运算符如下:
EL逻辑运算符 说明 范例 结果
&& 或 and 与 {2>1and3<4 } true
|| 或 or 或 {2<1or3>4} false
! 或 not 非 {not (2>4)} true
EL其它运算符
. 和 [ ]
.和[ ]是 EL 中最常用的运算符,用来访问 JavaBean 中的属性和隐式对象的数据。一般情况下,.用来访问 JavaBean 属性或 Map 类型的值,[ ]用来访问数组或者列表的元素。
empty
empty 用来判断 EL 表达式中的对象或者变量是否为空。若为空或者 null,返回 true,否则返回 false。
条件运算符
EL 表达式中,条件运算符的语法和 Java 的完全一致,如下:
${条件表达式?表达式1:表达式2}
其中,条件表达式用于指定一个判定条件,该表达式的结果为 boolean 类型。如果该表达式的运算结果为 true,则返回表达式 1 的值;反之,返回表达式 2 的值。
注意:
jsp默认支持EL表达式,如果要忽略EL表达式则:
设置jsp中page指令中的:isELIgnored="true"忽略当前jsp页面中所有的EL表达式
${表达式}:忽略当前这个EL表达式
EL表达式获取值
EL表达式只能从域对象中获取值
语法:
${域名称.键名}:从指定域中获取指定键的值
pageScope ⇒ pageContext
request ⇒ request
sessionScope ⇒ session
applicationScope ⇒ application(ServletContext)
举例:
在request域中存储name=张三,在session域中存储age=23
获取语法:
{sessionScope.age}
${sessionScope.haha}//没有的值在页面中只会显示空字符串。
还有一种${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。
获取对象、List集合、Map集合的值
对象:
创建一个user,里面有name,age,birthday
获取对象:
${requestScope.user}
通过对象的属性获取值
{user.age}
${user.birthday}
List集合:
${域名称.键名[索引]}
如果角标越界了,页面只会显示空字符
Map集合:
{域名称.键名[“Key名称”]}
JSTL
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
使用任何库,你必须在每个 JSP 文件中的头部包含 <taglib>标签。
JSTL作用
用于简化和替换JSP页面上的java代码
1.导入jstl相关的jar包点我去下载🚩
2.引入标签库:taglib指令:
<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
3.使用标签
常见的JSTL标签
标签 描述
c:out 用于在JSP中显示数据,就像<%= … >
c:set 用于保存数据
c:remove 用于删除数据
c:catch 用来处理产生错误的异常状况,并且将错误信息储存起来
c:if 与我们在一般程序中用的if一样
c:choose 本身只当做<c:when>和<c:otherwise>的父标签
c:when <c:choose>的子标签,用来判断条件是否成立
c:otherwise <c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行
c:import 检索一个绝对或相对 URL,然后将其内容暴露给页面
c:forEach 基础迭代标签,接受多种集合类型
c:forTokens 根据指定的分隔符来分隔内容并迭代输出
c:param 用来给包含或重定向的页面传递参数
c:redirect 重定向至一个新的URL.
c:url 使用可选的查询参数来创造一个URL
三层架构
是一种软件设计架构:
Web(表现层): 主要是指与用户交互的界面。用于接收用户输入的数据和显示处理后用户需要的数据。
Service:(业务逻辑层) : Web层和Dao层之间的桥梁。实现业务逻辑。业务逻辑具体包含:验证、计算、业务规则等等。
Dao:(数据访问层): 与数据库打交道。主要实现对数据的增、删、改、查。将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库。(当然这些操作都是基于Web层的。用户的需求反映给界面(Web),Web反映给Service,Service反映给Dao,Dao进行数据的操作,操作后再一一返回,直到将用户所需数据反馈给用户)