Javaweb基础学习(4)

Javaweb基础学习(4)

  • 一、JSP学习
    • 1.1 JSP的简介概述
    • 1.2 JSP快速入门
    • 1.3 JSP原理
    • 1.4 JSP脚本
    • 1.5 JSP缺点
    • 1.6 EL表达式
    • 1.7 JSL标签
      • 1.7.1 JSL快速入门
    • 1.8 MVC 模式和三层架构
    • 1.9 三层架构
  • 三、会话跟踪技术
    • 3.1 会话跟踪技术介绍
    • 3.2 Cookie的基本使用
    • 3.3、Cookie原理
    • 3.4 Cookie的细节
    • 3.5、Session 基本使用
    • 3.6、Session 原理
    • 3.7、Session 使用细节
    • 3.8、Cookie和Session小结

一、JSP学习

1.1 JSP的简介概述

概念: Java Server Pages,Java服务端页面

  • 一种动态的网页技术,其中既可以定义HTML、JS、CSS等静态内容,还可以定义Java代码的动态内容

简单理解:

  1. JSP = HTML + Java
  2. JSP作用:简化开发,避免了在Servlet中直接输出HTML标签

1.2 JSP快速入门

步骤:

  1. 导入JSP坐标
<dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version><scope>provided</scope></dependency>
  1. 创建JSP文件
    在这里插入图片描述
  2. 书写Java + HTML
    在这里插入图片描述

1.3 JSP原理

  • 概念: Java Server Pages,Java服务端页面
  • JSP=HTML +Java,用于简化开发的
  • JSP本质上就是一个Servlet

在这里插入图片描述

1.4 JSP脚本

  • JSP脚本用于在JSP页面内定义Java代码

JSP脚本分类:

  1. <%...%>:内容会直接放到 jspService()方法之中
  2. <%=...%>:内容会放到out.print()中,作为out.print()的参数
  3. <%!...%>:内容会放到jspService()方法之外,被类直接包含

在这里插入图片描述

<%@ page import="com.huanglei.pojo.Brand" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ 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>

1.5 JSP缺点

  • 由于JSP页面内,既可以定义HTML标签,又可以定义Java代码,造成了以下问题:
  • 书写麻烦:特别是复杂的页面
  • 阅读麻烦
  • 复杂度高:运行需要依赖于各种环境,JRE,JSP容器,JavaEE…
  • 占内存和磁盘:JSP会自动生成.java和.class文件占磁盘,运行的是.class文件占内存
  • 调试困难:出错后,需要找到自动生成的.java文件进行调试
  • 不利于团队协作:前端人员不会Java,后端人员不精HTML

1.6 EL表达式

  • Expression Language表达式语言,用于简化JSP页面内的Java代码

  • 主要功能:获取数据

  • 语法:${expression}
    ${brands}:获取域中存储的key为brands的数据

JavaWeb中的四大域对象:

  1. page:当前页面有效
  2. request:当前请求有效
  3. session:当前会话有效
  4. application:当前应用有效

在这里插入图片描述

el表达式获取数据,会依次从这4个域中寻找,直到找到为止

jsp:

<%--Created by IntelliJ IDEA.User: LENOVODate: 2023/8/21Time: 10:32To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>${users};
</body>
</html>

Serverlet:

package com.huanglei.Serverlets;import com.huanglei.mapper.UserMapper;
import com.huanglei.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;@WebServlet("/dom1")
public class ServletDom1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取数据String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);List<User> user = mapper.select();//然后将数据传输req.setAttribute("users",user);req.getRequestDispatcher("/dom1.jsp").forward(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req,resp);}
}

1.7 JSL标签

  • JSP标准标签库(Jsp Standarded Tag Library),使用标签取代JSP页面上的Java代码
    在这里插入图片描述

1.7.1 JSL快速入门

  • 导入JSTL坐标
<dependency><groupId>jstl</groupId><artifactId>jstl<lartifactId><version>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

<%--Created by IntelliJ IDEA.User: LENOVODate: 2023/8/22Time: 16:20To change this template use File | Settings | File Templates.
--%>
<%@ 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 test="true">正确</c:if><c:if test="false">错误,无法显示</c:if></body>
</html>

<c:forEach>:相当于for循环
items:被遍历的容器
var:遍历产生的临时变量
varStatus:遍历状态对象
count:从1开始遍历的数字
status:从0开始遍历的数字
在这里插入图片描述

