请求、响应
一、MVC三层架构
-
-
V:View视图(HTML页面+JSP页面)。
-
-
javaBean在MVC设计模型中是model,又称模型层,在一般的程序中,我们称它为数据层,就是用来设置数据的属性和一些行为,然后提供获取属性和设置属性的get/set方法。
JavaBean是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。
以entity,domain,vo,pojo命名的包,包中的类都满足javaBean的规范。
-
Entity
在entity包下面的实体类中所有的属性和数据库表中的字段,数据类型逐一对应。
如数据库中字段是user_id,user_name;Java中也只有这两个属性(和数据库表中字段保持一致)。
-
domain
domain包下实体类中的属性不仅会包含数据库中的字段,还会包含其他自定义属性。
如数据库中字段是user_id,user_name;Java中不仅有这两个属性,且还有其它属性。
-
pojo(Plain Old Java Objects,普通 Java 对象)
pojo包下面的实体类并没有严格定义。
-
vo(view object)
二、请求转发和请求重定向
1.请求转发
方式:
代码实例:
req.getRequestDispatcher("/Servlet2").forward(req,resp);
特点:
-
-
请求转发是一次请求(共享请求和响应对象),所以转发内的各个Servlet共享一个request对象。
-
请求转发是Tomcat服务器内部的行为,用户是看不到的。
-
可以使用req.setAttribute(key,value)和getAttribute(key)实现请求转发内的Servlet的数据的流转。
刷新后发现表单数据还在,所以每次刷新都会将url携带的请求体提交到服务器。
解决:请求重定向
2. 请求重定向
方式:
代码实例:
resp.sendRedirect(req.getContextPath() + "/MainServlet");
特点:
-
-
重定向的地址是浏览器收到第一次请求响应回来的地址,自动跳转的,用户不参与。
-
3. 转发和重定向对比
-
请求转发是一次请求,是Tomcat服务器内部的行为,共享同一个request对象。浏览器只需要发一次请求即可将业务处理完毕。
-
一般浏览器发起的查询功能会使用请求转发来完成请求的处理及结果的响应。
-
浏览器发起的是增删改的请求,如果使用请求转发来处理的话,因为转发后的地址栏信息是不变的,容易造成用户刷新页面后表单重复提交。
重定向:
-
重定向是两次请求,地址栏信息会改变,不共享同一个请求和响应对象。
-
对比总结:
区别 | 转发 | 重定向 |
---|---|---|
浏览器地址栏发生是否改变 | 否 | 是 |
请求与响应的次数 | 1次请求,1次响应 | 2次请求,2次响应 |
是否共享Request和Response对象 | 是 | 否 |
是否可以通过Request对象传递数据 | 是 | 否 |
速度 | 相对较快 | 相对较慢 |
行为类型 | 服务器内部行为 |
如果你需要将A Servlet的处理结果通过请求对象带到B Servlet中去使用,那就使用请求转发。
三、Cookie对象
由于http协议为无状态的,浏览器发起请求(请求中一般是需要携带数据的),服务器接收到请求后调用相关的后端代码去处理该请求,处理完后会响应浏览器。 本次请求与响应结束后,相关的请求与响应数据就会销毁。
下次在想用之前请求中发送的数据就获取不到了,这时可以通过cookie解决
1. Cookie简介
服务器决定哪些数据是以后的请求也会用到的(cookie由服务器创建)。
服务器以响应的方式告诉浏览器将常用的这些数据存储起来,存储在浏览器端。
2. 特点
-
-
Cookie使用字符串存储数据。
-
Cookie使用Key与Value结构存储数据。
-
不安全,不适合存储重要的数据到浏览器端。
-
单个Cookie存储数据大小限制在4097个字节(4kb左右)。
-
Cookie存储的数据中不支持中文,Servlet4.0中支持。
-
Cookie分为持久化Cooke与状态Cookie。
-
Cookie对象保存在客户端浏览器内存或系统磁盘中。
-
浏览器在保存同一域名所返回Cookie的数量是有限的。不同浏览器支持的数量不同,Chrome浏览器为50个
-
浏览器每次请求时都会把与当前访问的域名相关的Cookie在请求中提交到服务端。
-
3. Cookie的使用
cookie的创建及响应
//创建Cookie,Cookie中保存的数据是键值对的方式 Cookie cookie = new Cookie("username", "root"); //将创建好的Cookie添加到响应中,这样浏览器就会将Cookie中的信息保存起来了 resp.addCookie(cookie);
获取cookie
Cookie[] cookies = req.getCookies(); if(cookies != null){ for (Cookie cookie : cookies) { String name = cookie.getName(); String value = cookie.getValue(); System.out.println(name + ":" + value); } }
4. Cookie的三个属性设置
4.1 存活时间
使用setMaxAge()方法可以设置存活时间:
-
正数:表示在指定的秒数后过期
-
负数:表示浏览器一关,Cookie就会被删除(默认是-1)(浏览器中也能看到cookie的max-age为“会话”/“Session”,都是一样的效果)
-
cookie.setMaxAge(60);
4.2 path属性
path属性是通过请求的地址来进行有效的过滤。
如果不设置path属性,那Cookie的有效路径是当前项目。
比如:
CookieA path=/工程路径
CookieB path=/工程路径/abc
请求地址如下:
http://ip:port/工程路径/a.html 则CookieA发送,CookieB不发送
http://ip:port/工程路径/abc/a.html
设置方式:
//设置哪些资源可以使用Cookie(默认:/项目名,该项目所有资源都可以使用该Cookie) cookie1.setPath("/"); //当前Tomcat服务器中所有项目都可以使用 cookie2.setPath("/项目名/login.html"); ///只有 项目名/login.html 可以使用 cookie3.setPath("/项目名/regist.html");
需要注意的是:你要想看到/工程路径/abc这个路径的Cookie,那你的地址栏中请求地址必须包含/工程路径/abc才行。
4.3 domain属性
代表cookie生效的域名。
Cookie是不支持顶级域名的跨域,支持二级域名的跨域。
cookie.setDomain("test.com");
测试需要修改hosts文件。
四、HttpSession对象
是一种通过服务端存储数据解决Http无状态的一种技术。
1. 特点
-
-
HttpSession使用Key与Value结构存储数据。
-
HttpSession的Key是字符串类型,Value则是Object类型。
-
HttpSession存储数据大小无限制。
-
2. 介绍
一个浏览器在服务器中只创建一个Session对象,创建完成后会将Session的Id(JSSESIONID
)作为Cookie保存在客户端(浏览器);
由于浏览器每次发送请求都会携带cookie,所以在下次发送请求到服务器时,服务器就能根据cookie即(JSESSIONID)找到对应的Session对象;
如果找不到Session对象,就会创建新的Session对象、把新的JSESSIONID发送给浏览器、浏览器以cookie保存JSESSIONID。
注意:
Session对象创建完成服务器就会自动创建存储JSESSIONID的Cookie,然后将JESSIONID存储在Cookie中响应回浏览器;
Cookie有效期为一次会话,Session对象在Tomcat服务器默认有效期为30分钟。
一个浏览器对应一个服务器中的Session对象,不同用户(浏览器)的Session对象之间是相互独立的。
3. 创建
HttpSession session = req.getSession();
该方法是根据请求中携带的cookie(JSESSIONID)检索对应的Session,找不到就新建一个session并把JSESSIONID响应回客户端,客户端以cookie形式保存。
注意:
1.请求的Cookie中携带了JSESSIONID,就根据JSESSIONID找对应的Session对象可能找到,也可能找不到
①找到就返回该Session对象
②找不到,新创建一个Session对象,并将JSESSIONID存储到Cookie响应回浏览器。
2.请求中的Cookie中没有携带JSESSIONID,就创建一个Session,并将JSESSIONID存储到Cookie响应回浏览器。
3.默认不会自动创建session,访问jsp时会自动创建session,因为jsp翻译成java文件后,可以看到这行代码
jsp默认配置是<%@ page session="true"%>,创建(第一次访问)jsp会自动创建session
但如果jsp配置了<%@ page session="false"%>就不会自动创建session了
4. 销毁
HttpSession销毁方式有两种:
1.存活达到超时的时间(默认30分钟)就销毁。 起始时间按照最后一次请求的时间,即有新的请求session的存活时间就会刷新。
配置存活时间的 3种 方式:
①
②可以修改项目的web.xml中的HttpSession的超时时间。该时间对整个web项目中的所有HttpSession对象有效。
③调用session.setMaxInactiveInterval(int)设置存活时间。
void setMaxInactiveInterval(int var1);
2.手动销毁:调用HttpSession对象的invalidate()方法销毁
void invalidate();
注意:如果浏览器的cookie被销毁,再次发起请求会导致服务器创建新的session对象,旧的session并不会被覆盖或者直接销毁。而是原来的session对象及其中保存的数据仍然存在,直到到达最大生存时间才会被销毁。
5. Session与Cookie
Session依赖于Cookie
区别:
1.存储位置不同:Cookie存储在客户端(浏览器),Session存储在服务器
2.安全性:Cookie不安全(能在浏览器中看到),Session安全。
3.内存大小:Cookie最大在4kb左右,且浏览器会限制一个域名下的cookie的数量
session没有容量及数量限制,但是一般不会存储业务数据,否则会导致占用服务器内存。
4.保存的内容:两者都是保存K-V键值对,Cookie保存的都是字符串,Session能保存对象。
5.用途:Cookie用于 记住我、最近浏览商品、网页皮肤等。 Session用于 登录信息、错误信息、购物车等。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)