servlet的三个重要的类(httpServlet 、httpServletRequst、 httpServletResponse)

一、httpServlet 

写一个servlet代码一般都是要继承httpServlet 这个类,然后重写里面的方法

但是它有一个特点,根据之前写的代码,我们发现好像没有写main方法也能正常执行。

原因是:这个代码不是直接运行的,而是放到tomcat上运行的

换句话说,tomcat里就有main方法

1.httpServlet的几个主要方法

init方法是初始化操作

service 收到http请求的时候调用(一般会被doGet/doPost替代)

destroy当不在使用httpServlet实例的时候,调用,来销毁实例(释放资源)

        以上三个描述了 servlet的声明周期(经典面试题),就是描述一下这三个方法,什么时间干什么事(调用什么方法)。(在实际开发中,很少会用到,一般都是出现在面试题中)

初始化执行init方法,每次收到http请求调用 service方法,结束前执行destroy方法释放资源

        除了init方法,其他方法都可以在子类中重写,并且重写后,不用手动调用,tomcat会在何时机自动调用

        destroy方法,大概率事执行不到的。一个servlet 不用了,说明tomcat要关闭了

tomcat关闭有两种方式:

        1.直接干掉tomcat 进程(比如直接在任务管理器中 结束任务 , 或者直接点 叉关闭),完全来不及调用destroy。

        2.通过8005 管理端口,给tomcat 发送一个“停机”指令,这个时候是能执行到destroy的。

       但是通常,都是用第一种方式(直接干掉进程)来关闭servlet的。

使用HttpServlet类

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/method") //指定路径
public class MethodServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost");//控制台中打印
        resp.getWriter().write("doPost");//http的响应内容,显示在浏览器上
    }

    @Override
    protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPut");//控制台中打印
        resp.getWriter().write("doPut");//http的响应内容,显示在浏览器上
    }
    protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doDelete");//控制台中打印
        resp.getWriter().write("doDelete");//http的响应内容,显示在浏览器上
    }
}

二、HttpServletRequest类

     可以发现HttpServletRequest的方法里面,都是get方法(读方法),没有set方法(写方法)

        原因是,当前拿到的HttpServletRequest,这里的数据是来自于客户端发来的。这些数据的内容是已经确定下来了,程序员是不应该修改的。

(这种框架做出了限制,避免了程序员不小心把原有的请求修改坏的情况了)

经常将URI 、URL混着用

URI :统一资源标识符(相当于身份证号)

URL:统一资源定位符(相当于住址)

1)使用HttpServletRequest类的方法

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;

@WebServlet("/show")
public class ShowRequestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //调用上述api,把得到的结果构造成一个字符串,统一返回给客户端
       StringBuilder stringBuilder = new StringBuilder();//使用stringBuilder把HTTP请求中的数据记录下来
       stringBuilder.append(req.getProtocol());//获取HTTP协议版本
       stringBuilder.append("<br>");//html中的换行
       stringBuilder.append(req.getMethod());//获取HTTP请求方法(get/post)
       stringBuilder.append("<br>");
       stringBuilder.append(req.getRequestURI());//获取链接地址
         stringBuilder.append("<br>");
        stringBuilder.append(req.getContextPath());//获取一级地址
        stringBuilder.append("<br>");
        stringBuilder.append(req.getQueryString());//获取quary string
        stringBuilder.append("<br>");

        //获取所有的 header
        Enumeration<String> headernames = req.getHeaderNames();
        while(headernames.hasMoreElements()){
            String key = headernames.nextElement();
            String value = req.getHeader(key);
            stringBuilder.append(key + ":" + value + "<br>");
        }
        //返回响应是,一定要做的事情,告诉浏览器,当前是啥类型
        resp.setContentType("text/html;charset=utf8");
        //将stringBuild中的内容以字符串形式返回到响应中
        resp.getWriter().write(stringBuilder.toString());



    }
}

如果不写query string这里的a和b,那么这里就是a=1&b=2这里就是null 

2)获取Patameter(query string)

query string是url中 ?a=1&b=2 这种格式,是以键值对形式存在的

其中a 和 b 就是键值对的key,是由程序员自定的

前后端交互有三种方式:

一种是query string ,form表单,json格式(主流)

三种都差不多,具体用那种看个人习惯,以及公司既定的代码风格

servlet 天然支持 query string 和 form表单,而json本身是不支持的,但是可以引入第三方库

