【JavaWeb】JSP实现数据传递与保存

目录

  • JSP内置对象
    • request
      • request对象的常用方法
        • get与post区别
      • 问题
        • 解决表单提交时中文乱码的问题
    • response
      • response对象的常用方法
    • 思考
      • 请求的转发
        • 示例
    • 转发与重定向的区别
    • 会话
      • session对象
        • 常用方法
        • session与窗口的关系
        • 示例:使用session实现访问控制
      • 思考
      • 小结
      • 思考
      • JSP页面中的包含操作
        • 动态包含与静态包含的区别
    • application
      • application对象的常用方法
      • 示例:统计网站访问次数的实现
  • JSP四大作用域
    • 思考
    • Cookie
      • Cookie的作用
      • 安全性能
      • 在JSP中使用Cookie
      • Cookie类的常用方法
    • session与Cookie的关系
      • session的工作原理
      • cookie的工作原理
    • session与Cookie的区别

JSP内置对象

JSP内置对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明。JSP所支持的九大内置对象:

对象名类型说明
requestjavax.servlet.http.HttpServletRequest每当客户端请求JSP页面时,JSP引擎会制造一个新的request对象来代表这个请求。
responsejavax.servlet.http.HttpServletResponse当服务器创建request对象时会同时创建用于响应这个客户端的response对象
sessionjavax.servlet.http.HttpSessionsession对象用来跟踪在各个客户端请求间的会话
applicationjavax.servlet.ServletContext该对象代表web应用本身,整个web应用共享一个application对象
configjavax.servlet.ServletConfig这个对象允许开发者访问Servlet或者JSP引擎的初始化参数。
exceptionjava.lang.Throwable这个对象包装了从先前页面中抛出的异常信息
outjavax.servlet.jsp.JspWriterout对象用来在response对象中写入内容
pageContextjavax.servlet.jsp.PageContext页面上下文对象,这个对象存储了内置对象的引用。
pagejava.lang.Object当前对象this这个对象就是页面实例的引用。它可以被看做是整个JSP页面的代表

request

  • 主要用于处理客户端请求。
  • request对象中保存了用户的请求数据和浏览器的相关信息,通过调用相关方法就可以实现请求数据的读取。
    在这里插入图片描述

request对象的常用方法

方法名称说明
String getParameter(String name)根据表单组件名称获取提交数据
String[ ] getParameterValues(String name)获取表单组件对应多个值时的请求数据
void setCharacterEncoding(String charset)指定每个请求的编码
RequestDispatcher getRequestDispatcher(String path)返回一个RequestDispatcher对象,该对象的forward( )方法用于转发请求
<form name="form1" method="post"   action=“util/doreg.jsp">
     <div class="form-group">
        <label for="userName">用户名</label>
 <input id="userName" name="userName" required type="text"                class="form-control" placeholder="6-15位字母或数字" >
     </div>
     <!—省略其他表单元素-->
</form>
get与post区别
比较项getpost
参数出现在URL中
长度限制
安全性
URL可传播

问题

在这里插入图片描述
产生这种结果的原因是Tomcat中对于post方法提交的表单采用的默认编码为ISO-8859-1,而这种编码格式不支持中文字符。

解决表单提交时中文乱码的问题
  1. post请求出现乱码
    request.setCharacterEncoding(“utf-8”);
  2. get请求出现乱码
    治标的方法:new String(s.getBytes(“iso-8859-1”),“utf-8”);
    治本的方法:配置tomcat\conf\server.xml文件
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>

response

response对象用于响应客户请求并向客户端输出信息
在这里插入图片描述

response对象的常用方法

方法名称说明
void addCookie(Cookie cookie)给客户端添加一个Cookie对象,以保存客户端的信息
PrintWriter getWriter()返回一个输出字符流
void sendRedirect()将请求重新定位到一个不同的URL,即页面重定向
void setCharacterEncoding(String encoding)设置字符编码类型为encoding

思考

  • 页面实现跳转了,请求的信息是否也一起转移呢?
  • 如何才能实现页面跳转后,请求信息不丢失呢?
    • 使用转发取代重定向实现页面跳转

请求的转发

  • 转发的作用
    在服务器端,将请求发送给服务器上的其他资源,以共同完成一次请求的处理
  • 转发的实现
    RequestDispatcher对象的forward()方法
