前言
感谢
JSP
JSP介绍
我们在之前学习了Servlet,Cookie和Session,但其实我们一直仅仅有后端而没有前端。
只开发接口并不能算一个完整的项目,我们的JavaWeb自然也需要前端的技术。
但其实说实在话,JSP已经过时了,现在的公司基本没有使用JSP的公司了,但是我们还是需要讲,因为我们需要知道互联网编程语言的发展史,只有知道了老的技术,才能知道新的技术到底优越在哪里。
当然了,因为JSP这种东西已经过时了,所以就简单理解一下就好,不必深入进行。
那么,什么是JSP呢
JSP:Java Server Pages,Java服务端页面,和Servlet一样,也用于动态的Web技术
但是JSP和Servlet是不一样的,他可以写页面,再写JSP的时候我们会觉得和写HTML是差不多的,但是多了一些语法而已
但是JSP和HTML还不一样
- HTML只可以给用户展示静态的数据,不同的用户看到的效果是一样的
- JSP页面中可以嵌入Java代码,使用Java代码来为用户提供动态的数据
JSP的本质
其实是Java类,如果我们查看IDEA的Tomcat,在work/Catalina/localhost/ROOT/org/apache/jsp目录下会看到页面其实已经转换为了Java程序
浏览器向服务器发送请求,其实就是在访问Servlet
JSP本身就是一个Servlet,它也有初始化,提供服务,销毁的过程
1、客户端向服务器发送请求,访问localhost:8080/index.jsp
2、服务器解析请求信息,寻找是否有index.jsp这个资源
3、找到了资源,将index.jsp转换为.java文件
4、编译.java为.class字节码文件
5、字节码文件提供访问
快速起步
1、依赖
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
</dependency>
</dependencies>
2、补全目录结构
3、删掉原来的JSP页面重新创建一个名为index.jsp的页面
4、编写代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>HELLO JSP</title>
</head>
<body>
<%
int num = 10;
for (int i = 0; i < num; i++) {
out.print(i);
}
%>
</body>
</html>
5、服务器部署运行
基本语法
JSP脚本
JSP定义Java代码的方式实际上就是使用JSP脚本的方式去定义
1、<% 代码 %>
:定义的Java代码,比如说我们在快速起步的时候编写的内容
2、<%! 代码 %>
:在JSP转换后会到达Java类的成员位置
3、<%= 代码 %>
:在JSP中的定义会输出到页面上
4、<%@ 代码 %>
:用于配置JSP页面,导入资源文件
1、格式:
<%@ 指令名称 属性名=属性值 属性名=属性值 属性名=属性值 ... %>
2、分类
- page:定义页面
- contentType:等于response.setContentType()
1、设置响应体的mime类型和字符集
2、设置当前JSP页面的编码(如果使用低级IDE,需要设置pageEncoding属性来设置当前也买的字符集)- import:导包
- errorPage:当前页面发生异常之后,会自动跳转到指定的错误页面
- isErrorPage:表示当前页面是否为错误页面
- buffer:设置输出流可以使用的流量
<%@ page
contentType="text/html;charset=UTF-8"
language="java"
pageEncoding="utf-8"
buffer="8kb"
import="com"
errorPage="index.jsp"
isErrorPage="true"
%>
<html>
<head>
<title>HELLO JSP</title>
</head>
<body>
</body>
</html>
- include:导入其他的JSP页面
- file:引入其他页面资源
<%@ include file="./top.jsp"%>
<html>
<head>
<title>HELLO JSP</title>
</head>
<body>
</body>
</html>
- taglib:导入资源和标签库
- prefix:前缀,自定义的前缀
- uri:地址
<%@ taglib uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>HELLO JSP</title>
</head>
<body>
</body>
</html>
注释
1、<!-- -->
:只能注释html的代码
2、<%-- --%>
:注释所有
<%--JSP的指令,引资源
又比如
<%@include file="./hello.jsp"%>
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>HELLO JSP</title>
</head>
<body>
<%--在此定义的JSP代码会转换到Java类的成员变量的位置--%>
<%!
static {
System.out.println("输出到成员变量的位置");
}
public int sum(int x, int y) {
return x + y;
}
%>
<%-- JSP脚本 --%>
<%
int num = 10;
for (int i = 0; i < num; i++) {
out.println(i + " + " + i + 1 + " = " + sum(i, i + 1));
}
out.println("--------------------------------");
%>
<%-- JSP表达式,程序未来将会输出到客户端页面 --%>
<%=
new java.util.Date()
%>
</body>
</html>
查看编译成的Java文件
1、通过控制台打印我们可以查看到编译的目录
2、找到对应目录下的文件
3、打开.java文件查看
JSP九大内置对象和四大作用域
九大内置对象
JSP有九大内置对象,这九个内置对象我们不用定义,可以直接获取
- 输入输出对象:out,request,response
- 通信控制对象:pageContext,session,application
- servlet对象:page,config
- 错误处理对象:exception
| 变量 | 实例 | 作用 |
| —- | —- | —- |
| out | JSPWriter | 输出对象,数据将会输出到页面上 |
| request | HttpServletRequest | 一次请求访问的多个资源(转发方式)
保存的数据只在一次请求中有效 | | response | Response | 响应对象 | | pageContext | PageContext | 当前页面共享数据,并且获取其他的八个内置对象
保存的数据只在一个页面中有效 | | session | HttpSession | 一次会话的多次请求
保存的数据只在一次会话中有效 | | application | ServletContext | 所有用户间共享数据
保存的数据只在服务器打开到关闭这期间,在服务器范围内有效 | | page | Object | 当前页面(Servlet)的对象this | | config | ServletConfig | Servlet的配置对象 | | exception | Throwable | 异常对象 |
四大作用域
- page:只在一个页面保留数据
- request:在一个请求中保留数据
- session:在一次会话中保留数据,单个用户使用
- Application:在整个服务器中保留数据,全部用户共享
EL
EL介绍
EL:Expression Language,表达式语言
作用是替换和简化JSP页面中的Java代码的编写
语法
${表达式}
注意
JSP默认支持EL表达式,但是如果要忽略
1、设置JSP中的page指令,添加:isELIgnored=""true
,忽略当前JSP页面中的所有EL表达式
2、\${表达式}
:忽略当前表达式
快速起步
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>HELLO EL</title>
</head>
<body>
${1+2}
</body>
</html>
基本语法
运算符
1、算数:+ - * / %
2、比较:> < >= <= == !=
3、逻辑:&& || !
4、空:empty
功能: 1、判断字符串,集合,数组对象是否为null或者长度是否为0 2、${empty list}:判断字符串,集合,数组对象是否为null或长度是否为0 3、${not empty str}:判断字符串,集合,数组对象是否不为null并且长度>0
获取值
EL表达式只能从指定域中获取指定键的值
1、pageScope,页面域,代表的是pageContext
2、requestScope,请求域,代表的是request
3、sessionScope,session域,代表的是session
4、applicationScope,全局域,代表的是application(ServletContext)
假如从域中找不到对应的值,那么会使用空字符串来展示,不会打乱布局
<%
request.setAttribute("name","张三");
%>
${requestScope.name}
获取对象,List集合,Map集合
1、获取对象:${域.键名.属性名}
,本质上会调用对象的getter方法,所以注意getter是否是获取的你想要的值
2、获取List:${域.键名[索引]}
2、获取Map:${域.键名[“key”]}
,或者为${域.键名.key}
隐式对象
EL中有11个隐式对象,类似于JSP中的内置对象,只学一个:pageContext,作用是获取JSP的其他八个内置对象
比如:${pageContext.request.contextPath}
:动态获取虚拟目录
- pageContext:对应于JSP页面的pageContext对象
- pageScope:代表page域中用于保存属性的Map对象
- requestScope:代表request域中用于保存属性的Map对象
- sessionScope:代表session域中用于保存属性的Map对象
- applicationScope:代表application域中用于保存属性的Map对象
- param:表示一个保存了所有请求参数的Map对象
- paramValues:表示一个保存了所有请求参数的Map对象,它对于某个请求,返回的是一个String[]
- header:表示一个保存了所有http请求头字段的Map对象
- headervalues:表示了一个保存了所有http请求头字段的Map对象,返回String类型数组
- cookie:表示一个保存了所有cookie的Map对象
- initParam:表示一个保存了所有web应用初始化参数的map对象
JSTL
JSTL介绍
JSTL:JavaServer Pages Tag Library JSP,标准标签库
由Apache开源免费的JSP标签。
快速开始
1、导入依赖
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
2、引入标签库
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
3、使用标签
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>HELLO JSTL</title>
</head>
<body>
<c:if test="true">
可见
</c:if>
<c:if test="false">
不可见
</c:if>
</body>
</html>
4、假如报错
1、进入网址http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/ 2、下载 jakarta-taglibs-standard-1.1.2.zip ,将解压后的/lib目录下的standard.jar 和 jstl.jar拷贝到/WEB-INF/lib下并加入到项目中
基本语法
以下内容来自:https://blog.csdn.net/weixin_42808295/article/details/81460609
- 表达式标签:out标签、set标签、remove标签、catch标签。
- 流程标签:if标签、choose标签、when标签、otherwise标签。
- 循环标签:forEach标签、forTokens标签。
- URL标签:import标签、url标签、redirect标签。
out标签:输出一个值。
<c:out value="${num }"></c:out>1
set标签:定义一个变量,var变量名,value变量值。
<c:set var="age" value="90"></c:set>1
remove标签:移除一个属性。
<c:remove var="num"/>1
catch标签:抛出一个异常,catchException为抛出的异常名。
<c:catch var="catchException">
<%
int x = 5 / 0;
%>
</c:catch>12345
if标签:if判断,写在test中。
<c:if test="${num>10 }">
标签体的内容得到了输出
</c:if>123
choose标签,when标签,otherwise标签:choose表示选择,when表示判断,otherwise表示除了上述情形以外的其他状况。满足条件显式出来,不满足不显示。
<c:choose>
<c:when test="${age>95 }">
国家每月每人700
</c:when>
<c:when test="${age>80 }">
国家每月每人150
</c:when>
<c:when test="${age>60 }">
养老金自备
</c:when>
<c:otherwise>
努力赚钱
</c:otherwise>
</c:choose>1234567891011121314
forEach标签:循环遍历,items 需要循环展现的数据,var代表当前遍历项的变量名。 begin 开始条件 end 结束条件(用于截取) 。step 步长(隔几个输出一下)。delims=”|,”使用,|分割。varStatus设定变量名,该变量用于存放集合中元素的信息。
<c:forEach var=”user” items=”${userList }” varStatus=”StatusName” begin=”begin” end=”end” step=”step”>
<tr>
<td>${user.id }</td>
<td>${user.name }</td>
<td>${user.email }</td>
<td>修改</td>
</tr>
</c:forEach>12345678
forTokens标签:
<c:forTokens items="Zara,nuha,roshy" delims="," var="name">
<c:out value="${name}"/><p>
</c:forTokens>123
import标签:动态加载外部容器的内容。
<c:import var="data" url="http://www.baidu.com"/>1
url标签:用于写一个链接,param表示需要传入的参数。
<a href="
<c:url value="/delete">
<c:param value="${user.id }" name="userId"></c:param>
<c:param value="${user.name }" name="userName"></c:param>
</c:url>
">123456
redirect标签:重定向到某一个页面。
<c:redirect url="jstl2.jsp"></c:redirect>
MVC和三层架构
MVC和三层架构介绍
三层架构
通常意义上,将业务的应用范围划分为三块
1、表现层:用户看得见的界面
2、逻辑层:处理业务逻辑
3、数据访问层:操作数据存储文件
这张图来自黑马,我觉得十分好 我们先不要管这几个框架,只需要先看一下左边,中间,右边这几个分层的结构
MVC
全名为Model View Controller,是模型-视图-控制器的缩写,是一种软件的设计典范。
- Model:模型,主要处理业务逻辑和数据库的交互
- View:视图层
- Controller:控制层,主要用于请求转发和页面的请求
对比两者我们可以看到,其实MVC和三层结构是不同的,三层是基于业务逻辑来分开的,而MVC是基于页面来分的