1.GET请求

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/getParameter")
public class GetParameterServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //此处约定:请求中给定的query string 例如:username=zhangsan&password=123
        //上述 query string,就会被tomcat 给自动解析成一个 Map 这样的结构
        //getParameter 就是在查询 Map<String,String>里的内容
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        //就可以拿到这些内容之后,做一些其他的任意处理
        System.out.println("username =" + username);
        System.out.println("password =" + password);
        resp.setContentType("text/html charset=utf-8");
        resp.getWriter().write("ok");
    }

}

不写string是这里是null 

当写了我们自定义的username和password的时候,这里就能看见显示的query string的内容了

但是有一个需要注意的点:

当传入的query string的时候如果涉及到中文字符,需要用urlencode去进行编码

(如果不进行urlencode编码,有些浏览器可能无法识别,导致一些错误)

encode之后的结果发送给浏览器,浏览器能自动识别并进行urldecode解码

 

2.POST请求

import com.sun.prism.PresentableState;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/postParameter")
public class PostParameterServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //约定:前端构造形如这样的请求:
        //POST / postParameter
        //Content-Type:x-www-form-urlencoded
        //
        //username=zhangsan&password=123
        //就需要在后端代码中,把body中的值 给拿到
        //获取值的方法,仍然是 getParameter
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println("username=" + username);
        System.out.println("password=" + password);
        resp.setContentType("text/html;charset=utf8");
        resp.getWriter().write("okk");

    }
}

3)引入json的第三方库(jackson)

1.json的第三方库有很多,Jackson是spring官方推荐的库,也被spring集成起来了,对于后期学习spring比较方便

版本没有要求(也没有必要太新,稳定就行 选择2.15.0)

将这个代码点击,复制粘贴到pom.xml里,点击maven的刷新键,完成json第三方库安装

2.使用jackson(一个类,两个方法)

一个类:ObjectMapper 对象映射器 
两个方法
1-把json字符串,映射成一个Java对象。readValue
Request request = objectMapper.readValue(req.getInputStream(),Request.class);//Request.class 类对象(反射)
2-把一个Java对象,映射成json字符串 writeValueAsString
String respJson = objectMapper.writeValueAsString(response);

网络传输,使用json字符串。Java代码中各种逻辑,使用Java对象。

站在服务器的角度,收到的请求,就是json字符串,就需要把json字符串,先映射成Java对象,

再进行一系列的业务逻辑处理。处理完之后,可能还需要把得到的Java对象,映射会json字符串,并通过响应来返回。

import com.fasterxml.jackson.databind.ObjectMapper;
import com.sun.org.apache.regexp.internal.RE;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

//把 json格式的字符串请求 映射后的 Java对象
class Request{
    public String username;
    public String password;
}
class Response{
    public boolean ok;
}
@WebServlet("/json")
public class JsonParameterServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //此处的约定请求格式如下:
        //POST /json
        //Content-Type:application/json
        //
        //{
        //  username:"zhangsan",
        //  password:"123"
        //}

        //此处也约定响应的格式(也按照 json 来组织):
        //{
        //  ok:true
        //}

        //把请求的 body 按照 json 格式解析成java对象
        ObjectMapper objectMapper = new ObjectMapper();
        Request request = objectMapper.readValue(req.getInputStream(),Request.class);//Request.class 类对象(反射)
        System.out.println("username=" + request.username);
        System.out.println("password" + request.password);

        Response response = new Response();
        response.ok = true;
        //把响应对象转成 json 字符串
        String respJson = objectMapper.writeValueAsString(response);
        resp.setContentType("application/json;charset=utf8");//设置字符集
        resp.getWriter().write(respJson);//返回json格式的字符串


    }
}

4)总结:如何进行前后端交互?如何获取前端传来的数据?

1.query string ( 使用 getParameter这个方法)

2.form表单  ( 使用 getParameter这个方法)

3.json(实际常用,导入json 的库 jackson,使用objectMapper对象和json方法)

三、HttpServletResponse类

主要方法

 1)setStatus设置状态码 和 sendError 设置状态码同时设置body返回的内容

1.setStatus设置状态码

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/Status")
public class StatusServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setStatus(404);//设置状态码为404 not found 找不到
        
    }
}

  

光有状态码,body里面没有内容,是空的,对用户不太友好,浏览器里什么内容也没有,不知道到底出现了什么问题

2.sendError 设置状态码同时设置body返回的内容

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/Status")
public class StatusServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        resp.setStatus(404);//设置状态码为404 not found 找不到
        resp.sendError(404,"哎呀~网页找不到啦~是不是出现问题啦?");
    }
}

 可以看到设置了状态码404 同时还设置了 提示内容

这个页面就是sendError生成的

