HTTP以及Servlet的学习

news2024/11/24 14:15:08

HTTP和Servlet

联系:

  1. HTTP是一个通信协议,而Servlet是服务器端程序,用于处理HTTP请求。
  2. Servlet通常用于处理HTTP请求,在服务器上生成动态内容,并生成HTTP响应。HTTP协议就是Servlet处理的基础。

区别:

  1. HTTP是一种协议,Servlet是一种编程模型。HTTP定义了客户端和服务器之间的通信规则,而Servlet是一种特定的编程模型,用于处理HTTP请求和生成HTTP响应。
  2. HTTP是跨平台的,而Servlet是Java语言特定的。HTTP协议可以在任何支持该协议的平台上使用,而Servlet是使用Java语言编写的,需要在Java平台上运行。
  3. HTTP更关注网络通信方面的内容,如请求方法、状态码、头部信息等。而Servlet更关注服务器端的业务逻辑,如处理请求参数、生成动态内容等。

HTTP

HTTP请求

 Get请求(没有请求体)

Post请求

格式:

请求行

请求头1

请求头2

……

请求空行

请求体

请求行以一个方法符号开头,空格分开,后面跟着请求的UPI和协议的版本

HTTP响应

在接收和解释请求信息后,服务器返回一个HTTP响应信息,HTTP响应由三个部分组成:状态行,消息报头,响应正文

请求头

Referer:

  • 该请求头指明请求从哪里来

响应头

Location:

  • Location响应报头域用于重定向接受者到一个新的位置
  • Location响应报头域,常用于更换域名的时候

Refresh:

  • 自动跳转(单位是秒),可以在页面透过meta标签实现,也可以在后台实现

Servlet

Servlet的实现

//@WebServlet("/ser01")
//@WebServlet(name="Servlet",value = "/ser01")
//@WebServlet(name="Servlet",value = {"/ser01","ser001"})
//@WebServlet(name="Servlet",urlPatterns = "/ser01")
@WebServlet(name="Servlet",urlPatterns = {"/ser01","/ser001"})
public class Servlet01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //super.service(req, resp);
        //打印内容
        System.out.println("Hello");
        resp.getWriter().write("Hello Servlet");
    }
}
@WebServlet("/ser02")
public class Servlet02 extends GenericServlet {

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("继承GenericServlet类");
    }
}
@WebServlet("/ser05")
public class Servlet05 extends HttpServlet {
    /**
     *就绪/服务方法(处理请求数据)
     * 系统方法,服务器自动调用
     * 当请求到达Servlet时,就会调用该方法
     * 方法可以被调用多次
     * @param req
     * @param resp
     */
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //super.service(req, resp);
        //打印内容
        System.out.println("Hello");
        resp.getWriter().write("Hello Servlet");
    }
    /**
     * 销毁方法
     * 系统方法,服务器自动调用
     * 当服务器关闭或应用程序停止时,调用该方法
     * 只调用一次
     */
    @Override
    public void destroy() {
        System.out.println("销毁");
        super.destroy();
    }
    /**
     * 初始化方法
     * 系统方法,服务器自动调用
     * 当请求到达Servlet容器时,Servlet同期会判断Servlet对象是否存在,如果不存在则创建并初始化
     * 方法只会调用一次
     * @throws ServletException
     */
    @Override
    public void init() throws ServletException {
        System.out.println("初始化");
        super.init();
    }
}

接收请求

//获取客户端请求的完整URL(从http开始,到?前面结束
String url=request.getRequestURL().toString();
System.out.println("获取客户端请求的完整URL:"+url);
//获取客户端的部分URL(从站点名开始,到?前面结束
String uri=request.getRequestURI();
System.out.println("获取客户端的部分URL:"+uri);
//获取请求行中的参数部分
String queryString=request.getQueryString();
System.out.println("获取请求行中的参数部分:"+queryString);
//获取客户端的请求方式
String method=request.getMethod();
System.out.println("获取客户端的请求方式:"+method);
//获取HTTP版本号
String protocol=request.getProtocol();
System.out.println("获取HTTP版本号"+protocol);
//获取项目站点名
String webapp=request.getContextPath();//上下午路径
System.out.println("获取项目的站点名:"+webapp);

