请求、响应

一、MVC三层架构

  • M:Model模型(service+dao+pojo)。

  • V:View视图(HTML页面+JSP页面)。

  • C:Controller控制器(Servlet)。

  1. javaBean:一种类的规格编写规范

    javaBean在MVC设计模型中是model,又称模型层,在一般的程序中,我们称它为数据层,就是用来设置数据的属性和一些行为,然后提供获取属性和设置属性的get/set方法。

    JavaBean是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。

    以entity,domain,vo,pojo命名的包,包中的类都满足javaBean的规范。

  2. Entity

    在entity包下面的实体类中所有的属性和数据库表中的字段,数据类型逐一对应。

    如数据库中字段是user_id,user_name;Java中也只有这两个属性(和数据库表中字段保持一致)。

  3. domain

    domain包下实体类中的属性不仅会包含数据库中的字段,还会包含其他自定义属性。

    如数据库中字段是user_id,user_name;Java中不仅有这两个属性,且还有其它属性。

  4. pojo(Plain Old Java Objects,普通 Java 对象)

    pojo包下面的实体类并没有严格定义。

  5. vo(view object)

vo包下面的实体类的属性与数据库并没有关系,而是服务器与页面交互的视图数据(后台和前端进行交互的数据类)。

二、请求转发和请求重定向

1.请求转发

方式:

 代码实例:

req.getRequestDispatcher("/Servlet2").forward(req,resp); 

特点:

  1. 请求转发是一次请求,地址栏地址不变,还是访问第一个Servlet的地址。

  2. 请求转发是一次请求(共享请求和响应对象),所以转发内的各个Servlet共享一个request对象。

  3. 请求转发是Tomcat服务器内部的行为,用户是看不到的。

  4. 可以使用req.setAttribute(key,value)和getAttribute(key)实现请求转发内的Servlet的数据的流转。

  1. 总结:请求转发可以实现在后端Servlet之间的相互调用,一个请求由一个Servlet处理,转变为了多个Servlet的协同处理。

注意:请求转发可能会造成表单的重复提交

① 提交表单后刷新页面会造成重复提交,因为每次刷新浏览器都会重复发送之前的请求到服务器。

刷新后发现表单数据还在,所以每次刷新都会将url携带的请求体提交到服务器。

解决:请求重定向

② 网络差,提交时多次点击提交按钮会造成表单重复提交,每点击一次就相当于发送一次请求。

解决:js设置点击提交按钮后 按钮不可用   或者   请求重定向

 

因为请求转发全程都是用的同一个请求对象、响应对象,会携带数据

所以对于增删改的业务的表单提交必须用重定向,否则可能会造成表单重复提交。

2. 请求重定向

方式:

 代码实例:

resp.sendRedirect(req.getContextPath() + "/MainServlet");

特点:

  1. 重定向是两次请求,地址栏信息改变,地址会变成第二次请求的地址。

  2. 重定向的地址是浏览器收到第一次请求响应回来的地址,自动跳转的,用户不参与。

  3. 重定向的两次请求,request对象是不同的。

3. 转发和重定向对比

请求转发:

  1. 请求转发是一次请求,是Tomcat服务器内部的行为,共享同一个request对象。浏览器只需要发一次请求即可将业务处理完毕。

  2. 一般浏览器发起的查询功能会使用请求转发来完成请求的处理及结果的响应。

  3. 浏览器发起的是增删改的请求,如果使用请求转发来处理的话,因为转发后的地址栏信息是不变的,容易造成用户刷新页面后表单重复提交。

重定向:

  1. 重定向是两次请求,地址栏信息会改变,不共享同一个请求和响应对象。

  2. 一般用户的增删改请求会使用重定向的方式来处理请求。目的是保护第一次请求,避免用户因刷新页面造成表单重复提交。

对比总结:

区别转发重定向
浏览器地址栏发生是否改变
请求与响应的次数 1次请求,1次响应 2次请求,2次响应
是否共享Request和Response对象
是否可以通过Request对象传递数据
速度 相对较快 相对较慢
行为类型 服务器内部行为 非服务器内部行为

不论是请求转发还是请求重定向,都会涉及到多个Servlet。其实,什么时候该用请求转发什么时候该用请求重定向也很容易判断。

如果你需要将A Servlet的处理结果通过请求对象带到B Servlet中去使用,那就使用请求转发。