2)通过setHeader属性,给响应中设置一些特殊的header

1.设置 refresh:1,让浏览器每秒刷新一次

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/refresh")
public class RefreshServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       resp.setHeader("refresh","1");//refresh浏览器刷新,1为时间,每一秒刷新一次
        resp.getWriter().write(" "+System.currentTimeMillis());//在浏览器显示当前时间

    }
}

观察发现好像每次并没有精确1s刷新,可能是一秒多一点

原因是:浏览器响应也需要时间,所以比原有的1s多一些

 2.构造重定向响应

1-状态码是 3开头(例如:302)

2-header 需要有一个Location属性,描述要跳转到哪里

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/redirect")
public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //方法一
        resp.setStatus(302);
        resp.setHeader("Location","http://www.baidu.com");//重定向/redirect这个网页到 www.baidu.com
        //方法二
        resp.sendRedirect("http://www.baidu.com");
        //两者效果一致
    }
}

(这几个类学完,就可以愉快的进行接下来的简单网站啦~~)

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

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

相关文章

气象观测站点数据下载与处理

一、下载途径 全国400多个气象站气候数据&#xff08;1942-2022&#xff09; 王晓磊&#xff1a;中国空气质量/气象历史数据 | 北京市空气质量历史数据 气象数据免费下载网站整理 中国气象站观测的气象数据怎么下载 二、R语言处理 2.1 提取站点文件 library(dplyr) library(…

(助力国赛)数学建模可视化!!!含代码1(折线图、地图(点)、地图(线)、地图(多边形)、地图(密度)、环形图、环形柱状图、局部放大图)

众所周知&#xff0c;数学建模的过程中&#xff0c;将复杂的数据和模型结果通过可视化图形呈现出来&#xff0c;不仅能够帮助我们更深入地理解问题&#xff0c;还能够有效地向评委展示我们的研究成果。   今天&#xff0c;作者将与大家分享8种强大的数学建模可视化图形及其在…

解决VirtualBox虚拟机启动失败的问题

一.出现的问题&#xff08;未能启动虚拟电脑&#xff0c;由于物理网卡未找到&#xff09; 一、错误信息分析 “未能启动虚拟电脑&#xff0c;由于物理网卡未找到”&#xff1a;这个错误通常是由于VirtualBox无法识别或连接到物理网卡造成的。可能是由于驱动程序问题、网络设置错…

2024年阿里云最便宜的轻量应用服务器与云服务器价格及优惠购买入口

2024年&#xff0c;阿里云推出了几款价格最便宜的轻量应用服务器和云服务器&#xff0c;其中轻量应用服务器2核2G3M公网带宽50GB 高效云盘活动价格61元1年&#xff0c;经济型e实例4核16G10M公网带宽100G ESSD Entry云盘活动价格最低只要30元/1个月&#xff0c;通用算力型u1实例…

pyskl手势/动作识别的实现与pytorch cuda环境部署保姆教程

恭喜你&#xff0c;找到这篇不需要翻墙就能够成功部署的方法。在国内布置这个挺麻烦的&#xff0c;其他帖子会出现各种问题不能完全贯通。便宜你了。。 实话5年前我用1080训练过一个基于卷积和ltsm的手势识别&#xff0c;实话实说感觉比现在效果好。是因为现在的注意力都在tra…

【Spring】Spring MVC入门

Spring MVC入门 一、什么是Spring Web MVC&#xff1f; 1.1 MVC定义 MVC是Model View Controller的缩写&#xff0c;是一种软件架构的设计模式&#xff0c;将软件系统分为模型、视图、控制器三个部分。 示意图如下: 可以看到&#xff0c;Controller作为一个“粘合剂”处于M…

Hadoop——Yarn基础架构

Hadoop——Yarn基础架构 Hadoop YARN&#xff08;Yet Another Resource Negotiator&#xff09;是Apache Hadoop生态系统中的一个子项目&#xff0c;它是用于集群资源管理的框架&#xff0c;负责为运算程序提供服务器运算资源&#xff0c;相当于一个分布式的操作系统平台&…

Mac 利用Homebrew安装JDK

一、安装JDK17 1.安装openjdk17 2.把homebrew安装的openjdk17软链接到系统目录&#xff1a; brew install openjdk17 sudo ln -sfn $(brew --prefix)/opt/openjdk17/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-17.jdk 一、检查是否安装成功 在Termina…