获取请求参数

        /* 获取请求的参数 */
        //获取指定名称的参数值
        String uname=request.getParameter("uname");
        //获取指定名称的参数的所有参数
        String upwd=request.getParameter("upwd");
        //获取指定名称的参数的所哟参数值,返回字符串数组(用于复选框传值
        String[] hobbys=request.getParameterValues("hobby");
        if(hobbys!=null&hobbys.length>0){
            for(String hobby:hobbys){
                System.out.println("爱好:"+hobby);
            }
        }

请求乱码的问题

req.setCharacterEncoding("UTF-8");

请求转发

特点:

  • 地址不会发生改变
  • 参数共享
  • 只能在项目内跳转
  • 服务端行为
  • request作用域有效,session作用域有效

当客户端请求到达后,服务器进行转发,此时会将请求对象进行保存,地址栏中的URL地址不会改变,得到响应后,服务器端再讲响应发送给客户端,从始至终只有一个请求发出

通过该对象可以在一个请求中传递数据,作用范围:在一次请求中有效,即服务器跳转有效

        //设置域对象内容
        req.setAttribute(String name,Object value);
        //获取域对象内容
        req.getAttribute(String name)
        //删除域对象内容
        req.removeAttribute(String name);

响应数据

字节流和字符类不能同时使用

//字符流        
        PrintWriter writer=resp.getWriter();
        writer.write("Hello");
//字节流    
        ServletOutputStream out=resp.getOutputStream();
        out.write("Hi".getBytes());

字符流:要同时设置客户端和服务端的字符类型都支持中文,才不会乱码

        resp.setCharacterEncoding("UTF-8");
        resp.setHeader("content-type","text/html;charset=UTF-8");

字节流:指定客户端和服务器使用的方式一致

        resp.setHeader("content-type","text/html;charset=UTF-8");

注意:设置要在打印之前执行

重定向

服务端指导,客户端的行为。

特点:

  • 地址会发生改变
  • 参数不会共享
  • 可以跳转到http://
  • 客户端行为
  • request作用域无效,session作用域有效

Cookie对象

通过服务器的出现将一些只需保存在客户端,在客户端处理的数据,不需要通过网络传输。

//创建Cookie对象
Cookie cookie=new Cookie("name","admin");
//发送Cookie对象
resp.addCookie(cookie);

Cookie获取

        //获取Cookie数据
        Cookie[] cookies = req.getCookies();
        //判断数组是否为空
        if (cookies != null && cookies.length > 0) {
            for (Cookie c : cookies) {
                System.out.println(cookie.getName());
                System.out.println(cookie.getValue());
            }
        }

Cookie设置到期时间

  • 负整数
    • 默认值是-1,表示不存储
  • 正整数
    • 存活的秒数
    • 表示不存储

Cookie注意点

  • 如果服务器发送重复的Cookie,会覆盖原有的Cookie
  • 存储是有上限的
  • 不能存中文
  • 信息只是保存在本机上,换电脑这些信息无效,而且不能跨浏览器

如果一定要存中文,要用URLEncoder编码解码

name=URLEncoder.encode(name)

URLDecode.decode(name)

HttpSession对象

session对象的销毁

  • 默认:存活时间是30min,有操作会重新计时。
  • 手动设置:可以在Tomcat中的web.xml文件中进行修改
  • 立即销毁:通过session.invalidate()方法
  • 关闭浏览器:默认只在浏览器中存活,关闭立即失效
  • 关闭服务器:session销毁

ServletContext对象

//获取ServletContext对象

ServletContext servletContext=request.getServletContext();

//设置域对象

servletContext.setAttribute("name","zhang");

//获取域对象

String name=(String)servletContext.getAttribute("name");

//移除域对象

servletContext.removeAttribute("name");