<%--Created by IntelliJ IDEA.User: LENOVODate: 2023/8/22Time: 16:38To change this template use File | Settings | File Templates.
--%>
<%@ 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>
<input type="button" value="新增"><br>
<hr>
<table border="1" cellspacing="0" width="800"><tr><th>序号</th><th>用户名字</th><th>用户密码</th><th>用户邮箱</th></tr><%--    lists表示传输过来的数据集合,list表示的是集合当中的每一个数据--%><c:forEach items="${lists}" var="list"><tr align="center"><td>${list.userId}</td><td>${list.userName}</td><td>${list.userPassword}</td><td>${list.userEmail}</td><td><a href="#">修改</a> <a href="#">删除</a></td></tr></c:forEach>
</table>
</body>
</html>

1.8 MVC 模式和三层架构

  • MVC是一种分层开发的模式,其中
    M:Model,业务模型,处理业务
    V: View,视图,界面展示
    C:Controller,控制器,处理请求,调用模型和视图

  • MVC好处
    1.职责单一,互不影响
    2.有利于分工协作
    3.有利于组件重用

在这里插入图片描述

1.9 三层架构

在这里插入图片描述

  • 数据访问层:对数据库的CRUD基本操作
  • 业务逻辑层:对业务逻辑进行封装,组合数据访问层层中基本功能,形成复杂的业务
  • 逻辑功能表现层:接收请求,封装数据,调用业务逻辑层,响应数据

三、会话跟踪技术

3.1 会话跟踪技术介绍

  • 会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应

  • 会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据

  • HTTP协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现会话内数据共享

  • 实现方式:
    1.客户端会话跟踪技术:Cookie
    2.服务端会话跟踪技术:Session

在这里插入图片描述

3.2 Cookie的基本使用

  • Cookie:客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问

Cookie基本使用

  1. 创建Cookie对象,设置数据
Cookie cookie = new Cookie("key" ,"value");
  1. 发送Cookie到客户端:使用response对象
response.addCookie(cookie);
  1. 获取Cookie
  • 获取客户端携带的所有Cookie,使用request对象
Cookie[] cookies = request.getCookies();
  • 遍历数组,获取每一个Cookie对象
for(cookies:cookie){
}
  • 使用Cookie对象方法获取数据
cookie.getName();
cookie.getValue();

发送数据的案列(Cookie):

package com.itheima.Servlet.cookie;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.CollationKey;@WebServlet("/aServlet")
public class AServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1. 创建CookieString value = "张三";value = URLEncoder.encode(value,"UTF-8");Cookie cookie = new Cookie("username", value);//2. 发送Cookie到客户端resp.addCookie(cookie);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req, resp);}
}

接收数据的案列(Cookie):

package com.itheima.Servlet.cookie;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/bServlet")
public class BServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1. 获取到CookieCookie[] cookies = req.getCookies();for (Cookie cookie : cookies) {String name = cookie.getName();if(name.equals("username")){String value = cookie.getValue();System.out.println(name + ": "+ value);break;}}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req, resp);}
}

3.3、Cookie原理

Cookie的实现是基于HTTP协议的

  • 响应头: set-cookie
  • 请求头: cookie
    在这里插入图片描述

3.4 Cookie的细节

  • Cookie的存活时间:
  1. 默认情况下,Cookie存储在浏览器内存中,当浏览器关闭,内存释放,则Cookie被销毁
  2. setMaxAge(int seconds):设置Cookie存活时间
    正数将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除
    负数默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁
    删除对应Cookie
  • Cookie存储中文
    1.Cookie不能直接存储中文
    2.如果需要存储,则需要进行转码:URL编码
//编码value = URLEncoder.encode(value,"UTF-8");
//解码value = URLDecoder.decode(value,"UTF-8");

代码演示:

package com.itheima.Servlet.session;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.net.URLDecoder;@WebServlet("/dom1")
public class sessionDom1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//发送数据到session//1.创建session对象HttpSession session = req.getSession();String value = "张三";//2.发送数据到sessionsession.setAttribute("username",value);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req, resp);}
}
package com.itheima.Servlet.session;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;@WebServlet("/dom2")
public class sessionDom2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//接收数据HttpSession session = req.getSession();Object username = session.getAttribute("username");System.out.println(username);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req, resp);}
}

3.5、Session 基本使用

  • 服务端会话跟踪技术:将数据保存到服务端
  • JavaEE提供HttpSession接口,来实现一次会话的多次请求间数据共享功能

使用:

  1. 获取Session对象
HttpSession session = request.getSession();
  1. Session对象功能:
    void setAttribute(String name, Object o):存储数据到session域中
    Object getAttribute(String name):根据key,获取值
    void removeAttribute(String name):根据key,删除该键值对

