HTTP以及Servlet的学习

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注解

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

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

相关文章

Matlab数学建模实战——(Lokta-Volterra掠食者-猎物方程)

1.题目 问题1 该数学建模的第一问和第二问主要是用Matlab求解微分方程组,直接编程即可。 求解 Step1改写 y(1)ry(2)f Step2得y的导数 y(1).2y(1)-ay(1)*y(2)y(2).-y(2)a*y(1)*y(2) Step3编程 clear; a0.01; F(t,y)[2*y(1)-a*y(1)*y(2);-y(2)a*y(1)*y(2)]; […

MySQL的数据备份与还原--练习题

MySQLdump MySQLdump是MySQL提供的一个非常有用的数据库备份工具。MySQLdump命令执行时,可以将数据库备份成一个文本文件,该文件中实际上包含了多个CREATE 和 INSERT语句,使用这些语句可以重新创建表和插入数据。 看题: 第一题&a…

【新手上路】如何在Web3时代成为XR创建者

目录 0 XR在Web3里的作用 1 XR的概念、特征、技术、设备、平台、应用和工具 1.1 VR的概念、特征和技术 1.2 AR的概念、特征和技术 1.2 XR的设备、平台、应用和工具 2 选择XR的方法 2.1 何时使用VR 2.2 何时使用AR 3 开发XR作品的4个步骤 4 成为XR构建者的路径 4.1 三…

Win10使用gdc-client下载TCGA数据集【安装使用教程】成功解决闪退问题!

做实验需要下载TCGA数据集,数据量比较大的时候,直接从网页下载速度非常慢,容易出现下载不全等情况。 调研后选择在Win10端使用gdc-client来帮助下载Cart文件。 一、下载软件、配置环境 下载软件 下载网站链接:https://gdc.can…

解决dotnet调用https请求被中止未能创建SSL/TLS安全通道

环境:dotnet4.7.2/winserver2012 问题描述: 调用https出现请求被中止,未能创建SSL/TLS安全通道 第一试 自定义SetCertificatePolicy 函数,在建立http连接之前调用 SetCertificatePolicy 函数。 public static void SetCertificatePolicy() {ServicePointManage…

实战攻防之积极防御体系建设 | 中睿天下受邀参与诸子云沙龙

7月8日,中睿天下受邀参与由诸子云举办的“网络与数据安全”主题沙龙,中睿天下技术经理徐丹丹就《实战攻防之积极防御体系建设》这一主题进行了分享交流。 本次沙龙由南京分会会长宋士明主持,活动邀请到BASF、江苏省联社、华泰证券、宁证期货、…

工作日志2 input 的事件优先级 字符串.trim() this.$set()的应用 获取jq的自定义属性

input 的事件优先级 1.input输入框的事件 字符串.trim() 除去前后空格的方法 undefind不可以使用 this.$set()的应用

记录jeecg-boot及a-table前端问题

标签页重复 原因: 在TabLayout中它有监听$route,是根据route.fullpath去判断的。这就会出现一种情况,我是同一个path比如/detail,但是我带了个参数/detail?id132165151651和/detail?id256151561651这两个fullpath明显不同,所以…

单片机能否替代PLC实现控制和自动化系统?

是的,单片机可以在某些情况下替代PLC,但在其他情况下可能并不适用。以下是对这个问题的详细解释: 我这里刚好有嵌入式、单片机、plc的资料需要可以私我或在评论区扣个6 灵活性和可编程性:PLC相对于单片机来说更具有灵活性和可编…

k8s 持久化存储

我们继续来查看 k8s 的卷,上一次我们分享了将磁盘挂载到容器中,empyDir 和 gitRepo 都是会随着 pod 的启动而创建,随着 pod 的删除而销毁 那么我们或许会有这样的需求,期望在 pod 上面读取节点的文件或者使用节点的文件系统来访问…

Linux学习之变量引用和作用范围

使用${变量名}或者$变量名就可以引用变量,$变量名其实是${变量名}的省略写法。 要是变量名后边还有其他字符就需要加上{},比如helloToBash这个变量的值是Hello Bash,而需要输出的字符串是“Hello Bashing”,这样就需要加上{}&…

COMDEL射频电源维修康戴尔高频电源CLX2750

美国COMDEL电源维修常见型号包括:CLX2750;CLX2500;CLX-600H;CX600AS;CX-5000S;CX-3500S;CX-2500S;CV500;CDX2000等。 Comdel成立于1966年,总部设在马萨诸塞州…

设计模式-建造者模式在Java中使用示例

场景 建造者模式 复杂对象的组装与创建 没有人买车会只买一个轮胎或者方向盘,大家买的都是一辆包含轮胎、方向盘和发动机等多个部件的完整汽车。 如何将这些部件组装成一辆完整的汽车并返回给用户,这是建造者模式需要解决的问题。 建造者模式又称为…

Windows git bash输入vim报错,不能使用vim-plug插件管理器

Windows系统下的git bash在安装时自带了默认的vim&#xff0c;我自己也下了个gvim&#xff0c;并且配置了.vimrc&#xff0c;其中使用了vim-plug管理nerdtree这些插件。但是在bash中vim <file>时&#xff0c;就会蹦出来几行报错&#xff1a; 处理 /c/Users/<username…

Redis报错-CROSSSLOT keys in request don‘t hash in the same slot

背景 问题涉及&#xff1a;spring security、spring session、redis 问题描述 springbootspringsecurityspringsessionantd 登录功能的时候&#xff0c;在源码中使用到了redis的rename命令&#xff08;如下图所示&#xff09; 在这里就会报错 CROSSSLOT keys in request d…

Shell通配符和正则表达式

目录 ​​​​​​​grep 通配符 正则表达式 grep grep家族有三大成员分别为&#xff1a; grep&#xff1a;支持使用基本正则表达式。 egrep&#xff1a;支持使用扩展正则表达式。 fgrep&#xff1a;不支持使用正则表达式&#xff0c;即所有的正则表达式中的元字符都将作…

网络安全(黑客技术)自学笔记

首先给大家简单介绍一下网络安全&#xff1a; 1.什么是网络安全&#xff1f; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、…

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

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

基于Java+Swing+Mysql影院购票系统

基于JavaSwingMysql影院购票系统 一、系统介绍二、功能展示1.用户登陆2.用户订票管理3.电影售票中心4.电影上映管理4.退票记录查询 三、数据库四、其他系统实现五、获取源码 一、系统介绍 该系统实现了查看管理员登陆、用户订票管理、电影上映管理、电影售票中心、退票记录查询…

vue的学习

title: VUE 一、Vue简介 1.1 简介 ::: tip Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式的js框架&#xff0c;发布于 2014 年 2 月。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0…