JSP
- 概念:Java Server Pages,Java服务
- 动态的网页技术,其中可以定义HTML、JS、CSS等静态内容,还可以定义JAva代码的动态内容
- JSP = HTML+Java
- 作用:简化开发,避免了在Servlet中直接输出HTML标签
JSP快速入门
-
导入JSP坐标
<!-- https://mvnrepository.com/artifact/javax.servlet/jsp-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency>
-
创建JSP文件
-
编写HTML标签和Java代码
JSP原理
- 概念:Java Server Pages,Java服务
- SP = HTML+Java 作用:简化开发
- JSP本质上就是一个Servlet
- JSP被访问时,由容器将其转换为Java文件,在JSP容器将其编译,最终对外提供服务的其实就是这个字节码文件
JSP脚本
- JSP脚本用于在JSP页面内定义Java代码
- JSP脚本分类:
- <%…%>:内容会直接放到——jspService()方法中
- <%=…%>:内容会放到out.print()中,作为out.print()的参数
- <%!..%>:内容会放到_jspService()方法之外,被类直接包含
JSP缺点
- 由于JSP页面内,既可以定义HTML标签,又可以定义Java代码,造成了以下问题:
- 书写麻烦:特别是复杂页面
- 阅读麻烦
- 复杂的高:运行需要依赖于各种环境,JRE,JSP容器,JavaEE
- 占内存和磁盘:JSP会自动生成.java和.class文件占磁盘,运行的是.class文件占内存
- 调试困难:出错后,需要找到自动生成的.java文件进行调试
- 不利于团队协作:前端不会Java,后端不会HTML
JSP已逐渐退出历史舞台
EL表达式
-
Expression Language表达式语言,用于简化JSP页面内的Java代码
-
主要功能:获取数据
-
语法:${expression}
${brands}
:获取域中存储的key为brands的数据 -
JavaWeb中的四大域对象:
- page:当前页面有效
- request:当前请求有效
- session:当前会话有效
- application:当前应用有效
el表达式获取数据,会依次从这4个域中寻找,直到找到为止
JSTL标签
- JSP标准标签库(JSP Standarded Tag Library),使用标签取代JSP页面上的Java代码
快速入门:
-
导入坐标
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl --> <dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- https://mvnrepository.com/artifact/taglibs/standard --> <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>:相当于if判断
- text:判断条件
<c :forEach>:相当于for循环
- items:被遍历的容器
- var:遍历产生的临时变量
- varStatus:遍历状态对象
- begin:开始数
- end:结束数
- step:步长
注意:JSP和Servlet版本导致el功能默认关闭,加入<%@page isELIgnored=“false”%>标签手动开启el功能。
MVC模式和三层架构
MVC模式
MVC是一种分层开发的模式,其中
- M:Model,业务模型,处理业务
- V:View,视图,界面展示
- C:Controller,控制器,处理请求,调用模型和视图
三层架构
- 数据访问层(mapper/dao):对数据库的CRUD基本操作
- 业务逻辑层(service):对业务逻辑进行封装,组合数据访问层层中基本功能,形成复杂的业务逻辑功能
- 表现层(controller):接受请求,封装数据,调用业务逻辑层,响应数据
会话跟踪技术
- 会话:用户打开浏览器,访问web服务器的资源,会话建立,直到一方断开连接,会话结束。在一次会话中可以包含多次请求和响应
- 会话跟踪:一种维护浏览器状态的方法,浏览器需要多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据
- HTTP协议是无状态的,每一次浏览器向服务器请求时,服务器会将该请求视为新的请求,因此我们需要会话跟踪技术来实现会话内数据共享
- 实现方法:
- 客户端会话跟踪技术:Cookie
- 服务器会话跟踪技术:Session
Cookie基本使用
- Cookie:客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问
- Cookie:基本使用
发送Cookie
-
创建Cookie对象,设置数据
Cookie cookie= = new Cookie("key","value");
-
发送Cookie到客户端:使用response对象
response.addCookie(cookie);
获取Cookie
-
获取客户端携带的所有Cookie,使用request对象
Cookie[] cookie = request.getCookies();
-
遍历数组,获取每一个Cookie对象:for
-
使用Cookie对象方法获取数据
cookie.getName();
cookie.getValue();
Cookie原理
- Cookie的实现是基于HTTP协议的
- 响应头:set-cookie
- 请求头:cookie
Cookie使用细节
- Cookie存活时间
- 默认情况下,Cookie存储在浏览器内存中,当浏览器关闭,内存释放,则Cookie被销毁
- setMaxAge(int seconds):设置Cookie存储时间
- 正数:将Cookie在当前所在电脑的硬盘,持久化存储。到时见自动删除
- 负数:默认值,Cookie在当浏览器内存中,当浏览器关闭,则Cookie被销毁
- 零:删除对应Cookie
- Cookie存储中文
- Cookie不能直接存储中文
- 如果需要存储,则需要进行转码:URL编码
Session基本使用
-
服务端会话跟踪技术:将数据存储到服务端
-
JavaEE提供HttpSession接口,来实现一次对话的多次请求间数据共享功能
-
使用:
-
获取Session对象
HttpSession session=request.getSession();
-
Session对象功能
- void setAttribute(String name,Object o):存储数据到session中
- Object getAttribute(String name):根据key,获取值
- void removeAttribute(String name):根据key,删除该键对应的值
-
Session原理
- Session是基于Cookie实现的
Session使用细节
-
Session钝化、活化:
- 服务器重启后,Session中的数据是否还在?
- 钝化:在服务器关闭后,Tomcat会自动将Session数据写入硬盘的文件中
- 活化:再次启动服务器后,从文件中加载数据到Session中
-
Session销毁:
-
默认情况下,无操作,30分钟自动销毁
<session-config> <session-timeout>5</session-timeout> </session-config>
-
调用Session对象的invalidate()方法
-
总结:
- Cookie和Session都是来完成一次对话内多次请求间数据共享的
- 区别
- 存储位置:Cookie是将数据存储在客户端,Session是将数据存储在服务端
- 安全性:Cookie不安全,Session安全
- 数据大小:Cookie最大3kb,Session无大小限制
- 存储时间:Cookie可以长时间存储,Session默认30分钟
- 服务器性能:Cookie不占服务器资源,Session占用服务器资源