Servlet的三大域对象

  • request域对象
    • 在一次请求中有效,请求转发有效,重定向无效
  • session域对象
    • 在一次会话中有效,请求转发和重定向都有效,session销毁后无效
  • ServletContext域对象
    • 在整个应用程序中有效,关闭后失效

文件上传和下载

前台页面:

  • 要设置form表单的enctype为:“multipart/form-data”
  • 请求方式为POST
  • 设置文件提交的地址
  • 准备表单元素
  • 设置表单元素的name属性(否则后台无法接收)

后台实现:

  • 使用@MultipartConfig注解

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL】如何查询MySQL执行过的所有SQL语句

文章目录 1 MySQL 的通常查询日志实验2 参考资料 1 MySQL 的通常查询日志实验 通过 MySQL 的通用查询日志可以找到你指定的每一条 sql 语句。很明显会有严重的性能损耗所以也只会在开发测试时才会使用。 前言:关于本实验与慢日志实验几乎一模一样,故本文…

05-算法部分 (数据结构和算法)

一 排序算法 1.1 冒泡法排序 冒泡排序(Bubble Sort)是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。 首先从数组的第一个元素开始到数组最后一个元素为止&#x…

串行FLASH文件系统FatFs-文件系统介绍

目录 串行FLASH文件系统FatFs-文件系统介绍 文件系统介绍 使用SPI FLASH直接存储数据缺点 Windows上的文件系统 磁盘的物理结构 磁盘分区表 文件系统的结构与特性 文件系统的空间示意图 FATFS文件系统 FATFS文件系统简介 1 . 特征 2. 层级结构 FatFs的目录结构 FatF…

文件操作--文件的随机读写、标准输入输出重定向

目录 一、文件的随机读写 二、便准输入输出重定向 一、文件的随机读写 前面的例程执行的都是顺序文件处理(Sequential File Processing)。在顺序文件处理过程中,数据项是一个接着一个进行读取或者写入的。例如,如果想读取文件中…

HarmonyOS学习路之开发篇—流转(多端协同 一)

多端协同开发 场景介绍 开发者在应用FA中通过调用流转任务管理服务、分布式任务调度的接口,实现多端协同。 主要流程如下: 设备A上的应用FA向流转任务管理服务注册一个流转回调。 Alt1-系统推荐流转:系统感知周边有可用设备后,主…

Leangoo领歌敏捷管理工具标签升级,企业级标签组上线

在Leangoo领歌敏捷工具中,标签通常用作对任务的分类,或任务的优先级区分等。这次我们发布了大家期待已久的“企业级标签组”功能,标签可以统一管理啦~ 之前,Leangoo领歌的标签功能只限于单个看板使用,需要…

视频孪生赋能智慧交通综合管理系统的数智化升级

交通是重大民生工程,涉及公共安全和人民群众切身利益,必须树牢安全发展理念,强化企业主体责任落实。根据国家标准《城市轨道交通公共安全防范系统工程技术规范》中要求: 未来的智慧交通系统要建立在安防集成平台的应用上,对各类重要部位进行视频图像与三…

CUDA编程实战(使用Sobel算子对rgb图片进行边缘检测)

写在前面,本篇文章为一个CUDA实例,使用GPU并行计算对程序进行加速。如果不需要看环境如何配置,可以直接到看代码部分:点击直达 关于如何更改代码和理解代码写在这个地方:点击直达 运行环境: 系统:windows10专业版 显卡:NVIDIA …

sharding-jdbc分库连接数优化 | 京东物流技术团队

一.背景: 配运平台组的快递订单履约中心(cp-eofc)及物流平台履约中心(jdl-uep-ofc)系统都使用了ShardingSphere生态的sharding-jdbc作为分库分表中间件, 整个集群采用只分库不分表的设计,共16个MYSQL实例,每个实例有32个库,集群共512个库. 当每增加一台客户端主机,一个MYSQl实…

AE/PR/OFX插件-Mocha Pro 2023 v10.0.2 Win 专业平面/三维跟踪摄像机反求插件