3.6、Session 原理

  • Session是基于Cookie实现的

在这里插入图片描述

3.7、Session 使用细节

  • Session钝化、活化:

服务器重启后,Session中的数据是否还在?
钝化:在服务器正常关闭后,Tomcat会自动将Session数据写入硬盘的文件中
活化:再次启动服务器后,从文件中加载数据到Session中

  • Seesion销毁:
    默认情况下,无操作,30分钟自动销毁
    配置在web-xml文件中
<session-config><session-timeout>30</session-timeout>
</session-config>
  • 调用Session对象的invalidate()方法
    在这里插入图片描述

3.8、Cookie和Session小结

Cookie和Session都是完成一次会话内多次请求间数据共享的
区别:

  • 存储位置:Cookie是将数据存储在客户端,Session将数据存储在服务端
  • 安全性:Cookie不安全,Session安全
  • 数据大小:Cookie最大3KB,Session无大小限制
  • 存储时间:Cookie可以长期存储,Session默认30分钟
  • 服务器性能:Cookie不占服务器资源,Session占用服务器资源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/111274.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python-图片之乐-ASCII 文本图形

ASCII&#xff1a;一个简单的字符编码方案 pillow模块&#xff1a;读取图像&#xff0c;访问底层数据 numpy模块&#xff1a;计算平均值 import sys, random, argparse import numpy as np import math from PIL import Image定义灰度等级和网格 定义两种灰度等级作为全局值…

Linux环境离线安装MySQL8.0.33

目录 一、准备 1、检查libaio.so.1 2、卸载删除原有的mariadb 3、删除my.cnf 4、下载mysql安装包 二、安装 1、上传mysql 2、建立mysql所需目录 3、建立配置文件my.cnf 4、创建mysql用户并授权 5、初始化数据库 6、启动MySQL数据库 7、常见启动报错处理 8、配置M…

VMware标准虚拟交换机和分布式交换机

一、虚拟交换机 初期的网络虚拟化&#xff0c;是非常狭义的概念&#xff0c;主要指的是因为计算资源虚拟化&#xff0c;每台物理宿主机上安装了虚拟化软件&#xff0c;同时会部署了虚拟交换机&#xff0c;负责物理机上面承载的VM&#xff08;虚拟机&#xff09;之间与对外的通…

用心维护好电脑,提高学习工作效率

文章目录 一、我的电脑1.1 如何查看自己的电脑硬件信息呢&#xff1f; 二、电脑标准保养步骤和建议2.1 保持清洁2.2 定期升级系统和软件2.3 安全防护2.4 清理磁盘空间2.5 备份重要数据2.6 优化启动项2.7 散热管理2.8 硬件维护2.9 电源管理2.10 注意下载和安装2.11 定期维护 三、…

数据结构:单向循环链表

单向循环链表和单向链表差不多&#xff0c;只需要记录头节点的位置把单向链表判断NULL的地方改为判断头节点即可 dxxhlb.h dxxhlb.cmain.c 结果

聚类分析 | MATLAB实现基于AHC聚类算法可视化

聚类分析 | MATLAB实现基于AHC聚类算法可视化 目录 聚类分析 | MATLAB实现基于AHC聚类算法可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 AHC聚类算法&#xff0c;聚类结果可视化&#xff0c;MATLAB程序。 Agglomerative Hierarchical Clustering&#xff08;自底…

ArrayList与顺序表