如果A Servlet的处理结果不需要带到B Servlet中去使用,那就使用重定向。

三、Cookie对象

由于http协议为无状态的,浏览器发起请求(请求中一般是需要携带数据的),服务器接收到请求后调用相关的后端代码去处理该请求,处理完后会响应浏览器。 本次请求与响应结束后,相关的请求与响应数据就会销毁。

下次在想用之前请求中发送的数据就获取不到了,这时可以通过cookie解决

1. Cookie简介

  是一种客户端存储数据的技术。

  服务器决定哪些数据是以后的请求也会用到的(cookie由服务器创建)。

  服务器以响应的方式告诉浏览器将常用的这些数据存储起来,存储在浏览器端。

  浏览器以后每次发送请求的时候需要带上这些存储起来的数据。

2. 特点

  1. Cookie是浏览器端的数据存储技术。

  2. Cookie使用字符串存储数据。

  3. Cookie使用Key与Value结构存储数据。

  4. 不安全,不适合存储重要的数据到浏览器端。

  5. 单个Cookie存储数据大小限制在4097个字节(4kb左右)。

  6. Cookie存储的数据中不支持中文,Servlet4.0中支持。

  7. Cookie分为持久化Cooke与状态Cookie。

  8. Cookie对象保存在客户端浏览器内存或系统磁盘中。

  9. 浏览器在保存同一域名所返回Cookie的数量是有限的。不同浏览器支持的数量不同,Chrome浏览器为50个

  10. 浏览器每次请求时都会把与当前访问的域名相关的Cookie在请求中提交到服务端。

  11. 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 存活时间

Cookie是可以设置在浏览器的存活时间的。

使用setMaxAge()方法可以设置存活时间:

  • 正数:表示在指定的数后过期

  • 负数:表示浏览器一关,Cookie就会被删除(默认是-1)(浏览器中也能看到cookie的max-age为“会话”/“Session”,都是一样的效果)

  • 零:表示马上删除Cookie

cookie.setMaxAge(60);

4.2 path属性

Cookie的path属性可以有效的过滤哪些Cookie可以发送给服务器,哪些不发。

path属性是通过请求的地址来进行有效的过滤。

如果不设置path属性,那Cookie的有效路径是当前项目。

比如:

CookieA path=/工程路径

CookieB path=/工程路径/abc

请求地址如下:

http://ip:port/工程路径/a.html 则CookieA发送,CookieB不发送

http://ip:port/工程路径/abc/a.html 则CookieA发送,CookieB发送

设置方式:

//设置哪些资源可以使用Cookie(默认:/项目名,该项目所有资源都可以使用该Cookie)
cookie1.setPath("/"); //当前Tomcat服务器中所有项目都可以使用
cookie2.setPath("/项目名/login.html"); ///只有 项目名/login.html 可以使用
cookie3.setPath("/项目名/regist.html");

需要注意的是:你要想看到/工程路径/abc这个路径的Cookie,那你的地址栏中请求地址必须包含/工程路径/abc才行。

4.3 domain属性

代表cookie生效的域名。

域名一般是以www开头,以com结尾。

域名分为:顶级(一级)域名、二级域名。

比如: www.baidu.com是顶级域名、.baidu.com是二级域名

Cookie是不支持顶级域名的跨域,支持二级域名的跨域。

  比如:在www.baidu.com这个一级域名中存储的Cookie值,在www.jd.com这个一级域名中是拿不到的!但是在news.baidu.com这个二级域名中是可以拿到的。

  Cookie有domain属性,可以通过domain属性设置访问该Cookie的域名。如果设置为“www.itbz.com”,则只能是 "www.itbz.com" 可以访问。 如果设置为 ".itbz.com",则以 ".itbz.com" 结尾的域名都可以访问到该Cookie。

cookie.setDomain("test.com");

测试需要修改hosts文件。

四、HttpSession对象

是一种通过服务端存储数据解决Http无状态的一种技术。

1. 特点

  • Session将数据保存在服务器端。

  • HttpSession使用Key与Value结构存储数据。

  • HttpSession的Key是字符串类型,Value则是Object类型。

  • HttpSession存储数据大小无限制。

  • 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种 方式:

    ①Tomcat服务器的conf/web.xml文件中配置HttpSession的超时时间,这个文件是所有项目web.xml的父文件,不建议修改。

    ②可以修改项目的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用于 登录信息、错误信息、购物车等。

 

posted @   ygdgg  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示