插件简介 Mocha Pro是用于VFX视觉特效和后期制作强大的平面跟踪工具,这里提供的是AE和PR的插件版。具有GPU加速的跟踪和对象去除功能,具有边缘捕捉功能的高级遮罩,稳定功能,镜头校准,3D摄像头求解器,立体3…

Win32 汇编在对话框上画线

参阅前文&#xff0c;首先要有一个基本的对话框&#xff1b; 把对话框资源文件里的控件定义都删除&#xff0c;得到的一个rc文件&#xff0c;test.rc&#xff1b; #include <resource.h>#define DLG_MAIN 1DLG_MAIN DIALOG 193, 180, 130, 150 STYLE DS_MODALFRAME | …

在win32 asm中了解intel浮点运算

看老罗的书中有如下一段&#xff0c; ...... fild dwRadius fild _dwDegree fldpi fmul ;角度*Pi fild dwPara180 fdivp st(1),st ;角度*Pi/180 fsin ;Sin(角度*Pi/180) fild …

038、TiDB特性_聚簇索引和非聚簇索引

聚簇表 表中的行数据才能出顺序与主键存储的顺序一致表的主键即为KV映射中Key的一部分通过主键访问行记录时&#xff0c;可以直接获取行记录 create table t( a biging primary key clustered ,b varchar(255)); # a列为主键列&#xff0c;聚簇列聚簇表&#xff08;且ID为主键…

TortoiseGit 入门指南05:推送和拉取

本节所讲内容均涉及到 远端版本库。 版本库 的概念在《TortoiseGit 入门指南02&#xff1a;创建和克隆仓库》中提到过&#xff0c;它是工作目录下面的一个名为 .git 的隐藏目录&#xff0c;我们每一次提交、每一个分支都会保存在版本库中。这个版本库就在我们电脑上的某个文件…

windows开机启动nginx(服务方式启动)

提示&#xff1a;本文章介绍如何借助Windows Service Wrapper小工具&#xff0c;将Nginx转换为Windows服务&#xff0c;在服务中心配置自启动&#xff0c;从而在开机时windows自行启动Nginx服务 Nginx是什么 官方链接&#xff1a;nginx下载 Nginx 是一个高性能的HTTP和反向代理…

Kotlin基础(五):类和接口

前言 本文主要讲解类和接口&#xff0c;主要包括类的声明、构造器、类成员、修饰符、类的继承、接口、抽象类。 Kotlin文章列表 Kotlin文章列表: 点击此处跳转查看 目录 1.1 类的声明 在 Kotlin 中&#xff0c;类的声明使用关键字 class。下面是一个简单的类声明的示例&…

感受C++模版的所带来的魅力

一、泛型编程思想 首先我们来看一下下面这三个函数&#xff0c;如果学习过了 C函数重载 和 C引用 的话&#xff0c;就可以知道下面这三个函数是可以共存的&#xff0c;而且传值会很方便 void Swap(int& left, int& right) {int temp left;left right;right temp; }…

三、Exsi安装虚拟机win10系统

Exsi安装虚拟机win10系统 1、新建虚拟机2、选择存储(直接下一步)3、自定义设置3.1 设置cpu3.2 设置内存3.3 设置硬盘3.4 设置网卡3.5 设置驱动3.6 设置BIOS 4、完成安装 1、新建虚拟机 2、选择存储(直接下一步) 3、自定义设置 3.1 设置cpu 3.2 设置内存 3.3 设置硬盘 3.4 设置…

python搭建文件服务

python -m http.server 访问8000端口&#xff0c;可分享或下载命令启动文件夹下文件。

美国访问学者的申请条件

作为一个富有学术活力和创新精神的国家&#xff0c;美国吸引着世界各地的学者前往交流和研究。对于希望成为美国访问学者的人来说&#xff0c;了解申请条件是至关重要的。下面知识人网小编将介绍一些常见的美国访问学者申请条件。 1. 学术背景与研究计划&#xff1a;作为申请者…