文章目录 一. 顺序表是什么二. ArrayList是什么三. ArrayList的构造方法四. ArrayList的常见方法4.1 add()4.2 size()4.3 remove()4.4 get()4.5 set()4.6 contains()4.7 lastIndexOf()和 indexOf(&#xff09;4.8 subList()4.9 clear() 以上就是ArrayList的常见方法&#xff01…

【科研论文配图绘制】task6直方图绘制

【科研论文配图绘制】task6直方图绘制 task6 主要掌握直方图的绘制技巧&#xff0c;了解直方图含义&#xff0c;清楚统计指标的添加方式 1.直方图 直方图是一种用于表示数据分布和离散情况的统计图形&#xff0c;它的外观和柱形图相近&#xff0c;但它所 表达的含义和柱形图…

串口联网通信数据监听视监控侦测协议规约破解方案

作为物联网数据采集解决方案专业提供商,数采物联网小编daq-iot 在这里做以下内容介绍,并诚挚的欢迎大家讨论和交流。 本方案主要用于监听和侦测 串口通信数据报文&#xff0c;主要用于协议报文分析 破解领域。 例如破解摄像头控制道闸开启的命令等。 监控和分析通信数据代表的含…

设计模式-职责链模式

文章目录 职责链模式模式概述主要角色适用场景实现步骤优点注意事项 定义职责链结构示例总结 职责链模式 职责链模式是一种行为设计模式&#xff0c;它可以将请求的发送者和请求的处理者解耦&#xff0c;并按照预定义的顺序处理请求。职责链模式常用于需要逐级审批或转交处理的…

网络编程——套接字和字节序

目录 一、BSD套接字接口1.1 套接字类型1.2 套接字的位置 二、字节序2.1 大小端2.2 大小端判断2.3 主机字节序和网络字节序2.4 字节序转换函数 一、BSD套接字接口 BSD套接字接口是BSD的进程间通信的方式&#xff0c;它不仅支持各种形式的网络应用而且它还是一种进程间通信的机制…

汽车类 ±0.25°C SPI 温度传感器,TMP126EDBVRQ1、TMP126EDCKRQ1、TMP127EDBVRQ1引脚配置图

一、概述 TMP126-Q1 是一款精度为 0.25C 的数字温度传感器 &#xff0c; 支持的环境温度范围为 -55C 至 175C 。TMP126-Q1 具 有 14 位 &#xff08; 有符号 &#xff09; 温度分辨率(0.03125C/LSB)&#xff0c;并且可在 1.62V 至 5.5V 的电源电压范围内工作。TMP126-Q1 具有转…

Linux-crontab使用问题解决

添加定时进程 终端输入&#xff1a; crontab -e选择文本编辑方式&#xff0c;写入要运行的脚本&#xff0c;以及时间要求。 注意&#xff0c;如果有多个运行指令分两种情况&#xff1a; 1.多个运行指令之间没有耦合关系&#xff0c;分别独立&#xff0c;则可以直接分为两个…

SpringDataRedis 使用

1. SpringDataRedis 特点2. 使用 SpringDataRedis 步骤3. 自定义 RedisTemplate 序列化4. SpringDataRedis 操作对象 1. SpringDataRedis 特点 提供了对不同 Redis 客户端的整合&#xff08;Lettuce 和 Jedis&#xff09;提供了 RedisTemplate 统一 API 来操作 Redis支持 Redi…

【附安装包】Vm虚拟机安装Linux系统教程

软件下载 软件&#xff1a;Linux版本&#xff1a;18.0.4语言&#xff1a;简体中文大小&#xff1a;1.82G安装环境&#xff1a;VMware硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff09;下载通道①丨百度网盘&#xff1a;1.Vm虚拟机15.5下载链接&#xff1a;https://pan…

Ansible学习笔记(一)

1.什么是Ansible 官方网站&#xff1a;https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html Ansible是一个配置管理和配置工具&#xff0c;类似于Chef&#xff0c;Puppet或Salt。这是一款很简单也很容易入门的部署工具&#xff0c;它使用SS…

【USRP】集成化仪器系列1 :信号源,基于labview实现

USRP 信号源 1、设备IP地址&#xff1a;默认为192.168.10.2&#xff0c;请勿 修改&#xff0c;运行阶段无法修改。 2、天线输出端口是TX1&#xff0c;请勿修改。 3、通道&#xff1a;0 对应RF A、1 对应 RF B&#xff0c;运行 阶段无法修改。 4、中心频率&#xff1a;当需要…

MySQL的共享锁和排他锁

锁定读 Locking Reads 有过编程语言并发学习经验的同学&#xff0c;应该都了解过读写锁的概念。读写锁主要是为了解决多读少写条件下&#xff0c;程序的并发性能问题。它的特点即是&#xff1a;如果一个线程持有了读锁&#xff0c;那么其他线程也是可以继续读取它锁定的数据&a…

CANOCO5.0实现冗余分析(RDA)最详细步骤

在地理及生态领域会常使用RDA分析&#xff0c;RDA的实现路径也有很多&#xff0c;今天介绍一下CANOCO软件的实现方法。 1.软件安装 时间调整到2010年 2.数据处理 得有不同的物种或者样点数值&#xff0c;再加上环境因子数据。 3.软件运行 4.结果解读 结果解读主要把握这几点…

Pytorch-以数字识别更好地入门深度学习

目录 一、数据介绍 二、下载数据 三、可视化数据 四、模型构建 五、模型训练 六、模型预测 一、数据介绍 MNIST数据集是深度学习入门的经典案例&#xff0c;因为它具有以下优点&#xff1a; 1. 数据量小&#xff0c;计算速度快。MNIST数据集包含60000个训练样本和1000…