基于SSM的列车订票管理系统(含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的列车订票管理系统3拥有两种角色&#xff1b;管理员、用户 管理员&#xff1a;用户管理、车票管理、购票指南管理、系统管理等 用户&#xff1a;发布帖子、登录注册、购票等 1.…

Spring Boot 整合 Mockito:提升Java单元测试的高效实践

引言 在Java开发领域&#xff0c;Spring Boot因其便捷的配置和强大的功能而受到广泛欢迎&#xff0c;而Mockito作为一款成熟的单元测试模拟框架&#xff0c;则在提高测试质量、确保代码模块间解耦方面扮演着至关重要的角色。本文将详细介绍如何在Spring Boot项目中整合Mockito&…

千锤百炼算法系列之动态规划

题外话 这段时间,我必须把算法弄明白 这篇直接讲解动态规划所有细节! 前面那篇 千锤百炼之每日算法(一)-CSDN博客 也有关于动态规划的讲解,也非常详细 很简单,我成尊不就是了?!!! 正题 动态规划 这里我们主要是让大家明白什么是动态规划,怎么用动态规划解题 我就不用…

手动给docusaurus添加一个搜索

新版博客用docusaurus重构已经有些日子了&#xff0c;根据docusaurus的文档上也申请了Algolia,想一劳永逸的解决博客的搜索问题。但是流水有意&#xff0c;落花无情。 algolia总是不给我回复&#xff0c;我只能对着algolia的申请页面仰天长叹。 正常情况的申请 按照docusaur…

社区论坛小圈子小程序源码系统:自定义小程序管理社区圈子软件圈子系统系统开发-做社区圈子丨圈子论坛社区交友系统开源版小程序源码丨

简述 移动互联网的快速发展&#xff0c;微信小程序作为一种新型的应用形态&#xff0c;已经深入到人们的生活中。特别是对于社区论坛类应用&#xff0c;小程序版本可以更好地满足用户快速、便捷获取信息的需求。下面给大家分享一款社区论坛小圈子小程序源码系统。 在这个信息…

跨境电商MercadoLibre(美客多)平台预约号操作流程自动化系统

目录 一、前置配置准备 1. 安装Chrome插件 2. 添加预约配置 二、开始使用 MercadoLibre&#xff08;美客多&#xff09;于2021年10月18号上线了新预约入仓系统&#xff0c;在MercadoLibre美客多平台上&#xff0c;新入仓预约系统是一项非常重要的功能&#xff0c;它可以帮助…

2024华中杯数学建模挑战赛选题建议及各题思路来啦!

大家好呀&#xff0c;华中杯数学建模开始了&#xff0c;来说一下初步的选题建议吧&#xff1a; 首先定下主基调&#xff0c; 本次华中杯推荐选择C题目。难度方面A&#xff1e;B&#xff1e;C&#xff0c;A是优化类题目&#xff0c;难度较高&#xff0c;建议参考23国赛A优秀论…

STM32G431RBT6移植FreeRTOS

引言&#xff1a; 本文专门为参加了蓝桥杯嵌入式赛道的同学准备&#xff0c; 大家可能会有这样一个问题&#xff0c; 比完赛之后&#xff0c; 对于像继续使用STM32G431RBT6学习FreeRTOS的&#xff0c; 发现网上的教程使用的板子基本上都是F1和F4的&#xff0c; 其实呢&#xff…

《八》QSplitter拆分器以及QDockWidget窗口详解

QSplitter简介 QSplitter拆分器允许用户通过拖动子部件之间的边界来控制它们的大小。 单个拆分器可以控制任意数量的小部件。QSplitter的典型用法是创建几个小部件&#xff0c;并使用insertWidget()或addWidget()添加它们。 常用方法 默认情况下&#xff0c;QSplitter会动态…

甘特图是什么?如何利用其优化项目管理流程?

甘特图是项目管理软件中十分常见的功能&#xff0c;可以说每一个项目经理都要学会使用甘特图才能更好的交付项目。什么是甘特图&#xff1f;甘特图用来做什么&#xff1f;简单来说一种将项目任务与时间关系直观表示的图表&#xff0c;直观地展示了任务进度和持续时间。 一、甘特…

【k8s】:kubectl 命令设置简写启用自动补全功能

【k8s】&#xff1a;kubectl 命令设置简写&启用自动补全功能 1、设置kubectl命令简写2、启用kubectl自动补全功能 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; Kubernetes&#xff08;K8s&#xff09;是一个强大的容器编排平台&#…

【话题】程序员如何搞副业,简单探讨下

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 背景前提条件打造私域广结朋友平台 技能转化为价值1. 副业途径2. 如何开展3. 未来趋势与建议4. 挑战与策略5. 规划与发展 文章推荐 背景 程序员不仅拥有将抽象概念转化…