Servlet API

news2024/11/25 13:25:20

目录

1.HttpServlet

 1.doGet

2.doPost

2.HttpServletRequest

2.1方法

         2.2打印请求信息

 2.3获取GET请求的参数

 2.4post请求body格式

1.x-www-form-urlencoded

2.json

3.HttpServletResponse

3.1方法

3.2设置状态码

 3.3自动刷新

3.4构造重定向的响应


1.HttpServlet

方法名称调用时机
init实例化后被调用一次
destroy实例不使用时,调用一次
service收到HTTP请求调用
doGet

收到 GET 请求的时候调用(由 service 方法调用)

doPost

收到 POST 请求的时候调用(由 service 方法调用)

doPut/doDelete/doOptions/...

收到其他请求的时候调用(由 service 方法调用)

 1.doGet

@WebServlet("/method")
public class MethodServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf8");
        resp.getWriter().write("Get响应");
    }
}

2.doPost

test.html

请求是相对路径,不用加/    

方法是post,路径是method1,得到body

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
    <script>
        $.ajax({
            type:'post',
            url:'method1',
            success:function(body){
                console.log(body);
            }
        });
    </script>
</body>
</html>

 MethodServlet1.java

contentType:让服务器告诉浏览器它发送的数据属于什么文件类型

@WebServlet("/method1")
public class MethodServlet1 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf8");
        resp.getWriter().write("post响应");
    }
}

Fiddler捕获到两个页面

2.HttpServletRequest

通过Socket API读取HTTP请求(字符串),按照HTTP协议把字符串解析成HttpServletPequest对象

2.1方法

方法描述
String getProtocol()返回请求协议的名称和版本
String getMethod()返回请求的方法
String getRequestURI()

从协议名称直到 HTTP 请求的第一行的查询字符串中,返回该请求的URL 的一部分。

String getContextPath()

返回第一级路径

String getQueryString()返回查询的字符串(完整的)
Enumeratin getParameterNames()解析成键值对,key用enum方式表达
String getParameter(String name)解析成键值对,根据key返回value
String[] getParameterValues(String name)返回请求参数的值,如果不存在返回null

Enumeration getHeaderNames()

请求报头解析成键值对,key用enum方式表达

String getHeader(Stringname)

请求报头解析成键值对,根据key返回value

String getCharacterEncoding()

返回主体中使用字符编码的名称

String getContentType()

返回请求主体的 MIME 类型,如果不知道类型则返回 null

int getContentLength()

以字节为单位返回请求主体的长度,并提供输入流,或者如果长度未知则返回 -1。

InputStream getInputStream()

用于读取请求的 body 内容. 返回一个 InputStream 对象.

2.2打印请求信息

创建stringBuilder对象,把api得到的结果存入,

通过write()方法,输出到页面

@WebServlet("/showRequest")
public class showRequest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //调用API,把得到的结果组织到html中,作为响应的body

        //把api执行的结果,放入stringbuilder中
        StringBuilder stringBuilder=new StringBuilder();
        stringBuilder.append("<h3>首行部分</h3>");
        stringBuilder.append(req.getProtocol());//协议名称和版本号
        stringBuilder.append("<br>");
        stringBuilder.append(req.getMethod());//请求的方法
        stringBuilder.append("<br>");
        stringBuilder.append(req.getRequestURI());//返回第一行查询的字符串
        stringBuilder.append("<br>");
        stringBuilder.append(req.getContextPath());//第一级路径
        stringBuilder.append("<br>");
        stringBuilder.append(req.getQueryString());//完整字符串
        stringBuilder.append("<br>");
        stringBuilder.append("<h3>header部分</h3>");
        Enumeration<String> headerNames=req.getHeaderNames();//key
        while(headerNames.hasMoreElements()){
            String headerName=headerNames.nextElement();
            String headerValue=req.getHeader(headerName);//value
            stringBuilder.append(headerName+" : "+headerValue+"<br>");
        }
        resp.setContentType("text/html;charset=utf8");
        resp.getWriter().write(stringBuilder.toString());
    }
}

 

 2.3获取GET请求的参数

在输入网址时,输入信息

用getParameter()得到信息,输出