示例
<%
RequestDispatcher rd = request.getRequestDispatcher("welcome.jsp");
rd.forward(request, response);
%>

转发与重定向的区别

转发重定向
转发是在服务器端发挥作用,将同一请求在服务器资源之间进行传递重定向是在客户端发挥作用,通过发送一个新的请求实现页面转向
客户端浏览器的地址栏不会显示转向后的地址在地址栏中可以显示转向后的地址

在这里插入图片描述在这里插入图片描述

会话

  • 会话就是在一段时间内,一个客户端与Web服务器的一连串相关的交互过程。
  • 会话可以在多次请求中保存和使用数据。
  • 在JSP中使用session对象实现会话的存取。
    在这里插入图片描述

session对象

  • session机制是一种服务器端的机制,在服务器端保存信息。
  • 用于存储与用户相关的会话信息
常用方法
方法名称说明
void setAttribute(String key,Object value)以key/value的形式保存对象值
Object getAttribute(String key)通过key获取对象值
void invalidate()设置session对象失效
String getId()获取sessionid
void setMaxInactiveInterval(int interval)设定session的非活动时间
int getMaxInactiveInterval()获取session的有效非活动时间(以秒为单位)
void removeAttribute(String key)从session中删除指定名称(key)所对应的对象
session与窗口的关系
  • 每个session对象都与一个浏览器窗口对应 ,重新开启一个浏览器窗口,可以重新创建一个session对象(不同版本浏览器可能有所差别)
  • 通过超链接打开的新窗口,新窗口的session与其父窗口的session相同
  • 每个session都有一个唯一的sessionid
示例:使用session实现访问控制
  1. 在登录处理页面获取用户请求的登录信息进行验证