@WebServlet("/getParameter")
public class GetParameterServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //预期浏览器传来一个形如这样的请求:/getParameter?userId=123&classId=456
        String userId=req.getParameter("userId");
        String classId=req.getParameter("classId");
        resp.getWriter().write("userId"+userId+",classId="+classId);
    }

网址: localhost:8080/4/getParameter?userId=10&classId=20

如果?后 没有信息,则都为null

 2.4post请求body格式

1.x-www-form-urlencoded

前端代码:

a.form表单

b.postman

前端请求:

action中写的是相对路径

点击submit后,会跳转到action中写的路径(后端代码的页面)

<form action="postGetParameter" method="post">
        <input type="text" name="userId">
        <input type="text" name="classId">
        <input type="submit" value="提交">
    </form>

后端代码:

@WebServlet("/postGetParameter")
public class postGetParameterServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //假设前端传过来的参数是userId=10&classId=20
        //服务器也通过req.getParameter来获取内容的
        String userId=req.getParameter("userId");
        String classId=req.getParameter("classId");
        resp.getWriter().write("useId:"+userId+", classId:"+classId);

    }
}

 先登录test.html得到信息提交,转到postGetParameter,页面显示信息

2.json

形式:

{

  userId:zhang,

  classId:123;

}

用第三方库处理json格式==>Jackson

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.7</version>
</dependency>

前端代码:通过js构造body为json的格式请求

1.得到信息(userId,classId,submit)

2.编写点击按钮:

使用ajax:

写入:type,url,contentType,data(设置成json的格式),回调函数

<input type="text" id="userId">
        <input type="text" id="classId">
        <input type="button" value="提交" id="submit">
        <!-- 要构造一个json格式的请求,不能使用form表单,要用ajax -->
        <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
         <script>
            let userIdInput=document.querySelector('#userId');
            let classIdInput=document.querySelector('#classId');
            let button=document.querySelector('#submit');
            button.onclick=function(){
                $.ajax({
                    type:'post',
                    url:'postJson',
                    contentType:'application/json',
                    data:JSON.stringify({
                        userId:userIdInput.value,
                        classId:classIdInput.value
                    }),
                    success:function(body){
                        console.log(body);
                    }
                });
            }
         </script>

后端代码:

1.创建User类

2.创建jackson核心对象

3.读取body的请求,使用objectMapper解析成user.class

readValue把json格式的对象,转换成java对象

4.输出信息

遍历键值对,得到每个key,把对应的value附到User属性中

class User{
    public int userId;
    public int classId;
}
@WebServlet("/postJson")
public class PostJsonServlet extends HttpServlet {
    private ObjectMapper objectMapper=new ObjectMapper();

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        User user=objectMapper.readValue(req.getInputStream(),User.class);
        resp.getWriter().write("userId: " + user.userId + ", classId: " + user.classId);

    }
}

 

3.HttpServletResponse

Tomcat 就会把这个 HttpServletResponse 对象按照 HTTP 协议的格式, 转成一个字符串, 并通过Socket 写回给浏览器.

3.1方法

方法描述

void setStatus(int sc)

设置响应码

void setHeader(String name,String value)

设置有名称和值的header,

name已有则覆盖旧的值

void addHeader(Stringname, String value)

添加有名称和值的header,name已有,不覆盖新的值,添加新的键值对

void setContentType(Stringtype)

设置响应的内容类型

void  setCharacterEncoding(Stringcharset)

设置字符编码

void sendRedirect(Stringlocation)

用指定的重定向位置 URL 发送临时重定向响应到客户端

PrintWriter getWriter()

往 body 中写入文本格式数据.

OutputStream  getOutputStream()

往 body 中写入二进制格式数据.

3.2设置状态码

响应码:服务器返回的状态码,只是告诉浏览器当前响应的状态,不影响浏览器显示body

@WebServlet("/status")
public class StatusServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setStatus(404);
        resp.getWriter().write("hello");
    }
}

 3.3自动刷新

@WebServlet("/autoRefresh")
public class autoRefresh extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setHeader("Refresh","1");
        resp.getWriter().write("timeStamp"+System.currentTimeMillis());
    }
}

 

 

3.4构造重定向的响应

@WebServlet("/RedirectServlet")
public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.sendRedirect("https://www.bilibili.com/");
    }
}

 

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

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

相关文章

VMware Workstation Pro17安装并导入旧虚拟机系统

VMware Workstation Pro17 VMware是一个虚拟机软件&#xff0c;可以用来虚拟化各种系统&#xff0c;便于进行开发和其他相关工作 VMware Workstation Pro17支持window11版本&#xff0c;如果vm版本太低了升级window的时候会提示卸载旧版本的 下载VMware Workstation Pro17 h…

网格贪心搜索逼近最优组合解

如有错误&#xff0c;感谢不吝赐教、交流 文章目录背景描述实现方法一、寻找两组合的最优二、基于两组合的最优结果寻找四组合最优三、基于四组合的最优结果寻找八组合最优四、基于八组合的最优结果寻找十六组合最优总结适用场景背景描述 假如list [0, 1, 2, 3, 4, 5, 6, 7, …

2023年第三届智能机器人与系统国际会议(ISoIRS 2023) | IEEE-CPS独立出版

2023年第三届智能机器人与系统国际会议(ISoIRS 2023) | IEEE-CPS独立出版 会议简介 Brief Introduction 2023年第三届智能机器人与系统国际会议(ISoIRS 2023) 会议时间&#xff1a;2023年5月26日-28日 召开地点&#xff1a;中国长沙 大会官网&#xff1a;www.isoirs.org ISoIRS…

软件测试别再被“薪资陷阱”困扰了,这份攻略带你轻松查薪资

大家好&#xff0c;我是锦都不二。 测试岗面试 当HR问你期望薪资是多少时&#xff0c; 如果你回答: 10K 恭喜&#xff0c;你已经被HR成功套路&#xff0c; 拿到offer时你会在心里这么嘀咕&#xff1a;我要是当时报价15k该多好。 所以如何知道自己在这个市场上的价值&#xff0c…

95-拥塞控制

拥塞控制1.什么是拥塞控制2.拥塞控制的方法(1)慢启动和拥塞避免(2)快速重传和快速恢复1.什么是拥塞控制 在计算机网络中的链路容量&#xff08;即带宽&#xff09;、交换结点中的缓存和处理机等&#xff0c;都是网络的资源。在某段时间&#xff0c;若对网络中某一资源的需求超…

excel在文本的固定位置插入字符、进行日期和时间的合并

1.excel在文本的固定位置插入字符 如上图&#xff0c;现在想要将其转化为日期格式&#xff08;比如2017/1/1&#xff09;&#xff0c;但是当设置单元格格式为日期时却显示出很多&#xff03;。我们可以通过在20170101中添加两个斜杠“/”来将其转化为2017/1/1。可以用replace函…

基于SSM的二手车交易平台小程序

选题背景 互联网是人类的基本需求&#xff0c;特别是在现代社会&#xff0c;个人压力增大&#xff0c;社会运作节奏高&#xff0c;随着互联网的快速发展&#xff0c;用户的需求也越来越高&#xff0c;用户也将越来越多依靠互联网而不是自己获取信息&#xff0c;使得各种软件程…

【逗老师的无线电】BM的AirSecurity功能使用以防止他人使用你的DMRID

众所周知&#xff0c;在使用DMR热点和中继的时候&#xff0c;如果别人的手台上配置了你的ID进行恶意呼叫&#xff0c;或者伪装你的身份进行通联&#xff0c;之前是没有办法防范的。 目前&#xff0c;BM更新了AirSecurity功能&#xff0c;通过在呼叫前预先单呼一个作为密码的号码…

计算机组成原理——第二章数据的表示和运算(上)

提示&#xff1a;日出有盼&#xff0c;落日有念&#xff0c;心有所期&#xff0c;忙而不茫 文章目录前言2.1.1 进位计数制2.1.2 BCD码2.1.3 无符号整数的表示和运算2.1.4 带符号整数的表示和运算(原反补)2.1.5原反补码的特性对比2.1.6 移码2.1.7 定点小数前言 这里主要是根据王…

vue3 history模式配置及nginx服务器配置

vue的路由方式有hash模式和history模式&#xff0c;history模式路由看起来有好些&#xff0c;路由路径里没有#号&#xff0c;而hash模式默认是有#号的。 vue3开始默认新建的项目都是history模式&#xff0c;不过history模式打包后想要使用正常访问的话&#xff0c;需要后端服务…