<%
      if ("admin".equals(userName) && “0".equals(userPwd)) {  
session.setAttribute("loginUser", user);
 // 设置session过期时间
session.setMaxInactiveInterval(10*60);
response.sendRedirect("../manage/index.jsp");
} 
else {
       response.sendRedirect(“../index.jsp");
      } 
%>
  1. 在管理员首页获取用户的登录会话信息进行验证
<%
User loginUser = (User) session.getAttribute(“loginUser");
if (loginUser == null) {
out.println(“<script>alert(‘未登录的用户不能进入管理页面');location.href='../index.jsp';</script>");
} %>

思考

  • session的数据是在服务器端的,服务器保存的会话数据量会越来越大,若没有清理机制,会导致性能问题或服务器崩溃。
  • 如何清理服务器端的会话数据 ??

会话的清除和过期有两种形式。

  • 程序主动清除session数据
    1. 设置会话失效:session.invalidate();
    2. 只移除会话的一个属性:session. removeAttribute(String name);
  • 服务器主动清除长时间没有再次发出请求的session
    1. 通过setMaxInactiveInterval(int interval )方法,单位是秒

      <%
      session.setAttribute("loginUser",user); 
      session.setMaxInactiveInterval(600); 
      response.sendRedirect("admin.jsp"); 
      %>
      
    2. 修改tomcat服务器的web.xml,单位是分钟

      <session-config>
             <session-timeout>30</session-timeout>
      </session-config>
      

小结

  • 用浏览器访问服务器——产生会话
  • 通过浏览器在网站登录——在会话中保存数据
  • 登录成功后用个人身份进行访问——会话有效期内
  • 关闭了浏览器——结束会话
  • 服务器主动结束会话——会话到期
  • 使会话失效、删除属性——及时释放会话资源
  • 程序主动结束会话、会话到期——会话中的数据丢失

思考

通过之前的编码,我们实现了后果管理首页的权限,只有登录的管理员才可以进入后台首页,直接输入后台管理首页是无法进入的。实际上,后台的其它管理页面中同样需要加入登录验证,那就需要把以上代码编写多遍,有没有办法避免冗余代码的出现?

解决方案:JSP页面的包含操作

JSP页面中的包含操作

在JSP中实现页面包含的方式有两种:

  1. 使用<%@include%>指令实现静态包含
<%@include   file=“URL”%>
  1. 使用jsp:include标签实现动态包含
<jsp:include  page=“URL”>
动态包含与静态包含的区别
静态包含动态包含
<%@include%>jsp:include
先将页面包含,后执行页面代码,即将一个页面的代码复制到另一个页面中。先执行页面代码,后将页面包含,即将一个页面的运行结果包含到另一个页面中。
被包含的页面内容发生变化时,包含页面将会被重新编译。被包含页面内容发生变化时,包含页面不会重新编译。

application

  • application对象代表web应用本身,整个web应用共享一个application对象,该对象主要用于在多个JSP页面或者Servlet之间共享变量。
  • application对象开始于服务器的启动,终止于服务器的关闭。
  • application对象实现了用户间的数据共享,可以存放全局变量。

application对象的常用方法

方法名称说 明
void setAttribute(String key,Object value)以key/value的形式保存对象值
Object getAttribute(String key)通过key获取对象值
String getRealPath(String path)返回相对路径的真实路径

示例:统计网站访问次数的实现

 <%
	Integer count = (Integer) application.getAttribute("count");
	if (count != null) {
		count = 1 + count;
	} else {
		count = 1;	 	
	}
	application.setAttribute("count", count);
%>
<%
	Integer i = (Integer) application.getAttribute("count");
	out.println("您好,您是第 " + i + " 位访问本网站的用户");
%>

JSP四大作用域

名称对应的内置对象说 明
page作用域pageContext 对象在一个页面范围内有效,通过pageContext对象访问
request作用域request对象在一个请求范围内有效
session作用域session对象在一次会话范围内容有效
application作用域application对象在一个应用服务器范围内有效

在这里插入图片描述

思考

京东购物车会自动记录已经放入购物车的物品 ??
解决方案:使用Cookie保存客户端的信息

Cookie

  • 浏览器与WEB服务器之间是使用HTTP协议进行通信的,当某个用户发出页面请求时,WEB服务器进行响应后就关闭与该用户的连接。当一个请求发送到WEB服务器时,无论其是否是第一次来访,服务器都会把它当作第一次来对待,这样的不好之处可想而知。
  • 为了弥补这个缺陷,Netscape开发出了Cookie这个有效的工具来保存某个用户的识别信息,因此人们昵称为“小甜饼”。
  • Cookie是一种WEB服务器通过浏览器在访问者的硬盘上存储信息的手段:Netscape Navigator使用一个名为cookies.txt本地文件保存从所有站点接收的Cookie信息;当用户再次访问某个站点时,服务端将要求浏览器查找并返回先前发送的Cookie信息,来识别这个用户。
  • Cookie是Web服务器保存在客户端的一系列文本信息

Cookie的作用

  • 对特定对象的追踪(Cookie能告诉在线广告商广告被点击的次数,从而可以更精确的投放广告)
  • 实现各种个性化服务(Cookie能帮助站点统计用户个人资料以实现各种各样的个性化服务)
  • 简化登录(Cookie有效期限未到时,Cookie能使用户在不键入密码和用户名的情况下进入曾经浏览过的一些站点)

安全性能

  • 容易泄露信息

在JSP中使用Cookie

//创建Cookie对象
Cookie newCookie = new Cookie(String key, String value);
//由服务器端向客户端写入Cookie对象
response.addCookie(newCookie);
//读取客户端的Cookie对象
Cookie[] cookies = request.getCookies();

Cookie类的常用方法

方法名称说 明
void setMaxAge(int expiry)设置cookie的有效期,以秒为单位
void setValue(String value)在cookie创建后,对cookie进行赋值
String getName()获取cookie的名称
String getValue()获取cookie的值
int getMaxAge()获取cookie的有效时间,以秒为单位

session与Cookie的关系

cookie和session都是用来跟踪浏览器用户身份的会话方式。

session的工作原理

  1. 浏览器端第一次发送请求到服务器端,服务器端创建一个Session,同时会创建一个特殊的Cookie(name为JSESSIONID的固定值,value为session对象的ID),然后将该Cookie发送至浏览器端
  2. 浏览器端发送第N(N>1)次请求到服务器端,浏览器端访问服务器端时就会携带该name为JSESSIONID的Cookie对象
  3. 服务器端根据name为JSESSIONID的Cookie的value(sessionId),去查询Session对象,从而区分不同用户。
  • name为JSESSIONID的Cookie不存在(关闭或更换浏览器),返回1中重新去创建Session与特殊的Cookie
  • name为JSESSIONID的Cookie存在,根据value中的SessionId去寻找session对象
  • value为SessionId不存在**(Session对象默认存活30分钟)**,返回1中重新去创建Session与特殊的Cookie
  • value为SessionId存在,返回session对象
    在这里插入图片描述在这里插入图片描述

cookie的工作原理

  1. 浏览器端第一次发送请求到服务器端
  2. 服务器端创建Cookie,该Cookie中包含用户的信息,然后将该Cookie发送到浏览器端
  3. 浏览器端再次访问服务器端时会携带服务器端创建的Cookie
  4. 服务器端通过Cookie中携带的数据区分不同的用户
    在这里插入图片描述

session与Cookie的区别

sessioncookie
在服务器端保存用户信息在客户端保存用户信息
session中保存的是Object类型cookie保存的是 String类型
随会话的结束而将其存储的数据销毁cookie可以长期保存在客户端
保存重要的信息保存不重要的用户信息

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI大模型日报#0409:Llama 3下周发布、特斯联20亿融资、Karpathy新项目

导读&#xff1a; 欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。标题: 120亿Stable LM 2上线即开源&#xff01;2万亿token训练&#xff0c;碾压Llama 2 70B 摘要: Stable LM 2 12B参数版本发布&#x…

第一次在Vue里使用Swiper插件轮播先看这里,报错!!!(不同swiper在页面引入时方式不同,步步扫雷ing)

现在用新插件前有了个概念&#xff0c;一定要看它官方文档&#xff0c;因为不你项目版本与你想用的插件版本间是有规定的&#xff0c;不应该直接看别人已经实现就跟着哐哐下载然后不停报错。。。 比如Swiper版本问题的大小写问题&#xff1a; 3.x 版本的 ---- 引入模块时使用小…

爬虫 selenium

爬虫 selenium 【一】介绍 【1】说明 Selenium是一款广泛应用于Web应用程序测试的自动化测试框架 它可以模拟用户再浏览器上的行为对Web应用进行自动化测试 主要作用&#xff1a; 浏览器控制&#xff1a;启动、切换、关闭不同浏览器元素定位于操作&#xff1a;通过CSS选择器…

C++笔记(函数重载)

目录 引入&#xff1a; 定义&#xff1a; 易错案例&#xff1a; 引入&#xff1a; 对于实现相似功能的函数&#xff0c;在命名时&#xff0c;我们常会出现命名重复的问题。对于C语言&#xff0c;编译器遇到这种命名重复的情况&#xff0c;会进行报错。而我们的C为了更方便程…

mineadmin 设置时区

由于不同环境下&#xff0c;会造成时区不一致问题 在/bin/hyperf.php 文件里&#xff0c;设置 date_default_timezone_set(Asia/Shanghai);

【AIGC】训练数据入库(Milvus)

之前的文章有写如何获取数据、如何补充数据&#xff0c;也有说如何对数据进行清洗、如何使用结构化数据进行训练。但好像没有说如何将训练数据“入库”。这里说的入库不是指 MySQL 数据库&#xff0c;而是指向量检索库 Milvus。 众所周知&#xff0c;人工智能多用向量数据进行…

Kubernetes(k8s)监控与报警(qq邮箱+钉钉):Prometheus + Grafana + Alertmanager(超详细)

Kubernetes&#xff08;k8s&#xff09;监控与报警&#xff08;qq邮箱钉钉&#xff09;&#xff1a;Prometheus Grafana Alertmanager&#xff08;超详细&#xff09; 1、部署环境2、基本概念简介2.1、Prometheus简介2.2、Grafana简介2.3、Alertmanager简介2.4、Prometheus …

【leetcode】动态规划::前缀和(二)

标题&#xff1a;【leetcode】前缀和&#xff08;二&#xff09; 水墨不写bug 正文开始&#xff1a; &#xff08;一&#xff09; 和为K的子数组 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续…

C#开发 之 解决win11缩放导致的字体模糊问题

现在我们的笔记本电脑分辨率很高&#xff0c;基本上能达到1920*1080以上&#xff0c;目前普遍使用的显示器都已经达到了2K到4K的级别。 但是因为我们的笔记本的屏幕小&#xff0c;在非常高的分辨率下&#xff0c;一切看着都很小&#xff0c;尤其是文字&#xff0c;根本看不清&…

【Linux基础IO】

【Linux基础IO】 C文件接口回顾test.c 写文件test.c读文件> 和 >> 理解文件stdin & stdout & stderr标准输入&#xff08;stdin&#xff09;标准输出&#xff08;stdout&#xff09;标准错误输出&#xff08;stderr&#xff09; 系统文件I/O接口介绍openpathn…

什么是redis? 如何在SpringBoot中集成和操作redis?

喜欢就点击上方关注我们吧&#xff01; 本篇将带你快速了解什么是redis&#xff0c;以及学会如何在SpringBoot工程下集成和操作redis数据库。 一、概述 1、定义 Redis是一个基于内存的key-value 结构数据库。 1&#xff09;特点&#xff1a; 1、基于内存存储&#xff0c;读写性…

docker pull镜像的时候指定arm平台

指定arm平台 x86平台下载arm平台的镜像包 以mysql镜像为例 docker pull --platform linux/arm64 mysqldocker images查看镜像信息 要查看Docker镜像的信息&#xff0c;可以使用docker inspect命令。这个命令会返回镜像的详细信息&#xff0c;包括其元数据和配置。 docker i…

Canvas拖动图片效果

效果预览 代码 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>mouse event</title></head><body><div><canvasid"cs"width"800"height"400"style"bord…

doss攻击为什么是无解的?

这个让Google、亚马逊等实力巨头公司也无法避免的攻击。可以这么说&#xff0c;是目前最强大、最难防御的攻击之一&#xff0c;属于世界级难题&#xff0c;并且没有解决办法。 Doss攻击的原理不复杂&#xff0c;就是利用大量肉鸡仿照真实用户行为&#xff0c;使目标服务器资源…

CSS导读 (复合选择器 下)

&#xff08;大家好&#xff0c;今天我们将继续来学习CSS的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 2.5 伪类选择器 2.6 链接伪类选择器 2.6.1 链接伪类注意事项 2.6.2 链接伪类选择器实际开发中的写法 2.7 …

每日一题 第八十九期 洛谷 [NOIP2017 提高组] 奶酪

[NOIP2017 提高组] 奶酪 题目背景 NOIP2017 提高组 D2T1 题目描述 现有一块大奶酪&#xff0c;它的高度为 h h h&#xff0c;它的长度和宽度我们可以认为是无限大的&#xff0c;奶酪中间有许多半径相同的球形空洞。我们可以在这块奶酪中建立空间坐标系&#xff0c;在坐标系…

Redis-缓存击穿-逻辑过期

Redis-缓存击穿-逻辑过期实现 缓存击穿&#xff1a;也称热点key问题&#xff0c;大量访问一个key&#xff0c;而这个key恰巧到期了&#xff0c;导致大量的请求访问数据库。增大数据库的负担。为了解决这个问题可以采用互斥锁或逻辑过期的方式解决。本章采用逻辑过期的方式解决…

Golang笔记(下)

Golang学习笔记&#xff08;下&#xff09; 前篇&#xff1a;Golang学习笔记(上) 十四、错误处理 14.1使用error类型 func New(text string) error例子&#xff1a; package mainimport ("errors" // 导入errors包"fmt" )func main() {var number, divi…

【数据结构】树与二叉树遍历算法的应用(求叶子节点个数、求树高、复制二叉树、创建二叉树、二叉树存放表达式、交换二叉树每个结点的左右孩子)

目录 求叶子节点个数、求树高、复制二叉树、创建二叉树、二叉树存放表达式、交换二叉树每个结点的左右孩子应用一&#xff1a;统计二叉树中叶子结点个数的算法写法一&#xff1a;使用静态变量写法二&#xff1a;传入 count 作为参数写法三&#xff1a;不使用额外变量 应用二&am…

【Linux】socket编程2

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 目录 &#x1f449;&#x1f3fb;客户端代码Makefile(生成目标文件)UdpClient.cc(客户端代码)服务端代码部分优化1&#xff08;接受客户端时显示客…