BIO/NIO/Netty网络通信编程

文章目录1 BIO (BLOCK IO)2. NIO (new IO)2.1 NIO-Buffer缓冲区2.2 NIO-Buffer分散读-集中写2.3 NIO-Buffer粘包半包2.4 NIO-Channel2.4.1 files相关操作2.4.2 channel网络通信2.4.3 处理消息边界2.4.4 buffer大小分配2.4.5 处理大量写事件2.5 selector-Epoll2.6 IO模型2.7 零拷…

懒人必备!Python代码帮你自动发送会议纪要,让你有更多时间做更重要的事情

目录 痛点&#xff1a; 应用场景&#xff1a; 源代码&#xff1a; 代码说明&#xff1a; 效果如下所示&#xff1a; 痛点&#xff1a; 在传统的工作中&#xff0c;发送会议纪要是一个比较繁琐的任务&#xff0c;需要手动输入邮件内容、收件人、抄送人等信息&#xff0c;每…

代码随想录算法训练营第五十六天 | 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结

583. 两个字符串的删除操作 动规五部曲 1、确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j]&#xff1a;以i-1为结尾的字符串word1&#xff0c;和以j-1位结尾的字符串word2&#xff0c;想要达到相等&#xff0c;所需要删除元素的最少次数。 2、确定递推…

基于matlab使用Swerling目标模型来描述雷达横截面的波动

一、前言该示例说明了如何使用Swerling目标模型来描述雷达横截面的波动。该场景由旋转单基地雷达和具有Swerling 2模型描述的雷达横截面的目标组成。在此示例中&#xff0c;雷达和目标是静止的。二、斯威林 1 与斯威林 2 模型在Swerling 1和Swerling 2目标模型中&#xff0c;总…

Spring项目中如何接入Open AI?

前言 最近随着ChatGPT的爆火&#xff0c;很多人都坐不住了&#xff0c;OpenAI API 允许开发人员访问该模型并在其自己的应用程序中使用。那么它能给我们我们Java开发带来那些好处呢&#xff1f;又该怎么接入Open AI呢&#xff1f; 在开始之前&#xff0c;我们需要在 OpenAI 网…

安全沙箱技术小科普

安全沙箱技术是一种用于保护用户隐私和系统安全的机制&#xff0c;它可以将应用程序限制在一个封闭的运行环境中&#xff0c;防止其对系统和其他应用程序造成潜在的威胁。安全沙箱技术广泛应用于计算机安全领域&#xff0c;如防病毒软件、浏览器、操作系统等&#xff0c;以提高…

UE4读取本地XML文件

关键词&#xff1a;UE4 UE5 Unreal Engine XML 文件 txt 需求&#xff1a; 游戏开发中需要读取了写入配置文件&#xff0c;需要保存场景信息&#xff0c;道具位置旋转信息&#xff0c;那么将其保存为XML是一个不错的办法。 涉及知识点&#xff1a; 怎样读取xml文件 思路 …

2023级浙江大学MBA提前批面试真题及经验分享

前段时间获得了浙大MBA项目拟录取资格&#xff0c;在跟易考周老师报喜的同时也很荣幸收到了分享提前批面试经验的邀请&#xff0c;现在也4月中旬了&#xff0c;马上浙大MBA提面第一批次就要开始了&#xff0c;根据我的经验来说&#xff0c;参加浙大前三批提面拿优秀的概率会更高…

移动App测试实战—专项测试

移动App测试实战—专项测试 我们在进行了手工的功能测试之后&#xff0c;也开发了一些自动化测试用例&#xff0c;并且做了性能测试之后&#xff0c;测试工作看似比较完整了。但是当我们的App在大量的用户那里被安装和使用的时候&#xff0c;还是会有很多我们之前没有预料的问题…

【C++】STL——用一颗红黑树封装出map和set

用一颗红黑树封装出map和set 文章目录用一颗红黑树封装出map和set一、前言二、红黑树模板参数的控制三、模板参数中仿函数的增加四、红黑树正向迭代器的实现五、红黑树的反向迭代器的实现六、红黑树的begin()和end()七、红黑树的rbegin()和rend()八、[ ]下标访问运算符重载九、…